1
0
mirror of https://github.com/chylex/TweetDuck.git synced 2025-09-14 10:32:10 +02:00

Compare commits

...

23 Commits
1.16 ... 1.16.3

Author SHA1 Message Date
1b5304efb7 Release 1.16.3 2018-11-07 11:55:37 +01:00
d59375308f Work around clear-columns plugin reappearing after being disabled
Closes #240
2018-11-07 11:16:44 +01:00
8c9509a906 Fix broken colors of plugin elements with dark theme 2018-11-07 10:27:08 +01:00
fb86d8f3a8 Fix broken black theme colors 2018-11-07 10:18:24 +01:00
50e909cb3d Move debug TweetDeck resource freezing and update it to support CSS 2018-11-07 05:45:20 +01:00
2f54edf7e7 Fix missing <body> margin reset 2018-11-07 00:26:43 +01:00
c251603e1e Fix broken Arial font override 2018-11-07 00:26:22 +01:00
4476edb6c3 Release 1.16.2 2018-10-18 22:31:28 +02:00
28fc67660f Fix border color of large timeline cards 2018-10-18 22:30:11 +02:00
6e8b5a5ce5 Bypass t.co in new timeline cards 2018-10-18 21:26:03 +02:00
e53681416f Fix TweetDeck update breaking theme setting in edit-design plugin 2018-10-18 20:44:09 +02:00
acb5e184e8 Update styles for new timeline cards (rounded borders, black theme colors) 2018-10-18 20:36:42 +02:00
bdbafb3e5c Fix rounded borders in media badges and sensitive media overlay 2018-10-02 01:18:43 +02:00
ac70cf87c6 Fix slight misalignments in tweet composer elements when using old icons 2018-09-27 22:03:00 +02:00
93de835ab4 Fix rounded borders in composer (media elements & media description dialog) 2018-09-27 22:01:34 +02:00
2ea38b88ce Release 1.16.1 2018-08-28 21:11:31 +02:00
2c4f2be57d Support system font in notifications, but revert to Arial everywhere by default 2018-08-28 21:06:53 +02:00
fa4beea425 Reset script cache when holding Shift during browser reload 2018-08-24 16:34:55 +02:00
7a976edc82 Ignore cached files for updates and viewed images if their contents are empty 2018-08-23 20:08:34 +02:00
bb22c35221 Fix broken context menu options for images in DMs
Closes #238
2018-08-23 19:51:43 +02:00
ff3dc59016 Move 'View image in photo viewer' handling to TwitterUtils 2018-08-23 19:32:20 +02:00
2e4dd3df3e Fix column icon alignment & clear icon not being hidden for certain columns 2018-08-18 14:55:08 +02:00
b82e5d33f9 Add .column to data-td-icon attribute selectors (very minor optimization) 2018-08-18 14:41:30 +02:00
18 changed files with 240 additions and 99 deletions

View File

@@ -15,6 +15,7 @@ using TweetDuck.Core.Other.Settings.Dialogs;
using TweetDuck.Core.Utils;
using TweetDuck.Plugins;
using TweetDuck.Plugins.Events;
using TweetDuck.Resources;
using TweetDuck.Updates;
namespace TweetDuck.Core{
@@ -365,7 +366,11 @@ namespace TweetDuck.Core{
public void ReloadToTweetDeck(){
#if DEBUG
Resources.ScriptLoader.HotSwap();
ScriptLoader.HotSwap();
#else
if (ModifierKeys.HasFlag(Keys.Shift)){
ScriptLoader.ClearCache();
}
#endif
ignoreUpdateCheckError = false;

View File

@@ -1,5 +1,4 @@
using System;
using System.IO;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using CefSharp;
@@ -123,33 +122,11 @@ namespace TweetDuck.Core.Handling{
break;
case MenuViewImage: {
void ViewImage(string path){
string ext = Path.GetExtension(path);
if (TwitterUtils.ValidImageExtensions.Contains(ext)){
WindowsUtils.OpenAssociatedProgram(path);
}
else{
FormMessage.Error("Image Download", "Invalid file extension "+ext, FormMessage.OK);
}
}
string url = Context.MediaUrl;
string file = Path.Combine(BrowserCache.CacheFolder, TwitterUtils.GetImageFileName(url) ?? Path.GetRandomFileName());
control.InvokeAsyncSafe(() => {
if (File.Exists(file)){
ViewImage(file);
}
else{
analytics.AnalyticsFile.ViewedImages.Trigger();
BrowserUtils.DownloadFileAsync(TwitterUtils.GetMediaLink(url, ImageQuality), file, () => {
ViewImage(file);
}, ex => {
FormMessage.Error("Image Download", "An error occurred while downloading the image: "+ex.Message, FormMessage.OK);
});
}
TwitterUtils.ViewImage(url, ImageQuality);
analytics.AnalyticsFile.ViewedImages.Trigger();
});
break;

View File

@@ -1,9 +1,18 @@
using System.Collections.Specialized;
// Uncomment to force TweetDeck to load a predefined version of the vendor/bundle scripts and stylesheets
// #define FREEZE_TWEETDECK_RESOURCES
using System.Collections.Specialized;
using CefSharp;
using CefSharp.Handler;
using TweetDuck.Core.Handling.General;
using TweetDuck.Core.Utils;
#if FREEZE_TWEETDECK_RESOURCES
using System.Collections.Generic;
using System.Diagnostics;
using System.Text.RegularExpressions;
#endif
namespace TweetDuck.Core.Handling{
class RequestHandlerBase : DefaultRequestHandler{
private readonly bool autoReload;
@@ -31,5 +40,36 @@ namespace TweetDuck.Core.Handling{
browser.Reload();
}
}
#if FREEZE_TWEETDECK_RESOURCES
private static readonly Regex TweetDeckResourceUrl = new Regex(@"/dist/(.*?)\.(.*?)\.(css|js)$", RegexOptions.Compiled);
private static readonly SortedList<string, string> TweetDeckHashes = new SortedList<string, string>(2){
{ "vendor.js", "d897f6b9ed" },
{ "bundle.js", "851d3877b9" },
{ "vendor.css", "ce7cdd10b6" },
{ "bundle.css", "c339f07047" }
};
public override bool OnResourceResponse(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response){
if (request.ResourceType == ResourceType.Script || request.ResourceType == ResourceType.Stylesheet){
string url = request.Url;
Match match = TweetDeckResourceUrl.Match(url);
if (match.Success && TweetDeckHashes.TryGetValue($"{match.Groups[1]}.{match.Groups[3]}", out string hash)){
if (match.Groups[2].Value == hash){
Debug.WriteLine($"Accepting {url}");
}
else{
Debug.WriteLine($"Rewriting {url} hash to {hash}");
request.Url = TweetDeckResourceUrl.Replace(url, $"/dist/$1.{hash}.$3");
return true;
}
}
}
return base.OnResourceResponse(browserControl, browser, frame, request, response);
}
#endif
}
}

View File

@@ -1,16 +1,8 @@
// Uncomment to force TweetDeck to load a predefined version of the vendor/bundle scripts
// #define FREEZE_TWEETDECK_SCRIPTS
using System.Collections.Specialized;
using System.Collections.Specialized;
using CefSharp;
using TweetDuck.Core.Handling.Filters;
using TweetDuck.Core.Utils;
#if FREEZE_TWEETDECK_SCRIPTS
using System.Collections.Generic;
using System.Text.RegularExpressions;
#endif
namespace TweetDuck.Core.Handling{
sealed class RequestHandlerBrowser : RequestHandlerBase{
public string BlockNextUserNavUrl { get; set; }
@@ -36,36 +28,11 @@ namespace TweetDuck.Core.Handling{
return base.OnBeforeBrowse(browserControl, browser, frame, request, userGesture, isRedirect);
}
#if FREEZE_TWEETDECK_SCRIPTS
private static readonly Regex TweetDeckScriptUrl = new Regex(@"/dist/(.*?)\.(.*?)\.js$", RegexOptions.Compiled);
private static readonly SortedList<string, string> TweetDeckHashes = new SortedList<string, string>(2){
{ "vendor", "942c0a20e8" },
{ "bundle", "1bd75b5854" }
};
#endif
public override bool OnResourceResponse(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response){
if (request.ResourceType == ResourceType.Image && request.Url.Contains("/backgrounds/spinner_blue")){
request.Url = TwitterUtils.LoadingSpinner.Url;
return true;
}
#if FREEZE_TWEETDECK_SCRIPTS
else if (request.ResourceType == ResourceType.Script){
Match match = TweetDeckScriptUrl.Match(request.Url);
if (match.Success && TweetDeckHashes.TryGetValue(match.Groups[1].Value, out string hash)){
if (match.Groups[2].Value == hash){
System.Diagnostics.Debug.WriteLine($"accepting {request.Url}");
}
else{
System.Diagnostics.Debug.WriteLine($"rewriting {request.Url} to {hash}");
request.Url = TweetDeckScriptUrl.Replace(request.Url, "/dist/$1."+hash+".js");
return true;
}
}
}
#endif
return base.OnResourceResponse(browserControl, browser, frame, request, response);
}

View File

@@ -207,9 +207,13 @@ namespace TweetDuck.Core.Utils{
return client;
}
public static WebClient DownloadFileAsync(string url, string target, Action onSuccess, Action<Exception> onFailure){
public static WebClient DownloadFileAsync(string url, string target, string cookie, Action onSuccess, Action<Exception> onFailure){
WebClient client = CreateWebClient();
if (cookie != null){
client.Headers[HttpRequestHeader.Cookie] = cookie;
}
client.DownloadFileCompleted += (sender, args) => {
if (args.Cancelled){
try{

View File

@@ -4,8 +4,12 @@ using System.Drawing;
using System.IO;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using TweetDuck.Core.Management;
using TweetDuck.Core.Other;
using TweetDuck.Data;
using System.Linq;
using System.Threading.Tasks;
using Cookie = CefSharp.Cookie;
namespace TweetDuck.Core.Utils{
static class TwitterUtils{
@@ -48,7 +52,10 @@ namespace TweetDuck.Core.Utils{
if (quality == ImageQuality.Orig){
string result = ExtractMediaBaseLink(url);
if (result != url || url.Contains("//pbs.twimg.com/media/")){
if (url.Contains("//ton.twitter.com/") && url.Contains("/ton/data/dm/")){
result += ":large";
}
else if (result != url || url.Contains("//pbs.twimg.com/media/")){
result += ":orig";
}
@@ -62,6 +69,32 @@ namespace TweetDuck.Core.Utils{
public static string GetImageFileName(string url){
return BrowserUtils.GetFileNameFromUrl(ExtractMediaBaseLink(url));
}
public static void ViewImage(string url, ImageQuality quality){
void ViewImageInternal(string path){
string ext = Path.GetExtension(path);
if (ValidImageExtensions.Contains(ext)){
WindowsUtils.OpenAssociatedProgram(path);
}
else{
FormMessage.Error("Image Download", "Invalid file extension "+ext, FormMessage.OK);
}
}
string file = Path.Combine(BrowserCache.CacheFolder, GetImageFileName(url) ?? Path.GetRandomFileName());
if (WindowsUtils.FileExistsAndNotEmpty(file)){
ViewImageInternal(file);
}
else{
DownloadFileAuth(GetMediaLink(url, quality), file, () => {
ViewImageInternal(file);
}, ex => {
FormMessage.Error("Image Download", "An error occurred while downloading the image: "+ex.Message, FormMessage.OK);
});
}
}
public static void DownloadImage(string url, string username, ImageQuality quality){
DownloadImages(new string[]{ url }, username, quality);
@@ -91,14 +124,14 @@ namespace TweetDuck.Core.Utils{
}
if (urls.Length == 1){
BrowserUtils.DownloadFileAsync(firstImageLink, dialog.FileName, null, OnFailure);
DownloadFileAuth(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(GetMediaLink(urls[index], quality), $"{pathBase} {index+1}{pathExt}", null, OnFailure);
DownloadFileAuth(GetMediaLink(urls[index], quality), $"{pathBase} {index+1}{pathExt}", null, OnFailure);
}
}
}
@@ -117,11 +150,33 @@ namespace TweetDuck.Core.Utils{
Filter = "Video"+(string.IsNullOrEmpty(ext) ? " (unknown)|*.*" : $" (*{ext})|*{ext}")
}){
if (dialog.ShowDialog() == DialogResult.OK){
BrowserUtils.DownloadFileAsync(url, dialog.FileName, null, ex => {
DownloadFileAuth(url, dialog.FileName, null, ex => {
FormMessage.Error("Video Download", "An error occurred while downloading the video: "+ex.Message, FormMessage.OK);
});
}
}
}
private static void DownloadFileAuth(string url, string target, Action onSuccess, Action<Exception> onFailure){
const string AuthCookieName = "auth_token";
TaskScheduler scheduler = TaskScheduler.FromCurrentSynchronizationContext();
using(ICookieManager cookies = Cef.GetGlobalCookieManager()){
cookies.VisitUrlCookiesAsync(url, true).ContinueWith(task => {
string cookieStr = null;
if (task.Status == TaskStatus.RanToCompletion){
Cookie found = task.Result?.Find(cookie => cookie.Name == AuthCookieName); // the list may be null
if (found != null){
cookieStr = $"{found.Name}={found.Value}";
}
}
BrowserUtils.DownloadFileAsync(url, target, cookieStr, onSuccess, onFailure);
}, scheduler);
}
}
}
}

View File

@@ -66,6 +66,14 @@ namespace TweetDuck.Core.Utils{
}
}
public static bool FileExistsAndNotEmpty(string path){
try{
return new FileInfo(path).Length > 0;
}catch{
return false;
}
}
public static bool OpenAssociatedProgram(string file, string arguments = "", bool runElevated = false){
try{
using(Process.Start(new ProcessStartInfo{

View File

@@ -20,7 +20,7 @@ namespace TweetDuck{
public const string BrandName = "TweetDuck";
public const string Website = "https://tweetduck.chylex.com";
public const string VersionTag = "1.16";
public const string VersionTag = "1.16.3";
public static readonly string ProgramPath = AppDomain.CurrentDomain.BaseDirectory;
public static readonly bool IsPortable = File.Exists(Path.Combine(ProgramPath, "makeportable"));

View File

@@ -94,7 +94,7 @@ enabled(){
this.btnClearOneHTML = `
<a class="js-action-header-button column-header-link" href="#" data-action="td-clearcolumns-dosingle">
<i class="icon icon-clear-timeline js-show-tip" data-placement="bottom" data-original-title="Clear column (hold Shift to restore)" data-action="td-clearcolumns-dosingle"></i>
<i class="icon icon-clear-timeline js-show-tip" data-placement="bottom" data-original-title="Clear column (hold Shift to restore)" data-action="td-clearcolumns-dosingle"></i>
</a>`;
this.prevNavMenuMustache = TD.mustaches["menus/column_nav_menu.mustache"];
@@ -110,16 +110,27 @@ enabled(){
// styles
if (!document.getElementById("td-clearcolumns-workaround")){
// TD started caching mustaches so disabling the plugin doesn't update the column headers properly...
let workaround = document.createElement("style");
workaround.id = "td-clearcolumns-workaround";
workaround.innerText = "#tduck a[data-action='td-clearcolumns-dosingle'] { display: none }";
document.head.appendChild(workaround);
}
this.css = window.TDPF_createCustomStyle(this);
this.css.insert(".js-app-add-column.is-hidden + .clear-columns-btn-all-parent { display: none; }");
this.css.insert(".column-header-links { min-width: 51px !important; }");
this.css.insert("[data-td-icon='icon-message'] .column-header-links { min-width: 110px !important; }");
this.css.insert(".column-navigator-overflow .clear-columns-btn-all-parent { display: none !important; }");
this.css.insert(".column-navigator-overflow { bottom: 224px !important; }");
this.css.insert("[data-action='td-clearcolumns-dosingle'] { padding: 3px 0 !important; }");
this.css.insert("[data-action='clear'].btn-options-tray { display: none !important; }");
this.css.insert("[data-td-icon='icon-schedule'] .td-clear-column-shortcut { display: none; }");
this.css.insert("[data-td-icon='icon-custom-timeline'] .td-clear-column-shortcut { display: none; }");
this.css.insert(".column-header-links { min-width: 51px !important; }");
this.css.insert(".column[data-td-icon='icon-message'] .column-header-links { min-width: 110px !important; }");
this.css.insert(".btn-options-tray[data-action='clear'] { display: none !important; }");
this.css.insert("#tduck a[data-action='td-clearcolumns-dosingle'] { display: inline-block; }");
this.css.insert("#tduck .column[data-td-icon='icon-schedule'] a[data-action='td-clearcolumns-dosingle'] { display: none; }");
this.css.insert("#tduck .column[data-td-icon='icon-custom-timeline'] a[data-action='td-clearcolumns-dosingle'] { display: none; }");
}
ready(){

View File

@@ -14,6 +14,7 @@ enabled(){
themeColorTweaks: true,
revertIcons: true,
showCharacterCount: true,
forceArialFont: true,
increaseQuoteTextSize: false,
smallComposeTextSize: false,
optimizeAnimations: true,
@@ -254,7 +255,7 @@ enabled(){
setTimeout(function(){
if (theme != TD.settings.getTheme()){
$(document).trigger("uiToggleTheme");
TD.settings.setTheme(theme);
}
me.saveConfig();
@@ -430,6 +431,11 @@ enabled(){
this.css.insert("#tduck .tweet-actions > li:nth-child(4) { margin-right: 2px !important }");
}
if (this.config.forceArialFont){
this.css.insert("#tduck { font-family: Arial, sans-serif; font-weight: 400 }");
this.css.insert("#tduck input, #tduck label, #tduck select, #tduck textarea { font-family: Arial }")
}
if (this.config.increaseQuoteTextSize){
this.css.insert(".quoted-tweet { font-size: 1em !important }");
}
@@ -536,11 +542,13 @@ ${iconData.map(entry => `#tduck .icon-${entry[0]}:before{content:\"\\f0${entry[1
.drawer .btn .icon, .app-header .btn .icon { line-height: 1em !important }
.app-search-fake .icon { margin-top: -3px !important }
#tduck .js-docked-compose .js-drawer-close { margin: 20px 0 0 !important }
#tduck .search-input-control .icon { font-size: 20px !important; top: -4px !important }
#tduck .js-docked-compose .js-drawer-close { margin: 20px 0 0 !important }
#tduck .compose-media-bar-remove .icon-close, #tduck .compose-media-grid-remove .icon-close { padding: 3px 2px 1px !important }
.js-column-header .column-type-icon { margin-top: 0 !important }
.inline-reply .pull-left .Button--link { margin-top: 3px !important }
.js-inline-compose-pop .icon-popout { font-size: 23px !important }
.tweet-action-item .icon-favorite-toggle { font-size: 16px !important; }
.tweet-action-item .heartsprite { top: -260% !important; left: -260% !important; transform: scale(0.4, 0.39) translateY(0.5px) !important; }
@@ -595,6 +603,10 @@ ${iconData.map(entry => `#tduck .icon-${entry[0]}:before{content:\"\\f0${entry[1
html[data-td-font] { font-size: ${this.config.fontSize} !important }
.avatar { border-radius: ${this.config.avatarRadius}% !important }
${this.config.forceArialFont ? `
#tduck { font-family: Arial, sans-serif; font-weight: 400 }
` : ``}
${this.config.increaseQuoteTextSize ? `
.quoted-tweet { font-size: 1em !important }
` : ``}

View File

@@ -69,6 +69,10 @@
<option value="custom-px">Custom</option>
<option value="change-custom-px">Change custom value...</option>
</select>
<label class="checkbox">
<input data-td-key="forceArialFont" class="js-theme-checkbox touch-larger-label" type="checkbox">
Use Arial as default font
</label>
<label class="checkbox">
<input data-td-key="increaseQuoteTextSize" class="js-theme-checkbox touch-larger-label" type="checkbox">
Increase quoted tweet font size
@@ -169,12 +173,23 @@
#edit-design-panel {
width: 693px;
height: 380px;
background-color: #FFF;
box-shadow: 0 0 10px rgba(17, 17, 17, 0.5);
}
#edit-design-panel .mdl-header {
color: #8899A6;
}
#edit-design-panel .mdl-inner {
padding-top: 0;
}
#edit-design-panel .mdl-content {
border: 1px solid #CCD6DD;
background: #EAEAEA;
}
#edit-design-panel-inner-cols {
padding: 0 6px;
}

View File

@@ -117,7 +117,7 @@ html.dark .account-settings-bt{border-top:1px solid #e1e8ed}
html.dark .account-settings-bb{border-bottom:1px solid #e1e8ed}
html.dark .account-stats a{color:#66757f}
html.dark .account-stats a:hover{color:#2b7bb9}
html.dark .column{background-color:#222426}
html.dark .column-panel{background-color:#222426}
html.dark .column.is-focused{box-shadow:0 0 0 6px #7aa2c0}
html.dark .column-background-fill{background-color:#F5F8FA}
html.dark .more-tweets-glow{background-color:#55acee;background:radial-gradient(ellipse farthest-corner at 50% 100%,#55acee 0%,#55acee 25%,rgba(255,255,255,0) 75%)}
@@ -135,7 +135,6 @@ html.dark .column-header{background-color:#292F33}
html.dark .is-inverted-dark .column-header{border-bottom:1px solid #ddd}
html.dark .is-inverted-dark .column-title-edit-box{color:#111;background-color:#fff;border-color:#e1e8ed}
html.dark .column-header{border-bottom:1px solid #222426}
html.dark .column-header-temp{border-bottom:1px solid #ddd}
html.dark .column-title-edit-box{color:#e1e8ed;background-color:#14171A;border-color:#111}
html.dark .column-number{color:#66757f}
html.dark .is-new .column-type-icon{color:#55acee}
@@ -428,8 +427,7 @@ html.dark .list-account .username{color:#8899a6}
html.dark .list-listmember .username{color:#8899a6}
html.dark .list-listmember .bio{color:#657786}
html.dark .divider-bar{background-color:#ddd}
html.dark select{background-color:#fff}
html.dark input,html.dark textarea,html.dark select{color:#111;border:1px solid #e1e8ed}
html.dark input,html.dark textarea,html.dark select{color:#111;border:1px solid #e1e8ed;background-color:#fff}
html.dark input:disabled{background-color:#eaeaea;border-color:#e1e8ed}
html.dark select:disabled{background-color:#f5f8fa}
html.dark input:focus,html.dark select:focus,html.dark textarea:focus,html.dark .focus{border-color:rgba(80,165,230,0.8);box-shadow:inset 0 1px 3px rgba(17,17,17,0.1),0 0 8px rgba(80,165,230,0.6)}
@@ -804,3 +802,8 @@ html.dark .DrawerModal{color:#14171A}
html.dark .app-search-fake{border-color:transparent}
html.dark .spinner-small,html.dark .spinner-large{filter:grayscale(80%)brightness(93%)}
html.dark .tweet>.color-twitter-blue{color:#8bd!important}
html.dark .hw-card-container>div{border-color:#292F33;background:transparent}
html.dark .hw-card-container>div>div{border-color:#292F33}
html.dark .modal-content,html.dark .lst-group{color:#292F33}
html.dark .lst-launcher a span{color:#657786!important}
html.dark .social-proof-names a{color:#3b94d9}

View File

@@ -171,14 +171,14 @@
}
.template-editor-form input, .template-editor-form textarea {
color: #111;
background-color: #fff;
color: #111 !important;
background-color: #fff !important;
border: none;
border-radius: 0;
}
.template-editor-form input:focus, .template-editor-form textarea:focus {
box-shadow: inset 0 1px 3px rgba(17, 17, 17, 0.1), 0 0 8px rgba(80, 165, 230, 0.6);
box-shadow: inset 0 1px 3px rgba(17, 17, 17, 0.1), 0 0 8px rgba(80, 165, 230, 0.6) !important;
}
.template-editor-form textarea {

View File

@@ -80,6 +80,10 @@ namespace TweetDuck.Resources{
}
}
public static void ClearCache(){
CachedData.Clear();
}
private static void ShowLoadError(Control sync, string message){
sync?.InvokeSafe(() => FormMessage.Error("Resource Error", message, FormMessage.OK));
}
@@ -128,7 +132,7 @@ namespace TweetDuck.Resources{
sw.Stop();
Debug.WriteLine("Finished rebuild script in "+sw.ElapsedMilliseconds+" ms");
CachedData.Clear();
ClearCache();
// Force update plugin manager setup scripts

View File

@@ -245,6 +245,7 @@
if (column.model.getHasNotification()){
let sensitive = isSensitive(tweet);
let previews = $TDX.notificationMediaPreviews && (!sensitive || TD.settings.getDisplaySensitiveMedia());
// TODO new cards don't have either previews or links
let html = $(tweet.render({
withFooter: false,
@@ -413,7 +414,7 @@
let fontSizeName = TD.settings.getFontSize();
let themeName = TD.settings.getTheme();
let columnBackground = getClassStyleProperty("column", "background-color");
let columnBackground = getClassStyleProperty("column-panel", "background-color");
let tags = [
"<html "+Array.prototype.map.call(document.documentElement.attributes, ele => `${ele.name}="${ele.value}"`).join(" ")+"><head>"
@@ -574,6 +575,31 @@
data.setData("text/html", `<a href="${url}">${url}</a>`);
});
if (ensurePropertyExists(TD, "services", "TwitterStatus", "prototype", "_generateHTMLText")){
TD.services.TwitterStatus.prototype._generateHTMLText = prependToFunction(TD.services.TwitterStatus.prototype._generateHTMLText, function(){
let card = this.card;
let entities = this.entities;
return if !(card && entities);
let urls = entities.urls;
return if !(urls && urls.length);
let shortUrl = card.url;
let urlObj = entities.urls.find(obj => obj.url === shortUrl && obj.expanded_url);
if (urlObj){
let expandedUrl = urlObj.expanded_url;
card.url = expandedUrl;
let values = card.binding_values;
if (values && values.card_url){
values.card_url.string_value = expandedUrl;
}
}
});
}
if (ensurePropertyExists(TD, "services", "TwitterMedia", "prototype", "fromMediaEntity")){
const prevFunc = TD.services.TwitterMedia.prototype.fromMediaEntity;

View File

@@ -1,3 +1,11 @@
/***********/
/* General */
/***********/
body {
margin: 0;
}
/***********************/
/* Redesign scrollbars */
/***********************/
@@ -38,19 +46,23 @@
/* Square-ify stuff */
/********************/
button, .btn, .mdl, .mdl-content, .popover, .lst-modal, .tooltip-inner {
#tduck .compose-media-bar-remove .icon-close, #tduck .compose-media-grid-remove .icon-close {
border-radius: 2px !important;
}
button, .btn, .mdl, .mdl-content, .modal-content, .popover, .lst-modal, .tooltip-inner {
border-radius: 1px !important;
}
.media-item, .media-preview, .media-image, .js-media-added .br--4, #tduck .compose-message-recipient img {
.media-item, .media-preview, .media-image, .media-badge, .js-media-sensitive-overlay, .js-media-added .br--4, #tduck .compose-message-recipient img {
border-radius: 1px !important;
}
.tweet-button, .app-search-fake, .app-search-input, .compose-text-container, .compose-reply-tweet, .compose-message-recipient-input-container, .compose-message-recipient, .compose-media-bar-holder, .media-grid-container, .js-quote-tweet-holder, .detail-view-inline-text {
.tweet-button, .app-search-fake, .app-search-input, .compose-text-container, .compose-reply-tweet, .compose-message-recipient-input-container, .compose-message-recipient, .compose-media-bar-holder, .compose-media-bar-thumb, .media-grid-container, .js-add-image-description, .js-quote-tweet-holder, .detail-view-inline-text, .mdl-column-rhs {
border-radius: 0 !important;
}
.dropdown-menu, .list-item-last, .quoted-tweet, input, textarea, select, .prf-header {
.dropdown-menu, .list-item-last, .quoted-tweet, .hw-card-container > div, input, textarea, select, .prf-header {
border-radius: 0 !important;
}
@@ -253,9 +265,9 @@ a[data-full-url] {
bottom: 0 !important;
}
/**********************************************************/
/* Prevent column icons from being hidden by column title */
/**********************************************************/
/**************************************************************************/
/* Prevent column icons from being hidden by column title & fix alignment */
/**************************************************************************/
.column-header-title {
overflow: hidden !important;
@@ -270,9 +282,10 @@ a[data-full-url] {
.column-header-links {
max-width: 100% !important;
text-align: right;
}
[data-td-icon="icon-message"] .column-header-links {
.column[data-td-icon="icon-message"] .column-header-links {
min-width: 86px;
}
@@ -455,18 +468,18 @@ a:not(.tweet-detail-action) .reply-triangle {
/* Fix cut off usernames in Messages column */
/********************************************/
[data-td-icon="icon-message"].is-shifted-1 .column-title-container {
.column[data-td-icon="icon-message"].is-shifted-1 .column-title-container {
height: 100%;
border-bottom-color: transparent;
}
#tduck [data-td-icon="icon-message"].is-shifted-1 .column-title-items {
#tduck .column[data-td-icon="icon-message"].is-shifted-1 .column-title-items {
height: 100%;
margin-left: 4px !important;
padding-top: 1px;
}
[data-td-icon="icon-message"].is-shifted-1 .username {
.column[data-td-icon="icon-message"].is-shifted-1 .username {
vertical-align: bottom;
}

View File

@@ -6,6 +6,7 @@ html, body {
height: auto !important;
overflow-x: hidden !important;
overflow-y: auto !important;
margin: 0;
}
body::before {
@@ -36,7 +37,7 @@ body::before {
/* Square-ify stuff */
/********************/
.media-item, .media-preview {
.media-item, .media-preview, .media-badge {
border-radius: 1px !important;
}

View File

@@ -26,7 +26,7 @@ namespace TweetDuck.Updates{
}
public void BeginSilentDownload(){
if (File.Exists(InstallerPath)){
if (WindowsUtils.FileExistsAndNotEmpty(InstallerPath)){
DownloadStatus = UpdateDownloadStatus.Done;
return;
}
@@ -48,7 +48,7 @@ namespace TweetDuck.Updates{
return;
}
currentDownload = BrowserUtils.DownloadFileAsync(downloadUrl, InstallerPath, () => {
currentDownload = BrowserUtils.DownloadFileAsync(downloadUrl, InstallerPath, null, () => {
DownloadStatus = UpdateDownloadStatus.Done;
currentDownload = null;
}, e => {