diff --git a/Configuration/UserConfig.cs b/Configuration/UserConfig.cs index c5f9e742..380df363 100644 --- a/Configuration/UserConfig.cs +++ b/Configuration/UserConfig.cs @@ -45,6 +45,8 @@ sealed class UserConfig{ public WindowState PluginsWindow { get; set; } public string CustomCefArgs { get; set; } + public string CustomBrowserCSS { get; set; } + public string CustomNotificationCSS { get; set; } public bool IsCustomNotificationPositionSet{ get{ diff --git a/Core/FormBrowser.cs b/Core/FormBrowser.cs index 42275cf2..b846e1de 100644 --- a/Core/FormBrowser.cs +++ b/Core/FormBrowser.cs @@ -181,7 +181,7 @@ private void trayIcon_ClickClose(object sender, EventArgs e){ } private void plugins_Reloaded(object sender, PluginLoadEventArgs e){ - browser.ExecuteScriptAsync("window.location.reload()"); + ReloadBrowser(); } private void plugins_PluginChangedState(object sender, PluginChangedStateEventArgs e){ @@ -296,5 +296,9 @@ public void OnImagePasted(){ public void OnImagePastedFinish(){ browser.ExecuteScriptAsync("TDGF_tryPasteImageFinish",new object[0]); } + + public void ReloadBrowser(){ + browser.ExecuteScriptAsync("window.location.reload()"); + } } } \ No newline at end of file diff --git a/Core/Handling/TweetDeckBridge.cs b/Core/Handling/TweetDeckBridge.cs index aacde5e2..176c8ead 100644 --- a/Core/Handling/TweetDeckBridge.cs +++ b/Core/Handling/TweetDeckBridge.cs @@ -41,6 +41,18 @@ public bool ExpandLinksOnHover{ } } + public bool HasCustomBrowserCSS{ + get{ + return !string.IsNullOrEmpty(Program.UserConfig.CustomBrowserCSS); + } + } + + public string CustomBrowserCSS{ + get{ + return Program.UserConfig.CustomBrowserCSS; + } + } + public TweetDeckBridge(FormBrowser form, FormNotification notification){ this.form = form; this.notification = notification; diff --git a/Core/Handling/TweetNotification.cs b/Core/Handling/TweetNotification.cs index 9c2b21dd..904af65f 100644 --- a/Core/Handling/TweetNotification.cs +++ b/Core/Handling/TweetNotification.cs @@ -94,7 +94,13 @@ public string GenerateHtml(){ StringBuilder build = new StringBuilder(); build.Append("<!DOCTYPE html>"); build.Append("<html class='os-windows txt-base-").Append(FontSizeClass ?? DefaultFontSizeClass).Append("'>"); - build.Append("<head>").Append(HeadTag ?? DefaultHeadTag).Append("<style type='text/css'>").Append(CustomCSS).Append("</style></head>"); + build.Append("<head>").Append(HeadTag ?? DefaultHeadTag).Append("<style type='text/css'>").Append(CustomCSS).Append("</style>"); + + if (!string.IsNullOrEmpty(Program.UserConfig.CustomNotificationCSS)){ + build.Append("<style type='text/css'>").Append(Program.UserConfig.CustomNotificationCSS).Append("</style>"); + } + + build.Append("</head>"); build.Append("<body class='hearty'><div class='app-columns-container'><div class='column scroll-styled-v' style='width:100%;overflow-y:auto'>"); build.Append(html); build.Append("</div></div></body>"); diff --git a/Core/Other/FormSettings.cs b/Core/Other/FormSettings.cs index d067e7bf..46edc543 100644 --- a/Core/Other/FormSettings.cs +++ b/Core/Other/FormSettings.cs @@ -19,7 +19,7 @@ public FormSettings(FormBrowser browserForm, UpdateHandler updates){ this.tabPanel.AddButton("General",SelectTab<TabSettingsGeneral>); this.tabPanel.AddButton("Notifications",() => SelectTab(() => new TabSettingsNotifications(browserForm.CreateNotificationForm(false)))); this.tabPanel.AddButton("Updates",() => SelectTab(() => new TabSettingsUpdates(updates))); - this.tabPanel.AddButton("Advanced",SelectTab<TabSettingsAdvanced>); + this.tabPanel.AddButton("Advanced",() => SelectTab(() => new TabSettingsAdvanced(browserForm.ReloadBrowser))); this.tabPanel.SelectTab(tabPanel.Buttons.First()); } diff --git a/Core/Other/Settings/Dialogs/DialogSettingsCSS.Designer.cs b/Core/Other/Settings/Dialogs/DialogSettingsCSS.Designer.cs new file mode 100644 index 00000000..ca19900a --- /dev/null +++ b/Core/Other/Settings/Dialogs/DialogSettingsCSS.Designer.cs @@ -0,0 +1,181 @@ +namespace TweetDck.Core.Other.Settings.Dialogs { + partial class DialogSettingsCSS { + /// <summary> + /// Required designer variable. + /// </summary> + private System.ComponentModel.IContainer components = null; + + /// <summary> + /// Clean up any resources being used. + /// </summary> + /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> + protected override void Dispose(bool disposing) { + if (disposing && (components != null)) { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// <summary> + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// </summary> + private void InitializeComponent() { + this.textBoxBrowserCSS = new System.Windows.Forms.TextBox(); + this.btnCancel = new System.Windows.Forms.Button(); + this.btnApply = new System.Windows.Forms.Button(); + this.splitContainer = new System.Windows.Forms.SplitContainer(); + this.labelBrowser = new System.Windows.Forms.Label(); + this.labelNotification = new System.Windows.Forms.Label(); + this.textBoxNotificationCSS = new System.Windows.Forms.TextBox(); + this.labelWarning = new System.Windows.Forms.Label(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit(); + this.splitContainer.Panel1.SuspendLayout(); + this.splitContainer.Panel2.SuspendLayout(); + this.splitContainer.SuspendLayout(); + this.SuspendLayout(); + // + // textBoxBrowserCSS + // + this.textBoxBrowserCSS.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBoxBrowserCSS.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.textBoxBrowserCSS.Location = new System.Drawing.Point(0, 16); + this.textBoxBrowserCSS.Margin = new System.Windows.Forms.Padding(0, 3, 0, 0); + this.textBoxBrowserCSS.Multiline = true; + this.textBoxBrowserCSS.Name = "textBoxBrowserCSS"; + this.textBoxBrowserCSS.Size = new System.Drawing.Size(226, 193); + this.textBoxBrowserCSS.TabIndex = 0; + this.textBoxBrowserCSS.WordWrap = false; + // + // btnCancel + // + this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btnCancel.Location = new System.Drawing.Point(354, 227); + this.btnCancel.Name = "btnCancel"; + this.btnCancel.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.btnCancel.Size = new System.Drawing.Size(56, 23); + this.btnCancel.TabIndex = 1; + this.btnCancel.Text = "Cancel"; + this.btnCancel.UseVisualStyleBackColor = true; + this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click); + // + // btnApply + // + this.btnApply.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btnApply.Location = new System.Drawing.Point(416, 227); + this.btnApply.Name = "btnApply"; + this.btnApply.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.btnApply.Size = new System.Drawing.Size(56, 23); + this.btnApply.TabIndex = 2; + this.btnApply.Text = "Apply"; + this.btnApply.UseVisualStyleBackColor = true; + this.btnApply.Click += new System.EventHandler(this.btnApply_Click); + // + // splitContainer + // + this.splitContainer.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.splitContainer.Location = new System.Drawing.Point(12, 12); + this.splitContainer.Name = "splitContainer"; + // + // splitContainer.Panel1 + // + this.splitContainer.Panel1.Controls.Add(this.labelBrowser); + this.splitContainer.Panel1.Controls.Add(this.textBoxBrowserCSS); + this.splitContainer.Panel1MinSize = 64; + // + // splitContainer.Panel2 + // + this.splitContainer.Panel2.Controls.Add(this.labelNotification); + this.splitContainer.Panel2.Controls.Add(this.textBoxNotificationCSS); + this.splitContainer.Panel2MinSize = 64; + this.splitContainer.Size = new System.Drawing.Size(460, 209); + this.splitContainer.SplitterDistance = 226; + this.splitContainer.SplitterWidth = 5; + this.splitContainer.TabIndex = 5; + // + // labelBrowser + // + this.labelBrowser.AutoSize = true; + this.labelBrowser.Location = new System.Drawing.Point(-3, 0); + this.labelBrowser.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0); + this.labelBrowser.Name = "labelBrowser"; + this.labelBrowser.Size = new System.Drawing.Size(45, 13); + this.labelBrowser.TabIndex = 1; + this.labelBrowser.Text = "Browser"; + // + // labelNotification + // + this.labelNotification.AutoSize = true; + this.labelNotification.Location = new System.Drawing.Point(-3, 0); + this.labelNotification.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0); + this.labelNotification.Name = "labelNotification"; + this.labelNotification.Size = new System.Drawing.Size(60, 13); + this.labelNotification.TabIndex = 2; + this.labelNotification.Text = "Notification"; + // + // textBoxNotificationCSS + // + this.textBoxNotificationCSS.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBoxNotificationCSS.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.textBoxNotificationCSS.Location = new System.Drawing.Point(0, 16); + this.textBoxNotificationCSS.Margin = new System.Windows.Forms.Padding(0, 3, 0, 0); + this.textBoxNotificationCSS.Multiline = true; + this.textBoxNotificationCSS.Name = "textBoxNotificationCSS"; + this.textBoxNotificationCSS.Size = new System.Drawing.Size(227, 193); + this.textBoxNotificationCSS.TabIndex = 1; + this.textBoxNotificationCSS.WordWrap = false; + // + // labelWarning + // + this.labelWarning.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.labelWarning.AutoSize = true; + this.labelWarning.Location = new System.Drawing.Point(9, 232); + this.labelWarning.Name = "labelWarning"; + this.labelWarning.Size = new System.Drawing.Size(341, 13); + this.labelWarning.TabIndex = 6; + this.labelWarning.Text = "The code is not validated, please make sure there are no syntax errors."; + // + // DialogSettingsCSS + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(484, 262); + this.Controls.Add(this.labelWarning); + this.Controls.Add(this.splitContainer); + this.Controls.Add(this.btnApply); + this.Controls.Add(this.btnCancel); + this.MinimumSize = new System.Drawing.Size(500, 160); + this.Name = "DialogSettingsCSS"; + this.ShowIcon = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.splitContainer.Panel1.ResumeLayout(false); + this.splitContainer.Panel1.PerformLayout(); + this.splitContainer.Panel2.ResumeLayout(false); + this.splitContainer.Panel2.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit(); + this.splitContainer.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox textBoxBrowserCSS; + private System.Windows.Forms.Button btnCancel; + private System.Windows.Forms.Button btnApply; + private System.Windows.Forms.SplitContainer splitContainer; + private System.Windows.Forms.TextBox textBoxNotificationCSS; + private System.Windows.Forms.Label labelBrowser; + private System.Windows.Forms.Label labelNotification; + private System.Windows.Forms.Label labelWarning; + } +} \ No newline at end of file diff --git a/Core/Other/Settings/Dialogs/DialogSettingsCSS.cs b/Core/Other/Settings/Dialogs/DialogSettingsCSS.cs new file mode 100644 index 00000000..9e08cdc4 --- /dev/null +++ b/Core/Other/Settings/Dialogs/DialogSettingsCSS.cs @@ -0,0 +1,37 @@ +using System; +using System.Windows.Forms; + +namespace TweetDck.Core.Other.Settings.Dialogs{ + sealed partial class DialogSettingsCSS : Form{ + public string BrowserCSS{ + get{ + return textBoxBrowserCSS.Text; + } + } + + public string NotificationCSS{ + get{ + return textBoxNotificationCSS.Text; + } + } + + public DialogSettingsCSS(){ + InitializeComponent(); + + Text = Program.BrandName+" Settings - CSS"; + + textBoxBrowserCSS.Text = Program.UserConfig.CustomBrowserCSS ?? ""; + textBoxNotificationCSS.Text = Program.UserConfig.CustomNotificationCSS ?? ""; + } + + private void btnApply_Click(object sender, EventArgs e){ + DialogResult = DialogResult.OK; + Close(); + } + + private void btnCancel_Click(object sender, EventArgs e){ + DialogResult = DialogResult.Cancel; + Close(); + } + } +} diff --git a/Core/Other/Settings/TabSettingsAdvanced.Designer.cs b/Core/Other/Settings/TabSettingsAdvanced.Designer.cs index 113c8197..14e6b5f4 100644 --- a/Core/Other/Settings/TabSettingsAdvanced.Designer.cs +++ b/Core/Other/Settings/TabSettingsAdvanced.Designer.cs @@ -33,6 +33,7 @@ private void InitializeComponent() { this.btnExport = new System.Windows.Forms.Button(); this.groupPerformance = new System.Windows.Forms.GroupBox(); this.groupConfiguration = new System.Windows.Forms.GroupBox(); + this.btnEditCSS = new System.Windows.Forms.Button(); this.groupPerformance.SuspendLayout(); this.groupConfiguration.SuspendLayout(); this.SuspendLayout(); @@ -126,14 +127,26 @@ private void InitializeComponent() { // // groupConfiguration // + this.groupConfiguration.Controls.Add(this.btnEditCSS); this.groupConfiguration.Controls.Add(this.btnEditCefArgs); this.groupConfiguration.Location = new System.Drawing.Point(9, 89); this.groupConfiguration.Name = "groupConfiguration"; - this.groupConfiguration.Size = new System.Drawing.Size(183, 48); + this.groupConfiguration.Size = new System.Drawing.Size(183, 77); this.groupConfiguration.TabIndex = 19; this.groupConfiguration.TabStop = false; this.groupConfiguration.Text = "Configuration"; // + // btnEditCSS + // + this.btnEditCSS.Location = new System.Drawing.Point(6, 48); + this.btnEditCSS.Name = "btnEditCSS"; + this.btnEditCSS.Size = new System.Drawing.Size(171, 23); + this.btnEditCSS.TabIndex = 16; + this.btnEditCSS.Text = "Edit CSS"; + this.toolTip.SetToolTip(this.btnEditCSS, "Set custom CSS for browser and notification windows."); + this.btnEditCSS.UseVisualStyleBackColor = true; + this.btnEditCSS.Click += new System.EventHandler(this.btnEditCSS_Click); + // // TabSettingsAdvanced // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -164,5 +177,6 @@ private void InitializeComponent() { private System.Windows.Forms.GroupBox groupPerformance; private System.Windows.Forms.GroupBox groupConfiguration; private System.Windows.Forms.Button btnEditCefArgs; + private System.Windows.Forms.Button btnEditCSS; } } diff --git a/Core/Other/Settings/TabSettingsAdvanced.cs b/Core/Other/Settings/TabSettingsAdvanced.cs index 8e910633..3b5e5066 100644 --- a/Core/Other/Settings/TabSettingsAdvanced.cs +++ b/Core/Other/Settings/TabSettingsAdvanced.cs @@ -8,9 +8,13 @@ namespace TweetDck.Core.Other.Settings{ partial class TabSettingsAdvanced : BaseTabSettings{ - public TabSettingsAdvanced(){ + private readonly Action browserReloadAction; + + public TabSettingsAdvanced(Action browserReloadAction){ InitializeComponent(); + this.browserReloadAction = browserReloadAction; + checkHardwareAcceleration.Checked = HardwareAcceleration.IsEnabled; BrowserCache.CalculateCacheSize(bytes => this.InvokeSafe(() => { @@ -68,6 +72,21 @@ private void btnEditCefArgs_Click(object sender, EventArgs e){ } } + private void btnEditCSS_Click(object sender, EventArgs e){ + DialogSettingsCSS form = new DialogSettingsCSS(); + + if (form.ShowDialog(ParentForm) == DialogResult.OK){ + bool hasChangedBrowser = form.BrowserCSS != Config.CustomBrowserCSS; + + Config.CustomBrowserCSS = form.BrowserCSS; + Config.CustomNotificationCSS = form.NotificationCSS; + + if (hasChangedBrowser && MessageBox.Show("The browser CSS has changed, do you want to reload it?","Browser CSS Changed",MessageBoxButtons.YesNo,MessageBoxIcon.Question,MessageBoxDefaultButton.Button2) == DialogResult.Yes){ + browserReloadAction(); + } + } + } + private void btnExport_Click(object sender, EventArgs e){ DialogResult resultSaveCredentials = MessageBox.Show("Do you want to include your login session? This will not save your password into the file, but it will allow anyone with the file to login into TweetDeck as you.","Export "+Program.BrandName+" Settings",MessageBoxButtons.YesNoCancel,MessageBoxIcon.Question,MessageBoxDefaultButton.Button3); if (resultSaveCredentials == DialogResult.Cancel)return; diff --git a/Resources/Scripts/code.js b/Resources/Scripts/code.js index 4e38533a..947d4ecd 100644 --- a/Resources/Scripts/code.js +++ b/Resources/Scripts/code.js @@ -399,12 +399,14 @@ // Block: Inject custom CSS and layout into the page. // (function(){ - var style = document.createElement("style"); - document.head.appendChild(style); + var styleOfficial = document.createElement("style"); + document.head.appendChild(styleOfficial); + styleOfficial.sheet.insertRule("a[data-full-url] { word-break: break-all; }",0); // break long urls - var sheet = style.sheet; - - // break long urls - sheet.insertRule("a[data-full-url] { word-break: break-all; }",0); + if ($TD.hasCustomBrowserCSS){ + var styleCustom = document.createElement("style"); + styleCustom.innerHTML = $TD.customBrowserCSS; + document.head.appendChild(styleCustom); + } })(); })($,$TD,TD); diff --git a/TweetDck.csproj b/TweetDck.csproj index 32590bd1..d43782d9 100644 --- a/TweetDck.csproj +++ b/TweetDck.csproj @@ -129,6 +129,12 @@ <Compile Include="Core\Other\FormPlugins.Designer.cs"> <DependentUpon>FormPlugins.cs</DependentUpon> </Compile> + <Compile Include="Core\Other\Settings\Dialogs\DialogSettingsCSS.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Core\Other\Settings\Dialogs\DialogSettingsCSS.Designer.cs"> + <DependentUpon>DialogSettingsCSS.cs</DependentUpon> + </Compile> <Compile Include="Core\Other\Settings\Dialogs\DialogSettingsCefArgs.cs"> <SubType>Form</SubType> </Compile>