diff --git a/Core/Bridge/TweetDeckBridge.cs b/Core/Bridge/TweetDeckBridge.cs index 6b885b8e..de747ddc 100644 --- a/Core/Bridge/TweetDeckBridge.cs +++ b/Core/Bridge/TweetDeckBridge.cs @@ -14,11 +14,12 @@ sealed class TweetDeckBridge{ public static string LastRightClickedImage = string.Empty; public static string LastHighlightedTweet = string.Empty; public static string LastHighlightedQuotedTweet = string.Empty; + public static string LastHighlightedTweetAuthor = string.Empty; public static string[] LastHighlightedTweetImages = StringUtils.EmptyArray; public static Dictionary<string, string> SessionData = new Dictionary<string, string>(2); public static void ResetStaticProperties(){ - LastRightClickedLink = LastRightClickedImage = LastHighlightedTweet = LastHighlightedQuotedTweet = string.Empty; + LastRightClickedLink = LastRightClickedImage = LastHighlightedTweet = LastHighlightedQuotedTweet = LastHighlightedTweetAuthor = string.Empty; LastHighlightedTweetImages = StringUtils.EmptyArray; } @@ -63,10 +64,11 @@ public void SetLastRightClickedImage(string link){ form.InvokeAsyncSafe(() => LastRightClickedImage = link); } - public void SetLastHighlightedTweet(string link, string quotedLink, string imageList){ + public void SetLastHighlightedTweet(string link, string quotedLink, string author, string imageList){ form.InvokeAsyncSafe(() => { LastHighlightedTweet = link; LastHighlightedQuotedTweet = quotedLink; + LastHighlightedTweetAuthor = author; LastHighlightedTweetImages = imageList.Split(';'); }); } diff --git a/Core/Handling/ContextMenuBase.cs b/Core/Handling/ContextMenuBase.cs index dc587a38..6d78b3bd 100644 --- a/Core/Handling/ContextMenuBase.cs +++ b/Core/Handling/ContextMenuBase.cs @@ -32,6 +32,7 @@ private static string GetImage(IContextMenuParams parameters){ private readonly Form form; + private string lastHighlightedTweetAuthor; private string[] lastHighlightedTweetImageList; protected ContextMenuBase(Form form){ @@ -40,9 +41,11 @@ protected ContextMenuBase(Form form){ public virtual void OnBeforeContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model){ bool hasTweetImage = !string.IsNullOrEmpty(TweetDeckBridge.LastRightClickedImage); + lastHighlightedTweetAuthor = TweetDeckBridge.LastHighlightedTweetAuthor; lastHighlightedTweetImageList = TweetDeckBridge.LastHighlightedTweetImages; if (!TwitterUtils.IsTweetDeckWebsite(frame) || browser.IsLoading){ + lastHighlightedTweetAuthor = string.Empty; lastHighlightedTweetImageList = StringUtils.EmptyArray; } @@ -88,11 +91,11 @@ public virtual bool OnContextMenuCommand(IWebBrowser browserControl, IBrowser br break; case MenuSaveImage: - TwitterUtils.DownloadImage(GetImage(parameters), ImageQuality); + TwitterUtils.DownloadImage(GetImage(parameters), lastHighlightedTweetAuthor, ImageQuality); break; case MenuSaveAllImages: - TwitterUtils.DownloadImages(lastHighlightedTweetImageList, ImageQuality); + TwitterUtils.DownloadImages(lastHighlightedTweetImageList, lastHighlightedTweetAuthor, ImageQuality); break; case MenuCopyImageUrl: diff --git a/Core/Utils/TwitterUtils.cs b/Core/Utils/TwitterUtils.cs index 298fd1b7..02ddbb07 100644 --- a/Core/Utils/TwitterUtils.cs +++ b/Core/Utils/TwitterUtils.cs @@ -2,6 +2,7 @@ using CefSharp; using System.Drawing; using System.IO; +using System.Linq; using System.Text.RegularExpressions; using System.Windows.Forms; using TweetDuck.Core.Other; @@ -52,23 +53,32 @@ public static string GetImageLink(string url, ImageQuality quality){ } } - public static void DownloadImage(string url, ImageQuality quality){ - DownloadImages(new string[]{ url }, quality); + public static void DownloadImage(string url, string username, ImageQuality quality){ + DownloadImages(new string[]{ url }, username, quality); } - public static void DownloadImages(string[] urls, ImageQuality quality){ + public static void DownloadImages(string[] urls, string username, ImageQuality quality){ if (urls.Length == 0){ return; } - string file = BrowserUtils.GetFileNameFromUrl(ExtractImageBaseLink(urls[0])); + string firstImageLink = GetImageLink(urls[0], quality); + int qualityIndex = firstImageLink.LastIndexOf(':'); + + string file = BrowserUtils.GetFileNameFromUrl(ExtractImageBaseLink(firstImageLink)); string ext = Path.GetExtension(file); // includes dot + + string[] fileNameParts = { + username, + Path.ChangeExtension(file, null), + qualityIndex == -1 ? string.Empty : firstImageLink.Substring(qualityIndex+1) + }; using(SaveFileDialog dialog = new SaveFileDialog{ AutoUpgradeEnabled = true, OverwritePrompt = urls.Length == 1, Title = "Save image", - FileName = file, + FileName = $"{string.Join(" ", fileNameParts.Where(part => part.Length > 0))}{ext}", Filter = (urls.Length == 1 ? "Image" : "Images")+(string.IsNullOrEmpty(ext) ? " (unknown)|*.*" : $" (*{ext})|*{ext}") }){ if (dialog.ShowDialog() == DialogResult.OK){ @@ -77,14 +87,14 @@ void OnFailure(Exception ex){ } if (urls.Length == 1){ - BrowserUtils.DownloadFileAsync(GetImageLink(urls[0], quality), dialog.FileName, null, OnFailure); + BrowserUtils.DownloadFileAsync(firstImageLink, dialog.FileName, null, OnFailure); } else{ string pathBase = Path.ChangeExtension(dialog.FileName, null); string pathExt = Path.GetExtension(dialog.FileName); for(int index = 0; index < urls.Length; index++){ - BrowserUtils.DownloadFileAsync(GetImageLink(urls[index], quality), pathBase+(index+1)+pathExt, null, OnFailure); + BrowserUtils.DownloadFileAsync(GetImageLink(urls[index], quality), $"{pathBase} {index+1}{pathExt}", null, OnFailure); } } } diff --git a/Resources/Scripts/code.js b/Resources/Scripts/code.js index 8b2c969e..dfab54a8 100644 --- a/Resources/Scripts/code.js +++ b/Resources/Scripts/code.js @@ -391,12 +391,12 @@ return !!highlightedColumnObj; }; - var updateHighlightedTweet = function(ele, obj, link, embeddedLink, imageList){ + var updateHighlightedTweet = function(ele, obj, link, embeddedLink, author, imageList){ highlightedTweetEle = ele; highlightedTweetObj = obj; if (lastTweet !== link){ - $TD.setLastHighlightedTweet(link, embeddedLink, imageList); + $TD.setLastHighlightedTweet(link, embeddedLink, author, imageList); lastTweet = link; } }; @@ -426,18 +426,19 @@ if (tweet.chirpType === TD.services.ChirpBase.TWEET){ let link = tweet.getChirpURL(); let embedded = tweet.quotedTweet ? tweet.quotedTweet.getChirpURL() : ""; + let username = tweet.getMainUser().screenName; let images = tweet.hasImage() ? tweet.getMedia().filter(item => !item.isAnimatedGif).map(item => item.entity.media_url_https+":small").join(";") : ""; // TODO maybe handle embedded images too? - updateHighlightedTweet(me, tweet, link || "", embedded || "", images); + updateHighlightedTweet(me, tweet, link || "", embedded || "", username, images); } else{ - updateHighlightedTweet(me, tweet, "", "", ""); + updateHighlightedTweet(me, tweet, "", "", "", ""); } } } else if (e.type === "mouseleave"){ - updateHighlightedTweet(null, null, "", "", ""); + updateHighlightedTweet(null, null, "", "", "", ""); } }); })();