diff --git a/Configuration/UserConfig.cs b/Configuration/UserConfig.cs index 17c6a3ea..44c47744 100644 --- a/Configuration/UserConfig.cs +++ b/Configuration/UserConfig.cs @@ -53,6 +53,7 @@ static UserConfig(){ public string DismissedUpdate { get; set; } = null; public bool DisplayNotificationColumn { get; set; } = false; + public bool NotificationMediaPreviews { get; set; } = true; public bool NotificationSkipOnLinkClick { get; set; } = false; public bool NotificationNonIntrusiveMode { get; set; } = true; public int NotificationIdlePauseSeconds { get; set; } = 0; diff --git a/Core/Bridge/PropertyBridge.cs b/Core/Bridge/PropertyBridge.cs index fab66dc5..4f3ecb1d 100644 --- a/Core/Bridge/PropertyBridge.cs +++ b/Core/Bridge/PropertyBridge.cs @@ -10,7 +10,8 @@ public enum Properties{ HasCustomNotificationSound = 4, SkipOnLinkClick = 8, SwitchAccountSelectors = 16, - AllBrowser = ExpandLinksOnHover | SwitchAccountSelectors | MuteNotifications | HasCustomNotificationSound, + NotificationMediaPreviews = 32, + AllBrowser = ExpandLinksOnHover | SwitchAccountSelectors | MuteNotifications | HasCustomNotificationSound | NotificationMediaPreviews, AllNotification = ExpandLinksOnHover | SkipOnLinkClick } @@ -34,6 +35,10 @@ public static string GenerateScript(Properties properties){ build.Append("c.hasCustomNotificationSound=").Append(Program.UserConfig.NotificationSoundPath.Length > 0 ? "true;" : "false;"); } + if (properties.HasFlag(Properties.NotificationMediaPreviews)){ + build.Append("c.notificationMediaPreviews=").Append(Program.UserConfig.NotificationMediaPreviews ? "true;" : "false;"); + } + if (properties.HasFlag(Properties.SkipOnLinkClick)){ build.Append("c.skipOnLinkClick=").Append(Program.UserConfig.NotificationSkipOnLinkClick ? "true;" : "false;"); } diff --git a/Core/FormBrowser.cs b/Core/FormBrowser.cs index ba26e163..470b0ef1 100644 --- a/Core/FormBrowser.cs +++ b/Core/FormBrowser.cs @@ -463,7 +463,7 @@ public void OpenSettings(Type startTab){ memoryUsageTracker.Stop(); } - UpdateProperties(PropertyBridge.Properties.ExpandLinksOnHover | PropertyBridge.Properties.SwitchAccountSelectors | PropertyBridge.Properties.HasCustomNotificationSound); + UpdateProperties(PropertyBridge.Properties.ExpandLinksOnHover | PropertyBridge.Properties.SwitchAccountSelectors | PropertyBridge.Properties.HasCustomNotificationSound | PropertyBridge.Properties.NotificationMediaPreviews); notification.RequiresResize = true; form.Dispose(); diff --git a/Core/Notification/TweetNotification.cs b/Core/Notification/TweetNotification.cs index 66e099fd..ade3f23e 100644 --- a/Core/Notification/TweetNotification.cs +++ b/Core/Notification/TweetNotification.cs @@ -9,7 +9,7 @@ sealed class TweetNotification{ private const string DefaultFontSizeClass = "medium"; private const string DefaultHeadTag = @"<meta charset='utf-8'><meta http-equiv='X-UA-Compatible' content='chrome=1'><link rel='stylesheet' href='https://ton.twimg.com/tweetdeck-web/web/css/font.5ef884f9f9.css'><link rel='stylesheet' href='https://ton.twimg.com/tweetdeck-web/web/css/app-dark.5631e0dd42.css'><style type='text/css'>body{background:#222426}</style>"; - private const string CustomCSS = @"body:before{content:none}body{overflow-y:auto}.scroll-styled-v::-webkit-scrollbar{width:7px}.scroll-styled-v::-webkit-scrollbar-thumb{border-radius:0}.scroll-styled-v::-webkit-scrollbar-track{border-left:0}#td-skip{opacity:0;cursor:pointer;transition:opacity 0.15s ease}.td-hover #td-skip{opacity:0.75}#td-skip:hover{opacity:1}"; + private const string CustomCSS = @"body:before{content:none}body{overflow-y:auto}.scroll-styled-v::-webkit-scrollbar{width:7px}.scroll-styled-v::-webkit-scrollbar-thumb{border-radius:0}.scroll-styled-v::-webkit-scrollbar-track{border-left:0}#td-skip{opacity:0;cursor:pointer;transition:opacity 0.15s ease}.td-hover #td-skip{opacity:0.75}#td-skip:hover{opacity:1}.media-size-medium{height:calc(100vh - 16px)!important;max-height:240px;border-radius:1px!important}.js-quote-detail .media-size-medium{height:calc(100vh - 28px)!important;}.js-media.margin-vm, .js-media-preview-container.margin-vm{margin-bottom:0!important}"; public static int FontSizeLevel{ get{ diff --git a/Core/Other/Settings/TabSettingsNotifications.Designer.cs b/Core/Other/Settings/TabSettingsNotifications.Designer.cs index b809e43f..e2710a84 100644 --- a/Core/Other/Settings/TabSettingsNotifications.Designer.cs +++ b/Core/Other/Settings/TabSettingsNotifications.Designer.cs @@ -63,6 +63,7 @@ private void InitializeComponent() { this.labelSize = new System.Windows.Forms.Label(); this.panelMiscellaneous = new System.Windows.Forms.Panel(); this.durationUpdateTimer = new System.Windows.Forms.Timer(this.components); + this.checkMediaPreviews = new System.Windows.Forms.CheckBox(); ((System.ComponentModel.ISupportInitialize)(this.trackBarEdgeDistance)).BeginInit(); this.tableLayoutDurationButtons.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.trackBarDuration)).BeginInit(); @@ -273,11 +274,11 @@ private void InitializeComponent() { // checkSkipOnLinkClick // this.checkSkipOnLinkClick.AutoSize = true; - this.checkSkipOnLinkClick.Location = new System.Drawing.Point(6, 28); + this.checkSkipOnLinkClick.Location = new System.Drawing.Point(6, 51); this.checkSkipOnLinkClick.Margin = new System.Windows.Forms.Padding(6, 3, 3, 3); this.checkSkipOnLinkClick.Name = "checkSkipOnLinkClick"; this.checkSkipOnLinkClick.Size = new System.Drawing.Size(113, 17); - this.checkSkipOnLinkClick.TabIndex = 1; + this.checkSkipOnLinkClick.TabIndex = 2; this.checkSkipOnLinkClick.Text = "Skip On Link Click"; this.toolTip.SetToolTip(this.checkSkipOnLinkClick, "Skips current notification when a link\r\ninside the notification is clicked."); this.checkSkipOnLinkClick.UseVisualStyleBackColor = true; @@ -297,32 +298,32 @@ private void InitializeComponent() { // labelIdlePause // this.labelIdlePause.AutoSize = true; - this.labelIdlePause.Location = new System.Drawing.Point(3, 83); + this.labelIdlePause.Location = new System.Drawing.Point(3, 106); this.labelIdlePause.Margin = new System.Windows.Forms.Padding(3, 12, 3, 0); this.labelIdlePause.Name = "labelIdlePause"; this.labelIdlePause.Size = new System.Drawing.Size(89, 13); - this.labelIdlePause.TabIndex = 3; + this.labelIdlePause.TabIndex = 4; this.labelIdlePause.Text = "Pause When Idle"; // // comboBoxIdlePause // this.comboBoxIdlePause.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.comboBoxIdlePause.FormattingEnabled = true; - this.comboBoxIdlePause.Location = new System.Drawing.Point(5, 99); + this.comboBoxIdlePause.Location = new System.Drawing.Point(5, 122); this.comboBoxIdlePause.Margin = new System.Windows.Forms.Padding(5, 3, 3, 3); this.comboBoxIdlePause.Name = "comboBoxIdlePause"; this.comboBoxIdlePause.Size = new System.Drawing.Size(144, 21); - this.comboBoxIdlePause.TabIndex = 4; + this.comboBoxIdlePause.TabIndex = 5; this.toolTip.SetToolTip(this.comboBoxIdlePause, "Pauses new notifications after going idle for a set amount of time."); // // checkNonIntrusive // this.checkNonIntrusive.AutoSize = true; - this.checkNonIntrusive.Location = new System.Drawing.Point(6, 51); + this.checkNonIntrusive.Location = new System.Drawing.Point(6, 74); this.checkNonIntrusive.Margin = new System.Windows.Forms.Padding(6, 3, 3, 3); this.checkNonIntrusive.Name = "checkNonIntrusive"; this.checkNonIntrusive.Size = new System.Drawing.Size(128, 17); - this.checkNonIntrusive.TabIndex = 2; + this.checkNonIntrusive.TabIndex = 3; this.checkNonIntrusive.Text = "Non-Intrusive Popups"; this.toolTip.SetToolTip(this.checkNonIntrusive, "When not idle and the cursor is within the notification window area,\r\nit will be delayed until the cursor moves away to prevent accidental clicks."); this.checkNonIntrusive.UseVisualStyleBackColor = true; @@ -389,6 +390,7 @@ private void InitializeComponent() { // this.panelGeneral.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); + this.panelGeneral.Controls.Add(this.checkMediaPreviews); this.panelGeneral.Controls.Add(this.checkColumnName); this.panelGeneral.Controls.Add(this.checkSkipOnLinkClick); this.panelGeneral.Controls.Add(this.checkNonIntrusive); @@ -396,7 +398,7 @@ private void InitializeComponent() { this.panelGeneral.Controls.Add(this.comboBoxIdlePause); this.panelGeneral.Location = new System.Drawing.Point(9, 31); this.panelGeneral.Name = "panelGeneral"; - this.panelGeneral.Size = new System.Drawing.Size(322, 126); + this.panelGeneral.Size = new System.Drawing.Size(322, 149); this.panelGeneral.TabIndex = 1; // // labelScrollSpeedValue @@ -437,7 +439,7 @@ private void InitializeComponent() { // this.labelLocation.AutoSize = true; this.labelLocation.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.labelLocation.Location = new System.Drawing.Point(6, 372); + this.labelLocation.Location = new System.Drawing.Point(6, 395); this.labelLocation.Margin = new System.Windows.Forms.Padding(0, 21, 0, 0); this.labelLocation.Name = "labelLocation"; this.labelLocation.Size = new System.Drawing.Size(70, 20); @@ -458,7 +460,7 @@ private void InitializeComponent() { this.panelLocation.Controls.Add(this.radioLocBL); this.panelLocation.Controls.Add(this.radioLocCustom); this.panelLocation.Controls.Add(this.radioLocBR); - this.panelLocation.Location = new System.Drawing.Point(9, 395); + this.panelLocation.Location = new System.Drawing.Point(9, 418); this.panelLocation.Name = "panelLocation"; this.panelLocation.Size = new System.Drawing.Size(322, 165); this.panelLocation.TabIndex = 5; @@ -473,7 +475,7 @@ private void InitializeComponent() { this.panelTimer.Controls.Add(this.checkTimerCountDown); this.panelTimer.Controls.Add(this.labelDurationValue); this.panelTimer.Controls.Add(this.trackBarDuration); - this.panelTimer.Location = new System.Drawing.Point(9, 204); + this.panelTimer.Location = new System.Drawing.Point(9, 227); this.panelTimer.Name = "panelTimer"; this.panelTimer.Size = new System.Drawing.Size(322, 144); this.panelTimer.TabIndex = 3; @@ -492,7 +494,7 @@ private void InitializeComponent() { // this.labelTimer.AutoSize = true; this.labelTimer.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.labelTimer.Location = new System.Drawing.Point(6, 181); + this.labelTimer.Location = new System.Drawing.Point(6, 204); this.labelTimer.Margin = new System.Windows.Forms.Padding(0, 21, 0, 0); this.labelTimer.Name = "labelTimer"; this.labelTimer.Size = new System.Drawing.Size(48, 20); @@ -503,7 +505,7 @@ private void InitializeComponent() { // this.labelSize.AutoSize = true; this.labelSize.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); - this.labelSize.Location = new System.Drawing.Point(6, 584); + this.labelSize.Location = new System.Drawing.Point(6, 607); this.labelSize.Margin = new System.Windows.Forms.Padding(0, 21, 0, 0); this.labelSize.Name = "labelSize"; this.labelSize.Size = new System.Drawing.Size(40, 20); @@ -519,7 +521,7 @@ private void InitializeComponent() { this.panelMiscellaneous.Controls.Add(this.labelScrollSpeedValue); this.panelMiscellaneous.Controls.Add(this.trackBarScrollSpeed); this.panelMiscellaneous.Controls.Add(this.labelScrollSpeed); - this.panelMiscellaneous.Location = new System.Drawing.Point(9, 607); + this.panelMiscellaneous.Location = new System.Drawing.Point(9, 630); this.panelMiscellaneous.Name = "panelMiscellaneous"; this.panelMiscellaneous.Size = new System.Drawing.Size(322, 92); this.panelMiscellaneous.TabIndex = 7; @@ -529,6 +531,18 @@ private void InitializeComponent() { this.durationUpdateTimer.Interval = 200; this.durationUpdateTimer.Tick += new System.EventHandler(this.durationUpdateTimer_Tick); // + // checkMediaPreviews + // + this.checkMediaPreviews.AutoSize = true; + this.checkMediaPreviews.Location = new System.Drawing.Point(6, 28); + this.checkMediaPreviews.Margin = new System.Windows.Forms.Padding(6, 3, 3, 3); + this.checkMediaPreviews.Name = "checkMediaPreviews"; + this.checkMediaPreviews.Size = new System.Drawing.Size(131, 17); + this.checkMediaPreviews.TabIndex = 1; + this.checkMediaPreviews.Text = "Show Media Previews"; + this.toolTip.SetToolTip(this.checkMediaPreviews, "Shows image and video thumbnails in the notification window."); + this.checkMediaPreviews.UseVisualStyleBackColor = true; + // // TabSettingsNotifications // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -542,7 +556,7 @@ private void InitializeComponent() { this.Controls.Add(this.labelGeneral); this.Controls.Add(this.panelTimer); this.Name = "TabSettingsNotifications"; - this.Size = new System.Drawing.Size(340, 708); + this.Size = new System.Drawing.Size(340, 731); this.ParentChanged += new System.EventHandler(this.TabSettingsNotifications_ParentChanged); ((System.ComponentModel.ISupportInitialize)(this.trackBarEdgeDistance)).EndInit(); this.tableLayoutDurationButtons.ResumeLayout(false); @@ -601,5 +615,6 @@ private void InitializeComponent() { private System.Windows.Forms.Timer durationUpdateTimer; private System.Windows.Forms.RadioButton radioSizeCustom; private System.Windows.Forms.RadioButton radioSizeAuto; + private System.Windows.Forms.CheckBox checkMediaPreviews; } } diff --git a/Core/Other/Settings/TabSettingsNotifications.cs b/Core/Other/Settings/TabSettingsNotifications.cs index aff1c437..b5a081f0 100644 --- a/Core/Other/Settings/TabSettingsNotifications.cs +++ b/Core/Other/Settings/TabSettingsNotifications.cs @@ -63,6 +63,7 @@ public TabSettingsNotifications(FormNotificationMain notification){ checkNotificationTimer.Checked = Config.DisplayNotificationTimer; checkTimerCountDown.Enabled = checkNotificationTimer.Checked; checkTimerCountDown.Checked = Config.NotificationTimerCountDown; + checkMediaPreviews.Checked = Config.NotificationMediaPreviews; checkSkipOnLinkClick.Checked = Config.NotificationSkipOnLinkClick; checkNonIntrusive.Checked = Config.NotificationNonIntrusiveMode; @@ -96,6 +97,7 @@ public override void OnReady(){ checkColumnName.CheckedChanged += checkColumnName_CheckedChanged; checkNotificationTimer.CheckedChanged += checkNotificationTimer_CheckedChanged; checkTimerCountDown.CheckedChanged += checkTimerCountDown_CheckedChanged; + checkMediaPreviews.CheckedChanged += checkMediaPreviews_CheckedChanged; checkSkipOnLinkClick.CheckedChanged += checkSkipOnLinkClick_CheckedChanged; checkNonIntrusive.CheckedChanged += checkNonIntrusive_CheckedChanged; @@ -218,6 +220,10 @@ private void checkTimerCountDown_CheckedChanged(object sender, EventArgs e){ notification.ShowNotificationForSettings(true); } + private void checkMediaPreviews_CheckedChanged(object sender, EventArgs e){ + Config.NotificationMediaPreviews = checkMediaPreviews.Checked; + } + private void checkSkipOnLinkClick_CheckedChanged(object sender, EventArgs e){ Config.NotificationSkipOnLinkClick = checkSkipOnLinkClick.Checked; } diff --git a/Resources/Scripts/code.js b/Resources/Scripts/code.js index 8cafb745..f1acf385 100644 --- a/Resources/Scripts/code.js +++ b/Resources/Scripts/code.js @@ -124,26 +124,48 @@ return false; }; + let fixMedia = (html, media) => { + return html.find(".js-media a[data-media-entity-id='"+media.mediaId+"']").css("background-image", 'url("'+media.thumb()+'")').removeClass("is-zoomable"); + }; + return function(column, tweet){ if (checkRecentTweet(tweet.id)){ return; } if (column.model.getHasNotification()){ + let previews = $TDX.notificationMediaPreviews; + let html = $(tweet.render({ withFooter: false, withTweetActions: false, withMediaPreview: true, - isMediaPreviewOff: true, - isMediaPreviewSmall: false, - isMediaPreviewLarge: false + isMediaPreviewOff: !previews, + isMediaPreviewSmall: previews, + isMediaPreviewLarge: false, + isMediaPreviewCompact: false, + isMediaPreviewInQuoted: previews, + thumbSizeClass: "media-size-medium" })); - + html.css("border", "0"); html.find("footer").last().remove(); // apparently withTweetActions breaks for certain tweets, nice - html.find(".js-media").last().remove(); // and quoted tweets still show media previews, nice nice - html.find(".js-quote-detail").removeClass("is-actionable"); // prevent quoted tweets from changing the cursor - + html.find(".js-quote-detail").removeClass("is-actionable margin-b--8"); // prevent quoted tweets from changing the cursor and reduce bottom margin + + if (previews){ + html.find(".reverse-image-search").remove(); + + for(let media of tweet.getMedia()){ + fixMedia(html, media); + } + + if (tweet.quotedTweet){ + for(let media of tweet.quotedTweet.getMedia()){ + fixMedia(html, media).addClass("media-size-medium"); + } + } + } + html.find("a[href='#']").each(function(){ // remove <a> tags around links that don't lead anywhere (such as account names the tweet replied to) this.outerHTML = this.innerHTML; });