mirror of
https://github.com/chylex/TweetDuck.git
synced 2025-09-14 19:32:10 +02:00
Compare commits
321 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ed1bee8b89 | |||
| a8e1492056 | |||
| 5587216c01 | |||
| 86569261ad | |||
| 4a9049c7aa | |||
| 75d60a8182 | |||
| 14d4dc2ed9 | |||
| fd0e1740a5 | |||
| 70ca890bef | |||
| b9318dfd8e | |||
| 995642a719 | |||
| d14de4ac9e | |||
| b7f325a241 | |||
| 27c55718c2 | |||
| 421ff0654b | |||
| ed947458f9 | |||
| 9cdb20ba84 | |||
| d8774b735f | |||
| adcb42695f | |||
| dd77b5bcbb | |||
| d2445be155 | |||
| 10254c8af7 | |||
| d7e830badf | |||
| b445a3a9b8 | |||
| 97f42ead66 | |||
| 03730fafb9 | |||
| 0be9465dca | |||
| d7f1df4995 | |||
| 3cb0f90706 | |||
| a3e9b15a8a | |||
| 00bfa68a57 | |||
| c311e24f08 | |||
| 1cdd4e4455 | |||
| 8078c0081a | |||
| a867e1fc40 | |||
| 61da36ac1c | |||
| 720ca2a018 | |||
| b39c593552 | |||
| c808952a45 | |||
| b468d7a766 | |||
| 28578f60be | |||
| 92a39e2527 | |||
| 1bce5e4342 | |||
| 68f586e104 | |||
| d27a66202e | |||
| 07de2f450c | |||
| 3c03726634 | |||
| 6fb2643063 | |||
| 5eef6c8196 | |||
| 829c332e13 | |||
| 47eec14bca | |||
| e7ee1d6be7 | |||
| e41b5e5ff7 | |||
| ba1bacd08c | |||
| 1029ea5840 | |||
| 339eaf0195 | |||
| aa1e1549d8 | |||
| 1f8ae9ef80 | |||
| 65165de060 | |||
| 485836d2ce | |||
| 64c07c14d9 | |||
| b6313c2b72 | |||
| 58124b5821 | |||
| b6a599f8a6 | |||
| 19a6bc0dbd | |||
| 8cb81d44ee | |||
| 22d0a372d8 | |||
| 988fae75c3 | |||
| a82b0e3622 | |||
| bc6cacacf9 | |||
| 03ad1b3cbc | |||
| eac300627f | |||
| 12525ac386 | |||
| 7558551859 | |||
| a9cce13eef | |||
| 5bb2c43dd0 | |||
| 5b1dcc88cc | |||
| 5c8fc1d136 | |||
| 82c2ab3448 | |||
| b05c8d180f | |||
| 87109e5d01 | |||
| be1a809098 | |||
| ba0e3f1bd4 | |||
| 27d41e6164 | |||
| 1ce5ddfd98 | |||
| 0096a1a4ef | |||
| d2a6560a90 | |||
| 4d7c048139 | |||
| 1d78bd2655 | |||
| 9250f1907c | |||
| a63e210b88 | |||
| 06bd65b7f8 | |||
| b6c17eb05e | |||
| a3d40fdc2b | |||
| c064ef7a30 | |||
| 762717da1e | |||
| b7d3758bea | |||
| d20541fd24 | |||
| 2c2f860f26 | |||
| d1db3aa673 | |||
| cedc52cdf5 | |||
| 33f8eafbcf | |||
| ad45cf8c72 | |||
| f99d035621 | |||
| f3072caea8 | |||
| 1410974292 | |||
| 44413fa96c | |||
| 342a4b4067 | |||
| 4356dde92d | |||
| 21e64a18d8 | |||
| 5a305a6740 | |||
| 44595bad40 | |||
| 7fc9edc9cb | |||
| 93e191f522 | |||
| 8d8355e792 | |||
| a5379d290c | |||
| caea8d4315 | |||
| 24224ab4c6 | |||
| 4dbc02360c | |||
| aa7a29af0c | |||
| 296d0c6199 | |||
| 812a034e8d | |||
| e9de789b79 | |||
| cfbc1b9575 | |||
| e39e85e4dd | |||
| 3f0b161cd0 | |||
| ebe3868720 | |||
| ffd0f5e986 | |||
| 217535a3ba | |||
| 7abfbea2da | |||
| 86ffeaac9a | |||
| ab915b7115 | |||
| 705b5d38cf | |||
| fc2acb00b3 | |||
| 5add8a1d0e | |||
| 063d3a2637 | |||
| f1f90a2ee3 | |||
| ed317a4e46 | |||
| cca16f3bb1 | |||
| aba156cb3b | |||
| cd4e4d7095 | |||
| 8fbb639430 | |||
| d5bf8ec558 | |||
| b6cff40f1e | |||
| 833e42f455 | |||
| 8134843dad | |||
| 1f92d5e633 | |||
| dc51c0ae85 | |||
| 45c79643d6 | |||
| 9041bfc627 | |||
| 0b3b3dd0be | |||
| 89e92dab59 | |||
| 8c168c9ad7 | |||
| 9f63357a92 | |||
| d91b4bd1f3 | |||
| c0c64f6d62 | |||
| 1a5d2af779 | |||
| f40a33192b | |||
| ca4900aff0 | |||
| 56fc9e2d40 | |||
| d2174c0b69 | |||
| 9f76754ad3 | |||
| 118ceaec35 | |||
| 5a57d28a7d | |||
| 07af99f862 | |||
| 59fba7fba0 | |||
| dd4edc4249 | |||
| 856226473a | |||
| 8d1c07d6b2 | |||
| c32462cc9e | |||
| ec94ea3273 | |||
| 41acd8c15b | |||
| 155a79f2ec | |||
| 9197cb9be6 | |||
| 03d50c847b | |||
| bf45c40365 | |||
| 679e126194 | |||
| 50e39164bd | |||
| cb9f75e968 | |||
| aa7f6cc3b1 | |||
| fe601aed41 | |||
| 2282a9df28 | |||
| 2b54627750 | |||
| 16051a0d25 | |||
| 66d5f0d790 | |||
| 07d29207f0 | |||
| a60be2afcc | |||
| 027f3ee253 | |||
| 04774815e4 | |||
| 61a73c055b | |||
| 7731534ffc | |||
| ed7bf99610 | |||
| cbe4272556 | |||
| 8f5e3dfdcc | |||
| 35500c51f1 | |||
| 629f873bb2 | |||
| a44cb884c4 | |||
| d5ad1d0daa | |||
| 61ae7e3b6a | |||
| 01583e424f | |||
| 5c0aa1b3da | |||
| 07391efa70 | |||
| b80f1bfc7c | |||
| ad310db86c | |||
| 4ce0122a29 | |||
| a8894f7054 | |||
| 1d1515351b | |||
| 2a9ddd4468 | |||
| 0f9a944775 | |||
| 34ee9ebd66 | |||
| 43f632b555 | |||
| 7cf3f1d32c | |||
| e51e87647e | |||
| b8aae88b11 | |||
| d06e29db15 | |||
| 62449450f3 | |||
| b290c94635 | |||
| f909b887d9 | |||
| 5cf4843212 | |||
| b3d1e1bfac | |||
| df47499a28 | |||
| 421475ec87 | |||
| 29d999b8eb | |||
| acacd9a5e5 | |||
| b81c26f93f | |||
| 00b212944c | |||
| 70ba006e4d | |||
| 118e0cae62 | |||
| c003bb4e71 | |||
| e9b2fa7603 | |||
| 35afaa105d | |||
| 2e300a7b8f | |||
| f3f5b88550 | |||
| 22f491d98a | |||
| 7908c8ebd9 | |||
| e114a93714 | |||
| 931761600f | |||
| e5b4b03e1a | |||
| f1e8b3fbf0 | |||
| 4d64243a07 | |||
| 3422b4d4d6 | |||
| b170d529fd | |||
| 83741db5aa | |||
| c4b2b3ab25 | |||
| 676df44985 | |||
| 037adc6b5c | |||
| 186d17dd98 | |||
| ab9ff980ef | |||
| f297cb2623 | |||
| b53c672768 | |||
| 1a2b967749 | |||
| 6ba30c48cf | |||
| 1af9ee9ced | |||
| e50480aa35 | |||
| 6943c7813f | |||
| 7c9b4382ca | |||
| 3187f97592 | |||
| b71a367052 | |||
| 2d4bbf2a6f | |||
| 6e59dfddcc | |||
| bd92fc6ee0 | |||
| 2f61de7025 | |||
| 8fcec7ec7c | |||
| 33d9ba3871 | |||
| 4f8c778ba0 | |||
| 804c739038 | |||
| a0445fbb12 | |||
| 7ab5d7b796 | |||
| 7f83a7773b | |||
| fc9e8a808f | |||
| 5ab8976bc7 | |||
| e2a28f2811 | |||
| 137a20ed0e | |||
| f956f696f4 | |||
| bb7cbde38f | |||
| 8c452d3fa2 | |||
| f65c33c432 | |||
| da2758ccb1 | |||
| de10112b7f | |||
| 301d4fb171 | |||
| f0a79add14 | |||
| d33bc9fe25 | |||
| a2a5dfd435 | |||
| f3d7c8d4c3 | |||
| 67f60dd787 | |||
| 62310ce4a4 | |||
| 3a27089364 | |||
| a05460f562 | |||
| 390872c305 | |||
| 594d12df79 | |||
| c42c12c72b | |||
| c37f4fe365 | |||
| 8d37d68770 | |||
| 1b3d1fb36a | |||
| 2f352ef9bb | |||
| 527f3cab4c | |||
| f67bf27db2 | |||
| a8bb3ba349 | |||
| 321ab12213 | |||
| 4cab18e557 | |||
| c15ea97a36 | |||
| a0cc4109df | |||
| f66ff1000a | |||
| 51a9bb6d3c | |||
| 07017bd29b | |||
| 45b6f49a08 | |||
| 103ad72788 | |||
| 543259f29f | |||
| 98799734c5 | |||
| 96f491a666 | |||
| 29e541dbef | |||
| 1343b9c113 | |||
| 94920fd459 | |||
| b2f3b245b7 | |||
| 15bc6c1d73 | |||
| 2c175b8d3a | |||
| a48c17a769 | |||
| 03465c4ab0 | |||
| b4e936c530 | |||
| fb1482370a | |||
| e831bc2bea |
@@ -5,9 +5,9 @@ namespace TweetDuck.Configuration{
|
|||||||
static class Arguments{
|
static class Arguments{
|
||||||
// public args
|
// public args
|
||||||
public const string ArgDataFolder = "-datafolder";
|
public const string ArgDataFolder = "-datafolder";
|
||||||
public const string ArgLocale = "-locale";
|
|
||||||
public const string ArgLogging = "-log";
|
public const string ArgLogging = "-log";
|
||||||
public const string ArgDebugUpdates = "-debugupdates";
|
public const string ArgIgnoreGDPR = "-nogdpr";
|
||||||
|
public const string ArgNotificationScrollWA = "-nscrollwa";
|
||||||
|
|
||||||
// internal args
|
// internal args
|
||||||
public const string ArgRestart = "-restart";
|
public const string ArgRestart = "-restart";
|
||||||
|
|||||||
@@ -13,8 +13,8 @@ namespace TweetDuck.Configuration{
|
|||||||
|
|
||||||
private bool _hardwareAcceleration = true;
|
private bool _hardwareAcceleration = true;
|
||||||
|
|
||||||
public bool EnableBrowserGCReload { get; set; } = true;
|
public bool ClearCacheAutomatically { get; set; } = true;
|
||||||
public int BrowserMemoryThreshold { get; set; } = 400;
|
public int ClearCacheThreshold { get; set; } = 250;
|
||||||
|
|
||||||
// SPECIAL PROPERTIES
|
// SPECIAL PROPERTIES
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using TweetDuck.Core.Controls;
|
using TweetDuck.Core.Controls;
|
||||||
@@ -36,21 +37,29 @@ namespace TweetDuck.Configuration{
|
|||||||
|
|
||||||
public bool FirstRun { get; set; } = true;
|
public bool FirstRun { get; set; } = true;
|
||||||
public bool AllowDataCollection { get; set; } = false;
|
public bool AllowDataCollection { get; set; } = false;
|
||||||
public bool ShowDataCollectionNotification { get; set; } = true;
|
|
||||||
|
|
||||||
public WindowState BrowserWindow { get; set; } = new WindowState();
|
public WindowState BrowserWindow { get; set; } = new WindowState();
|
||||||
public WindowState PluginsWindow { get; set; } = new WindowState();
|
public Size PluginsWindowSize { get; set; } = Size.Empty;
|
||||||
|
|
||||||
public bool ExpandLinksOnHover { get; set; } = true;
|
public bool ExpandLinksOnHover { get; set; } = true;
|
||||||
public bool SwitchAccountSelectors { get; set; } = true;
|
|
||||||
public bool OpenSearchInFirstColumn { get; set; } = true;
|
public bool OpenSearchInFirstColumn { get; set; } = true;
|
||||||
|
public bool KeepLikeFollowDialogsOpen { get; set; } = true;
|
||||||
public bool BestImageQuality { get; set; } = true;
|
public bool BestImageQuality { get; set; } = true;
|
||||||
public bool EnableAnimatedImages { get; set; } = true;
|
public bool EnableAnimatedImages { get; set; } = true;
|
||||||
public bool EnableSpellCheck { get; set; } = false;
|
|
||||||
public int VideoPlayerVolume { get; set; } = 50;
|
public bool IgnoreTrackingUrlWarning { get; set; } = false;
|
||||||
|
public bool EnableSmoothScrolling { get; set; } = true;
|
||||||
|
public string BrowserPath { get; set; } = null;
|
||||||
|
public string SearchEngineUrl { get; set; } = null;
|
||||||
private int _zoomLevel = 100;
|
private int _zoomLevel = 100;
|
||||||
private bool _muteNotifications;
|
private bool _muteNotifications;
|
||||||
|
|
||||||
|
public int VideoPlayerVolume { get; set; } = 50;
|
||||||
|
|
||||||
|
public bool EnableSpellCheck { get; set; } = false;
|
||||||
|
public string SpellCheckLanguage { get; set; } = "en-US";
|
||||||
|
public string TranslationTarget { get; set; } = "en";
|
||||||
|
|
||||||
private TrayIcon.Behavior _trayBehavior = TrayIcon.Behavior.Disabled;
|
private TrayIcon.Behavior _trayBehavior = TrayIcon.Behavior.Disabled;
|
||||||
public bool EnableTrayHighlight { get; set; } = true;
|
public bool EnableTrayHighlight { get; set; } = true;
|
||||||
|
|
||||||
@@ -74,10 +83,10 @@ namespace TweetDuck.Configuration{
|
|||||||
|
|
||||||
public TweetNotification.Size NotificationSize { get; set; } = TweetNotification.Size.Auto;
|
public TweetNotification.Size NotificationSize { get; set; } = TweetNotification.Size.Auto;
|
||||||
public Size CustomNotificationSize { get; set; } = Size.Empty;
|
public Size CustomNotificationSize { get; set; } = Size.Empty;
|
||||||
public int NotificationScrollSpeed { get; set; } = 10;
|
public int NotificationScrollSpeed { get; set; } = 100;
|
||||||
|
|
||||||
public int NotificationSoundVolume { get; set; } = 100;
|
|
||||||
private string _notificationSoundPath;
|
private string _notificationSoundPath;
|
||||||
|
private int _notificationSoundVolume = 100;
|
||||||
|
|
||||||
public string CustomCefArgs { get; set; } = null;
|
public string CustomCefArgs { get; set; } = null;
|
||||||
public string CustomBrowserCSS { get; set; } = null;
|
public string CustomBrowserCSS { get; set; } = null;
|
||||||
@@ -87,45 +96,33 @@ namespace TweetDuck.Configuration{
|
|||||||
|
|
||||||
public bool IsCustomNotificationPositionSet => CustomNotificationPosition != ControlExtensions.InvisibleLocation;
|
public bool IsCustomNotificationPositionSet => CustomNotificationPosition != ControlExtensions.InvisibleLocation;
|
||||||
public bool IsCustomNotificationSizeSet => CustomNotificationSize != Size.Empty;
|
public bool IsCustomNotificationSizeSet => CustomNotificationSize != Size.Empty;
|
||||||
|
public bool IsCustomSoundNotificationSet => NotificationSoundPath != string.Empty;
|
||||||
|
|
||||||
public TwitterUtils.ImageQuality TwitterImageQuality => BestImageQuality ? TwitterUtils.ImageQuality.Orig : TwitterUtils.ImageQuality.Default;
|
public TwitterUtils.ImageQuality TwitterImageQuality => BestImageQuality ? TwitterUtils.ImageQuality.Orig : TwitterUtils.ImageQuality.Default;
|
||||||
|
|
||||||
public string NotificationSoundPath{
|
public string NotificationSoundPath{
|
||||||
get => string.IsNullOrEmpty(_notificationSoundPath) ? string.Empty : _notificationSoundPath;
|
get => _notificationSoundPath ?? string.Empty;
|
||||||
set => _notificationSoundPath = value;
|
set => UpdatePropertyWithEvent(ref _notificationSoundPath, value, SoundNotificationChanged);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int NotificationSoundVolume{
|
||||||
|
get => _notificationSoundVolume;
|
||||||
|
set => UpdatePropertyWithEvent(ref _notificationSoundVolume, value, SoundNotificationChanged);
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool MuteNotifications{
|
public bool MuteNotifications{
|
||||||
get => _muteNotifications;
|
get => _muteNotifications;
|
||||||
|
set => UpdatePropertyWithEvent(ref _muteNotifications, value, MuteToggled);
|
||||||
set{
|
|
||||||
if (_muteNotifications != value){
|
|
||||||
_muteNotifications = value;
|
|
||||||
MuteToggled?.Invoke(this, EventArgs.Empty);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public int ZoomLevel{
|
public int ZoomLevel{
|
||||||
get => _zoomLevel;
|
get => _zoomLevel;
|
||||||
|
set => UpdatePropertyWithEvent(ref _zoomLevel, value, ZoomLevelChanged);
|
||||||
set{
|
|
||||||
if (_zoomLevel != value){
|
|
||||||
_zoomLevel = value;
|
|
||||||
ZoomLevelChanged?.Invoke(this, EventArgs.Empty);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public TrayIcon.Behavior TrayBehavior{
|
public TrayIcon.Behavior TrayBehavior{
|
||||||
get => _trayBehavior;
|
get => _trayBehavior;
|
||||||
|
set => UpdatePropertyWithEvent(ref _trayBehavior, value, TrayBehaviorChanged);
|
||||||
set{
|
|
||||||
if (_trayBehavior != value){
|
|
||||||
_trayBehavior = value;
|
|
||||||
TrayBehaviorChanged?.Invoke(this, EventArgs.Empty);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// EVENTS
|
// EVENTS
|
||||||
@@ -133,6 +130,7 @@ namespace TweetDuck.Configuration{
|
|||||||
public event EventHandler MuteToggled;
|
public event EventHandler MuteToggled;
|
||||||
public event EventHandler ZoomLevelChanged;
|
public event EventHandler ZoomLevelChanged;
|
||||||
public event EventHandler TrayBehaviorChanged;
|
public event EventHandler TrayBehaviorChanged;
|
||||||
|
public event EventHandler SoundNotificationChanged;
|
||||||
|
|
||||||
// END OF CONFIG
|
// END OF CONFIG
|
||||||
|
|
||||||
@@ -142,6 +140,13 @@ namespace TweetDuck.Configuration{
|
|||||||
this.file = file;
|
this.file = file;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void UpdatePropertyWithEvent<T>(ref T field, T value, EventHandler eventHandler){
|
||||||
|
if (!EqualityComparer<T>.Default.Equals(field, value)){
|
||||||
|
field = value;
|
||||||
|
eventHandler?.Invoke(this, EventArgs.Empty);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void Save(){
|
public void Save(){
|
||||||
try{
|
try{
|
||||||
if (File.Exists(file)){
|
if (File.Exists(file)){
|
||||||
@@ -171,8 +176,25 @@ namespace TweetDuck.Configuration{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void Reset(){
|
||||||
|
try{
|
||||||
|
File.Delete(file);
|
||||||
|
File.Delete(GetBackupFile(file));
|
||||||
|
}catch(Exception e){
|
||||||
|
Program.Reporter.HandleException("Configuration Error", "Could not delete configuration files to reset the options.", true, e);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Reload();
|
||||||
|
}
|
||||||
|
|
||||||
private void LoadInternal(bool backup){
|
private void LoadInternal(bool backup){
|
||||||
Serializer.Read(backup ? GetBackupFile(file) : file, this);
|
Serializer.Read(backup ? GetBackupFile(file) : file, this);
|
||||||
|
|
||||||
|
if (NotificationScrollSpeed == 10){ // incorrect initial value
|
||||||
|
NotificationScrollSpeed = 100;
|
||||||
|
Save();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UserConfig Load(string file){
|
public static UserConfig Load(string file){
|
||||||
|
|||||||
@@ -1,19 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Windows.Forms;
|
|
||||||
using TweetDuck.Core.Controls;
|
|
||||||
|
|
||||||
namespace TweetDuck.Core.Bridge{
|
|
||||||
sealed class CallbackBridge{
|
|
||||||
private readonly Control owner;
|
|
||||||
private readonly Action safeCallback;
|
|
||||||
|
|
||||||
public CallbackBridge(Control owner, Action safeCallback){
|
|
||||||
this.owner = owner;
|
|
||||||
this.safeCallback = safeCallback;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Trigger(){
|
|
||||||
owner.InvokeSafe(safeCallback);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -7,20 +7,19 @@ namespace TweetDuck.Core.Bridge{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static string GenerateScript(Environment environment){
|
public static string GenerateScript(Environment environment){
|
||||||
string Bool(bool value){
|
string Bool(bool value) => value ? "true;" : "false;";
|
||||||
return value ? "true;" : "false;";
|
string Str(string value) => '"'+value+"\";";
|
||||||
}
|
|
||||||
|
|
||||||
StringBuilder build = new StringBuilder().Append("(function(x){");
|
StringBuilder build = new StringBuilder().Append("(function(x){");
|
||||||
|
|
||||||
build.Append("x.expandLinksOnHover=").Append(Bool(Program.UserConfig.ExpandLinksOnHover));
|
build.Append("x.expandLinksOnHover=").Append(Bool(Program.UserConfig.ExpandLinksOnHover));
|
||||||
|
|
||||||
if (environment == Environment.Browser){
|
if (environment == Environment.Browser){
|
||||||
build.Append("x.switchAccountSelectors=").Append(Bool(Program.UserConfig.SwitchAccountSelectors));
|
|
||||||
build.Append("x.openSearchInFirstColumn=").Append(Bool(Program.UserConfig.OpenSearchInFirstColumn));
|
build.Append("x.openSearchInFirstColumn=").Append(Bool(Program.UserConfig.OpenSearchInFirstColumn));
|
||||||
|
build.Append("x.keepLikeFollowDialogsOpen=").Append(Bool(Program.UserConfig.KeepLikeFollowDialogsOpen));
|
||||||
build.Append("x.muteNotifications=").Append(Bool(Program.UserConfig.MuteNotifications));
|
build.Append("x.muteNotifications=").Append(Bool(Program.UserConfig.MuteNotifications));
|
||||||
build.Append("x.hasCustomNotificationSound=").Append(Bool(Program.UserConfig.NotificationSoundPath.Length > 0));
|
|
||||||
build.Append("x.notificationMediaPreviews=").Append(Bool(Program.UserConfig.NotificationMediaPreviews));
|
build.Append("x.notificationMediaPreviews=").Append(Bool(Program.UserConfig.NotificationMediaPreviews));
|
||||||
|
build.Append("x.translationTarget=").Append(Str(Program.UserConfig.TranslationTarget));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (environment == Environment.Notification){
|
if (environment == Environment.Notification){
|
||||||
|
|||||||
@@ -3,30 +3,22 @@ using System.Text;
|
|||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using CefSharp;
|
using CefSharp;
|
||||||
using TweetDuck.Core.Controls;
|
using TweetDuck.Core.Controls;
|
||||||
using TweetDuck.Core.Handling;
|
using TweetDuck.Core.Management;
|
||||||
using TweetDuck.Core.Notification;
|
using TweetDuck.Core.Notification;
|
||||||
using TweetDuck.Core.Other;
|
using TweetDuck.Core.Other;
|
||||||
using TweetDuck.Core.Utils;
|
using TweetDuck.Core.Utils;
|
||||||
using TweetDuck.Resources;
|
using TweetDuck.Resources;
|
||||||
|
|
||||||
namespace TweetDuck.Core.Bridge{
|
namespace TweetDuck.Core.Bridge{
|
||||||
sealed class TweetDeckBridge{
|
class TweetDeckBridge{
|
||||||
public static string FontSize { get; private set; }
|
public static string FontSize { get; private set; }
|
||||||
public static string NotificationHeadLayout { get; private set; }
|
public static string NotificationHeadLayout { get; private set; }
|
||||||
|
public static readonly ContextInfo ContextInfo = new ContextInfo();
|
||||||
public static string LastHighlightedTweetUrl = string.Empty;
|
|
||||||
public static string LastHighlightedQuoteUrl = string.Empty;
|
|
||||||
private static string LastHighlightedTweetAuthors = string.Empty;
|
|
||||||
private static string LastHighlightedTweetImages = string.Empty;
|
|
||||||
|
|
||||||
public static string[] LastHighlightedTweetAuthorsArray => LastHighlightedTweetAuthors.Split(';');
|
|
||||||
public static string[] LastHighlightedTweetImagesArray => LastHighlightedTweetImages.Split(';');
|
|
||||||
|
|
||||||
private static readonly Dictionary<string, string> SessionData = new Dictionary<string, string>(2);
|
private static readonly Dictionary<string, string> SessionData = new Dictionary<string, string>(2);
|
||||||
|
|
||||||
public static void ResetStaticProperties(){
|
public static void ResetStaticProperties(){
|
||||||
FontSize = NotificationHeadLayout = null;
|
FontSize = NotificationHeadLayout = null;
|
||||||
LastHighlightedTweetUrl = LastHighlightedQuoteUrl = LastHighlightedTweetAuthors = LastHighlightedTweetImages = string.Empty;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void RestoreSessionData(IFrame frame){
|
public static void RestoreSessionData(IFrame frame){
|
||||||
@@ -45,11 +37,20 @@ namespace TweetDuck.Core.Bridge{
|
|||||||
private readonly FormBrowser form;
|
private readonly FormBrowser form;
|
||||||
private readonly FormNotificationMain notification;
|
private readonly FormNotificationMain notification;
|
||||||
|
|
||||||
public TweetDeckBridge(FormBrowser form, FormNotificationMain notification){
|
protected TweetDeckBridge(FormBrowser form, FormNotificationMain notification){
|
||||||
this.form = form;
|
this.form = form;
|
||||||
this.notification = notification;
|
this.notification = notification;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Browser only
|
||||||
|
|
||||||
|
public sealed class Browser : TweetDeckBridge{
|
||||||
|
public Browser(FormBrowser form, FormNotificationMain notification) : base(form, notification){}
|
||||||
|
|
||||||
|
public void OpenContextMenu(){
|
||||||
|
form.InvokeAsyncSafe(form.OpenContextMenu);
|
||||||
|
}
|
||||||
|
|
||||||
public void OnIntroductionClosed(bool showGuide, bool allowDataCollection){
|
public void OnIntroductionClosed(bool showGuide, bool allowDataCollection){
|
||||||
form.InvokeAsyncSafe(() => {
|
form.InvokeAsyncSafe(() => {
|
||||||
form.OnIntroductionClosed(showGuide, allowDataCollection);
|
form.OnIntroductionClosed(showGuide, allowDataCollection);
|
||||||
@@ -63,23 +64,45 @@ namespace TweetDuck.Core.Bridge{
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetLastRightClickInfo(string type, string link){
|
public void SetRightClickedLink(string type, string url){
|
||||||
form.InvokeAsyncSafe(() => ContextMenuBase.SetContextInfo(type, link));
|
ContextInfo.SetLink(type, url);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetLastHighlightedTweet(string tweetUrl, string quoteUrl, string authors, string imageList){
|
public void SetRightClickedChirp(string tweetUrl, string quoteUrl, string chirpAuthors, string chirpImages){
|
||||||
form.InvokeAsyncSafe(() => {
|
ContextInfo.SetChirp(tweetUrl, quoteUrl, chirpAuthors, chirpImages);
|
||||||
LastHighlightedTweetUrl = tweetUrl;
|
}
|
||||||
LastHighlightedQuoteUrl = quoteUrl;
|
|
||||||
LastHighlightedTweetAuthors = authors;
|
public void DisplayTooltip(string text){
|
||||||
LastHighlightedTweetImages = imageList;
|
form.InvokeAsyncSafe(() => form.DisplayTooltip(text));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetSessionData(string key, string value){
|
||||||
|
form.InvokeSafe(() => { // do not use InvokeAsyncSafe, return only after invocation
|
||||||
|
SessionData.Add(key, value);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OpenContextMenu(){
|
|
||||||
form.InvokeAsyncSafe(form.OpenContextMenu);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Notification only
|
||||||
|
|
||||||
|
public sealed class Notification : TweetDeckBridge{
|
||||||
|
public Notification(FormBrowser form, FormNotificationMain notification) : base(form, notification){}
|
||||||
|
|
||||||
|
public void DisplayTooltip(string text){
|
||||||
|
notification.InvokeAsyncSafe(() => notification.DisplayTooltip(text));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void LoadNextNotification(){
|
||||||
|
notification.InvokeAsyncSafe(notification.FinishCurrentNotification);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ShowTweetDetail(){
|
||||||
|
notification.InvokeAsyncSafe(notification.ShowTweetDetail);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Global
|
||||||
|
|
||||||
public void OnTweetPopup(string columnId, string chirpId, string columnName, string tweetHtml, int tweetCharacters, string tweetUrl, string quoteUrl){
|
public void OnTweetPopup(string columnId, string chirpId, string columnName, string tweetHtml, int tweetCharacters, string tweetUrl, string quoteUrl){
|
||||||
notification.InvokeAsyncSafe(() => {
|
notification.InvokeAsyncSafe(() => {
|
||||||
form.OnTweetNotification();
|
form.OnTweetNotification();
|
||||||
@@ -90,31 +113,12 @@ namespace TweetDuck.Core.Bridge{
|
|||||||
public void OnTweetSound(){
|
public void OnTweetSound(){
|
||||||
form.InvokeAsyncSafe(() => {
|
form.InvokeAsyncSafe(() => {
|
||||||
form.OnTweetNotification();
|
form.OnTweetNotification();
|
||||||
form.PlayNotificationSound();
|
form.OnTweetSound();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void DisplayTooltip(string text, bool showInNotification){
|
public void ScreenshotTweet(string html, int width){
|
||||||
if (showInNotification){
|
form.InvokeAsyncSafe(() => form.OnTweetScreenshotReady(html, width));
|
||||||
notification.InvokeAsyncSafe(() => notification.DisplayTooltip(text));
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
form.InvokeAsyncSafe(() => form.DisplayTooltip(text));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetSessionData(string key, string value){
|
|
||||||
form.InvokeSafe(() => { // do not use InvokeAsyncSafe, return only after invocation
|
|
||||||
SessionData.Add(key, value);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public void LoadNextNotification(){
|
|
||||||
notification.InvokeAsyncSafe(notification.FinishCurrentNotification);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void ScreenshotTweet(string html, int width, int height){
|
|
||||||
form.InvokeAsyncSafe(() => form.OnTweetScreenshotReady(html, width, height));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void PlayVideo(string url, string username){
|
public void PlayVideo(string url, string username){
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ namespace TweetDuck.Core.Controls{
|
|||||||
public int LineHeight { get; set; }
|
public int LineHeight { get; set; }
|
||||||
|
|
||||||
protected override void OnPaint(PaintEventArgs e){
|
protected override void OnPaint(PaintEventArgs e){
|
||||||
int y = (int)Math.Floor((ClientRectangle.Height-Text.Length*LineHeight)/2F)-2; // 2 = random
|
int y = (int)Math.Floor((ClientRectangle.Height-Text.Length*LineHeight)/2F)-1;
|
||||||
|
|
||||||
using(Brush brush = new SolidBrush(ForeColor)){
|
using(Brush brush = new SolidBrush(ForeColor)){
|
||||||
foreach(char chr in Text){
|
foreach(char chr in Text){
|
||||||
|
|||||||
6
Core/FormBrowser.Designer.cs
generated
6
Core/FormBrowser.Designer.cs
generated
@@ -39,17 +39,17 @@
|
|||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
this.BackColor = TweetDuck.Core.Utils.TwitterUtils.BackgroundColor;
|
this.BackColor = TweetDuck.Core.Utils.TwitterUtils.BackgroundColor;
|
||||||
this.ClientSize = new System.Drawing.Size(400, 386);
|
this.ClientSize = new System.Drawing.Size(1008, 730);
|
||||||
this.Icon = Properties.Resources.icon;
|
this.Icon = Properties.Resources.icon;
|
||||||
this.Location = TweetDuck.Core.Controls.ControlExtensions.InvisibleLocation;
|
this.Location = TweetDuck.Core.Controls.ControlExtensions.InvisibleLocation;
|
||||||
this.MinimumSize = new System.Drawing.Size(416, 424);
|
this.MinimumSize = new System.Drawing.Size(348, 424);
|
||||||
this.Name = "FormBrowser";
|
this.Name = "FormBrowser";
|
||||||
this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
|
this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
|
||||||
this.Activated += new System.EventHandler(this.FormBrowser_Activated);
|
this.Activated += new System.EventHandler(this.FormBrowser_Activated);
|
||||||
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FormBrowser_FormClosing);
|
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FormBrowser_FormClosing);
|
||||||
this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.FormBrowser_FormClosed);
|
this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.FormBrowser_FormClosed);
|
||||||
this.LocationChanged += new System.EventHandler(this.FormBrowser_LocationChanged);
|
|
||||||
this.ResizeEnd += new System.EventHandler(this.FormBrowser_ResizeEnd);
|
this.ResizeEnd += new System.EventHandler(this.FormBrowser_ResizeEnd);
|
||||||
|
this.LocationChanged += new System.EventHandler(this.FormBrowser_LocationChanged);
|
||||||
this.Resize += new System.EventHandler(this.FormBrowser_Resize);
|
this.Resize += new System.EventHandler(this.FormBrowser_Resize);
|
||||||
this.ResumeLayout(false);
|
this.ResumeLayout(false);
|
||||||
|
|
||||||
|
|||||||
@@ -5,20 +5,20 @@ using TweetDuck.Configuration;
|
|||||||
using TweetDuck.Core.Bridge;
|
using TweetDuck.Core.Bridge;
|
||||||
using TweetDuck.Core.Controls;
|
using TweetDuck.Core.Controls;
|
||||||
using TweetDuck.Core.Handling;
|
using TweetDuck.Core.Handling;
|
||||||
|
using TweetDuck.Core.Management;
|
||||||
using TweetDuck.Core.Notification;
|
using TweetDuck.Core.Notification;
|
||||||
using TweetDuck.Core.Notification.Screenshot;
|
using TweetDuck.Core.Notification.Screenshot;
|
||||||
using TweetDuck.Core.Other;
|
using TweetDuck.Core.Other;
|
||||||
using TweetDuck.Core.Other.Analytics;
|
using TweetDuck.Core.Other.Analytics;
|
||||||
using TweetDuck.Core.Other.Management;
|
|
||||||
using TweetDuck.Core.Other.Settings;
|
|
||||||
using TweetDuck.Core.Utils;
|
using TweetDuck.Core.Utils;
|
||||||
using TweetDuck.Plugins;
|
using TweetDuck.Plugins;
|
||||||
|
using TweetDuck.Plugins.Enums;
|
||||||
using TweetDuck.Plugins.Events;
|
using TweetDuck.Plugins.Events;
|
||||||
using TweetDuck.Updates;
|
using TweetDuck.Updates;
|
||||||
using TweetLib.Audio;
|
using TweetDuck.Updates.Events;
|
||||||
|
|
||||||
namespace TweetDuck.Core{
|
namespace TweetDuck.Core{
|
||||||
sealed partial class FormBrowser : Form{
|
sealed partial class FormBrowser : Form, AnalyticsFile.IProvider{
|
||||||
private static UserConfig Config => Program.UserConfig;
|
private static UserConfig Config => Program.UserConfig;
|
||||||
|
|
||||||
public bool IsWaiting{
|
public bool IsWaiting{
|
||||||
@@ -39,6 +39,9 @@ namespace TweetDuck.Core{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public string UpdateInstallerPath { get; private set; }
|
public string UpdateInstallerPath { get; private set; }
|
||||||
|
private bool ignoreUpdateCheckError;
|
||||||
|
|
||||||
|
public AnalyticsFile AnalyticsFile => analytics?.File ?? AnalyticsFile.Dummy;
|
||||||
|
|
||||||
private readonly TweetDeckBrowser browser;
|
private readonly TweetDeckBrowser browser;
|
||||||
private readonly PluginManager plugins;
|
private readonly PluginManager plugins;
|
||||||
@@ -50,11 +53,10 @@ namespace TweetDuck.Core{
|
|||||||
private FormWindowState prevState;
|
private FormWindowState prevState;
|
||||||
|
|
||||||
private TweetScreenshotManager notificationScreenshotManager;
|
private TweetScreenshotManager notificationScreenshotManager;
|
||||||
private SoundNotification soundNotification;
|
|
||||||
private VideoPlayer videoPlayer;
|
private VideoPlayer videoPlayer;
|
||||||
private AnalyticsManager analytics;
|
private AnalyticsManager analytics;
|
||||||
|
|
||||||
public FormBrowser(UpdaterSettings updaterSettings){
|
public FormBrowser(){
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
Text = Program.BrandName;
|
Text = Program.BrandName;
|
||||||
@@ -67,33 +69,43 @@ namespace TweetDuck.Core{
|
|||||||
this.notification = new FormNotificationTweet(this, plugins);
|
this.notification = new FormNotificationTweet(this, plugins);
|
||||||
this.notification.Show();
|
this.notification.Show();
|
||||||
|
|
||||||
this.browser = new TweetDeckBrowser(this, plugins, new TweetDeckBridge(this, notification));
|
this.browser = new TweetDeckBrowser(this, new TweetDeckBridge.Browser(this, notification));
|
||||||
this.browser.PageLoaded += browser_PageLoaded;
|
|
||||||
|
|
||||||
this.contextMenu = ContextMenuBrowser.CreateMenu(this);
|
this.contextMenu = ContextMenuBrowser.CreateMenu(this);
|
||||||
|
|
||||||
|
this.plugins.Register(browser, PluginEnvironment.Browser, true);
|
||||||
|
|
||||||
Controls.Add(new MenuStrip{ Visible = false }); // fixes Alt freezing the program in Win 10 Anniversary Update
|
Controls.Add(new MenuStrip{ Visible = false }); // fixes Alt freezing the program in Win 10 Anniversary Update
|
||||||
|
|
||||||
Disposed += (sender, args) => {
|
Disposed += (sender, args) => {
|
||||||
|
Config.MuteToggled -= Config_MuteToggled;
|
||||||
|
Config.TrayBehaviorChanged -= Config_TrayBehaviorChanged;
|
||||||
|
|
||||||
browser.Dispose();
|
browser.Dispose();
|
||||||
|
updates.Dispose();
|
||||||
contextMenu.Dispose();
|
contextMenu.Dispose();
|
||||||
|
|
||||||
notificationScreenshotManager?.Dispose();
|
notificationScreenshotManager?.Dispose();
|
||||||
soundNotification?.Dispose();
|
|
||||||
videoPlayer?.Dispose();
|
videoPlayer?.Dispose();
|
||||||
analytics?.Dispose();
|
analytics?.Dispose();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Config.MuteToggled += Config_MuteToggled;
|
||||||
|
|
||||||
this.trayIcon.ClickRestore += trayIcon_ClickRestore;
|
this.trayIcon.ClickRestore += trayIcon_ClickRestore;
|
||||||
this.trayIcon.ClickClose += trayIcon_ClickClose;
|
this.trayIcon.ClickClose += trayIcon_ClickClose;
|
||||||
Config.TrayBehaviorChanged += Config_TrayBehaviorChanged;
|
Config.TrayBehaviorChanged += Config_TrayBehaviorChanged;
|
||||||
|
|
||||||
UpdateTrayIcon();
|
UpdateTrayIcon();
|
||||||
|
|
||||||
this.updates = browser.CreateUpdateHandler(updaterSettings);
|
this.updates = new UpdateHandler(browser, Program.InstallerPath);
|
||||||
|
this.updates.CheckFinished += updates_CheckFinished;
|
||||||
this.updates.UpdateAccepted += updates_UpdateAccepted;
|
this.updates.UpdateAccepted += updates_UpdateAccepted;
|
||||||
this.updates.UpdateDismissed += updates_UpdateDismissed;
|
this.updates.UpdateDismissed += updates_UpdateDismissed;
|
||||||
|
|
||||||
|
if (Config.AllowDataCollection){
|
||||||
|
analytics = new AnalyticsManager(this, plugins, Program.AnalyticsFilePath);
|
||||||
|
}
|
||||||
|
|
||||||
RestoreWindow();
|
RestoreWindow();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -113,10 +125,6 @@ namespace TweetDuck.Core{
|
|||||||
Config.BrowserWindow.Restore(this, true);
|
Config.BrowserWindow.Restore(this, true);
|
||||||
prevState = WindowState;
|
prevState = WindowState;
|
||||||
isLoaded = true;
|
isLoaded = true;
|
||||||
|
|
||||||
if (Config.AllowDataCollection){
|
|
||||||
analytics = new AnalyticsManager(this, plugins, Program.AnalyticsFilePath);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UpdateTrayIcon(){
|
private void UpdateTrayIcon(){
|
||||||
@@ -193,6 +201,10 @@ namespace TweetDuck.Core{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void Config_MuteToggled(object sender, EventArgs e){
|
||||||
|
AnalyticsFile.NotificationMutes.Trigger();
|
||||||
|
}
|
||||||
|
|
||||||
private void Config_TrayBehaviorChanged(object sender, EventArgs e){
|
private void Config_TrayBehaviorChanged(object sender, EventArgs e){
|
||||||
UpdateTrayIcon();
|
UpdateTrayIcon();
|
||||||
}
|
}
|
||||||
@@ -208,45 +220,13 @@ namespace TweetDuck.Core{
|
|||||||
ForceClose();
|
ForceClose();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void browser_PageLoaded(object sender, EventArgs e){
|
|
||||||
if (Config.ShowDataCollectionNotification){
|
|
||||||
this.InvokeAsyncSafe(() => {
|
|
||||||
if (!Config.FirstRun && Config.AllowDataCollection){
|
|
||||||
FormMessage form = new FormMessage("Anonymous Data Update", "Hi! You can now review your anonymous data report, and opt-out if you've changed your mind. Collected data will be used to focus development on most commonly used features. If you want to opt-out but still support the project, any feedback and donations are appreciated.", MessageBoxIcon.Information);
|
|
||||||
form.AddButton("OK", ControlType.Accept | ControlType.Focused);
|
|
||||||
|
|
||||||
Button btnReviewSettings = new Button{
|
|
||||||
Anchor = AnchorStyles.Bottom | AnchorStyles.Left,
|
|
||||||
Font = SystemFonts.MessageBoxFont,
|
|
||||||
Location = new Point(9, 12),
|
|
||||||
Margin = new Padding(0, 0, 48, 0),
|
|
||||||
Size = new Size(160, 26),
|
|
||||||
Text = "Review Feedback Options",
|
|
||||||
UseVisualStyleBackColor = true
|
|
||||||
};
|
|
||||||
|
|
||||||
btnReviewSettings.Click += (sender2, args2) => {
|
|
||||||
form.Close();
|
|
||||||
OpenSettings(typeof(TabSettingsFeedback));
|
|
||||||
};
|
|
||||||
|
|
||||||
form.AddActionControl(btnReviewSettings);
|
|
||||||
ShowChildForm(form);
|
|
||||||
}
|
|
||||||
|
|
||||||
Config.ShowDataCollectionNotification = false;
|
|
||||||
Config.Save();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void plugins_Reloaded(object sender, PluginErrorEventArgs e){
|
private void plugins_Reloaded(object sender, PluginErrorEventArgs e){
|
||||||
if (e.HasErrors){
|
if (e.HasErrors){
|
||||||
FormMessage.Error("Error Loading Plugins", "The following plugins will not be available until the issues are resolved:\n\n"+string.Join("\n\n", e.Errors), FormMessage.OK);
|
FormMessage.Error("Error Loading Plugins", "The following plugins will not be available until the issues are resolved:\n\n"+string.Join("\n\n", e.Errors), FormMessage.OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isLoaded){
|
if (isLoaded){
|
||||||
ReloadToTweetDeck();
|
browser.ReloadToTweetDeck();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -256,16 +236,50 @@ namespace TweetDuck.Core{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void updates_CheckFinished(object sender, UpdateCheckEventArgs e){
|
||||||
|
e.Result.Handle(update => {
|
||||||
|
string tag = update.VersionTag;
|
||||||
|
|
||||||
|
if (tag != Program.VersionTag && tag != Config.DismissedUpdate){
|
||||||
|
updates.PrepareUpdate(update);
|
||||||
|
browser.ShowUpdateNotification(tag, update.ReleaseNotes);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
updates.StartTimer();
|
||||||
|
}
|
||||||
|
}, ex => {
|
||||||
|
if (!ignoreUpdateCheckError){
|
||||||
|
Program.Reporter.HandleException("Update Check Error", "An error occurred while checking for updates.", true, ex);
|
||||||
|
updates.StartTimer();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
ignoreUpdateCheckError = true;
|
||||||
|
}
|
||||||
|
|
||||||
private void updates_UpdateAccepted(object sender, UpdateEventArgs e){
|
private void updates_UpdateAccepted(object sender, UpdateEventArgs e){
|
||||||
this.InvokeAsyncSafe(() => {
|
this.InvokeAsyncSafe(() => {
|
||||||
FormManager.CloseAllDialogs();
|
FormManager.CloseAllDialogs();
|
||||||
|
|
||||||
updates.BeginUpdateDownload(this, e.UpdateInfo, update => {
|
if (!string.IsNullOrEmpty(Config.DismissedUpdate)){
|
||||||
if (update.DownloadStatus == UpdateDownloadStatus.Done){
|
Config.DismissedUpdate = null;
|
||||||
UpdateInstallerPath = update.InstallerPath;
|
Config.Save();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
updates.BeginUpdateDownload(this, e.UpdateInfo, update => {
|
||||||
|
UpdateDownloadStatus status = update.DownloadStatus;
|
||||||
|
|
||||||
|
if (status == UpdateDownloadStatus.Done){
|
||||||
|
UpdateInstallerPath = update.InstallerPath;
|
||||||
ForceClose();
|
ForceClose();
|
||||||
|
}
|
||||||
|
else if (status != UpdateDownloadStatus.Canceled && FormMessage.Error("Update Has Failed", "Could not automatically download the update: "+(update.DownloadError?.Message ?? "unknown error")+"\n\nWould you like to open the website and try downloading the update manually?", FormMessage.Yes, FormMessage.No)){
|
||||||
|
BrowserUtils.OpenExternalBrowser(Program.Website);
|
||||||
|
ForceClose();
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
Show();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -277,41 +291,14 @@ namespace TweetDuck.Core{
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void soundNotification_PlaybackError(object sender, PlaybackErrorEventArgs e){
|
|
||||||
e.Ignore = true;
|
|
||||||
|
|
||||||
using(FormMessage form = new FormMessage("Notification Sound Error", "Could not play custom notification sound.\n"+e.Message, MessageBoxIcon.Error)){
|
|
||||||
form.AddButton(FormMessage.Ignore, ControlType.Cancel | ControlType.Focused);
|
|
||||||
|
|
||||||
Button btnOpenSettings = form.AddButton("View Options");
|
|
||||||
btnOpenSettings.Width += 16;
|
|
||||||
btnOpenSettings.Location = new Point(btnOpenSettings.Location.X-16, btnOpenSettings.Location.Y);
|
|
||||||
|
|
||||||
if (form.ShowDialog() == DialogResult.OK && form.ClickedButton == btnOpenSettings){
|
|
||||||
OpenSettings(typeof(TabSettingsSounds));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void WndProc(ref Message m){
|
protected override void WndProc(ref Message m){
|
||||||
if (isLoaded){
|
if (isLoaded && m.Msg == Program.WindowRestoreMessage){
|
||||||
if (m.Msg == Program.WindowRestoreMessage){
|
|
||||||
if (WindowsUtils.CurrentProcessID == m.WParam.ToInt32()){
|
if (WindowsUtils.CurrentProcessID == m.WParam.ToInt32()){
|
||||||
trayIcon_ClickRestore(trayIcon, EventArgs.Empty);
|
trayIcon_ClickRestore(trayIcon, EventArgs.Empty);
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if (m.Msg == Program.SubProcessMessage){
|
|
||||||
int processId = m.WParam.ToInt32();
|
|
||||||
|
|
||||||
if (WindowsUtils.IsChildProcess(processId)){ // child process is checked in two places for safety
|
|
||||||
BrowserProcesses.Link(m.LParam.ToInt32(), processId);
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (browser.Ready && m.Msg == NativeMethods.WM_PARENTNOTIFY && (m.WParam.ToInt32() & 0xFFFF) == NativeMethods.WM_XBUTTONDOWN){
|
if (browser.Ready && m.Msg == NativeMethods.WM_PARENTNOTIFY && (m.WParam.ToInt32() & 0xFFFF) == NativeMethods.WM_XBUTTONDOWN){
|
||||||
if (videoPlayer != null && videoPlayer.Running){
|
if (videoPlayer != null && videoPlayer.Running){
|
||||||
@@ -319,7 +306,7 @@ namespace TweetDuck.Core{
|
|||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
browser.OnMouseClickExtra(m.WParam);
|
browser.OnMouseClickExtra(m.WParam);
|
||||||
TriggerAnalyticsEvent(AnalyticsFile.Event.BrowserExtraMouseButton);
|
AnalyticsFile.BrowserExtraMouseButtons.Trigger();
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@@ -343,7 +330,17 @@ namespace TweetDuck.Core{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void ReloadToTweetDeck(){
|
public void ReloadToTweetDeck(){
|
||||||
|
#if DEBUG
|
||||||
|
Resources.ScriptLoader.HotSwap();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ignoreUpdateCheckError = false;
|
||||||
browser.ReloadToTweetDeck();
|
browser.ReloadToTweetDeck();
|
||||||
|
AnalyticsFile.BrowserReloads.Trigger();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddSearchColumn(string query){
|
||||||
|
browser.AddSearchColumn(query);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void TriggerTweetScreenshot(){
|
public void TriggerTweetScreenshot(){
|
||||||
@@ -354,12 +351,13 @@ namespace TweetDuck.Core{
|
|||||||
browser.ReloadColumns();
|
browser.ReloadColumns();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ApplyROT13(){
|
public void PlaySoundNotification(){
|
||||||
browser.ApplyROT13();
|
browser.PlaySoundNotification();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void TriggerAnalyticsEvent(AnalyticsFile.Event e){
|
public void ApplyROT13(){
|
||||||
analytics?.TriggerEvent(e);
|
browser.ApplyROT13();
|
||||||
|
AnalyticsFile.UsedROT13.Trigger();
|
||||||
}
|
}
|
||||||
|
|
||||||
// callback handlers
|
// callback handlers
|
||||||
@@ -368,7 +366,6 @@ namespace TweetDuck.Core{
|
|||||||
if (Config.FirstRun){
|
if (Config.FirstRun){
|
||||||
Config.FirstRun = false;
|
Config.FirstRun = false;
|
||||||
Config.AllowDataCollection = allowDataCollection;
|
Config.AllowDataCollection = allowDataCollection;
|
||||||
Config.ShowDataCollectionNotification = false;
|
|
||||||
Config.Save();
|
Config.Save();
|
||||||
|
|
||||||
if (allowDataCollection && analytics == null){
|
if (allowDataCollection && analytics == null){
|
||||||
@@ -377,7 +374,7 @@ namespace TweetDuck.Core{
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (showGuide){
|
if (showGuide){
|
||||||
ShowChildForm(new FormGuide());
|
FormGuide.Show();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -407,8 +404,6 @@ namespace TweetDuck.Core{
|
|||||||
trayIcon.HasNotifications = false;
|
trayIcon.HasNotifications = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
browser.RefreshMemoryTracker();
|
|
||||||
|
|
||||||
if (Config.AllowDataCollection){
|
if (Config.AllowDataCollection){
|
||||||
if (analytics == null){
|
if (analytics == null){
|
||||||
analytics = new AnalyticsManager(this, plugins, Program.AnalyticsFilePath);
|
analytics = new AnalyticsManager(this, plugins, Program.AnalyticsFilePath);
|
||||||
@@ -419,6 +414,8 @@ namespace TweetDuck.Core{
|
|||||||
analytics = null;
|
analytics = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BrowserCache.RefreshTimer();
|
||||||
|
|
||||||
if (form.ShouldReloadBrowser){
|
if (form.ShouldReloadBrowser){
|
||||||
FormManager.TryFind<FormPlugins>()?.Close();
|
FormManager.TryFind<FormPlugins>()?.Close();
|
||||||
plugins.Reload(); // also reloads the browser
|
plugins.Reload(); // also reloads the browser
|
||||||
@@ -431,21 +428,21 @@ namespace TweetDuck.Core{
|
|||||||
form.Dispose();
|
form.Dispose();
|
||||||
};
|
};
|
||||||
|
|
||||||
TriggerAnalyticsEvent(AnalyticsFile.Event.OpenOptions);
|
AnalyticsFile.OpenOptions.Trigger();
|
||||||
ShowChildForm(form);
|
ShowChildForm(form);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OpenAbout(){
|
public void OpenAbout(){
|
||||||
if (!FormManager.TryBringToFront<FormAbout>()){
|
if (!FormManager.TryBringToFront<FormAbout>()){
|
||||||
TriggerAnalyticsEvent(AnalyticsFile.Event.OpenAbout);
|
AnalyticsFile.OpenAbout.Trigger();
|
||||||
ShowChildForm(new FormAbout());
|
ShowChildForm(new FormAbout());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OpenPlugins(){
|
public void OpenPlugins(){
|
||||||
if (!FormManager.TryBringToFront<FormPlugins>()){
|
if (!FormManager.TryBringToFront<FormPlugins>()){
|
||||||
TriggerAnalyticsEvent(AnalyticsFile.Event.OpenPlugins);
|
AnalyticsFile.OpenPlugins.Trigger();
|
||||||
ShowChildForm(new FormPlugins(plugins));
|
ShowChildForm(new FormPlugins(plugins));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -456,20 +453,8 @@ namespace TweetDuck.Core{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void PlayNotificationSound(){
|
public void OnTweetSound(){
|
||||||
if (Config.NotificationSoundPath.Length == 0){
|
AnalyticsFile.SoundNotifications.Trigger();
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (soundNotification == null){
|
|
||||||
soundNotification = new SoundNotification();
|
|
||||||
soundNotification.PlaybackError += soundNotification_PlaybackError;
|
|
||||||
}
|
|
||||||
|
|
||||||
soundNotification.SetVolume(Config.NotificationSoundVolume);
|
|
||||||
soundNotification.Play(Config.NotificationSoundPath);
|
|
||||||
|
|
||||||
TriggerAnalyticsEvent(AnalyticsFile.Event.SoundNotification);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void PlayVideo(string url, string username){
|
public void PlayVideo(string url, string username){
|
||||||
@@ -487,7 +472,7 @@ namespace TweetDuck.Core{
|
|||||||
}
|
}
|
||||||
|
|
||||||
videoPlayer.Launch(url, username);
|
videoPlayer.Launch(url, username);
|
||||||
TriggerAnalyticsEvent(AnalyticsFile.Event.VideoPlay);
|
AnalyticsFile.VideoPlays.Trigger();
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool ProcessBrowserKey(Keys key){
|
public bool ProcessBrowserKey(Keys key){
|
||||||
@@ -509,16 +494,16 @@ namespace TweetDuck.Core{
|
|||||||
|
|
||||||
notification.FinishCurrentNotification();
|
notification.FinishCurrentNotification();
|
||||||
browser.ShowTweetDetail(columnId, chirpId, fallbackUrl);
|
browser.ShowTweetDetail(columnId, chirpId, fallbackUrl);
|
||||||
TriggerAnalyticsEvent(AnalyticsFile.Event.TweetDetail);
|
AnalyticsFile.TweetDetails.Trigger();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnTweetScreenshotReady(string html, int width, int height){
|
public void OnTweetScreenshotReady(string html, int width){
|
||||||
if (notificationScreenshotManager == null){
|
if (notificationScreenshotManager == null){
|
||||||
notificationScreenshotManager = new TweetScreenshotManager(this, plugins);
|
notificationScreenshotManager = new TweetScreenshotManager(this, plugins);
|
||||||
}
|
}
|
||||||
|
|
||||||
notificationScreenshotManager.Trigger(html, width, height);
|
notificationScreenshotManager.Trigger(html, width);
|
||||||
TriggerAnalyticsEvent(AnalyticsFile.Event.TweetScreenshot);
|
AnalyticsFile.TweetScreenshots.Trigger();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void DisplayTooltip(string text){
|
public void DisplayTooltip(string text){
|
||||||
|
|||||||
@@ -3,32 +3,22 @@ using System.IO;
|
|||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using CefSharp;
|
using CefSharp;
|
||||||
using TweetDuck.Core.Bridge;
|
|
||||||
using TweetDuck.Core.Controls;
|
using TweetDuck.Core.Controls;
|
||||||
using TweetDuck.Core.Utils;
|
using TweetDuck.Core.Utils;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using TweetDuck.Core.Bridge;
|
||||||
|
using TweetDuck.Core.Management;
|
||||||
|
using TweetDuck.Core.Notification;
|
||||||
using TweetDuck.Core.Other;
|
using TweetDuck.Core.Other;
|
||||||
|
using TweetDuck.Core.Other.Analytics;
|
||||||
|
using TweetDuck.Resources;
|
||||||
|
|
||||||
namespace TweetDuck.Core.Handling{
|
namespace TweetDuck.Core.Handling{
|
||||||
abstract class ContextMenuBase : IContextMenuHandler{
|
abstract class ContextMenuBase : IContextMenuHandler{
|
||||||
protected static readonly bool HasDevTools = File.Exists(Path.Combine(Program.ProgramPath, "devtools_resources.pak"));
|
public static readonly bool HasDevTools = File.Exists(Path.Combine(Program.ProgramPath, "devtools_resources.pak"));
|
||||||
|
|
||||||
private static TwitterUtils.ImageQuality ImageQuality => Program.UserConfig.TwitterImageQuality;
|
private static TwitterUtils.ImageQuality ImageQuality => Program.UserConfig.TwitterImageQuality;
|
||||||
|
|
||||||
private static KeyValuePair<string, string> ContextInfo;
|
|
||||||
private static bool IsLink => ContextInfo.Key == "link";
|
|
||||||
private static bool IsImage => ContextInfo.Key == "image";
|
|
||||||
private static bool IsVideo => ContextInfo.Key == "video";
|
|
||||||
|
|
||||||
public static void SetContextInfo(string type, string link){
|
|
||||||
ContextInfo = new KeyValuePair<string, string>(string.IsNullOrEmpty(link) ? null : type, link);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static string GetMediaLink(IContextMenuParams parameters){
|
|
||||||
return IsImage || IsVideo ? ContextInfo.Value : parameters.SourceUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
private const CefMenuCommand MenuOpenLinkUrl = (CefMenuCommand)26500;
|
private const CefMenuCommand MenuOpenLinkUrl = (CefMenuCommand)26500;
|
||||||
private const CefMenuCommand MenuCopyLinkUrl = (CefMenuCommand)26501;
|
private const CefMenuCommand MenuCopyLinkUrl = (CefMenuCommand)26501;
|
||||||
private const CefMenuCommand MenuCopyUsername = (CefMenuCommand)26502;
|
private const CefMenuCommand MenuCopyUsername = (CefMenuCommand)26502;
|
||||||
@@ -37,24 +27,43 @@ namespace TweetDuck.Core.Handling{
|
|||||||
private const CefMenuCommand MenuCopyMediaUrl = (CefMenuCommand)26505;
|
private const CefMenuCommand MenuCopyMediaUrl = (CefMenuCommand)26505;
|
||||||
private const CefMenuCommand MenuSaveMedia = (CefMenuCommand)26506;
|
private const CefMenuCommand MenuSaveMedia = (CefMenuCommand)26506;
|
||||||
private const CefMenuCommand MenuSaveTweetImages = (CefMenuCommand)26507;
|
private const CefMenuCommand MenuSaveTweetImages = (CefMenuCommand)26507;
|
||||||
|
private const CefMenuCommand MenuSearchInBrowser = (CefMenuCommand)26508;
|
||||||
|
private const CefMenuCommand MenuReadApplyROT13 = (CefMenuCommand)26509;
|
||||||
private const CefMenuCommand MenuOpenDevTools = (CefMenuCommand)26599;
|
private const CefMenuCommand MenuOpenDevTools = (CefMenuCommand)26599;
|
||||||
|
|
||||||
private string[] lastHighlightedTweetAuthors;
|
protected ContextInfo.LinkInfo LastLink { get; private set; }
|
||||||
private string[] lastHighlightedTweetImageList;
|
protected ContextInfo.ChirpInfo LastChirp { get; private set; }
|
||||||
|
|
||||||
|
private readonly AnalyticsFile.IProvider analytics;
|
||||||
|
|
||||||
|
protected ContextMenuBase(AnalyticsFile.IProvider analytics){
|
||||||
|
this.analytics = analytics;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ResetContextInfo(){
|
||||||
|
LastLink = default(ContextInfo.LinkInfo);
|
||||||
|
LastChirp = default(ContextInfo.ChirpInfo);
|
||||||
|
TweetDeckBridge.ContextInfo.Reset();
|
||||||
|
}
|
||||||
|
|
||||||
public virtual void OnBeforeContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model){
|
public virtual void OnBeforeContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model){
|
||||||
if (!TwitterUtils.IsTweetDeckWebsite(frame) || browser.IsLoading){
|
if (!TwitterUtils.IsTweetDeckWebsite(frame) || browser.IsLoading){
|
||||||
lastHighlightedTweetAuthors = StringUtils.EmptyArray;
|
ResetContextInfo();
|
||||||
lastHighlightedTweetImageList = StringUtils.EmptyArray;
|
|
||||||
ContextInfo = default(KeyValuePair<string, string>);
|
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
lastHighlightedTweetAuthors = TweetDeckBridge.LastHighlightedTweetAuthorsArray;
|
LastLink = TweetDeckBridge.ContextInfo.Link;
|
||||||
lastHighlightedTweetImageList = TweetDeckBridge.LastHighlightedTweetImagesArray;
|
LastChirp = TweetDeckBridge.ContextInfo.Chirp;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool hasTweetImage = IsImage;
|
if (parameters.TypeFlags.HasFlag(ContextMenuType.Selection) && !parameters.TypeFlags.HasFlag(ContextMenuType.Editable)){
|
||||||
bool hasTweetVideo = IsVideo;
|
model.AddItem(MenuSearchInBrowser, "Search in browser");
|
||||||
|
model.AddSeparator();
|
||||||
|
model.AddItem(MenuReadApplyROT13, "Apply ROT13");
|
||||||
|
model.AddSeparator();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool hasTweetImage = LastLink.IsImage;
|
||||||
|
bool hasTweetVideo = LastLink.IsVideo;
|
||||||
|
|
||||||
string TextOpen(string name) => "Open "+name+" in browser";
|
string TextOpen(string name) => "Open "+name+" in browser";
|
||||||
string TextCopy(string name) => "Copy "+name+" address";
|
string TextCopy(string name) => "Copy "+name+" address";
|
||||||
@@ -80,13 +89,13 @@ namespace TweetDuck.Core.Handling{
|
|||||||
model.AddItem(MenuSaveMedia, TextSave("video"));
|
model.AddItem(MenuSaveMedia, TextSave("video"));
|
||||||
model.AddSeparator();
|
model.AddSeparator();
|
||||||
}
|
}
|
||||||
else if ((parameters.TypeFlags.HasFlag(ContextMenuType.Media) && parameters.HasImageContents) || hasTweetImage){
|
else if (((parameters.TypeFlags.HasFlag(ContextMenuType.Media) && parameters.HasImageContents) || hasTweetImage) && parameters.SourceUrl != TweetNotification.AppLogo.Url){
|
||||||
model.AddItem(MenuViewImage, "View image in photo viewer");
|
model.AddItem(MenuViewImage, "View image in photo viewer");
|
||||||
model.AddItem(MenuOpenMediaUrl, TextOpen("image"));
|
model.AddItem(MenuOpenMediaUrl, TextOpen("image"));
|
||||||
model.AddItem(MenuCopyMediaUrl, TextCopy("image"));
|
model.AddItem(MenuCopyMediaUrl, TextCopy("image"));
|
||||||
model.AddItem(MenuSaveMedia, TextSave("image"));
|
model.AddItem(MenuSaveMedia, TextSave("image"));
|
||||||
|
|
||||||
if (lastHighlightedTweetImageList.Length > 1){
|
if (LastChirp.Images.Length > 1){
|
||||||
model.AddItem(MenuSaveTweetImages, TextSave("all images"));
|
model.AddItem(MenuSaveTweetImages, TextSave("all images"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -95,66 +104,104 @@ namespace TweetDuck.Core.Handling{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public virtual bool OnContextMenuCommand(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, CefMenuCommand commandId, CefEventFlags eventFlags){
|
public virtual bool OnContextMenuCommand(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, CefMenuCommand commandId, CefEventFlags eventFlags){
|
||||||
|
Control control = browserControl.AsControl();
|
||||||
|
|
||||||
switch(commandId){
|
switch(commandId){
|
||||||
case MenuOpenLinkUrl:
|
case MenuOpenLinkUrl:
|
||||||
OpenBrowser(browserControl.AsControl(), IsLink ? ContextInfo.Value : parameters.LinkUrl);
|
OpenBrowser(control, LastLink.GetUrl(parameters, true));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MenuCopyLinkUrl:
|
case MenuCopyLinkUrl:
|
||||||
SetClipboardText(browserControl.AsControl(), IsLink ? ContextInfo.Value : parameters.UnfilteredLinkUrl);
|
SetClipboardText(control, LastLink.GetUrl(parameters, false));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MenuCopyUsername:
|
case MenuCopyUsername:
|
||||||
Match match = TwitterUtils.RegexAccount.Match(parameters.UnfilteredLinkUrl);
|
Match match = TwitterUtils.RegexAccount.Match(parameters.UnfilteredLinkUrl);
|
||||||
SetClipboardText(browserControl.AsControl(), match.Success ? match.Groups[1].Value : parameters.UnfilteredLinkUrl);
|
SetClipboardText(control, match.Success ? match.Groups[1].Value : parameters.UnfilteredLinkUrl);
|
||||||
|
control.InvokeAsyncSafe(analytics.AnalyticsFile.CopiedUsernames.Trigger);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MenuOpenMediaUrl:
|
case MenuOpenMediaUrl:
|
||||||
OpenBrowser(browserControl.AsControl(), TwitterUtils.GetMediaLink(GetMediaLink(parameters), ImageQuality));
|
OpenBrowser(control, TwitterUtils.GetMediaLink(LastLink.GetMediaSource(parameters), ImageQuality));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MenuCopyMediaUrl:
|
case MenuCopyMediaUrl:
|
||||||
SetClipboardText(browserControl.AsControl(), TwitterUtils.GetMediaLink(GetMediaLink(parameters), ImageQuality));
|
SetClipboardText(control, TwitterUtils.GetMediaLink(LastLink.GetMediaSource(parameters), ImageQuality));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MenuViewImage:
|
case MenuViewImage: {
|
||||||
string url = GetMediaLink(parameters);
|
void ViewImage(string path){
|
||||||
string file = Path.Combine(BrowserCache.CacheFolder, TwitterUtils.GetImageFileName(url));
|
string ext = Path.GetExtension(path);
|
||||||
|
|
||||||
void ViewFile(){
|
|
||||||
string ext = Path.GetExtension(file);
|
|
||||||
|
|
||||||
if (TwitterUtils.ValidImageExtensions.Contains(ext)){
|
if (TwitterUtils.ValidImageExtensions.Contains(ext)){
|
||||||
WindowsUtils.OpenAssociatedProgram(file);
|
WindowsUtils.OpenAssociatedProgram(path);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
FormMessage.Error("Image Download", "Invalid file extension "+ext, FormMessage.OK);
|
FormMessage.Error("Image Download", "Invalid file extension "+ext, FormMessage.OK);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
string url = LastLink.GetMediaSource(parameters);
|
||||||
|
string file = Path.Combine(BrowserCache.CacheFolder, TwitterUtils.GetImageFileName(url) ?? Path.GetRandomFileName());
|
||||||
|
|
||||||
|
control.InvokeAsyncSafe(() => {
|
||||||
if (File.Exists(file)){
|
if (File.Exists(file)){
|
||||||
ViewFile();
|
ViewImage(file);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
BrowserUtils.DownloadFileAsync(TwitterUtils.GetMediaLink(url, ImageQuality), file, ViewFile, ex => {
|
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);
|
FormMessage.Error("Image Download", "An error occurred while downloading the image: "+ex.Message, FormMessage.OK);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case MenuSaveMedia:
|
case MenuSaveMedia: {
|
||||||
if (IsVideo){
|
bool isVideo = LastLink.IsVideo;
|
||||||
TwitterUtils.DownloadVideo(GetMediaLink(parameters), lastHighlightedTweetAuthors.LastOrDefault());
|
string url = LastLink.GetMediaSource(parameters);
|
||||||
|
string username = LastChirp.Authors.LastOrDefault();
|
||||||
|
|
||||||
|
control.InvokeAsyncSafe(() => {
|
||||||
|
if (isVideo){
|
||||||
|
TwitterUtils.DownloadVideo(url, username);
|
||||||
|
analytics.AnalyticsFile.DownloadedVideos.Trigger();
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
TwitterUtils.DownloadImage(GetMediaLink(parameters), lastHighlightedTweetAuthors.LastOrDefault(), ImageQuality);
|
TwitterUtils.DownloadImage(url, username, ImageQuality);
|
||||||
|
analytics.AnalyticsFile.DownloadedImages.Trigger();
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case MenuSaveTweetImages:
|
case MenuSaveTweetImages: {
|
||||||
TwitterUtils.DownloadImages(lastHighlightedTweetImageList, lastHighlightedTweetAuthors.LastOrDefault(), ImageQuality);
|
string[] urls = LastChirp.Images;
|
||||||
|
string username = LastChirp.Authors.LastOrDefault();
|
||||||
|
|
||||||
|
control.InvokeAsyncSafe(() => {
|
||||||
|
TwitterUtils.DownloadImages(urls, username, ImageQuality);
|
||||||
|
analytics.AnalyticsFile.DownloadedImages.Trigger();
|
||||||
|
});
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case MenuReadApplyROT13:
|
||||||
|
string selection = parameters.SelectionText;
|
||||||
|
control.InvokeAsyncSafe(() => FormMessage.Information("ROT13", StringUtils.ConvertRot13(selection), FormMessage.OK));
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case MenuSearchInBrowser:
|
||||||
|
string query = parameters.SelectionText;
|
||||||
|
control.InvokeAsyncSafe(() => BrowserUtils.OpenExternalSearch(query));
|
||||||
|
DeselectAll(frame);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MenuOpenDevTools:
|
case MenuOpenDevTools:
|
||||||
@@ -166,21 +213,29 @@ namespace TweetDuck.Core.Handling{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public virtual void OnContextMenuDismissed(IWebBrowser browserControl, IBrowser browser, IFrame frame){
|
public virtual void OnContextMenuDismissed(IWebBrowser browserControl, IBrowser browser, IFrame frame){
|
||||||
ContextInfo = default(KeyValuePair<string, string>);
|
ResetContextInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual bool RunContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model, IRunContextMenuCallback callback){
|
public virtual bool RunContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model, IRunContextMenuCallback callback){
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void OpenBrowser(Control control, string url){
|
protected static void DeselectAll(IFrame frame){
|
||||||
|
ScriptLoader.ExecuteScript(frame, "window.getSelection().removeAllRanges()", "gen:deselect");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static void OpenBrowser(Control control, string url){
|
||||||
control.InvokeAsyncSafe(() => BrowserUtils.OpenExternalBrowser(url));
|
control.InvokeAsyncSafe(() => BrowserUtils.OpenExternalBrowser(url));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void SetClipboardText(Control control, string text){
|
protected static void SetClipboardText(Control control, string text){
|
||||||
control.InvokeAsyncSafe(() => WindowsUtils.SetClipboard(text, TextDataFormat.UnicodeText));
|
control.InvokeAsyncSafe(() => WindowsUtils.SetClipboard(text, TextDataFormat.UnicodeText));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected static void InsertSelectionSearchItem(IMenuModel model, CefMenuCommand insertCommand, string insertLabel){
|
||||||
|
model.InsertItemAt(model.GetIndexOf(MenuSearchInBrowser)+1, insertCommand, insertLabel);
|
||||||
|
}
|
||||||
|
|
||||||
protected static void AddDebugMenuItems(IMenuModel model){
|
protected static void AddDebugMenuItems(IMenuModel model){
|
||||||
model.AddItem(MenuOpenDevTools, "Open dev tools");
|
model.AddItem(MenuOpenDevTools, "Open dev tools");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
using CefSharp;
|
using CefSharp;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using TweetDuck.Core.Bridge;
|
|
||||||
using TweetDuck.Core.Controls;
|
using TweetDuck.Core.Controls;
|
||||||
using TweetDuck.Core.Other.Analytics;
|
|
||||||
using TweetDuck.Core.Utils;
|
using TweetDuck.Core.Utils;
|
||||||
|
|
||||||
namespace TweetDuck.Core.Handling{
|
namespace TweetDuck.Core.Handling{
|
||||||
@@ -18,7 +16,8 @@ namespace TweetDuck.Core.Handling{
|
|||||||
private const CefMenuCommand MenuOpenQuotedTweetUrl = (CefMenuCommand)26612;
|
private const CefMenuCommand MenuOpenQuotedTweetUrl = (CefMenuCommand)26612;
|
||||||
private const CefMenuCommand MenuCopyQuotedTweetUrl = (CefMenuCommand)26613;
|
private const CefMenuCommand MenuCopyQuotedTweetUrl = (CefMenuCommand)26613;
|
||||||
private const CefMenuCommand MenuScreenshotTweet = (CefMenuCommand)26614;
|
private const CefMenuCommand MenuScreenshotTweet = (CefMenuCommand)26614;
|
||||||
private const CefMenuCommand MenuInputApplyROT13 = (CefMenuCommand)26615;
|
private const CefMenuCommand MenuWriteApplyROT13 = (CefMenuCommand)26615;
|
||||||
|
private const CefMenuCommand MenuSearchInColumn = (CefMenuCommand)26616;
|
||||||
|
|
||||||
private const string TitleReloadBrowser = "Reload browser";
|
private const string TitleReloadBrowser = "Reload browser";
|
||||||
private const string TitleMuteNotifications = "Mute notifications";
|
private const string TitleMuteNotifications = "Mute notifications";
|
||||||
@@ -28,24 +27,24 @@ namespace TweetDuck.Core.Handling{
|
|||||||
|
|
||||||
private readonly FormBrowser form;
|
private readonly FormBrowser form;
|
||||||
|
|
||||||
private string lastHighlightedTweetUrl;
|
public ContextMenuBrowser(FormBrowser form) : base(form){
|
||||||
private string lastHighlightedQuoteUrl;
|
|
||||||
|
|
||||||
public ContextMenuBrowser(FormBrowser form){
|
|
||||||
this.form = form;
|
this.form = form;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void OnBeforeContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model){
|
public override void OnBeforeContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model){
|
||||||
|
bool isSelecting = parameters.TypeFlags.HasFlag(ContextMenuType.Selection);
|
||||||
|
bool isEditing = parameters.TypeFlags.HasFlag(ContextMenuType.Editable);
|
||||||
|
|
||||||
model.Remove(CefMenuCommand.Back);
|
model.Remove(CefMenuCommand.Back);
|
||||||
model.Remove(CefMenuCommand.Forward);
|
model.Remove(CefMenuCommand.Forward);
|
||||||
model.Remove(CefMenuCommand.Print);
|
model.Remove(CefMenuCommand.Print);
|
||||||
model.Remove(CefMenuCommand.ViewSource);
|
model.Remove(CefMenuCommand.ViewSource);
|
||||||
RemoveSeparatorIfLast(model);
|
RemoveSeparatorIfLast(model);
|
||||||
|
|
||||||
if (parameters.TypeFlags.HasFlag(ContextMenuType.Selection)){
|
if (isSelecting){
|
||||||
if (parameters.TypeFlags.HasFlag(ContextMenuType.Editable)){
|
if (isEditing){
|
||||||
model.AddSeparator();
|
model.AddSeparator();
|
||||||
model.AddItem(MenuInputApplyROT13, "Apply ROT13");
|
model.AddItem(MenuWriteApplyROT13, "Apply ROT13");
|
||||||
}
|
}
|
||||||
|
|
||||||
model.AddSeparator();
|
model.AddSeparator();
|
||||||
@@ -53,20 +52,16 @@ namespace TweetDuck.Core.Handling{
|
|||||||
|
|
||||||
base.OnBeforeContextMenu(browserControl, browser, frame, parameters, model);
|
base.OnBeforeContextMenu(browserControl, browser, frame, parameters, model);
|
||||||
|
|
||||||
lastHighlightedTweetUrl = TweetDeckBridge.LastHighlightedTweetUrl;
|
if (isSelecting && !isEditing && TwitterUtils.IsTweetDeckWebsite(frame)){
|
||||||
lastHighlightedQuoteUrl = TweetDeckBridge.LastHighlightedQuoteUrl;
|
InsertSelectionSearchItem(model, MenuSearchInColumn, "Search in a column");
|
||||||
|
|
||||||
if (!TwitterUtils.IsTweetDeckWebsite(frame) || browser.IsLoading){
|
|
||||||
lastHighlightedTweetUrl = string.Empty;
|
|
||||||
lastHighlightedQuoteUrl = string.Empty;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(lastHighlightedTweetUrl) && (parameters.TypeFlags & (ContextMenuType.Editable | ContextMenuType.Selection)) == 0){
|
if (!string.IsNullOrEmpty(LastChirp.TweetUrl) && !isSelecting && !isEditing){
|
||||||
model.AddItem(MenuOpenTweetUrl, "Open tweet in browser");
|
model.AddItem(MenuOpenTweetUrl, "Open tweet in browser");
|
||||||
model.AddItem(MenuCopyTweetUrl, "Copy tweet address");
|
model.AddItem(MenuCopyTweetUrl, "Copy tweet address");
|
||||||
model.AddItem(MenuScreenshotTweet, "Screenshot tweet to clipboard");
|
model.AddItem(MenuScreenshotTweet, "Screenshot tweet to clipboard");
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(lastHighlightedQuoteUrl)){
|
if (!string.IsNullOrEmpty(LastChirp.QuoteUrl)){
|
||||||
model.AddSeparator();
|
model.AddSeparator();
|
||||||
model.AddItem(MenuOpenQuotedTweetUrl, "Open quoted tweet in browser");
|
model.AddItem(MenuOpenQuotedTweetUrl, "Open quoted tweet in browser");
|
||||||
model.AddItem(MenuCopyQuotedTweetUrl, "Copy quoted tweet address");
|
model.AddItem(MenuCopyQuotedTweetUrl, "Copy quoted tweet address");
|
||||||
@@ -75,7 +70,7 @@ namespace TweetDuck.Core.Handling{
|
|||||||
model.AddSeparator();
|
model.AddSeparator();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((parameters.TypeFlags & (ContextMenuType.Editable | ContextMenuType.Selection)) == 0){
|
if (!isSelecting && !isEditing){
|
||||||
AddSeparator(model);
|
AddSeparator(model);
|
||||||
|
|
||||||
IMenuModel globalMenu = model.Count == 0 ? model : model.AddSubMenu(MenuGlobal, Program.BrandName);
|
IMenuModel globalMenu = model.Count == 0 ? model : model.AddSubMenu(MenuGlobal, Program.BrandName);
|
||||||
@@ -97,7 +92,7 @@ namespace TweetDuck.Core.Handling{
|
|||||||
|
|
||||||
RemoveSeparatorIfLast(model);
|
RemoveSeparatorIfLast(model);
|
||||||
|
|
||||||
form.InvokeAsyncSafe(() => form.TriggerAnalyticsEvent(AnalyticsFile.Event.BrowserContextMenu));
|
form.InvokeAsyncSafe(form.AnalyticsFile.BrowserContextMenus.Trigger);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override bool OnContextMenuCommand(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, CefMenuCommand commandId, CefEventFlags eventFlags){
|
public override bool OnContextMenuCommand(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, CefMenuCommand commandId, CefEventFlags eventFlags){
|
||||||
@@ -127,11 +122,11 @@ namespace TweetDuck.Core.Handling{
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
case MenuOpenTweetUrl:
|
case MenuOpenTweetUrl:
|
||||||
OpenBrowser(form, lastHighlightedTweetUrl);
|
OpenBrowser(form, LastChirp.TweetUrl);
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
case MenuCopyTweetUrl:
|
case MenuCopyTweetUrl:
|
||||||
SetClipboardText(form, lastHighlightedTweetUrl);
|
SetClipboardText(form, LastChirp.TweetUrl);
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
case MenuScreenshotTweet:
|
case MenuScreenshotTweet:
|
||||||
@@ -139,16 +134,22 @@ namespace TweetDuck.Core.Handling{
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
case MenuOpenQuotedTweetUrl:
|
case MenuOpenQuotedTweetUrl:
|
||||||
OpenBrowser(form, lastHighlightedQuoteUrl);
|
OpenBrowser(form, LastChirp.QuoteUrl);
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
case MenuCopyQuotedTweetUrl:
|
case MenuCopyQuotedTweetUrl:
|
||||||
SetClipboardText(form, lastHighlightedQuoteUrl);
|
SetClipboardText(form, LastChirp.QuoteUrl);
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
case MenuInputApplyROT13:
|
case MenuWriteApplyROT13:
|
||||||
form.InvokeAsyncSafe(form.ApplyROT13);
|
form.InvokeAsyncSafe(form.ApplyROT13);
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
case MenuSearchInColumn:
|
||||||
|
string query = parameters.SelectionText;
|
||||||
|
form.InvokeAsyncSafe(() => form.AddSearchColumn(query));
|
||||||
|
DeselectAll(frame);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@@ -166,7 +167,7 @@ namespace TweetDuck.Core.Handling{
|
|||||||
|
|
||||||
menu.Popup += (sender, args) => {
|
menu.Popup += (sender, args) => {
|
||||||
menu.MenuItems[1].Checked = Program.UserConfig.MuteNotifications;
|
menu.MenuItems[1].Checked = Program.UserConfig.MuteNotifications;
|
||||||
form.TriggerAnalyticsEvent(AnalyticsFile.Event.BrowserContextMenu);
|
form.AnalyticsFile.BrowserContextMenus.Trigger();
|
||||||
};
|
};
|
||||||
|
|
||||||
return menu;
|
return menu;
|
||||||
|
|||||||
@@ -1,7 +1,10 @@
|
|||||||
using CefSharp;
|
using CefSharp;
|
||||||
|
using TweetDuck.Core.Other.Analytics;
|
||||||
|
|
||||||
namespace TweetDuck.Core.Handling{
|
namespace TweetDuck.Core.Handling{
|
||||||
sealed class ContextMenuGuide : ContextMenuBase{
|
sealed class ContextMenuGuide : ContextMenuBase{
|
||||||
|
public ContextMenuGuide(AnalyticsFile.IProvider analytics) : base(analytics){}
|
||||||
|
|
||||||
public override void OnBeforeContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model){
|
public override void OnBeforeContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model){
|
||||||
model.Clear();
|
model.Clear();
|
||||||
base.OnBeforeContextMenu(browserControl, browser, frame, parameters, model);
|
base.OnBeforeContextMenu(browserControl, browser, frame, parameters, model);
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
using CefSharp;
|
using CefSharp;
|
||||||
using TweetDuck.Core.Controls;
|
using TweetDuck.Core.Controls;
|
||||||
using TweetDuck.Core.Notification;
|
using TweetDuck.Core.Notification;
|
||||||
using TweetDuck.Core.Other.Analytics;
|
|
||||||
|
|
||||||
namespace TweetDuck.Core.Handling{
|
namespace TweetDuck.Core.Handling{
|
||||||
sealed class ContextMenuNotification : ContextMenuBase{
|
sealed class ContextMenuNotification : ContextMenuBase{
|
||||||
@@ -14,7 +13,7 @@ namespace TweetDuck.Core.Handling{
|
|||||||
private readonly FormNotificationBase form;
|
private readonly FormNotificationBase form;
|
||||||
private readonly bool enableCustomMenu;
|
private readonly bool enableCustomMenu;
|
||||||
|
|
||||||
public ContextMenuNotification(FormNotificationBase form, bool enableCustomMenu){
|
public ContextMenuNotification(FormNotificationBase form, bool enableCustomMenu) : base(form){
|
||||||
this.form = form;
|
this.form = form;
|
||||||
this.enableCustomMenu = enableCustomMenu;
|
this.enableCustomMenu = enableCustomMenu;
|
||||||
}
|
}
|
||||||
@@ -57,7 +56,7 @@ namespace TweetDuck.Core.Handling{
|
|||||||
|
|
||||||
form.InvokeAsyncSafe(() => {
|
form.InvokeAsyncSafe(() => {
|
||||||
form.ContextMenuOpen = true;
|
form.ContextMenuOpen = true;
|
||||||
form.TriggerAnalyticsEvent(AnalyticsFile.Event.NotificationContextMenu);
|
form.AnalyticsFile.NotificationContextMenus.Trigger();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,22 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using CefSharp;
|
using CefSharp;
|
||||||
|
using CefSharp.Enums;
|
||||||
|
|
||||||
namespace TweetDuck.Core.Handling{
|
namespace TweetDuck.Core.Handling{
|
||||||
sealed class DragHandlerBrowser : IDragHandler{
|
sealed class DragHandlerBrowser : IDragHandler{
|
||||||
|
private readonly RequestHandlerBrowser requestHandler;
|
||||||
|
|
||||||
|
public DragHandlerBrowser(RequestHandlerBrowser requestHandler){
|
||||||
|
this.requestHandler = requestHandler;
|
||||||
|
}
|
||||||
|
|
||||||
public bool OnDragEnter(IWebBrowser browserControl, IBrowser browser, IDragData dragData, DragOperationsMask mask){
|
public bool OnDragEnter(IWebBrowser browserControl, IBrowser browser, IDragData dragData, DragOperationsMask mask){
|
||||||
void TriggerDragStart(string type, string data = null){
|
void TriggerDragStart(string type, string data = null){
|
||||||
browserControl.ExecuteScriptAsync("window.TDGF_onGlobalDragStart", type, data);
|
browserControl.ExecuteScriptAsync("window.TDGF_onGlobalDragStart", type, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
requestHandler.BlockNextUserNavUrl = dragData.LinkUrl; // empty if not a link
|
||||||
|
|
||||||
if (dragData.IsLink){
|
if (dragData.IsLink){
|
||||||
TriggerDragStart("link", dragData.LinkUrl);
|
TriggerDragStart("link", dragData.LinkUrl);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ namespace TweetDuck.Core.Handling.General{
|
|||||||
private static void UpdatePrefsInternal(){
|
private static void UpdatePrefsInternal(){
|
||||||
using(IRequestContext ctx = Cef.GetGlobalRequestContext()){
|
using(IRequestContext ctx = Cef.GetGlobalRequestContext()){
|
||||||
ctx.SetPreference("browser.enable_spellchecking", Program.UserConfig.EnableSpellCheck, out string _);
|
ctx.SetPreference("browser.enable_spellchecking", Program.UserConfig.EnableSpellCheck, out string _);
|
||||||
|
ctx.SetPreference("spellcheck.dictionary", Program.UserConfig.SpellCheckLanguage, out string _);
|
||||||
ctx.SetPreference("settings.a11y.animation_policy", Program.UserConfig.EnableAnimatedImages ? "allowed" : "none", out string _);
|
ctx.SetPreference("settings.a11y.animation_policy", Program.UserConfig.EnableAnimatedImages ? "allowed" : "none", out string _);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using CefSharp;
|
using CefSharp;
|
||||||
using CefSharp.WinForms;
|
|
||||||
using TweetDuck.Core.Controls;
|
using TweetDuck.Core.Controls;
|
||||||
using TweetDuck.Core.Other;
|
using TweetDuck.Core.Other;
|
||||||
using TweetDuck.Core.Utils;
|
using TweetDuck.Core.Utils;
|
||||||
@@ -28,7 +27,7 @@ namespace TweetDuck.Core.Handling.General{
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool IJsDialogHandler.OnJSDialog(IWebBrowser browserControl, IBrowser browser, string originUrl, CefJsDialogType dialogType, string messageText, string defaultPromptText, IJsDialogCallback callback, ref bool suppressMessage){
|
bool IJsDialogHandler.OnJSDialog(IWebBrowser browserControl, IBrowser browser, string originUrl, CefJsDialogType dialogType, string messageText, string defaultPromptText, IJsDialogCallback callback, ref bool suppressMessage){
|
||||||
((ChromiumWebBrowser)browserControl).InvokeSafe(() => {
|
browserControl.AsControl().InvokeSafe(() => {
|
||||||
FormMessage form;
|
FormMessage form;
|
||||||
TextBox input = null;
|
TextBox input = null;
|
||||||
|
|
||||||
@@ -51,8 +50,9 @@ namespace TweetDuck.Core.Handling.General{
|
|||||||
|
|
||||||
input = new TextBox{
|
input = new TextBox{
|
||||||
Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Bottom,
|
Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Bottom,
|
||||||
|
Font = SystemFonts.MessageBoxFont,
|
||||||
Location = new Point(BrowserUtils.Scale(22+inputPad, dpiScale), form.ActionPanelY-BrowserUtils.Scale(46, dpiScale)),
|
Location = new Point(BrowserUtils.Scale(22+inputPad, dpiScale), form.ActionPanelY-BrowserUtils.Scale(46, dpiScale)),
|
||||||
Size = new Size(form.ClientSize.Width-BrowserUtils.Scale(44+inputPad, dpiScale), 20)
|
Size = new Size(form.ClientSize.Width-BrowserUtils.Scale(44+inputPad, dpiScale), BrowserUtils.Scale(23, dpiScale))
|
||||||
};
|
};
|
||||||
|
|
||||||
form.Controls.Add(input);
|
form.Controls.Add(input);
|
||||||
|
|||||||
@@ -4,9 +4,7 @@ using TweetDuck.Core.Utils;
|
|||||||
|
|
||||||
namespace TweetDuck.Core.Handling.General{
|
namespace TweetDuck.Core.Handling.General{
|
||||||
sealed class LifeSpanHandler : ILifeSpanHandler{
|
sealed class LifeSpanHandler : ILifeSpanHandler{
|
||||||
public bool OnBeforePopup(IWebBrowser browserControl, IBrowser browser, IFrame frame, string targetUrl, string targetFrameName, WindowOpenDisposition targetDisposition, bool userGesture, IPopupFeatures popupFeatures, IWindowInfo windowInfo, IBrowserSettings browserSettings, ref bool noJavascriptAccess, out IWebBrowser newBrowser){
|
public static bool HandleLinkClick(IWebBrowser browserControl, WindowOpenDisposition targetDisposition, string targetUrl){
|
||||||
newBrowser = null;
|
|
||||||
|
|
||||||
switch(targetDisposition){
|
switch(targetDisposition){
|
||||||
case WindowOpenDisposition.NewBackgroundTab:
|
case WindowOpenDisposition.NewBackgroundTab:
|
||||||
case WindowOpenDisposition.NewForegroundTab:
|
case WindowOpenDisposition.NewForegroundTab:
|
||||||
@@ -20,6 +18,11 @@ namespace TweetDuck.Core.Handling.General{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool OnBeforePopup(IWebBrowser browserControl, IBrowser browser, IFrame frame, string targetUrl, string targetFrameName, WindowOpenDisposition targetDisposition, bool userGesture, IPopupFeatures popupFeatures, IWindowInfo windowInfo, IBrowserSettings browserSettings, ref bool noJavascriptAccess, out IWebBrowser newBrowser){
|
||||||
|
newBrowser = null;
|
||||||
|
return HandleLinkClick(browserControl, targetDisposition, targetUrl);
|
||||||
|
}
|
||||||
|
|
||||||
public void OnAfterCreated(IWebBrowser browserControl, IBrowser browser){}
|
public void OnAfterCreated(IWebBrowser browserControl, IBrowser browser){}
|
||||||
|
|
||||||
public bool DoClose(IWebBrowser browserControl, IBrowser browser){
|
public bool DoClose(IWebBrowser browserControl, IBrowser browser){
|
||||||
|
|||||||
@@ -1,68 +0,0 @@
|
|||||||
using System.Security.Cryptography.X509Certificates;
|
|
||||||
using CefSharp;
|
|
||||||
|
|
||||||
namespace TweetDuck.Core.Handling.General{
|
|
||||||
abstract class RequestHandlerBase : IRequestHandler{
|
|
||||||
// Browser
|
|
||||||
|
|
||||||
public virtual void OnRenderViewReady(IWebBrowser browserControl, IBrowser browser){}
|
|
||||||
|
|
||||||
public virtual void OnRenderProcessTerminated(IWebBrowser browserControl, IBrowser browser, CefTerminationStatus status){}
|
|
||||||
|
|
||||||
public virtual bool OnBeforeBrowse(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, bool isRedirect){
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public virtual bool OnOpenUrlFromTab(IWebBrowser browserControl, IBrowser browser, IFrame frame, string targetUrl, WindowOpenDisposition targetDisposition, bool userGesture){
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public virtual bool OnProtocolExecution(IWebBrowser browserControl, IBrowser browser, string url){
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Resources
|
|
||||||
|
|
||||||
public virtual CefReturnValue OnBeforeResourceLoad(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback){
|
|
||||||
return CefReturnValue.Continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
public virtual void OnResourceRedirect(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response, ref string newUrl){}
|
|
||||||
|
|
||||||
public virtual bool OnResourceResponse(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response){
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public virtual IResponseFilter GetResourceResponseFilter(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response){
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public virtual void OnResourceLoadComplete(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response, UrlRequestStatus status, long receivedContentLength){}
|
|
||||||
|
|
||||||
// JavaScript & Plugins
|
|
||||||
|
|
||||||
public virtual bool OnQuotaRequest(IWebBrowser browserControl, IBrowser browser, string originUrl, long newSize, IRequestCallback callback){
|
|
||||||
callback.Dispose();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public virtual void OnPluginCrashed(IWebBrowser browserControl, IBrowser browser, string pluginPath){}
|
|
||||||
|
|
||||||
// Auth
|
|
||||||
|
|
||||||
public virtual bool GetAuthCredentials(IWebBrowser browserControl, IBrowser browser, IFrame frame, bool isProxy, string host, int port, string realm, string scheme, IAuthCallback callback){
|
|
||||||
callback.Dispose();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public virtual bool OnSelectClientCertificate(IWebBrowser browserControl, IBrowser browser, bool isProxy, string host, int port, X509Certificate2Collection certificates, ISelectClientCertificateCallback callback){
|
|
||||||
callback.Dispose();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public virtual bool OnCertificateError(IWebBrowser browserControl, IBrowser browser, CefErrorCode errorCode, string requestUrl, ISslInfo sslInfo, IRequestCallback callback){
|
|
||||||
callback.Dispose();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -2,7 +2,6 @@
|
|||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using TweetDuck.Core.Controls;
|
using TweetDuck.Core.Controls;
|
||||||
using TweetDuck.Core.Notification;
|
using TweetDuck.Core.Notification;
|
||||||
using TweetDuck.Core.Other.Analytics;
|
|
||||||
|
|
||||||
namespace TweetDuck.Core.Handling {
|
namespace TweetDuck.Core.Handling {
|
||||||
sealed class KeyboardHandlerNotification : IKeyboardHandler{
|
sealed class KeyboardHandlerNotification : IKeyboardHandler{
|
||||||
@@ -13,7 +12,7 @@ namespace TweetDuck.Core.Handling {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void TriggerKeyboardShortcutAnalytics(){
|
private void TriggerKeyboardShortcutAnalytics(){
|
||||||
notification.InvokeAsyncSafe(() => notification.TriggerAnalyticsEvent(AnalyticsFile.Event.NotificationKeyboardShortcut));
|
notification.InvokeAsyncSafe(notification.AnalyticsFile.NotificationKeyboardShortcuts.Trigger);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IKeyboardHandler.OnPreKeyEvent(IWebBrowser browserControl, IBrowser browser, KeyType type, int windowsKeyCode, int nativeKeyCode, CefEventFlags modifiers, bool isSystemKey, ref bool isKeyboardShortcut){
|
bool IKeyboardHandler.OnPreKeyEvent(IWebBrowser browserControl, IBrowser browser, KeyType type, int windowsKeyCode, int nativeKeyCode, CefEventFlags modifiers, bool isSystemKey, ref bool isKeyboardShortcut){
|
||||||
|
|||||||
34
Core/Handling/RequestHandlerBase.cs
Normal file
34
Core/Handling/RequestHandlerBase.cs
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
using System.Collections.Specialized;
|
||||||
|
using CefSharp;
|
||||||
|
using CefSharp.Handler;
|
||||||
|
using TweetDuck.Core.Handling.General;
|
||||||
|
|
||||||
|
namespace TweetDuck.Core.Handling{
|
||||||
|
class RequestHandlerBase : DefaultRequestHandler{
|
||||||
|
private readonly bool autoReload;
|
||||||
|
|
||||||
|
public RequestHandlerBase(bool autoReload){
|
||||||
|
this.autoReload = autoReload;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool OnOpenUrlFromTab(IWebBrowser browserControl, IBrowser browser, IFrame frame, string targetUrl, WindowOpenDisposition targetDisposition, bool userGesture){
|
||||||
|
return LifeSpanHandler.HandleLinkClick(browserControl, targetDisposition, targetUrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override CefReturnValue OnBeforeResourceLoad(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback){
|
||||||
|
if (ContextMenuBase.HasDevTools){
|
||||||
|
NameValueCollection headers = request.Headers;
|
||||||
|
headers.Remove("x-devtools-emulate-network-conditions-client-id");
|
||||||
|
request.Headers = headers;
|
||||||
|
}
|
||||||
|
|
||||||
|
return base.OnBeforeResourceLoad(browserControl, browser, frame, request, callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void OnRenderProcessTerminated(IWebBrowser browserControl, IBrowser browser, CefTerminationStatus status){
|
||||||
|
if (autoReload){
|
||||||
|
browser.Reload();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,18 +1,38 @@
|
|||||||
using CefSharp;
|
using CefSharp;
|
||||||
using TweetDuck.Core.Handling.General;
|
using TweetDuck.Core.Utils;
|
||||||
|
|
||||||
namespace TweetDuck.Core.Handling{
|
namespace TweetDuck.Core.Handling{
|
||||||
sealed class RequestHandlerBrowser : RequestHandlerBase{
|
sealed class RequestHandlerBrowser : RequestHandlerBase{
|
||||||
public override void OnRenderProcessTerminated(IWebBrowser browserControl, IBrowser browser, CefTerminationStatus status){
|
public string BlockNextUserNavUrl { get; set; }
|
||||||
browser.Reload();
|
|
||||||
}
|
public RequestHandlerBrowser() : base(true){}
|
||||||
|
|
||||||
public override CefReturnValue OnBeforeResourceLoad(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback){
|
public override CefReturnValue OnBeforeResourceLoad(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback){
|
||||||
if (request.ResourceType == ResourceType.Script && request.Url.Contains("analytics.")){
|
if (request.ResourceType == ResourceType.Script && request.Url.Contains("analytics.")){
|
||||||
|
callback.Dispose();
|
||||||
return CefReturnValue.Cancel;
|
return CefReturnValue.Cancel;
|
||||||
}
|
}
|
||||||
|
|
||||||
return CefReturnValue.Continue;
|
return base.OnBeforeResourceLoad(browserControl, browser, frame, request, callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool OnBeforeBrowse(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, bool userGesture, bool isRedirect){
|
||||||
|
if (userGesture && request.TransitionType == TransitionType.LinkClicked){
|
||||||
|
bool block = request.Url == BlockNextUserNavUrl;
|
||||||
|
BlockNextUserNavUrl = string.Empty;
|
||||||
|
return block;
|
||||||
|
}
|
||||||
|
|
||||||
|
return base.OnBeforeBrowse(browserControl, browser, frame, request, userGesture, isRedirect);
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
return base.OnResourceResponse(browserControl, browser, frame, request, response);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
72
Core/Management/BrowserCache.cs
Normal file
72
Core/Management/BrowserCache.cs
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace TweetDuck.Core.Management{
|
||||||
|
static class BrowserCache{
|
||||||
|
public static string CacheFolder => Path.Combine(Program.StoragePath, "Cache");
|
||||||
|
|
||||||
|
private static bool ClearOnExit;
|
||||||
|
private static Timer AutoClearTimer;
|
||||||
|
|
||||||
|
private static long CalculateCacheSize(){
|
||||||
|
return new DirectoryInfo(CacheFolder).EnumerateFiles().Select(file => {
|
||||||
|
try{
|
||||||
|
return file.Length;
|
||||||
|
}catch{
|
||||||
|
return 0L;
|
||||||
|
}
|
||||||
|
}).Sum();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void GetCacheSize(Action<Task<long>> callbackBytes){
|
||||||
|
Task<long> task = new Task<long>(CalculateCacheSize);
|
||||||
|
task.ContinueWith(callbackBytes);
|
||||||
|
task.Start();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void RefreshTimer(){
|
||||||
|
bool shouldRun = Program.SystemConfig.ClearCacheAutomatically && !ClearOnExit;
|
||||||
|
|
||||||
|
if (!shouldRun && AutoClearTimer != null){
|
||||||
|
AutoClearTimer.Dispose();
|
||||||
|
AutoClearTimer = null;
|
||||||
|
}
|
||||||
|
else if (shouldRun && AutoClearTimer == null){
|
||||||
|
AutoClearTimer = new Timer(state => {
|
||||||
|
if (AutoClearTimer != null){
|
||||||
|
try{
|
||||||
|
if (CalculateCacheSize() >= Program.SystemConfig.ClearCacheThreshold*1024L*1024L){
|
||||||
|
SetClearOnExit();
|
||||||
|
}
|
||||||
|
}catch(Exception){
|
||||||
|
// TODO should probably log errors and report them at some point
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, null, TimeSpan.FromSeconds(30), TimeSpan.FromHours(4));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void SetClearOnExit(){
|
||||||
|
ClearOnExit = true;
|
||||||
|
RefreshTimer();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Exit(){
|
||||||
|
if (AutoClearTimer != null){
|
||||||
|
AutoClearTimer.Dispose();
|
||||||
|
AutoClearTimer = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ClearOnExit){
|
||||||
|
try{
|
||||||
|
Directory.Delete(CacheFolder, true);
|
||||||
|
}catch{
|
||||||
|
// welp, too bad
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
68
Core/Management/ContextInfo.cs
Normal file
68
Core/Management/ContextInfo.cs
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
using CefSharp;
|
||||||
|
using TweetDuck.Core.Utils;
|
||||||
|
|
||||||
|
namespace TweetDuck.Core.Management{
|
||||||
|
sealed class ContextInfo{
|
||||||
|
public LinkInfo Link { get; private set; }
|
||||||
|
public ChirpInfo Chirp { get; private set; }
|
||||||
|
|
||||||
|
public ContextInfo(){
|
||||||
|
Reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetLink(string type, string url){
|
||||||
|
Link = string.IsNullOrEmpty(url) ? new LinkInfo() : new LinkInfo(type, url);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetChirp(string tweetUrl, string quoteUrl, string chirpAuthors, string chirpImages){
|
||||||
|
Chirp = new ChirpInfo(tweetUrl, quoteUrl, chirpAuthors, chirpImages);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Reset(){
|
||||||
|
Link = new LinkInfo();
|
||||||
|
Chirp = new ChirpInfo();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Data structures
|
||||||
|
|
||||||
|
public struct LinkInfo{
|
||||||
|
public bool IsLink => type == "link";
|
||||||
|
public bool IsImage => type == "image";
|
||||||
|
public bool IsVideo => type == "video";
|
||||||
|
|
||||||
|
public string GetUrl(IContextMenuParams parameters, bool safe){
|
||||||
|
return IsLink ? url : (safe ? parameters.LinkUrl : parameters.UnfilteredLinkUrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
public string GetMediaSource(IContextMenuParams parameters){
|
||||||
|
return IsImage || IsVideo ? url : parameters.SourceUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
private readonly string type;
|
||||||
|
private readonly string url;
|
||||||
|
|
||||||
|
public LinkInfo(string type, string url){
|
||||||
|
this.type = type;
|
||||||
|
this.url = url;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public struct ChirpInfo{
|
||||||
|
public string TweetUrl { get; }
|
||||||
|
public string QuoteUrl { get; }
|
||||||
|
|
||||||
|
public string[] Authors => chirpAuthors?.Split(';') ?? StringUtils.EmptyArray;
|
||||||
|
public string[] Images => chirpImages?.Split(';') ?? StringUtils.EmptyArray;
|
||||||
|
|
||||||
|
private readonly string chirpAuthors;
|
||||||
|
private readonly string chirpImages;
|
||||||
|
|
||||||
|
public ChirpInfo(string tweetUrl, string quoteUrl, string chirpAuthors, string chirpImages){
|
||||||
|
this.TweetUrl = tweetUrl;
|
||||||
|
this.QuoteUrl = quoteUrl;
|
||||||
|
this.chirpAuthors = chirpAuthors;
|
||||||
|
this.chirpImages = chirpImages;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,38 +2,48 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using TweetDuck.Core.Other;
|
||||||
using TweetDuck.Data;
|
using TweetDuck.Data;
|
||||||
using TweetDuck.Plugins;
|
using TweetDuck.Plugins;
|
||||||
using TweetDuck.Plugins.Enums;
|
using TweetDuck.Plugins.Enums;
|
||||||
|
|
||||||
namespace TweetDuck.Core.Other.Settings.Export{
|
namespace TweetDuck.Core.Management{
|
||||||
sealed class ExportManager{
|
sealed class ProfileManager{
|
||||||
private static readonly string CookiesPath = Path.Combine(Program.StoragePath, "Cookies");
|
private static readonly string CookiesPath = Path.Combine(Program.StoragePath, "Cookies");
|
||||||
private static readonly string TempCookiesPath = Path.Combine(Program.StoragePath, "CookiesTmp");
|
private static readonly string TempCookiesPath = Path.Combine(Program.StoragePath, "CookiesTmp");
|
||||||
|
|
||||||
|
[Flags]
|
||||||
|
public enum Items{
|
||||||
|
None = 0,
|
||||||
|
UserConfig = 1,
|
||||||
|
SystemConfig = 2,
|
||||||
|
Session = 4,
|
||||||
|
PluginData = 8,
|
||||||
|
All = UserConfig|SystemConfig|Session|PluginData
|
||||||
|
}
|
||||||
|
|
||||||
public bool IsRestarting { get; private set; }
|
public bool IsRestarting { get; private set; }
|
||||||
public Exception LastException { get; private set; }
|
|
||||||
|
|
||||||
private readonly string file;
|
private readonly string file;
|
||||||
private readonly PluginManager plugins;
|
private readonly PluginManager plugins;
|
||||||
|
|
||||||
public ExportManager(string file, PluginManager plugins){
|
public ProfileManager(string file, PluginManager plugins){
|
||||||
this.file = file;
|
this.file = file;
|
||||||
this.plugins = plugins;
|
this.plugins = plugins;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Export(ExportFileFlags flags){
|
public bool Export(Items items){
|
||||||
try{
|
try{
|
||||||
using(CombinedFileStream stream = new CombinedFileStream(new FileStream(file, FileMode.Create, FileAccess.Write, FileShare.None))){
|
using(CombinedFileStream stream = new CombinedFileStream(new FileStream(file, FileMode.Create, FileAccess.Write, FileShare.None))){
|
||||||
if (flags.HasFlag(ExportFileFlags.UserConfig)){
|
if (items.HasFlag(Items.UserConfig)){
|
||||||
stream.WriteFile("config", Program.UserConfigFilePath);
|
stream.WriteFile("config", Program.UserConfigFilePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flags.HasFlag(ExportFileFlags.SystemConfig)){
|
if (items.HasFlag(Items.SystemConfig)){
|
||||||
stream.WriteFile("system", Program.SystemConfigFilePath);
|
stream.WriteFile("system", Program.SystemConfigFilePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flags.HasFlag(ExportFileFlags.PluginData)){
|
if (items.HasFlag(Items.PluginData)){
|
||||||
stream.WriteFile("plugin.config", Program.PluginConfigFilePath);
|
stream.WriteFile("plugin.config", Program.PluginConfigFilePath);
|
||||||
|
|
||||||
foreach(Plugin plugin in plugins.Plugins){
|
foreach(Plugin plugin in plugins.Plugins){
|
||||||
@@ -47,7 +57,7 @@ namespace TweetDuck.Core.Other.Settings.Export{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flags.HasFlag(ExportFileFlags.Session)){
|
if (items.HasFlag(Items.Session)){
|
||||||
stream.WriteFile("cookies", CookiesPath);
|
stream.WriteFile("cookies", CookiesPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -56,13 +66,13 @@ namespace TweetDuck.Core.Other.Settings.Export{
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
LastException = e;
|
Program.Reporter.HandleException("Profile Export Error", "An exception happened while exporting TweetDuck profile.", true, e);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public ExportFileFlags GetImportFlags(){
|
public Items FindImportItems(){
|
||||||
ExportFileFlags flags = ExportFileFlags.None;
|
Items items = Items.None;
|
||||||
|
|
||||||
try{
|
try{
|
||||||
using(CombinedFileStream stream = new CombinedFileStream(new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.None))){
|
using(CombinedFileStream stream = new CombinedFileStream(new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.None))){
|
||||||
@@ -71,33 +81,32 @@ namespace TweetDuck.Core.Other.Settings.Export{
|
|||||||
while((key = stream.SkipFile()) != null){
|
while((key = stream.SkipFile()) != null){
|
||||||
switch(key){
|
switch(key){
|
||||||
case "config":
|
case "config":
|
||||||
flags |= ExportFileFlags.UserConfig;
|
items |= Items.UserConfig;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "system":
|
case "system":
|
||||||
flags |= ExportFileFlags.SystemConfig;
|
items |= Items.SystemConfig;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "plugin.config":
|
case "plugin.config":
|
||||||
case "plugin.data":
|
case "plugin.data":
|
||||||
flags |= ExportFileFlags.PluginData;
|
items |= Items.PluginData;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "cookies":
|
case "cookies":
|
||||||
flags |= ExportFileFlags.Session;
|
items |= Items.Session;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}catch(Exception e){
|
}catch(Exception){
|
||||||
LastException = e;
|
items = Items.None;
|
||||||
flags = ExportFileFlags.None;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return flags;
|
return items;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Import(ExportFileFlags flags){
|
public bool Import(Items items){
|
||||||
try{
|
try{
|
||||||
HashSet<string> missingPlugins = new HashSet<string>();
|
HashSet<string> missingPlugins = new HashSet<string>();
|
||||||
|
|
||||||
@@ -107,14 +116,14 @@ namespace TweetDuck.Core.Other.Settings.Export{
|
|||||||
while((entry = stream.ReadFile()) != null){
|
while((entry = stream.ReadFile()) != null){
|
||||||
switch(entry.KeyName){
|
switch(entry.KeyName){
|
||||||
case "config":
|
case "config":
|
||||||
if (flags.HasFlag(ExportFileFlags.UserConfig)){
|
if (items.HasFlag(Items.UserConfig)){
|
||||||
entry.WriteToFile(Program.UserConfigFilePath);
|
entry.WriteToFile(Program.UserConfigFilePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "system":
|
case "system":
|
||||||
if (flags.HasFlag(ExportFileFlags.SystemConfig)){
|
if (items.HasFlag(Items.SystemConfig)){
|
||||||
entry.WriteToFile(Program.SystemConfigFilePath);
|
entry.WriteToFile(Program.SystemConfigFilePath);
|
||||||
IsRestarting = true;
|
IsRestarting = true;
|
||||||
}
|
}
|
||||||
@@ -122,14 +131,14 @@ namespace TweetDuck.Core.Other.Settings.Export{
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case "plugin.config":
|
case "plugin.config":
|
||||||
if (flags.HasFlag(ExportFileFlags.PluginData)){
|
if (items.HasFlag(Items.PluginData)){
|
||||||
entry.WriteToFile(Program.PluginConfigFilePath);
|
entry.WriteToFile(Program.PluginConfigFilePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "plugin.data":
|
case "plugin.data":
|
||||||
if (flags.HasFlag(ExportFileFlags.PluginData)){
|
if (items.HasFlag(Items.PluginData)){
|
||||||
string[] value = entry.KeyValue;
|
string[] value = entry.KeyValue;
|
||||||
|
|
||||||
entry.WriteToFile(Path.Combine(Program.PluginDataPath, value[0], value[1]), true);
|
entry.WriteToFile(Path.Combine(Program.PluginDataPath, value[0], value[1]), true);
|
||||||
@@ -142,7 +151,7 @@ namespace TweetDuck.Core.Other.Settings.Export{
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case "cookies":
|
case "cookies":
|
||||||
if (flags.HasFlag(ExportFileFlags.Session)){
|
if (items.HasFlag(Items.Session)){
|
||||||
entry.WriteToFile(Path.Combine(Program.StoragePath, TempCookiesPath));
|
entry.WriteToFile(Path.Combine(Program.StoragePath, TempCookiesPath));
|
||||||
IsRestarting = true;
|
IsRestarting = true;
|
||||||
}
|
}
|
||||||
@@ -153,12 +162,12 @@ namespace TweetDuck.Core.Other.Settings.Export{
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (missingPlugins.Count > 0){
|
if (missingPlugins.Count > 0){
|
||||||
FormMessage.Information("Importing TweetDuck Profile", "Detected missing plugins when importing plugin data:\n"+string.Join("\n", missingPlugins), FormMessage.OK);
|
FormMessage.Information("Profile Import", "Detected missing plugins when importing plugin data:\n"+string.Join("\n", missingPlugins), FormMessage.OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
LastException = e;
|
Program.Reporter.HandleException("Profile Import Error", "An exception happened while importing TweetDuck profile.", true, e);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -188,15 +197,29 @@ namespace TweetDuck.Core.Other.Settings.Export{
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static IEnumerable<PathInfo> EnumerateFilesRelative(string root){
|
private static IEnumerable<PathInfo> EnumerateFilesRelative(string root){
|
||||||
return Directory.Exists(root) ? Directory.EnumerateFiles(root, "*.*", SearchOption.AllDirectories).Select(fullPath => new PathInfo{
|
if (Directory.Exists(root)){
|
||||||
Full = fullPath,
|
int rootLength = root.Length;
|
||||||
Relative = fullPath.Substring(root.Length).TrimStart(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar) // strip leading separator character
|
return Directory.EnumerateFiles(root, "*.*", SearchOption.AllDirectories).Select(fullPath => new PathInfo(fullPath, rootLength));
|
||||||
}) : Enumerable.Empty<PathInfo>();
|
}
|
||||||
|
else{
|
||||||
|
return Enumerable.Empty<PathInfo>();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private sealed class PathInfo{
|
private sealed class PathInfo{
|
||||||
public string Full { get; set; }
|
public string Full { get; }
|
||||||
public string Relative { get; set; }
|
public string Relative { get; }
|
||||||
|
|
||||||
|
public PathInfo(string fullPath, int rootLength){
|
||||||
|
this.Full = fullPath;
|
||||||
|
this.Relative = fullPath.Substring(rootLength).TrimStart(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar); // strip leading separator character
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static class ProfileManagerExtensions{
|
||||||
|
public static bool NeedsRestart(this ProfileManager.Items items){
|
||||||
|
return items.HasFlag(ProfileManager.Items.SystemConfig) || items.HasFlag(ProfileManager.Items.Session);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3,33 +3,22 @@ using System.Diagnostics;
|
|||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using TweetDuck.Core.Controls;
|
using TweetDuck.Core.Controls;
|
||||||
|
using TweetDuck.Core.Other;
|
||||||
using TweetDuck.Core.Utils;
|
using TweetDuck.Core.Utils;
|
||||||
using TweetLib.Communication;
|
using TweetLib.Communication;
|
||||||
|
|
||||||
namespace TweetDuck.Core.Other.Management{
|
namespace TweetDuck.Core.Management{
|
||||||
sealed class VideoPlayer : IDisposable{
|
sealed class VideoPlayer : IDisposable{
|
||||||
public bool Running{
|
public bool Running => currentInstance != null && currentInstance.Running;
|
||||||
get{
|
|
||||||
if (currentProcess == null){
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
currentProcess.Refresh();
|
|
||||||
return !currentProcess.HasExited;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public event EventHandler ProcessExited;
|
public event EventHandler ProcessExited;
|
||||||
|
|
||||||
private readonly Form owner;
|
private readonly FormBrowser owner;
|
||||||
private string lastUrl;
|
|
||||||
private string lastUsername;
|
|
||||||
|
|
||||||
private Process currentProcess;
|
private Instance currentInstance;
|
||||||
private DuplexPipe.Server currentPipe;
|
|
||||||
private bool isClosing;
|
private bool isClosing;
|
||||||
|
|
||||||
public VideoPlayer(Form owner){
|
public VideoPlayer(FormBrowser owner){
|
||||||
this.owner = owner;
|
this.owner = owner;
|
||||||
this.owner.FormClosing += owner_FormClosing;
|
this.owner.FormClosing += owner_FormClosing;
|
||||||
}
|
}
|
||||||
@@ -40,39 +29,42 @@ namespace TweetDuck.Core.Other.Management{
|
|||||||
isClosing = false;
|
isClosing = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
lastUrl = url;
|
|
||||||
lastUsername = username;
|
|
||||||
|
|
||||||
try{
|
try{
|
||||||
currentPipe = DuplexPipe.CreateServer();
|
DuplexPipe.Server pipe = DuplexPipe.CreateServer();
|
||||||
currentPipe.DataIn += currentPipe_DataIn;
|
pipe.DataIn += pipe_DataIn;
|
||||||
|
|
||||||
if ((currentProcess = Process.Start(new ProcessStartInfo{
|
Process process;
|
||||||
|
|
||||||
|
if ((process = Process.Start(new ProcessStartInfo{
|
||||||
FileName = Path.Combine(Program.ProgramPath, "TweetDuck.Video.exe"),
|
FileName = Path.Combine(Program.ProgramPath, "TweetDuck.Video.exe"),
|
||||||
Arguments = $"{owner.Handle} {Program.UserConfig.VideoPlayerVolume} \"{url}\" \"{currentPipe.GenerateToken()}\"",
|
Arguments = $"{owner.Handle} {Program.UserConfig.VideoPlayerVolume} \"{url}\" \"{pipe.GenerateToken()}\"",
|
||||||
UseShellExecute = false,
|
UseShellExecute = false,
|
||||||
RedirectStandardOutput = true
|
RedirectStandardOutput = true
|
||||||
})) != null){
|
})) != null){
|
||||||
currentProcess.EnableRaisingEvents = true;
|
currentInstance = new Instance(process, pipe, url, username);
|
||||||
currentProcess.Exited += process_Exited;
|
|
||||||
|
|
||||||
#if DEBUG
|
process.EnableRaisingEvents = true;
|
||||||
currentProcess.BeginOutputReadLine();
|
process.Exited += process_Exited;
|
||||||
currentProcess.OutputDataReceived += (sender, args) => Debug.WriteLine("VideoPlayer: "+args.Data);
|
|
||||||
#endif
|
process.BeginOutputReadLine();
|
||||||
|
process.OutputDataReceived += process_OutputDataReceived;
|
||||||
|
|
||||||
|
pipe.DisposeToken();
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
pipe.DataIn -= pipe_DataIn;
|
||||||
|
pipe.Dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
currentPipe.DisposeToken();
|
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
Program.Reporter.HandleException("Video Playback Error", "Error launching video player.", true, e);
|
Program.Reporter.HandleException("Video Playback Error", "Error launching video player.", true, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SendKeyEvent(Keys key){
|
public void SendKeyEvent(Keys key){
|
||||||
currentPipe?.Write("key", ((int)key).ToString());
|
currentInstance?.Pipe.Write("key", ((int)key).ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void currentPipe_DataIn(object sender, DuplexPipe.PipeReadEventArgs e){
|
private void pipe_DataIn(object sender, DuplexPipe.PipeReadEventArgs e){
|
||||||
owner.InvokeSafe(() => {
|
owner.InvokeSafe(() => {
|
||||||
switch(e.Key){
|
switch(e.Key){
|
||||||
case "vol":
|
case "vol":
|
||||||
@@ -84,15 +76,16 @@ namespace TweetDuck.Core.Other.Management{
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case "download":
|
case "download":
|
||||||
TwitterUtils.DownloadVideo(lastUrl, lastUsername);
|
if (currentInstance != null){
|
||||||
|
owner.AnalyticsFile.DownloadedVideos.Trigger();
|
||||||
|
TwitterUtils.DownloadVideo(currentInstance.Url, currentInstance.Username);
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "rip":
|
case "rip":
|
||||||
currentPipe.Dispose();
|
currentInstance?.Dispose();
|
||||||
currentPipe = null;
|
currentInstance = null;
|
||||||
|
|
||||||
currentProcess.Dispose();
|
|
||||||
currentProcess = null;
|
|
||||||
|
|
||||||
isClosing = false;
|
isClosing = false;
|
||||||
TriggerProcessExitEventUnsafe();
|
TriggerProcessExitEventUnsafe();
|
||||||
@@ -102,15 +95,15 @@ namespace TweetDuck.Core.Other.Management{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void Close(){
|
public void Close(){
|
||||||
if (currentProcess != null){
|
if (currentInstance != null){
|
||||||
if (isClosing){
|
if (isClosing){
|
||||||
Destroy();
|
Destroy();
|
||||||
isClosing = false;
|
isClosing = false;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
isClosing = true;
|
isClosing = true;
|
||||||
currentProcess.Exited -= process_Exited;
|
currentInstance.Process.Exited -= process_Exited;
|
||||||
currentPipe.Write("die");
|
currentInstance.Pipe.Write("die");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -123,49 +116,48 @@ namespace TweetDuck.Core.Other.Management{
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void Destroy(){
|
private void Destroy(){
|
||||||
if (currentProcess != null){
|
if (currentInstance != null){
|
||||||
try{
|
currentInstance.KillAndDispose();
|
||||||
currentProcess.Kill();
|
currentInstance = null;
|
||||||
}catch{
|
|
||||||
// kill me instead then
|
|
||||||
}
|
|
||||||
|
|
||||||
currentProcess.Dispose();
|
|
||||||
currentProcess = null;
|
|
||||||
|
|
||||||
currentPipe.Dispose();
|
|
||||||
currentPipe = null;
|
|
||||||
|
|
||||||
TriggerProcessExitEventUnsafe();
|
TriggerProcessExitEventUnsafe();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void owner_FormClosing(object sender, FormClosingEventArgs e){
|
private void owner_FormClosing(object sender, FormClosingEventArgs e){
|
||||||
if (currentProcess != null){
|
if (currentInstance != null){
|
||||||
currentProcess.Exited -= process_Exited;
|
currentInstance.Process.Exited -= process_Exited;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void process_OutputDataReceived(object sender, DataReceivedEventArgs e){
|
||||||
|
if (!string.IsNullOrEmpty(e.Data)){
|
||||||
|
Program.Reporter.Log("[VideoPlayer] "+e.Data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void process_Exited(object sender, EventArgs e){
|
private void process_Exited(object sender, EventArgs e){
|
||||||
int exitCode = currentProcess.ExitCode;
|
if (currentInstance == null){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
currentProcess.Dispose();
|
int exitCode = currentInstance.Process.ExitCode;
|
||||||
currentProcess = null;
|
string url = currentInstance.Url;
|
||||||
|
|
||||||
currentPipe.Dispose();
|
currentInstance.Dispose();
|
||||||
currentPipe = null;
|
currentInstance = null;
|
||||||
|
|
||||||
switch(exitCode){
|
switch(exitCode){
|
||||||
case 3: // CODE_LAUNCH_FAIL
|
case 3: // CODE_LAUNCH_FAIL
|
||||||
if (FormMessage.Error("Video Playback Error", "Error launching video player, this may be caused by missing Windows Media Player. Do you want to open the video in your browser?", FormMessage.Yes, FormMessage.No)){
|
if (FormMessage.Error("Video Playback Error", "Error launching video player, this may be caused by missing Windows Media Player. Do you want to open the video in your browser?", FormMessage.Yes, FormMessage.No)){
|
||||||
BrowserUtils.OpenExternalBrowser(lastUrl);
|
BrowserUtils.OpenExternalBrowser(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 4: // CODE_MEDIA_ERROR
|
case 4: // CODE_MEDIA_ERROR
|
||||||
if (FormMessage.Error("Video Playback Error", "The video could not be loaded, most likely due to unknown format. Do you want to open the video in your browser?", FormMessage.Yes, FormMessage.No)){
|
if (FormMessage.Error("Video Playback Error", "The video could not be loaded, most likely due to unknown format. Do you want to open the video in your browser?", FormMessage.Yes, FormMessage.No)){
|
||||||
BrowserUtils.OpenExternalBrowser(lastUrl);
|
BrowserUtils.OpenExternalBrowser(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@@ -177,5 +169,42 @@ namespace TweetDuck.Core.Other.Management{
|
|||||||
private void TriggerProcessExitEventUnsafe(){
|
private void TriggerProcessExitEventUnsafe(){
|
||||||
ProcessExited?.Invoke(this, EventArgs.Empty);
|
ProcessExited?.Invoke(this, EventArgs.Empty);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private sealed class Instance : IDisposable{
|
||||||
|
public bool Running{
|
||||||
|
get{
|
||||||
|
Process.Refresh();
|
||||||
|
return !Process.HasExited;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Process Process { get; }
|
||||||
|
public DuplexPipe.Server Pipe { get; }
|
||||||
|
|
||||||
|
public string Url { get; }
|
||||||
|
public string Username { get; }
|
||||||
|
|
||||||
|
public Instance(Process process, DuplexPipe.Server pipe, string url, string username){
|
||||||
|
this.Process = process;
|
||||||
|
this.Pipe = pipe;
|
||||||
|
this.Url = url;
|
||||||
|
this.Username = username;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void KillAndDispose(){
|
||||||
|
try{
|
||||||
|
Process.Kill();
|
||||||
|
}catch{
|
||||||
|
// kill me instead then
|
||||||
|
}
|
||||||
|
|
||||||
|
Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose(){
|
||||||
|
Process.Dispose();
|
||||||
|
Pipe.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,7 @@
|
|||||||
using System.Windows.Forms;
|
using System;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
using CefSharp;
|
||||||
|
using TweetDuck.Core.Controls;
|
||||||
using TweetDuck.Plugins;
|
using TweetDuck.Plugins;
|
||||||
using TweetDuck.Resources;
|
using TweetDuck.Resources;
|
||||||
|
|
||||||
@@ -20,18 +23,35 @@ namespace TweetDuck.Core.Notification.Example{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public event EventHandler Ready;
|
||||||
|
|
||||||
private readonly TweetNotification exampleNotification;
|
private readonly TweetNotification exampleNotification;
|
||||||
|
|
||||||
public FormNotificationExample(FormBrowser owner, PluginManager pluginManager) : base(owner, pluginManager, false){
|
public FormNotificationExample(FormBrowser owner, PluginManager pluginManager) : base(owner, pluginManager, false){
|
||||||
string exampleTweetHTML = ScriptLoader.LoadResource("pages/example.html", true);
|
browser.LoadingStateChanged += browser_LoadingStateChanged;
|
||||||
|
|
||||||
|
string exampleTweetHTML = ScriptLoader.LoadResource("pages/example.html", true)?.Replace("{avatar}", TweetNotification.AppLogo.Url) ?? string.Empty;
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
exampleTweetHTML = exampleTweetHTML.Replace("</p>", @"</p><div style='margin-top:256px'>Scrollbar test padding...</div>");
|
exampleTweetHTML = exampleTweetHTML.Replace("</p>", @"</p><div style='margin-top:256px'>Scrollbar test padding...</div>");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
exampleNotification = TweetNotification.Example(exampleTweetHTML, 95);
|
exampleNotification = TweetNotification.Example(exampleTweetHTML, 176);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void browser_LoadingStateChanged(object sender, LoadingStateChangedEventArgs e){
|
||||||
|
if (!e.IsLoading){
|
||||||
|
Ready?.Invoke(this, EventArgs.Empty);
|
||||||
|
browser.LoadingStateChanged -= browser_LoadingStateChanged;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void HideNotification(){
|
||||||
|
Location = ControlExtensions.InvisibleLocation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void FinishCurrentNotification(){}
|
||||||
|
|
||||||
public void ShowExampleNotification(bool reset){
|
public void ShowExampleNotification(bool reset){
|
||||||
if (reset){
|
if (reset){
|
||||||
LoadTweet(exampleNotification);
|
LoadTweet(exampleNotification);
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
using CefSharp;
|
using CefSharp.WinForms;
|
||||||
using CefSharp.WinForms;
|
|
||||||
using System;
|
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using TweetDuck.Configuration;
|
using TweetDuck.Configuration;
|
||||||
@@ -9,11 +7,10 @@ using TweetDuck.Core.Controls;
|
|||||||
using TweetDuck.Core.Handling;
|
using TweetDuck.Core.Handling;
|
||||||
using TweetDuck.Core.Handling.General;
|
using TweetDuck.Core.Handling.General;
|
||||||
using TweetDuck.Core.Other.Analytics;
|
using TweetDuck.Core.Other.Analytics;
|
||||||
using TweetDuck.Core.Other.Management;
|
|
||||||
using TweetDuck.Core.Utils;
|
using TweetDuck.Core.Utils;
|
||||||
|
|
||||||
namespace TweetDuck.Core.Notification{
|
namespace TweetDuck.Core.Notification{
|
||||||
partial class FormNotificationBase : Form{
|
partial class FormNotificationBase : Form, AnalyticsFile.IProvider{
|
||||||
protected static int FontSizeLevel{
|
protected static int FontSizeLevel{
|
||||||
get{
|
get{
|
||||||
switch(TweetDeckBridge.FontSize){
|
switch(TweetDeckBridge.FontSize){
|
||||||
@@ -66,7 +63,7 @@ namespace TweetDuck.Core.Notification{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool IsNotificationVisible => Location != ControlExtensions.InvisibleLocation;
|
protected bool IsNotificationVisible => Location != ControlExtensions.InvisibleLocation;
|
||||||
protected virtual bool CanDragWindow => true;
|
protected virtual bool CanDragWindow => true;
|
||||||
|
|
||||||
public new Point Location{
|
public new Point Location{
|
||||||
@@ -91,6 +88,8 @@ namespace TweetDuck.Core.Notification{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public AnalyticsFile AnalyticsFile => owner.AnalyticsFile;
|
||||||
|
|
||||||
protected override bool ShowWithoutActivation => true;
|
protected override bool ShowWithoutActivation => true;
|
||||||
|
|
||||||
protected float DpiScale { get; }
|
protected float DpiScale { get; }
|
||||||
@@ -108,13 +107,13 @@ namespace TweetDuck.Core.Notification{
|
|||||||
public string CurrentQuoteUrl => currentNotification?.QuoteUrl;
|
public string CurrentQuoteUrl => currentNotification?.QuoteUrl;
|
||||||
|
|
||||||
public bool CanViewDetail => currentNotification != null && !string.IsNullOrEmpty(currentNotification.ColumnId) && !string.IsNullOrEmpty(currentNotification.ChirpId);
|
public bool CanViewDetail => currentNotification != null && !string.IsNullOrEmpty(currentNotification.ColumnId) && !string.IsNullOrEmpty(currentNotification.ChirpId);
|
||||||
public bool IsPaused => pauseCounter > 0;
|
|
||||||
|
protected bool IsPaused => pauseCounter > 0;
|
||||||
|
protected bool IsCursorOverBrowser => browser.Bounds.Contains(PointToClient(Cursor.Position));
|
||||||
|
|
||||||
public bool FreezeTimer { get; set; }
|
public bool FreezeTimer { get; set; }
|
||||||
public bool ContextMenuOpen { get; set; }
|
public bool ContextMenuOpen { get; set; }
|
||||||
|
|
||||||
public event EventHandler Initialized;
|
|
||||||
|
|
||||||
protected FormNotificationBase(FormBrowser owner, bool enableContextMenu){
|
protected FormNotificationBase(FormBrowser owner, bool enableContextMenu){
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
@@ -124,21 +123,15 @@ namespace TweetDuck.Core.Notification{
|
|||||||
this.browser = new ChromiumWebBrowser("about:blank"){
|
this.browser = new ChromiumWebBrowser("about:blank"){
|
||||||
MenuHandler = new ContextMenuNotification(this, enableContextMenu),
|
MenuHandler = new ContextMenuNotification(this, enableContextMenu),
|
||||||
JsDialogHandler = new JavaScriptDialogHandler(),
|
JsDialogHandler = new JavaScriptDialogHandler(),
|
||||||
LifeSpanHandler = new LifeSpanHandler()
|
LifeSpanHandler = new LifeSpanHandler(),
|
||||||
|
RequestHandler = new RequestHandlerBase(false)
|
||||||
};
|
};
|
||||||
|
|
||||||
this.browser.Dock = DockStyle.None;
|
this.browser.Dock = DockStyle.None;
|
||||||
this.browser.ClientSize = ClientSize;
|
this.browser.ClientSize = ClientSize;
|
||||||
this.browser.IsBrowserInitializedChanged += browser_IsBrowserInitializedChanged;
|
|
||||||
|
|
||||||
#if DEBUG
|
browser.SetupResourceHandler(TwitterUtils.TweetDeckURL, this.resourceHandler);
|
||||||
this.browser.ConsoleMessage += BrowserUtils.HandleConsoleMessage;
|
browser.SetupResourceHandler(TweetNotification.AppLogo);
|
||||||
#endif
|
|
||||||
|
|
||||||
DpiScale = this.GetDPIScale();
|
|
||||||
|
|
||||||
DefaultResourceHandlerFactory handlerFactory = (DefaultResourceHandlerFactory)browser.ResourceHandlerFactory;
|
|
||||||
handlerFactory.RegisterHandler(TwitterUtils.TweetDeckURL, this.resourceHandler);
|
|
||||||
|
|
||||||
Controls.Add(browser);
|
Controls.Add(browser);
|
||||||
|
|
||||||
@@ -147,6 +140,8 @@ namespace TweetDuck.Core.Notification{
|
|||||||
this.owner.FormClosed -= owner_FormClosed;
|
this.owner.FormClosed -= owner_FormClosed;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
DpiScale = this.GetDPIScale();
|
||||||
|
|
||||||
// ReSharper disable once VirtualMemberCallInContructor
|
// ReSharper disable once VirtualMemberCallInContructor
|
||||||
UpdateTitle();
|
UpdateTitle();
|
||||||
}
|
}
|
||||||
@@ -159,29 +154,18 @@ namespace TweetDuck.Core.Notification{
|
|||||||
base.WndProc(ref m);
|
base.WndProc(ref m);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void TriggerAnalyticsEvent(AnalyticsFile.Event e){
|
|
||||||
owner.TriggerAnalyticsEvent(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
// event handlers
|
// event handlers
|
||||||
|
|
||||||
private void owner_FormClosed(object sender, FormClosedEventArgs e){
|
private void owner_FormClosed(object sender, FormClosedEventArgs e){
|
||||||
Close();
|
Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void browser_IsBrowserInitializedChanged(object sender, IsBrowserInitializedChangedEventArgs e){
|
|
||||||
if (e.IsBrowserInitialized){
|
|
||||||
Initialized?.Invoke(this, EventArgs.Empty);
|
|
||||||
|
|
||||||
int identifier = browser.GetBrowser().Identifier;
|
|
||||||
Disposed += (sender2, args2) => BrowserProcesses.Forget(identifier);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// notification methods
|
// notification methods
|
||||||
|
|
||||||
public virtual void HideNotification(){
|
public virtual void HideNotification(){
|
||||||
browser.Load("about:blank");
|
browser.Load("about:blank");
|
||||||
|
DisplayTooltip(null);
|
||||||
|
|
||||||
Location = ControlExtensions.InvisibleLocation;
|
Location = ControlExtensions.InvisibleLocation;
|
||||||
currentNotification = null;
|
currentNotification = null;
|
||||||
}
|
}
|
||||||
@@ -201,14 +185,15 @@ namespace TweetDuck.Core.Notification{
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected virtual string GetTweetHTML(TweetNotification tweet){
|
protected virtual string GetTweetHTML(TweetNotification tweet){
|
||||||
string bodyClasses = browser.Bounds.Contains(PointToClient(Cursor.Position)) ? "td-hover" : string.Empty;
|
return tweet.GenerateHtml(IsCursorOverBrowser ? "td-notification td-hover" : "td-notification");
|
||||||
return tweet.GenerateHtml(bodyClasses);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected virtual void LoadTweet(TweetNotification tweet){
|
protected virtual void LoadTweet(TweetNotification tweet){
|
||||||
currentNotification = tweet;
|
currentNotification = tweet;
|
||||||
resourceHandler.SetHTML(GetTweetHTML(tweet));
|
resourceHandler.SetHTML(GetTweetHTML(tweet));
|
||||||
|
|
||||||
browser.Load(TwitterUtils.TweetDeckURL);
|
browser.Load(TwitterUtils.TweetDeckURL);
|
||||||
|
DisplayTooltip(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected virtual void SetNotificationSize(int width, int height){
|
protected virtual void SetNotificationSize(int width, int height){
|
||||||
@@ -221,8 +206,10 @@ namespace TweetDuck.Core.Notification{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void ShowTweetDetail(){
|
public void ShowTweetDetail(){
|
||||||
|
if (currentNotification != null){
|
||||||
owner.ShowTweetDetail(currentNotification.ColumnId, currentNotification.ChirpId, currentNotification.TweetUrl);
|
owner.ShowTweetDetail(currentNotification.ColumnId, currentNotification.ChirpId, currentNotification.TweetUrl);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void MoveToVisibleLocation(){
|
public void MoveToVisibleLocation(){
|
||||||
bool needsReactivating = Location == ControlExtensions.InvisibleLocation;
|
bool needsReactivating = Location == ControlExtensions.InvisibleLocation;
|
||||||
|
|||||||
@@ -2,10 +2,11 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
using TweetDuck.Configuration;
|
||||||
using TweetDuck.Core.Bridge;
|
using TweetDuck.Core.Bridge;
|
||||||
using TweetDuck.Core.Controls;
|
using TweetDuck.Core.Controls;
|
||||||
using TweetDuck.Core.Handling;
|
using TweetDuck.Core.Handling;
|
||||||
using TweetDuck.Core.Other.Analytics;
|
using TweetDuck.Core.Other.Interfaces;
|
||||||
using TweetDuck.Core.Utils;
|
using TweetDuck.Core.Utils;
|
||||||
using TweetDuck.Data;
|
using TweetDuck.Data;
|
||||||
using TweetDuck.Plugins;
|
using TweetDuck.Plugins;
|
||||||
@@ -13,7 +14,7 @@ using TweetDuck.Plugins.Enums;
|
|||||||
using TweetDuck.Resources;
|
using TweetDuck.Resources;
|
||||||
|
|
||||||
namespace TweetDuck.Core.Notification{
|
namespace TweetDuck.Core.Notification{
|
||||||
abstract partial class FormNotificationMain : FormNotificationBase{
|
abstract partial class FormNotificationMain : FormNotificationBase, ITweetDeckBrowser{
|
||||||
private const string NotificationScriptFile = "notification.js";
|
private const string NotificationScriptFile = "notification.js";
|
||||||
|
|
||||||
private static readonly string NotificationScriptIdentifier = ScriptLoader.GetRootIdentifier(NotificationScriptFile);
|
private static readonly string NotificationScriptIdentifier = ScriptLoader.GetRootIdentifier(NotificationScriptFile);
|
||||||
@@ -65,7 +66,7 @@ namespace TweetDuck.Core.Notification{
|
|||||||
get{
|
get{
|
||||||
switch(Program.UserConfig.NotificationSize){
|
switch(Program.UserConfig.NotificationSize){
|
||||||
default:
|
default:
|
||||||
return BrowserUtils.Scale(122, SizeScale*(1.0+0.075*FontSizeLevel));
|
return BrowserUtils.Scale(122, SizeScale*(1.0+0.08*FontSizeLevel));
|
||||||
|
|
||||||
case TweetNotification.Size.Custom:
|
case TweetNotification.Size.Custom:
|
||||||
return Program.UserConfig.CustomNotificationSize.Height;
|
return Program.UserConfig.CustomNotificationSize.Height;
|
||||||
@@ -82,17 +83,39 @@ namespace TweetDuck.Core.Notification{
|
|||||||
this.timerBarHeight = BrowserUtils.Scale(4, DpiScale);
|
this.timerBarHeight = BrowserUtils.Scale(4, DpiScale);
|
||||||
|
|
||||||
browser.KeyboardHandler = new KeyboardHandlerNotification(this);
|
browser.KeyboardHandler = new KeyboardHandlerNotification(this);
|
||||||
|
browser.RegisterAsyncJsObject("$TD", new TweetDeckBridge.Notification(owner, this));
|
||||||
browser.RegisterAsyncJsObject("$TD", new TweetDeckBridge(owner, this));
|
|
||||||
browser.RegisterAsyncJsObject("$TDP", plugins.Bridge);
|
|
||||||
|
|
||||||
browser.LoadingStateChanged += Browser_LoadingStateChanged;
|
browser.LoadingStateChanged += Browser_LoadingStateChanged;
|
||||||
browser.FrameLoadEnd += Browser_FrameLoadEnd;
|
browser.FrameLoadEnd += Browser_FrameLoadEnd;
|
||||||
|
|
||||||
|
plugins.Register(this, PluginEnvironment.Notification);
|
||||||
|
|
||||||
mouseHookDelegate = MouseHookProc;
|
mouseHookDelegate = MouseHookProc;
|
||||||
Disposed += (sender, args) => StopMouseHook(true);
|
Disposed += (sender, args) => StopMouseHook(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// implementation of ITweetDeckBrowser
|
||||||
|
|
||||||
|
bool ITweetDeckBrowser.IsTweetDeckWebsite => IsNotificationVisible;
|
||||||
|
|
||||||
|
void ITweetDeckBrowser.RegisterBridge(string name, object obj){
|
||||||
|
browser.RegisterAsyncJsObject(name, obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ITweetDeckBrowser.OnFrameLoaded(Action<IFrame> callback){
|
||||||
|
browser.FrameLoadEnd += (sender, args) => {
|
||||||
|
IFrame frame = args.Frame;
|
||||||
|
|
||||||
|
if (frame.IsMain && NotificationJS != null && browser.Address != "about:blank"){
|
||||||
|
callback(frame);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
void ITweetDeckBrowser.ExecuteFunction(string name, params object[] args){
|
||||||
|
browser.ExecuteScriptAsync(name, args);
|
||||||
|
}
|
||||||
|
|
||||||
// mouse wheel hook
|
// mouse wheel hook
|
||||||
|
|
||||||
private void StartMouseHook(){
|
private void StartMouseHook(){
|
||||||
@@ -113,8 +136,15 @@ namespace TweetDuck.Core.Notification{
|
|||||||
if (nCode == 0){
|
if (nCode == 0){
|
||||||
int eventType = wParam.ToInt32();
|
int eventType = wParam.ToInt32();
|
||||||
|
|
||||||
if (eventType == NativeMethods.WM_MOUSEWHEEL && browser.Bounds.Contains(PointToClient(Cursor.Position))){
|
if (eventType == NativeMethods.WM_MOUSEWHEEL && IsCursorOverBrowser){
|
||||||
browser.SendMouseWheelEvent(0, 0, 0, BrowserUtils.Scale(NativeMethods.GetMouseHookData(lParam), Program.UserConfig.NotificationScrollSpeed/100.0), CefEventFlags.None);
|
if (Arguments.HasFlag(Arguments.ArgNotificationScrollWA)){
|
||||||
|
int delta = BrowserUtils.Scale(NativeMethods.GetMouseHookData(lParam), Program.UserConfig.NotificationScrollSpeed*0.01);
|
||||||
|
browser.ExecuteScriptAsync("window.scrollBy", 0, -Math.Round(delta/0.72));
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
browser.SendMouseWheelEvent(0, 0, 0, BrowserUtils.Scale(NativeMethods.GetMouseHookData(lParam), Program.UserConfig.NotificationScrollSpeed*0.01), CefEventFlags.None);
|
||||||
|
}
|
||||||
|
|
||||||
return NativeMethods.HOOK_HANDLED;
|
return NativeMethods.HOOK_HANDLED;
|
||||||
}
|
}
|
||||||
else if (eventType == NativeMethods.WM_XBUTTONDOWN && DesktopBounds.Contains(Cursor.Position)){
|
else if (eventType == NativeMethods.WM_XBUTTONDOWN && DesktopBounds.Contains(Cursor.Position)){
|
||||||
@@ -128,7 +158,7 @@ namespace TweetDuck.Core.Notification{
|
|||||||
}
|
}
|
||||||
|
|
||||||
blockXButtonUp = true;
|
blockXButtonUp = true;
|
||||||
this.InvokeAsyncSafe(() => TriggerAnalyticsEvent(AnalyticsFile.Event.NotificationExtraMouseButton));
|
this.InvokeAsyncSafe(AnalyticsFile.NotificationExtraMouseButtons.Trigger);
|
||||||
return NativeMethods.HOOK_HANDLED;
|
return NativeMethods.HOOK_HANDLED;
|
||||||
}
|
}
|
||||||
else if (eventType == NativeMethods.WM_XBUTTONUP && blockXButtonUp){
|
else if (eventType == NativeMethods.WM_XBUTTONUP && blockXButtonUp){
|
||||||
@@ -167,7 +197,6 @@ namespace TweetDuck.Core.Notification{
|
|||||||
if (e.Frame.IsMain && NotificationJS != null && browser.Address != "about:blank"){
|
if (e.Frame.IsMain && NotificationJS != null && browser.Address != "about:blank"){
|
||||||
e.Frame.ExecuteJavaScriptAsync(PropertyBridge.GenerateScript(PropertyBridge.Environment.Notification));
|
e.Frame.ExecuteJavaScriptAsync(PropertyBridge.GenerateScript(PropertyBridge.Environment.Notification));
|
||||||
ScriptLoader.ExecuteScript(e.Frame, NotificationJS, NotificationScriptIdentifier);
|
ScriptLoader.ExecuteScript(e.Frame, NotificationJS, NotificationScriptIdentifier);
|
||||||
plugins.ExecutePlugins(e.Frame, PluginEnvironment.Notification);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -233,7 +262,7 @@ namespace TweetDuck.Core.Notification{
|
|||||||
protected override string GetTweetHTML(TweetNotification tweet){
|
protected override string GetTweetHTML(TweetNotification tweet){
|
||||||
string html = base.GetTweetHTML(tweet);
|
string html = base.GetTweetHTML(tweet);
|
||||||
|
|
||||||
foreach(InjectedHTML injection in plugins.Bridge.NotificationInjections){
|
foreach(InjectedHTML injection in plugins.NotificationInjections){
|
||||||
html = injection.Inject(html);
|
html = injection.Inject(html);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ using System.Collections.Generic;
|
|||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using TweetDuck.Plugins;
|
using TweetDuck.Plugins;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using TweetDuck.Core.Other.Analytics;
|
|
||||||
using TweetDuck.Core.Utils;
|
using TweetDuck.Core.Utils;
|
||||||
|
|
||||||
namespace TweetDuck.Core.Notification{
|
namespace TweetDuck.Core.Notification{
|
||||||
@@ -94,7 +93,7 @@ namespace TweetDuck.Core.Notification{
|
|||||||
}
|
}
|
||||||
|
|
||||||
needsTrim |= tweetQueue.Count >= TrimMinimum;
|
needsTrim |= tweetQueue.Count >= TrimMinimum;
|
||||||
TriggerAnalyticsEvent(AnalyticsFile.Event.DesktopNotification);
|
AnalyticsFile.DesktopNotifications.Trigger();
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void HideNotification(){
|
public override void HideNotification(){
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ using System.Drawing;
|
|||||||
using System.Drawing.Imaging;
|
using System.Drawing.Imaging;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using CefSharp;
|
using CefSharp;
|
||||||
using TweetDuck.Core.Bridge;
|
using TweetDuck.Core.Controls;
|
||||||
using TweetDuck.Core.Other;
|
using TweetDuck.Core.Other;
|
||||||
using TweetDuck.Core.Utils;
|
using TweetDuck.Core.Utils;
|
||||||
using TweetDuck.Data;
|
using TweetDuck.Data;
|
||||||
@@ -15,44 +15,72 @@ namespace TweetDuck.Core.Notification.Screenshot{
|
|||||||
protected override bool CanDragWindow => false;
|
protected override bool CanDragWindow => false;
|
||||||
|
|
||||||
private readonly PluginManager plugins;
|
private readonly PluginManager plugins;
|
||||||
|
private int height;
|
||||||
|
|
||||||
public FormNotificationScreenshotable(Action callback, FormBrowser owner, PluginManager pluginManager) : base(owner, false){
|
public FormNotificationScreenshotable(Action callback, FormBrowser owner, PluginManager pluginManager, string html, int width) : base(owner, false){
|
||||||
this.plugins = pluginManager;
|
this.plugins = pluginManager;
|
||||||
|
|
||||||
browser.RegisterAsyncJsObject("$TD_NotificationScreenshot", new CallbackBridge(this, callback));
|
browser.RegisterAsyncJsObject("$TD_NotificationScreenshot", new ScreenshotBridge(this, SetScreenshotHeight, callback));
|
||||||
|
|
||||||
browser.LoadingStateChanged += (sender, args) => {
|
browser.LoadingStateChanged += (sender, args) => {
|
||||||
if (!args.IsLoading){
|
if (args.IsLoading){
|
||||||
using(IFrame frame = args.Browser.MainFrame){
|
return;
|
||||||
ScriptLoader.ExecuteScript(frame, "window.setTimeout($TD_NotificationScreenshot.trigger, document.getElementsByTagName('iframe').length ? 267 : 67)", "gen:screenshot");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
string script = ScriptLoader.LoadResource("screenshot.js", true);
|
||||||
|
|
||||||
|
if (script == null){
|
||||||
|
this.InvokeAsyncSafe(callback);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
using(IFrame frame = args.Browser.MainFrame){
|
||||||
|
ScriptLoader.ExecuteScript(frame, script.Replace("{width}", BrowserUtils.Scale(width, DpiScale).ToString()).Replace("{frames}", TweetScreenshotManager.WaitFrames.ToString()), "gen:screenshot");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
SetNotificationSize(width, 1024);
|
||||||
|
LoadTweet(new TweetNotification(string.Empty, string.Empty, string.Empty, html, 0, string.Empty, string.Empty));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override string GetTweetHTML(TweetNotification tweet){
|
protected override string GetTweetHTML(TweetNotification tweet){
|
||||||
string html = tweet.GenerateHtml("td-screenshot", false);
|
string html = tweet.GenerateHtml("td-screenshot");
|
||||||
|
|
||||||
foreach(InjectedHTML injection in plugins.Bridge.NotificationInjections){
|
foreach(InjectedHTML injection in plugins.NotificationInjections){
|
||||||
html = injection.Inject(html);
|
html = injection.Inject(html);
|
||||||
}
|
}
|
||||||
|
|
||||||
return html;
|
return html;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void LoadNotificationForScreenshot(TweetNotification tweet, int width, int height){
|
private void SetScreenshotHeight(int browserHeight){
|
||||||
LoadTweet(tweet);
|
this.height = BrowserUtils.Scale(browserHeight, SizeScale);
|
||||||
SetNotificationSize(width, height);
|
}
|
||||||
|
|
||||||
|
public bool TakeScreenshot(bool ignoreHeightError = false){
|
||||||
|
if (!ignoreHeightError){
|
||||||
|
if (height == 0){
|
||||||
|
FormMessage.Error("Screenshot Failed", "Could not detect screenshot size.", FormMessage.OK);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if (height > ClientSize.Height){
|
||||||
|
FormMessage.Error("Screenshot Failed", $"Screenshot is too large: {height}px > {ClientSize.Height}px", FormMessage.OK);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!WindowsUtils.IsAeroEnabled){
|
||||||
|
MoveToVisibleLocation(); // TODO make this look nicer I guess
|
||||||
}
|
}
|
||||||
|
|
||||||
public void TakeScreenshot(){
|
|
||||||
IntPtr context = NativeMethods.GetDC(this.Handle);
|
IntPtr context = NativeMethods.GetDC(this.Handle);
|
||||||
|
|
||||||
if (context == IntPtr.Zero){
|
if (context == IntPtr.Zero){
|
||||||
FormMessage.Error("Screenshot Failed", "Could not retrieve a graphics context handle for the notification window to take the screenshot.", FormMessage.OK);
|
FormMessage.Error("Screenshot Failed", "Could not retrieve a graphics context handle for the notification window to take the screenshot.", FormMessage.OK);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
using(Bitmap bmp = new Bitmap(ClientSize.Width, ClientSize.Height, PixelFormat.Format32bppRgb)){
|
using(Bitmap bmp = new Bitmap(ClientSize.Width, Math.Max(1, height), PixelFormat.Format32bppRgb)){
|
||||||
try{
|
try{
|
||||||
NativeMethods.RenderSourceIntoBitmap(context, bmp);
|
NativeMethods.RenderSourceIntoBitmap(context, bmp);
|
||||||
}finally{
|
}finally{
|
||||||
@@ -60,6 +88,7 @@ namespace TweetDuck.Core.Notification.Screenshot{
|
|||||||
}
|
}
|
||||||
|
|
||||||
Clipboard.SetImage(bmp);
|
Clipboard.SetImage(bmp);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
26
Core/Notification/Screenshot/ScreenshotBridge.cs
Normal file
26
Core/Notification/Screenshot/ScreenshotBridge.cs
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
using System;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
using TweetDuck.Core.Controls;
|
||||||
|
|
||||||
|
namespace TweetDuck.Core.Notification.Screenshot{
|
||||||
|
sealed class ScreenshotBridge{
|
||||||
|
private readonly Control owner;
|
||||||
|
|
||||||
|
private readonly Action<int> safeSetHeight;
|
||||||
|
private readonly Action safeTriggerScreenshot;
|
||||||
|
|
||||||
|
public ScreenshotBridge(Control owner, Action<int> safeSetHeight, Action safeTriggerScreenshot){
|
||||||
|
this.owner = owner;
|
||||||
|
this.safeSetHeight = safeSetHeight;
|
||||||
|
this.safeTriggerScreenshot = safeTriggerScreenshot;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetHeight(int tweetHeight){
|
||||||
|
owner.InvokeSafe(() => safeSetHeight(tweetHeight));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void TriggerScreenshot(){
|
||||||
|
owner.InvokeSafe(safeTriggerScreenshot);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,11 +1,22 @@
|
|||||||
// Uncomment to keep screenshot windows visible for debugging
|
#if DEBUG
|
||||||
|
// Uncomment to keep screenshot windows visible for debugging
|
||||||
// #define NO_HIDE_SCREENSHOTS
|
// #define NO_HIDE_SCREENSHOTS
|
||||||
|
|
||||||
|
// Uncomment to generate screenshots of individual frames for at most 1 second
|
||||||
|
// #define GEN_SCREENSHOT_FRAMES
|
||||||
|
#endif
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using TweetDuck.Core.Controls;
|
using TweetDuck.Core.Controls;
|
||||||
using TweetDuck.Plugins;
|
using TweetDuck.Plugins;
|
||||||
|
|
||||||
|
#if GEN_SCREENSHOT_FRAMES
|
||||||
|
using System.Drawing.Imaging;
|
||||||
|
using System.IO;
|
||||||
|
using TweetDuck.Core.Utils;
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace TweetDuck.Core.Notification.Screenshot{
|
namespace TweetDuck.Core.Notification.Screenshot{
|
||||||
sealed class TweetScreenshotManager : IDisposable{
|
sealed class TweetScreenshotManager : IDisposable{
|
||||||
private readonly FormBrowser owner;
|
private readonly FormBrowser owner;
|
||||||
@@ -13,6 +24,15 @@ namespace TweetDuck.Core.Notification.Screenshot{
|
|||||||
private readonly Timer timeout;
|
private readonly Timer timeout;
|
||||||
private readonly Timer disposer;
|
private readonly Timer disposer;
|
||||||
|
|
||||||
|
#if GEN_SCREENSHOT_FRAMES
|
||||||
|
private readonly Timer debugger;
|
||||||
|
private int frameCounter;
|
||||||
|
|
||||||
|
public const int WaitFrames = 60;
|
||||||
|
#else
|
||||||
|
public const int WaitFrames = 5;
|
||||||
|
#endif
|
||||||
|
|
||||||
private FormNotificationScreenshotable screenshot;
|
private FormNotificationScreenshotable screenshot;
|
||||||
|
|
||||||
public TweetScreenshotManager(FormBrowser owner, PluginManager pluginManager){
|
public TweetScreenshotManager(FormBrowser owner, PluginManager pluginManager){
|
||||||
@@ -24,6 +44,11 @@ namespace TweetDuck.Core.Notification.Screenshot{
|
|||||||
|
|
||||||
this.disposer = new Timer{ Interval = 1 };
|
this.disposer = new Timer{ Interval = 1 };
|
||||||
this.disposer.Tick += disposer_Tick;
|
this.disposer.Tick += disposer_Tick;
|
||||||
|
|
||||||
|
#if GEN_SCREENSHOT_FRAMES
|
||||||
|
this.debugger = new Timer{ Interval = 16 };
|
||||||
|
this.debugger.Tick += debugger_Tick;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
private void timeout_Tick(object sender, EventArgs e){
|
private void timeout_Tick(object sender, EventArgs e){
|
||||||
@@ -37,17 +62,20 @@ namespace TweetDuck.Core.Notification.Screenshot{
|
|||||||
screenshot = null;
|
screenshot = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Trigger(string html, int width, int height){
|
public void Trigger(string html, int width){
|
||||||
if (screenshot != null){
|
if (screenshot != null){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
screenshot = new FormNotificationScreenshotable(Callback, owner, plugins);
|
screenshot = new FormNotificationScreenshotable(Callback, owner, plugins, html, width);
|
||||||
screenshot.LoadNotificationForScreenshot(new TweetNotification(string.Empty, string.Empty, string.Empty, html, 0, string.Empty, string.Empty), width, height);
|
|
||||||
screenshot.Show();
|
screenshot.Show();
|
||||||
timeout.Start();
|
timeout.Start();
|
||||||
|
|
||||||
#if !(DEBUG && NO_HIDE_SCREENSHOTS)
|
#if GEN_SCREENSHOT_FRAMES
|
||||||
|
StartDebugger();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !NO_HIDE_SCREENSHOTS
|
||||||
owner.IsWaiting = true;
|
owner.IsWaiting = true;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -60,7 +88,7 @@ namespace TweetDuck.Core.Notification.Screenshot{
|
|||||||
timeout.Stop();
|
timeout.Stop();
|
||||||
screenshot.TakeScreenshot();
|
screenshot.TakeScreenshot();
|
||||||
|
|
||||||
#if !(DEBUG && NO_HIDE_SCREENSHOTS)
|
#if !NO_HIDE_SCREENSHOTS
|
||||||
OnFinished();
|
OnFinished();
|
||||||
#else
|
#else
|
||||||
screenshot.MoveToVisibleLocation();
|
screenshot.MoveToVisibleLocation();
|
||||||
@@ -69,15 +97,52 @@ namespace TweetDuck.Core.Notification.Screenshot{
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void OnFinished(){
|
private void OnFinished(){
|
||||||
|
#if GEN_SCREENSHOT_FRAMES
|
||||||
|
debugger.Stop();
|
||||||
|
#endif
|
||||||
|
|
||||||
screenshot.Location = ControlExtensions.InvisibleLocation;
|
screenshot.Location = ControlExtensions.InvisibleLocation;
|
||||||
owner.IsWaiting = false;
|
owner.IsWaiting = false;
|
||||||
disposer.Start();
|
disposer.Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Dispose(){
|
public void Dispose(){
|
||||||
|
#if GEN_SCREENSHOT_FRAMES
|
||||||
|
debugger.Dispose();
|
||||||
|
#endif
|
||||||
|
|
||||||
timeout.Dispose();
|
timeout.Dispose();
|
||||||
disposer.Dispose();
|
disposer.Dispose();
|
||||||
screenshot?.Dispose();
|
screenshot?.Dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if GEN_SCREENSHOT_FRAMES
|
||||||
|
private static readonly string DebugScreenshotPath = Path.Combine(Program.StoragePath, "TD_Screenshots");
|
||||||
|
|
||||||
|
private void StartDebugger(){
|
||||||
|
frameCounter = 0;
|
||||||
|
|
||||||
|
try{
|
||||||
|
Directory.Delete(DebugScreenshotPath, true);
|
||||||
|
WindowsUtils.TrySleepUntil(() => !Directory.Exists(DebugScreenshotPath), 1000, 10);
|
||||||
|
}catch(DirectoryNotFoundException){}
|
||||||
|
|
||||||
|
Directory.CreateDirectory(DebugScreenshotPath);
|
||||||
|
debugger.Start();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void debugger_Tick(object sender, EventArgs e){
|
||||||
|
if (frameCounter < 63 && screenshot.TakeScreenshot(true)){
|
||||||
|
try{
|
||||||
|
Clipboard.GetImage()?.Save(Path.Combine(DebugScreenshotPath, "frame_"+(++frameCounter)+".png"), ImageFormat.Png);
|
||||||
|
}catch{
|
||||||
|
System.Diagnostics.Debug.WriteLine("Failed generating frame "+frameCounter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
debugger.Stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,32 +1,50 @@
|
|||||||
using System;
|
using System.Drawing;
|
||||||
using TweetLib.Audio;
|
using System.IO;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
using CefSharp;
|
||||||
|
using TweetDuck.Core.Controls;
|
||||||
|
using TweetDuck.Core.Other;
|
||||||
|
using TweetDuck.Core.Other.Settings;
|
||||||
|
|
||||||
namespace TweetDuck.Core.Notification{
|
namespace TweetDuck.Core.Notification{
|
||||||
sealed class SoundNotification : IDisposable{
|
static class SoundNotification{
|
||||||
public string SupportedFormats => player.SupportedFormats;
|
public const string SupportedFormats = "*.wav;*.ogg;*.mp3;*.flac;*.opus;*.weba;*.webm";
|
||||||
public event EventHandler<PlaybackErrorEventArgs> PlaybackError;
|
|
||||||
|
|
||||||
private readonly AudioPlayer player;
|
public static IResourceHandler CreateFileHandler(string path){
|
||||||
|
string mimeType;
|
||||||
|
|
||||||
public SoundNotification(){
|
switch(Path.GetExtension(path)){
|
||||||
this.player = AudioPlayer.New();
|
case ".weba":
|
||||||
this.player.PlaybackError += Player_PlaybackError;
|
case ".webm": mimeType = "audio/webm"; break;
|
||||||
|
case ".wav": mimeType = "audio/wav"; break;
|
||||||
|
case ".ogg": mimeType = "audio/ogg"; break;
|
||||||
|
case ".mp3": mimeType = "audio/mp3"; break;
|
||||||
|
case ".flac": mimeType = "audio/flac"; break;
|
||||||
|
case ".opus": mimeType = "audio/ogg; codecs=opus"; break;
|
||||||
|
default: mimeType = null; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Play(string file){
|
try{
|
||||||
player.Play(file);
|
return ResourceHandler.FromFilePath(path, mimeType);
|
||||||
}
|
}catch{
|
||||||
|
FormBrowser browser = FormManager.TryFind<FormBrowser>();
|
||||||
|
|
||||||
public bool SetVolume(int volume){
|
browser?.InvokeAsyncSafe(() => {
|
||||||
return player.SetVolume(volume);
|
using(FormMessage form = new FormMessage("Sound Notification Error", "Could not find custom notification sound file:\n"+path, MessageBoxIcon.Error)){
|
||||||
}
|
form.AddButton(FormMessage.Ignore, ControlType.Cancel | ControlType.Focused);
|
||||||
|
|
||||||
private void Player_PlaybackError(object sender, PlaybackErrorEventArgs e){
|
Button btnViewOptions = form.AddButton("View Options");
|
||||||
PlaybackError?.Invoke(this, e);
|
btnViewOptions.Width += 16;
|
||||||
}
|
btnViewOptions.Location = new Point(btnViewOptions.Location.X-16, btnViewOptions.Location.Y);
|
||||||
|
|
||||||
public void Dispose(){
|
if (form.ShowDialog() == DialogResult.OK && form.ClickedButton == btnViewOptions){
|
||||||
player.Dispose();
|
browser.OpenSettings(typeof(TabSettingsSounds));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,15 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
using CefSharp;
|
||||||
using TweetDuck.Core.Bridge;
|
using TweetDuck.Core.Bridge;
|
||||||
|
using TweetDuck.Data;
|
||||||
using TweetDuck.Resources;
|
using TweetDuck.Resources;
|
||||||
|
|
||||||
namespace TweetDuck.Core.Notification{
|
namespace TweetDuck.Core.Notification{
|
||||||
sealed class TweetNotification{
|
sealed class TweetNotification{
|
||||||
private const string DefaultHeadLayout = @"<html id='tduck' class='os-windows txt-size--14' data-td-font='medium' data-td-theme='dark'><head><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 DefaultHeadLayout = @"<html class=""scroll-v os-windows dark txt-size--14"" lang=""en-US"" id=""tduck"" data-td-font=""medium"" data-td-theme=""dark""><head><meta charset=""utf-8""><link href=""https://ton.twimg.com/tweetdeck-web/web/dist/bundle.4b1f87e09d.css"" rel=""stylesheet""><style type='text/css'>body { background: rgb(34, 36, 38) !important }</style>";
|
||||||
private static readonly string CustomCSS = ScriptLoader.LoadResource("styles/notification.css");
|
private static readonly string CustomCSS = ScriptLoader.LoadResource("styles/notification.css") ?? string.Empty;
|
||||||
|
public static readonly ResourceLink AppLogo = new ResourceLink("https://ton.twimg.com/tduck/avatar", ResourceHandler.FromByteArray(Properties.Resources.avatar, "image/png"));
|
||||||
|
|
||||||
public static TweetNotification Example(string html, int characters){
|
public static TweetNotification Example(string html, int characters){
|
||||||
return new TweetNotification(string.Empty, string.Empty, "Home", html, characters, string.Empty, string.Empty, true);
|
return new TweetNotification(string.Empty, string.Empty, "Home", html, characters, string.Empty, string.Empty, true);
|
||||||
@@ -50,18 +53,15 @@ namespace TweetDuck.Core.Notification{
|
|||||||
return 2000+Math.Max(1000, value*characters);
|
return 2000+Math.Max(1000, value*characters);
|
||||||
}
|
}
|
||||||
|
|
||||||
public string GenerateHtml(string bodyClasses = null, bool enableCustomCSS = true){
|
public string GenerateHtml(string bodyClasses){
|
||||||
StringBuilder build = new StringBuilder();
|
StringBuilder build = new StringBuilder();
|
||||||
build.Append("<!DOCTYPE html>");
|
build.Append("<!DOCTYPE html>");
|
||||||
build.Append(TweetDeckBridge.NotificationHeadLayout ?? DefaultHeadLayout);
|
build.Append(TweetDeckBridge.NotificationHeadLayout ?? DefaultHeadLayout);
|
||||||
|
|
||||||
if (enableCustomCSS){
|
|
||||||
build.Append("<style type='text/css'>").Append(CustomCSS).Append("</style>");
|
build.Append("<style type='text/css'>").Append(CustomCSS).Append("</style>");
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(Program.UserConfig.CustomNotificationCSS)){
|
if (!string.IsNullOrEmpty(Program.UserConfig.CustomNotificationCSS)){
|
||||||
build.Append("<style type='text/css'>").Append(Program.UserConfig.CustomNotificationCSS).Append("</style>");
|
build.Append("<style type='text/css'>").Append(Program.UserConfig.CustomNotificationCSS).Append("</style>");
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
build.Append("</head>");
|
build.Append("</head>");
|
||||||
build.Append("<body class='scroll-styled-v");
|
build.Append("<body class='scroll-styled-v");
|
||||||
@@ -70,7 +70,7 @@ namespace TweetDuck.Core.Notification{
|
|||||||
build.Append(' ').Append(bodyClasses);
|
build.Append(' ').Append(bodyClasses);
|
||||||
}
|
}
|
||||||
|
|
||||||
build.Append('\'').Append(isExample ? " td-example-notification" : "").Append("><div class='column' style='width:100%!important;height:auto!important;overflow:initial!important;'>");
|
build.Append('\'').Append(isExample ? " td-example-notification" : "").Append("><div class='column' style='width:100%!important;min-height:100vh!important;height:auto!important;overflow:initial!important;'>");
|
||||||
build.Append(html);
|
build.Append(html);
|
||||||
build.Append("</div></body>");
|
build.Append("</div></body>");
|
||||||
build.Append("</html>");
|
build.Append("</html>");
|
||||||
|
|||||||
@@ -1,7 +1,11 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Diagnostics.CodeAnalysis;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Reflection;
|
||||||
using TweetDuck.Data.Serialization;
|
using TweetDuck.Data.Serialization;
|
||||||
|
|
||||||
namespace TweetDuck.Core.Other.Analytics{
|
namespace TweetDuck.Core.Other.Analytics{
|
||||||
|
[SuppressMessage("ReSharper", "AutoPropertyCanBeMadeGetOnly.Local")]
|
||||||
sealed class AnalyticsFile{
|
sealed class AnalyticsFile{
|
||||||
private static readonly FileSerializer<AnalyticsFile> Serializer = new FileSerializer<AnalyticsFile>();
|
private static readonly FileSerializer<AnalyticsFile> Serializer = new FileSerializer<AnalyticsFile>();
|
||||||
|
|
||||||
@@ -10,15 +14,14 @@ namespace TweetDuck.Core.Other.Analytics{
|
|||||||
ConvertToString = value => value.ToBinary().ToString(),
|
ConvertToString = value => value.ToBinary().ToString(),
|
||||||
ConvertToObject = value => DateTime.FromBinary(long.Parse(value))
|
ConvertToObject = value => DateTime.FromBinary(long.Parse(value))
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Serializer.RegisterTypeConverter(typeof(Counter), new SingleTypeConverter<Counter>{
|
||||||
|
ConvertToString = value => value.Value.ToString(),
|
||||||
|
ConvertToObject = value => int.Parse(value)
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum Event{
|
public static readonly AnalyticsFile Dummy = new AnalyticsFile();
|
||||||
OpenOptions, OpenPlugins, OpenAbout, OpenGuide,
|
|
||||||
DesktopNotification, SoundNotification,
|
|
||||||
BrowserContextMenu, BrowserExtraMouseButton,
|
|
||||||
NotificationContextMenu, NotificationExtraMouseButton, NotificationKeyboardShortcut,
|
|
||||||
TweetScreenshot, TweetDetail, VideoPlay, GCReload
|
|
||||||
}
|
|
||||||
|
|
||||||
// STATE PROPERTIES
|
// STATE PROPERTIES
|
||||||
|
|
||||||
@@ -28,57 +31,61 @@ namespace TweetDuck.Core.Other.Analytics{
|
|||||||
|
|
||||||
// USAGE DATA
|
// USAGE DATA
|
||||||
|
|
||||||
public int CountOpenOptions { get; private set; } = 0;
|
public Counter OpenOptions { get; private set; } = 0;
|
||||||
public int CountOpenPlugins { get; private set; } = 0;
|
public Counter OpenPlugins { get; private set; } = 0;
|
||||||
public int CountOpenAbout { get; private set; } = 0;
|
public Counter OpenAbout { get; private set; } = 0;
|
||||||
public int CountOpenGuide { get; private set; } = 0;
|
public Counter OpenGuide { get; private set; } = 0;
|
||||||
|
|
||||||
public int CountDesktopNotifications { get; private set; } = 0;
|
public Counter DesktopNotifications { get; private set; } = 0;
|
||||||
public int CountSoundNotifications { get; private set; } = 0;
|
public Counter SoundNotifications { get; private set; } = 0;
|
||||||
|
public Counter NotificationMutes { get; private set; } = 0;
|
||||||
|
|
||||||
public int CountBrowserContextMenus { get; private set; } = 0;
|
public Counter BrowserContextMenus { get; private set; } = 0;
|
||||||
public int CountBrowserExtraMouseButtons { get; private set; } = 0;
|
public Counter BrowserExtraMouseButtons { get; private set; } = 0;
|
||||||
public int CountNotificationContextMenus { get; private set; } = 0;
|
public Counter NotificationContextMenus { get; private set; } = 0;
|
||||||
public int CountNotificationExtraMouseButtons { get; private set; } = 0;
|
public Counter NotificationExtraMouseButtons { get; private set; } = 0;
|
||||||
public int CountNotificationKeyboardShortcuts { get; private set; } = 0;
|
public Counter NotificationKeyboardShortcuts { get; private set; } = 0;
|
||||||
|
|
||||||
public int CountTweetScreenshots { get; private set; } = 0;
|
public Counter BrowserReloads { get; private set; } = 0;
|
||||||
public int CountTweetDetails { get; private set; } = 0;
|
public Counter CopiedUsernames { get; private set; } = 0;
|
||||||
public int CountVideoPlays { get; private set; } = 0;
|
public Counter ViewedImages { get; private set; } = 0;
|
||||||
public int CountGCReloads { get; private set; } = 0;
|
public Counter DownloadedImages { get; private set; } = 0;
|
||||||
|
public Counter DownloadedVideos { get; private set; } = 0;
|
||||||
|
public Counter UsedROT13 { get; private set; } = 0;
|
||||||
|
|
||||||
|
public Counter TweetScreenshots { get; private set; } = 0;
|
||||||
|
public Counter TweetDetails { get; private set; } = 0;
|
||||||
|
public Counter VideoPlays { get; private set; } = 0;
|
||||||
|
|
||||||
// END OF DATA
|
// END OF DATA
|
||||||
|
|
||||||
|
public event EventHandler PropertyChanged;
|
||||||
|
|
||||||
private readonly string file;
|
private readonly string file;
|
||||||
|
|
||||||
private AnalyticsFile(string file){
|
private AnalyticsFile(string file){
|
||||||
this.file = file;
|
this.file = file;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void TriggerEvent(Event e){
|
private AnalyticsFile(){
|
||||||
switch(e){
|
this.file = null;
|
||||||
case Event.OpenOptions: ++CountOpenOptions; break;
|
|
||||||
case Event.OpenPlugins: ++CountOpenPlugins; break;
|
|
||||||
case Event.OpenAbout: ++CountOpenAbout; break;
|
|
||||||
case Event.OpenGuide: ++CountOpenGuide; break;
|
|
||||||
|
|
||||||
case Event.DesktopNotification: ++CountDesktopNotifications; break;
|
|
||||||
case Event.SoundNotification: ++CountSoundNotifications; break;
|
|
||||||
|
|
||||||
case Event.BrowserContextMenu: ++CountBrowserContextMenus; break;
|
|
||||||
case Event.BrowserExtraMouseButton: ++CountBrowserExtraMouseButtons; break;
|
|
||||||
case Event.NotificationContextMenu: ++CountNotificationContextMenus; break;
|
|
||||||
case Event.NotificationExtraMouseButton: ++CountNotificationExtraMouseButtons; break;
|
|
||||||
case Event.NotificationKeyboardShortcut: ++CountNotificationKeyboardShortcuts; break;
|
|
||||||
|
|
||||||
case Event.TweetScreenshot: ++CountTweetScreenshots; break;
|
|
||||||
case Event.TweetDetail: ++CountTweetDetails; break;
|
|
||||||
case Event.VideoPlay: ++CountVideoPlays; break;
|
|
||||||
case Event.GCReload: ++CountGCReloads; break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void SetupProperties(){
|
||||||
|
foreach(Counter counter in GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public).Where(prop => prop.PropertyType == typeof(Counter)).Select(prop => (Counter)prop.GetValue(this))){
|
||||||
|
counter.SetOwner(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnPropertyChanged(){
|
||||||
|
PropertyChanged?.Invoke(this, EventArgs.Empty);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Save(){
|
public void Save(){
|
||||||
|
if (file == null){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
try{
|
try{
|
||||||
Serializer.Write(file, this);
|
Serializer.Write(file, this);
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
@@ -95,7 +102,34 @@ namespace TweetDuck.Core.Other.Analytics{
|
|||||||
Program.Reporter.HandleException("Analytics File Error", "Could not open the analytics file.", true, e);
|
Program.Reporter.HandleException("Analytics File Error", "Could not open the analytics file.", true, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
config.SetupProperties();
|
||||||
return config;
|
return config;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public interface IProvider{
|
||||||
|
AnalyticsFile AnalyticsFile { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public sealed class Counter{
|
||||||
|
public int Value { get; private set; }
|
||||||
|
|
||||||
|
private AnalyticsFile owner;
|
||||||
|
|
||||||
|
public Counter(int value){
|
||||||
|
this.Value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetOwner(AnalyticsFile owner){
|
||||||
|
this.owner = owner;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Trigger(){
|
||||||
|
++Value;
|
||||||
|
owner?.OnPropertyChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static implicit operator int(Counter counter) => counter.Value;
|
||||||
|
public static implicit operator Counter(int value) => new Counter(value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,8 @@
|
|||||||
using System;
|
// Uncomment to debug reports locally
|
||||||
|
// #define ANALYTICS_LOCALHOST
|
||||||
|
// #define ANALYTICS_INSTANT
|
||||||
|
|
||||||
|
using System;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Timers;
|
using System.Timers;
|
||||||
@@ -8,8 +12,15 @@ using TweetDuck.Plugins;
|
|||||||
|
|
||||||
namespace TweetDuck.Core.Other.Analytics{
|
namespace TweetDuck.Core.Other.Analytics{
|
||||||
sealed class AnalyticsManager : IDisposable{
|
sealed class AnalyticsManager : IDisposable{
|
||||||
private static readonly TimeSpan CollectionInterval = TimeSpan.FromDays(7);
|
private static readonly TimeSpan CollectionInterval = TimeSpan.FromDays(14);
|
||||||
private static readonly Uri CollectionUrl = new Uri("https://tweetduck.chylex.com/breadcrumb/report");
|
|
||||||
|
private static readonly Uri CollectionUrl = new Uri(
|
||||||
|
#if (DEBUG && ANALYTICS_LOCALHOST)
|
||||||
|
"http://localhost/newhome/tweetduck/~breadcrumb/request.php?type=report"
|
||||||
|
#else
|
||||||
|
"https://tweetduck.chylex.com/breadcrumb/report"
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
|
||||||
public AnalyticsFile File { get; }
|
public AnalyticsFile File { get; }
|
||||||
|
|
||||||
@@ -20,7 +31,9 @@ namespace TweetDuck.Core.Other.Analytics{
|
|||||||
public AnalyticsManager(FormBrowser browser, PluginManager plugins, string file){
|
public AnalyticsManager(FormBrowser browser, PluginManager plugins, string file){
|
||||||
this.browser = browser;
|
this.browser = browser;
|
||||||
this.plugins = plugins;
|
this.plugins = plugins;
|
||||||
|
|
||||||
this.File = AnalyticsFile.Load(file);
|
this.File = AnalyticsFile.Load(file);
|
||||||
|
this.File.PropertyChanged += File_PropertyChanged;
|
||||||
|
|
||||||
this.currentTimer = new Timer{ SynchronizingObject = browser };
|
this.currentTimer = new Timer{ SynchronizingObject = browser };
|
||||||
this.currentTimer.Elapsed += currentTimer_Elapsed;
|
this.currentTimer.Elapsed += currentTimer_Elapsed;
|
||||||
@@ -29,14 +42,20 @@ namespace TweetDuck.Core.Other.Analytics{
|
|||||||
this.saveTimer.Elapsed += saveTimer_Elapsed;
|
this.saveTimer.Elapsed += saveTimer_Elapsed;
|
||||||
|
|
||||||
if (this.File.LastCollectionVersion != Program.VersionTag){
|
if (this.File.LastCollectionVersion != Program.VersionTag){
|
||||||
ScheduleReportIn(TimeSpan.FromHours(12), string.Empty);
|
ScheduleReportIn(TimeSpan.FromHours(8), string.Empty);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
RestartTimer();
|
RestartTimer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if (DEBUG && ANALYTICS_INSTANT)
|
||||||
|
SendReport();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Dispose(){
|
public void Dispose(){
|
||||||
|
File.PropertyChanged -= File_PropertyChanged;
|
||||||
|
|
||||||
if (saveTimer.Enabled){
|
if (saveTimer.Enabled){
|
||||||
File.Save();
|
File.Save();
|
||||||
}
|
}
|
||||||
@@ -45,8 +64,7 @@ namespace TweetDuck.Core.Other.Analytics{
|
|||||||
saveTimer.Dispose();
|
saveTimer.Dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void TriggerEvent(AnalyticsFile.Event e){
|
private void File_PropertyChanged(object sender, EventArgs e){
|
||||||
File.TriggerEvent(e);
|
|
||||||
saveTimer.Enabled = true;
|
saveTimer.Enabled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -72,7 +90,7 @@ namespace TweetDuck.Core.Other.Analytics{
|
|||||||
TimeSpan diff = DateTime.Now.Subtract(File.LastDataCollection);
|
TimeSpan diff = DateTime.Now.Subtract(File.LastDataCollection);
|
||||||
int minutesTillNext = (int)(CollectionInterval.TotalMinutes-Math.Floor(diff.TotalMinutes));
|
int minutesTillNext = (int)(CollectionInterval.TotalMinutes-Math.Floor(diff.TotalMinutes));
|
||||||
|
|
||||||
currentTimer.Interval = Math.Max(minutesTillNext, 1)*60000;
|
currentTimer.Interval = Math.Max(minutesTillNext, 2)*60000;
|
||||||
currentTimer.Start();
|
currentTimer.Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -94,6 +112,11 @@ namespace TweetDuck.Core.Other.Analytics{
|
|||||||
|
|
||||||
Task.Factory.StartNew(() => {
|
Task.Factory.StartNew(() => {
|
||||||
AnalyticsReport report = AnalyticsReportGenerator.Create(File, info, plugins);
|
AnalyticsReport report = AnalyticsReportGenerator.Create(File, info, plugins);
|
||||||
|
|
||||||
|
#if (DEBUG && !ANALYTICS_INSTANT)
|
||||||
|
System.Diagnostics.Debugger.Break();
|
||||||
|
#endif
|
||||||
|
|
||||||
BrowserUtils.CreateWebClient().UploadValues(CollectionUrl, "POST", report.ToNameValueCollection());
|
BrowserUtils.CreateWebClient().UploadValues(CollectionUrl, "POST", report.ToNameValueCollection());
|
||||||
}).ContinueWith(task => browser.InvokeAsyncSafe(() => {
|
}).ContinueWith(task => browser.InvokeAsyncSafe(() => {
|
||||||
if (task.Status == TaskStatus.RanToCompletion){
|
if (task.Status == TaskStatus.RanToCompletion){
|
||||||
@@ -117,6 +140,14 @@ namespace TweetDuck.Core.Other.Analytics{
|
|||||||
message = "HTTP Error "+(response != null ? $"{(int)response.StatusCode} ({response.StatusDescription})" : "(unknown code)");
|
message = "HTTP Error "+(response != null ? $"{(int)response.StatusCode} ({response.StatusDescription})" : "(unknown code)");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
System.IO.Stream responseStream = e.Response.GetResponseStream();
|
||||||
|
|
||||||
|
if (responseStream != null){
|
||||||
|
System.Diagnostics.Debug.WriteLine(new System.IO.StreamReader(responseStream).ReadToEnd());
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
ScheduleReportIn(TimeSpan.FromHours(4), message ?? "Error: "+(task.Exception.InnerException?.Message ?? task.Exception.Message));
|
ScheduleReportIn(TimeSpan.FromHours(4), message ?? "Error: "+(task.Exception.InnerException?.Message ?? task.Exception.Message));
|
||||||
|
|||||||
@@ -8,9 +8,11 @@ using TweetDuck.Configuration;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Management;
|
using System.Management;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
|
using TweetDuck.Core.Handling;
|
||||||
using TweetDuck.Core.Notification;
|
using TweetDuck.Core.Notification;
|
||||||
using TweetDuck.Core.Utils;
|
using TweetDuck.Core.Utils;
|
||||||
using TweetDuck.Plugins;
|
using TweetDuck.Plugins;
|
||||||
|
using TweetDuck.Plugins.Enums;
|
||||||
|
|
||||||
namespace TweetDuck.Core.Other.Analytics{
|
namespace TweetDuck.Core.Other.Analytics{
|
||||||
static class AnalyticsReportGenerator{
|
static class AnalyticsReportGenerator{
|
||||||
@@ -20,6 +22,7 @@ namespace TweetDuck.Core.Other.Analytics{
|
|||||||
return new AnalyticsReport{
|
return new AnalyticsReport{
|
||||||
{ "App Version" , Program.VersionTag },
|
{ "App Version" , Program.VersionTag },
|
||||||
{ "App Type" , Program.IsPortable ? "portable" : "installed" },
|
{ "App Type" , Program.IsPortable ? "portable" : "installed" },
|
||||||
|
{ "App Dev Tools" , Bool(ContextMenuBase.HasDevTools) },
|
||||||
0,
|
0,
|
||||||
{ "System Name" , SystemName },
|
{ "System Name" , SystemName },
|
||||||
{ "System Edition" , SystemEdition },
|
{ "System Edition" , SystemEdition },
|
||||||
@@ -35,16 +38,23 @@ namespace TweetDuck.Core.Other.Analytics{
|
|||||||
{ "Screen DPI" , info.DPI != null ? Exact(info.DPI.Value) : "(unknown)" },
|
{ "Screen DPI" , info.DPI != null ? Exact(info.DPI.Value) : "(unknown)" },
|
||||||
0,
|
0,
|
||||||
{ "Hardware Acceleration" , Bool(SysConfig.HardwareAcceleration) },
|
{ "Hardware Acceleration" , Bool(SysConfig.HardwareAcceleration) },
|
||||||
{ "Browser GC Reload" , Bool(SysConfig.EnableBrowserGCReload) },
|
{ "Clear Cache Automatically" , Bool(SysConfig.ClearCacheAutomatically) },
|
||||||
{ "Browser GC Threshold" , Exact(SysConfig.BrowserMemoryThreshold) },
|
{ "Clear Cache Threshold" , Exact(SysConfig.ClearCacheThreshold) },
|
||||||
0,
|
0,
|
||||||
{ "Expand Links" , Bool(UserConfig.ExpandLinksOnHover) },
|
{ "Expand Links" , Bool(UserConfig.ExpandLinksOnHover) },
|
||||||
{ "Switch Account Selectors" , Bool(UserConfig.SwitchAccountSelectors) },
|
|
||||||
{ "Search In First Column" , Bool(UserConfig.OpenSearchInFirstColumn) },
|
{ "Search In First Column" , Bool(UserConfig.OpenSearchInFirstColumn) },
|
||||||
|
{ "Keep Like Follow Dialogs Open" , Bool(UserConfig.KeepLikeFollowDialogsOpen) },
|
||||||
{ "Best Image Quality" , Bool(UserConfig.BestImageQuality) },
|
{ "Best Image Quality" , Bool(UserConfig.BestImageQuality) },
|
||||||
{ "Spell Check" , Bool(UserConfig.EnableSpellCheck) },
|
{ "Animated Images" , Bool(UserConfig.EnableAnimatedImages) },
|
||||||
|
0,
|
||||||
|
{ "Smooth Scrolling" , Bool(UserConfig.EnableSmoothScrolling) },
|
||||||
|
{ "Custom Browser" , CustomBrowser },
|
||||||
{ "Zoom" , Exact(UserConfig.ZoomLevel) },
|
{ "Zoom" , Exact(UserConfig.ZoomLevel) },
|
||||||
0,
|
0,
|
||||||
|
{ "Spell Check" , Bool(UserConfig.EnableSpellCheck) },
|
||||||
|
{ "Spell Check Language" , UserConfig.SpellCheckLanguage.ToLower() },
|
||||||
|
{ "Translation Target Language" , UserConfig.TranslationTarget },
|
||||||
|
0,
|
||||||
{ "Updates" , Bool(UserConfig.EnableUpdateCheck) },
|
{ "Updates" , Bool(UserConfig.EnableUpdateCheck) },
|
||||||
{ "Update Dismissed" , Bool(!string.IsNullOrEmpty(UserConfig.DismissedUpdate)) },
|
{ "Update Dismissed" , Bool(!string.IsNullOrEmpty(UserConfig.DismissedUpdate)) },
|
||||||
0,
|
0,
|
||||||
@@ -62,14 +72,15 @@ namespace TweetDuck.Core.Other.Analytics{
|
|||||||
{ "Notification Non-Intrusive" , Bool(UserConfig.NotificationNonIntrusiveMode) },
|
{ "Notification Non-Intrusive" , Bool(UserConfig.NotificationNonIntrusiveMode) },
|
||||||
{ "Notification Idle Pause" , Exact(UserConfig.NotificationIdlePauseSeconds) },
|
{ "Notification Idle Pause" , Exact(UserConfig.NotificationIdlePauseSeconds) },
|
||||||
{ "Custom Sound Notification" , string.IsNullOrEmpty(UserConfig.NotificationSoundPath) ? "off" : Path.GetExtension(UserConfig.NotificationSoundPath) },
|
{ "Custom Sound Notification" , string.IsNullOrEmpty(UserConfig.NotificationSoundPath) ? "off" : Path.GetExtension(UserConfig.NotificationSoundPath) },
|
||||||
|
{ "Custom Sound Notification Volume" , RoundUp(UserConfig.NotificationSoundVolume, 5) },
|
||||||
0,
|
0,
|
||||||
{ "Program Arguments" , List(ProgramArguments) },
|
{ "Program Arguments" , List(ProgramArguments) },
|
||||||
{ "Custom CEF Arguments" , RoundUp((UserConfig.CustomCefArgs ?? string.Empty).Length, 10) },
|
{ "Custom CEF Arguments" , RoundUp((UserConfig.CustomCefArgs ?? string.Empty).Length, 10) },
|
||||||
{ "Custom Browser CSS" , RoundUp((UserConfig.CustomBrowserCSS ?? string.Empty).Length, 50) },
|
{ "Custom Browser CSS" , RoundUp((UserConfig.CustomBrowserCSS ?? string.Empty).Length, 50) },
|
||||||
{ "Custom Notification CSS" , RoundUp((UserConfig.CustomNotificationCSS ?? string.Empty).Length, 50) },
|
{ "Custom Notification CSS" , RoundUp((UserConfig.CustomNotificationCSS ?? string.Empty).Length, 50) },
|
||||||
0,
|
0,
|
||||||
{ "Plugins All" , List(plugins.Plugins.Select(plugin => plugin.Identifier)) },
|
{ "Plugins All" , List(plugins.Plugins.Select(Plugin)) },
|
||||||
{ "Plugins Enabled" , List(plugins.Plugins.Where(plugin => plugins.Config.IsEnabled(plugin)).Select(plugin => plugin.Identifier)) },
|
{ "Plugins Enabled" , List(plugins.Plugins.Where(plugin => plugins.Config.IsEnabled(plugin)).Select(Plugin)) },
|
||||||
0,
|
0,
|
||||||
{ "Theme" , Dict(editLayoutDesign, "_theme", "light/def") },
|
{ "Theme" , Dict(editLayoutDesign, "_theme", "light/def") },
|
||||||
{ "Column Width" , Dict(editLayoutDesign, "columnWidth", "310px/def") },
|
{ "Column Width" , Dict(editLayoutDesign, "columnWidth", "310px/def") },
|
||||||
@@ -85,21 +96,27 @@ namespace TweetDuck.Core.Other.Analytics{
|
|||||||
{ "Reply Account Mode" , ReplyAccountConfigFromPlugin },
|
{ "Reply Account Mode" , ReplyAccountConfigFromPlugin },
|
||||||
{ "Template Count" , Exact(TemplateCountFromPlugin) },
|
{ "Template Count" , Exact(TemplateCountFromPlugin) },
|
||||||
0,
|
0,
|
||||||
{ "Opened Options" , LogRound(file.CountOpenOptions, 4) },
|
{ "Opened Options" , LogRound(file.OpenOptions, 4) },
|
||||||
{ "Opened Plugins" , LogRound(file.CountOpenPlugins, 4) },
|
{ "Opened Plugins" , LogRound(file.OpenPlugins, 4) },
|
||||||
{ "Opened About" , LogRound(file.CountOpenAbout, 4) },
|
{ "Opened About" , LogRound(file.OpenAbout, 4) },
|
||||||
{ "Opened Guide" , LogRound(file.CountOpenGuide, 4) },
|
{ "Opened Guide" , LogRound(file.OpenGuide, 4) },
|
||||||
{ "Desktop Notifications" , LogRound(file.CountDesktopNotifications, 5) },
|
{ "Desktop Notifications" , LogRound(file.DesktopNotifications, 5) },
|
||||||
{ "Sound Notifications" , LogRound(file.CountSoundNotifications, 5) },
|
{ "Sound Notifications" , LogRound(file.SoundNotifications, 5) },
|
||||||
{ "Browser Context Menus" , LogRound(file.CountBrowserContextMenus, 2) },
|
{ "Notification Mutes" , LogRound(file.NotificationMutes, 2) },
|
||||||
{ "Browser Extra Mouse Buttons" , LogRound(file.CountBrowserExtraMouseButtons, 2) },
|
{ "Browser Context Menus" , LogRound(file.BrowserContextMenus, 2) },
|
||||||
{ "Notification Context Menus" , LogRound(file.CountNotificationContextMenus, 2) },
|
{ "Browser Extra Mouse Buttons" , LogRound(file.BrowserExtraMouseButtons, 2) },
|
||||||
{ "Notification Extra Mouse Buttons" , LogRound(file.CountNotificationExtraMouseButtons, 2) },
|
{ "Notification Context Menus" , LogRound(file.NotificationContextMenus, 2) },
|
||||||
{ "Notification Keyboard Shortcuts" , LogRound(file.CountNotificationKeyboardShortcuts, 2) },
|
{ "Notification Extra Mouse Buttons" , LogRound(file.NotificationExtraMouseButtons, 2) },
|
||||||
{ "Tweet Screenshots" , LogRound(file.CountTweetScreenshots, 2) },
|
{ "Notification Keyboard Shortcuts" , LogRound(file.NotificationKeyboardShortcuts, 2) },
|
||||||
{ "Tweet Details" , LogRound(file.CountTweetDetails, 2) },
|
{ "Browser Reloads" , LogRound(file.BrowserReloads, 2) },
|
||||||
{ "Video Plays" , LogRound(file.CountVideoPlays, 4) },
|
{ "Copied Usernames" , LogRound(file.CopiedUsernames, 2) },
|
||||||
{ "GC Reloads" , LogRound(file.CountGCReloads, 4) }
|
{ "Viewed Images" , LogRound(file.ViewedImages, 2) },
|
||||||
|
{ "Downloaded Images" , LogRound(file.DownloadedImages, 2) },
|
||||||
|
{ "Downloaded Videos" , LogRound(file.DownloadedVideos, 2) },
|
||||||
|
{ "Used ROT13" , LogRound(file.UsedROT13, 2) },
|
||||||
|
{ "Tweet Screenshots" , LogRound(file.TweetScreenshots, 2) },
|
||||||
|
{ "Tweet Details" , LogRound(file.TweetDetails, 2) },
|
||||||
|
{ "Video Plays" , LogRound(file.VideoPlays, 4) }
|
||||||
}.FinalizeReport();
|
}.FinalizeReport();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -110,6 +127,7 @@ namespace TweetDuck.Core.Other.Analytics{
|
|||||||
private static string Exact(int value) => value.ToString();
|
private static string Exact(int value) => value.ToString();
|
||||||
private static string RoundUp(int value, int multiple) => (multiple*(int)Math.Ceiling((double)value/multiple)).ToString();
|
private static string RoundUp(int value, int multiple) => (multiple*(int)Math.Ceiling((double)value/multiple)).ToString();
|
||||||
private static string LogRound(int value, int logBase) => (value <= 0 ? 0 : (int)Math.Pow(logBase, Math.Floor(Math.Log(value, logBase)))).ToString();
|
private static string LogRound(int value, int logBase) => (value <= 0 ? 0 : (int)Math.Pow(logBase, Math.Floor(Math.Log(value, logBase)))).ToString();
|
||||||
|
private static string Plugin(Plugin plugin) => plugin.Group.GetIdentifierPrefixShort()+plugin.Identifier.Substring(plugin.Group.GetIdentifierPrefix().Length);
|
||||||
private static string Dict(Dictionary<string, string> dict, string key, string def = "(unknown)") => dict.TryGetValue(key, out string value) ? value : def;
|
private static string Dict(Dictionary<string, string> dict, string key, string def = "(unknown)") => dict.TryGetValue(key, out string value) ? value : def;
|
||||||
private static string List(IEnumerable<string> list) => string.Join("|", list.DefaultIfEmpty("(none)"));
|
private static string List(IEnumerable<string> list) => string.Join("|", list.DefaultIfEmpty("(none)"));
|
||||||
|
|
||||||
@@ -127,11 +145,16 @@ namespace TweetDuck.Core.Other.Analytics{
|
|||||||
using(RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", false)){
|
using(RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", false)){
|
||||||
// ReSharper disable once PossibleNullReferenceException
|
// ReSharper disable once PossibleNullReferenceException
|
||||||
osName = key.GetValue("ProductName") as string;
|
osName = key.GetValue("ProductName") as string;
|
||||||
osEdition = key.GetValue("EditionID") as string;
|
|
||||||
osBuild = key.GetValue("CurrentBuild") as string;
|
osBuild = key.GetValue("CurrentBuild") as string;
|
||||||
|
osEdition = null;
|
||||||
|
|
||||||
if (osName != null && osEdition != null){
|
if (osName != null){
|
||||||
osName = osName.Replace(osEdition, "").TrimEnd();
|
Match match = Regex.Match(osName, @"^(.*?\d+(?:\.\d+)?) (.*)$");
|
||||||
|
|
||||||
|
if (match.Success){
|
||||||
|
osName = match.Groups[1].Value;
|
||||||
|
osEdition = match.Groups[2].Value;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}catch{
|
}catch{
|
||||||
@@ -175,6 +198,12 @@ namespace TweetDuck.Core.Other.Analytics{
|
|||||||
ProgramArguments = args.Keys.Select(key => key.TrimStart('-')).ToArray();
|
ProgramArguments = args.Keys.Select(key => key.TrimStart('-')).ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static string CustomBrowser{
|
||||||
|
get{
|
||||||
|
return Path.GetFileName(UserConfig.BrowserPath) ?? string.Empty;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static string TrayMode{
|
private static string TrayMode{
|
||||||
get{
|
get{
|
||||||
switch(UserConfig.TrayBehavior){
|
switch(UserConfig.TrayBehavior){
|
||||||
@@ -257,7 +286,7 @@ namespace TweetDuck.Core.Other.Analytics{
|
|||||||
Match matchAdvanced = Regex.Match(data, "useAdvancedSelector:(.*?)(?:,|$)", RegexOptions.Multiline);
|
Match matchAdvanced = Regex.Match(data, "useAdvancedSelector:(.*?)(?:,|$)", RegexOptions.Multiline);
|
||||||
|
|
||||||
if (!matchType.Success){
|
if (!matchType.Success){
|
||||||
return "(unknown)";
|
return data.Contains("defaultAccount:\"\"") ? "(legacy)" : "(unknown)";
|
||||||
}
|
}
|
||||||
|
|
||||||
string accType = matchType.Groups[1].Value == "#" ? matchType.Groups[2].Value : "account";
|
string accType = matchType.Groups[1].Value == "#" ? matchType.Groups[2].Value : "account";
|
||||||
@@ -274,7 +303,7 @@ namespace TweetDuck.Core.Other.Analytics{
|
|||||||
return new ExternalInfo();
|
return new ExternalInfo();
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
Screen screen = Screen.FromControl(form);
|
Screen screen = Screen.FromControl(form); // works on multi-monitor setups even in tray
|
||||||
int dpi;
|
int dpi;
|
||||||
|
|
||||||
using(Graphics graphics = form.CreateGraphics()){
|
using(Graphics graphics = form.CreateGraphics()){
|
||||||
|
|||||||
28
Core/Other/FormAbout.Designer.cs
generated
28
Core/Other/FormAbout.Designer.cs
generated
@@ -23,7 +23,6 @@ namespace TweetDuck.Core.Other {
|
|||||||
/// the contents of this method with the code editor.
|
/// the contents of this method with the code editor.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void InitializeComponent() {
|
private void InitializeComponent() {
|
||||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormAbout));
|
|
||||||
this.pictureLogo = new System.Windows.Forms.PictureBox();
|
this.pictureLogo = new System.Windows.Forms.PictureBox();
|
||||||
this.labelDescription = new System.Windows.Forms.Label();
|
this.labelDescription = new System.Windows.Forms.Label();
|
||||||
this.labelTips = new System.Windows.Forms.LinkLabel();
|
this.labelTips = new System.Windows.Forms.LinkLabel();
|
||||||
@@ -38,11 +37,11 @@ namespace TweetDuck.Core.Other {
|
|||||||
//
|
//
|
||||||
this.pictureLogo.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None;
|
this.pictureLogo.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None;
|
||||||
this.pictureLogo.ErrorImage = null;
|
this.pictureLogo.ErrorImage = null;
|
||||||
this.pictureLogo.Image = ((System.Drawing.Image)(resources.GetObject("pictureLogo.Image")));
|
|
||||||
this.pictureLogo.InitialImage = null;
|
this.pictureLogo.InitialImage = null;
|
||||||
this.pictureLogo.Location = new System.Drawing.Point(12, 12);
|
this.pictureLogo.Location = new System.Drawing.Point(12, 12);
|
||||||
this.pictureLogo.Name = "pictureLogo";
|
this.pictureLogo.Name = "pictureLogo";
|
||||||
this.pictureLogo.Size = new System.Drawing.Size(96, 96);
|
this.pictureLogo.Size = new System.Drawing.Size(96, 96);
|
||||||
|
this.pictureLogo.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
|
||||||
this.pictureLogo.TabIndex = 0;
|
this.pictureLogo.TabIndex = 0;
|
||||||
this.pictureLogo.TabStop = false;
|
this.pictureLogo.TabStop = false;
|
||||||
//
|
//
|
||||||
@@ -51,23 +50,22 @@ namespace TweetDuck.Core.Other {
|
|||||||
this.labelDescription.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
this.labelDescription.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||||
| System.Windows.Forms.AnchorStyles.Left)
|
| System.Windows.Forms.AnchorStyles.Left)
|
||||||
| System.Windows.Forms.AnchorStyles.Right)));
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
this.labelDescription.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
this.labelDescription.Font = new System.Drawing.Font("Segoe UI", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.labelDescription.Location = new System.Drawing.Point(114, 12);
|
this.labelDescription.Location = new System.Drawing.Point(114, 12);
|
||||||
this.labelDescription.Name = "labelDescription";
|
this.labelDescription.Name = "labelDescription";
|
||||||
this.labelDescription.Size = new System.Drawing.Size(232, 109);
|
this.labelDescription.Size = new System.Drawing.Size(232, 113);
|
||||||
this.labelDescription.TabIndex = 0;
|
this.labelDescription.TabIndex = 0;
|
||||||
//
|
//
|
||||||
// labelTips
|
// labelTips
|
||||||
//
|
//
|
||||||
this.labelTips.Dock = System.Windows.Forms.DockStyle.Fill;
|
this.labelTips.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
this.labelTips.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
this.labelTips.Font = new System.Drawing.Font("Segoe UI", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.labelTips.LinkArea = new System.Windows.Forms.LinkArea(0, 0);
|
this.labelTips.LinkArea = new System.Windows.Forms.LinkArea(0, 0);
|
||||||
this.labelTips.Location = new System.Drawing.Point(117, 0);
|
this.labelTips.Location = new System.Drawing.Point(117, 0);
|
||||||
this.labelTips.Margin = new System.Windows.Forms.Padding(0);
|
this.labelTips.Margin = new System.Windows.Forms.Padding(0);
|
||||||
this.labelTips.Name = "labelTips";
|
this.labelTips.Name = "labelTips";
|
||||||
this.labelTips.Size = new System.Drawing.Size(99, 16);
|
this.labelTips.Size = new System.Drawing.Size(99, 18);
|
||||||
this.labelTips.TabIndex = 1;
|
this.labelTips.TabIndex = 1;
|
||||||
this.labelTips.TabStop = true;
|
|
||||||
this.labelTips.Text = "Tips && Tricks";
|
this.labelTips.Text = "Tips && Tricks";
|
||||||
this.labelTips.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
this.labelTips.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||||
this.labelTips.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.OnLinkClicked);
|
this.labelTips.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.OnLinkClicked);
|
||||||
@@ -76,14 +74,13 @@ namespace TweetDuck.Core.Other {
|
|||||||
//
|
//
|
||||||
this.labelWebsite.AutoSize = true;
|
this.labelWebsite.AutoSize = true;
|
||||||
this.labelWebsite.Dock = System.Windows.Forms.DockStyle.Fill;
|
this.labelWebsite.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
this.labelWebsite.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
this.labelWebsite.Font = new System.Drawing.Font("Segoe UI", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.labelWebsite.LinkArea = new System.Windows.Forms.LinkArea(0, 0);
|
this.labelWebsite.LinkArea = new System.Windows.Forms.LinkArea(0, 0);
|
||||||
this.labelWebsite.Location = new System.Drawing.Point(0, 0);
|
this.labelWebsite.Location = new System.Drawing.Point(0, 0);
|
||||||
this.labelWebsite.Margin = new System.Windows.Forms.Padding(0);
|
this.labelWebsite.Margin = new System.Windows.Forms.Padding(0);
|
||||||
this.labelWebsite.Name = "labelWebsite";
|
this.labelWebsite.Name = "labelWebsite";
|
||||||
this.labelWebsite.Size = new System.Drawing.Size(117, 16);
|
this.labelWebsite.Size = new System.Drawing.Size(117, 18);
|
||||||
this.labelWebsite.TabIndex = 0;
|
this.labelWebsite.TabIndex = 0;
|
||||||
this.labelWebsite.TabStop = true;
|
|
||||||
this.labelWebsite.Text = "Official Website";
|
this.labelWebsite.Text = "Official Website";
|
||||||
this.labelWebsite.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
|
this.labelWebsite.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
|
||||||
this.labelWebsite.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.OnLinkClicked);
|
this.labelWebsite.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.OnLinkClicked);
|
||||||
@@ -99,24 +96,23 @@ namespace TweetDuck.Core.Other {
|
|||||||
this.tablePanelLinks.Controls.Add(this.labelIssues, 2, 0);
|
this.tablePanelLinks.Controls.Add(this.labelIssues, 2, 0);
|
||||||
this.tablePanelLinks.Controls.Add(this.labelWebsite, 0, 0);
|
this.tablePanelLinks.Controls.Add(this.labelWebsite, 0, 0);
|
||||||
this.tablePanelLinks.Controls.Add(this.labelTips, 1, 0);
|
this.tablePanelLinks.Controls.Add(this.labelTips, 1, 0);
|
||||||
this.tablePanelLinks.Location = new System.Drawing.Point(12, 124);
|
this.tablePanelLinks.Location = new System.Drawing.Point(12, 128);
|
||||||
this.tablePanelLinks.Name = "tablePanelLinks";
|
this.tablePanelLinks.Name = "tablePanelLinks";
|
||||||
this.tablePanelLinks.RowCount = 1;
|
this.tablePanelLinks.RowCount = 1;
|
||||||
this.tablePanelLinks.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
|
this.tablePanelLinks.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
|
||||||
this.tablePanelLinks.Size = new System.Drawing.Size(334, 16);
|
this.tablePanelLinks.Size = new System.Drawing.Size(334, 18);
|
||||||
this.tablePanelLinks.TabIndex = 1;
|
this.tablePanelLinks.TabIndex = 1;
|
||||||
//
|
//
|
||||||
// labelIssues
|
// labelIssues
|
||||||
//
|
//
|
||||||
this.labelIssues.Dock = System.Windows.Forms.DockStyle.Fill;
|
this.labelIssues.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
this.labelIssues.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
this.labelIssues.Font = new System.Drawing.Font("Segoe UI", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.labelIssues.LinkArea = new System.Windows.Forms.LinkArea(0, 0);
|
this.labelIssues.LinkArea = new System.Windows.Forms.LinkArea(0, 0);
|
||||||
this.labelIssues.Location = new System.Drawing.Point(216, 0);
|
this.labelIssues.Location = new System.Drawing.Point(216, 0);
|
||||||
this.labelIssues.Margin = new System.Windows.Forms.Padding(0);
|
this.labelIssues.Margin = new System.Windows.Forms.Padding(0);
|
||||||
this.labelIssues.Name = "labelIssues";
|
this.labelIssues.Name = "labelIssues";
|
||||||
this.labelIssues.Size = new System.Drawing.Size(118, 16);
|
this.labelIssues.Size = new System.Drawing.Size(118, 18);
|
||||||
this.labelIssues.TabIndex = 2;
|
this.labelIssues.TabIndex = 2;
|
||||||
this.labelIssues.TabStop = true;
|
|
||||||
this.labelIssues.Text = "Report an Issue";
|
this.labelIssues.Text = "Report an Issue";
|
||||||
this.labelIssues.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
|
this.labelIssues.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
|
||||||
this.labelIssues.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.OnLinkClicked);
|
this.labelIssues.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.OnLinkClicked);
|
||||||
@@ -126,7 +122,7 @@ namespace TweetDuck.Core.Other {
|
|||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
this.BackColor = System.Drawing.Color.White;
|
this.BackColor = System.Drawing.Color.White;
|
||||||
this.ClientSize = new System.Drawing.Size(358, 152);
|
this.ClientSize = new System.Drawing.Size(358, 156);
|
||||||
this.Controls.Add(this.tablePanelLinks);
|
this.Controls.Add(this.tablePanelLinks);
|
||||||
this.Controls.Add(this.labelDescription);
|
this.Controls.Add(this.labelDescription);
|
||||||
this.Controls.Add(this.pictureLogo);
|
this.Controls.Add(this.pictureLogo);
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.IO;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using TweetDuck.Core.Utils;
|
using TweetDuck.Core.Utils;
|
||||||
|
|
||||||
@@ -17,6 +19,10 @@ namespace TweetDuck.Core.Other{
|
|||||||
labelWebsite.Links.Add(new LinkLabel.Link(0, labelWebsite.Text.Length, Program.Website));
|
labelWebsite.Links.Add(new LinkLabel.Link(0, labelWebsite.Text.Length, Program.Website));
|
||||||
labelTips.Links.Add(new LinkLabel.Link(0, labelTips.Text.Length, TipsLink));
|
labelTips.Links.Add(new LinkLabel.Link(0, labelTips.Text.Length, TipsLink));
|
||||||
labelIssues.Links.Add(new LinkLabel.Link(0, labelIssues.Text.Length, IssuesLink));
|
labelIssues.Links.Add(new LinkLabel.Link(0, labelIssues.Text.Length, IssuesLink));
|
||||||
|
|
||||||
|
MemoryStream logoStream = new MemoryStream(Properties.Resources.avatar);
|
||||||
|
pictureLogo.Image = Image.FromStream(logoStream);
|
||||||
|
Disposed += (sender, args) => logoStream.Dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnLinkClicked(object sender, LinkLabelLinkClickedEventArgs e){
|
private void OnLinkClicked(object sender, LinkLabelLinkClickedEventArgs e){
|
||||||
@@ -33,7 +39,7 @@ namespace TweetDuck.Core.Other{
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void ShowGuide(){
|
private void ShowGuide(){
|
||||||
new FormGuide().Show();
|
FormGuide.Show();
|
||||||
Close();
|
Close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,246 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<root>
|
|
||||||
<!--
|
|
||||||
Microsoft ResX Schema
|
|
||||||
|
|
||||||
Version 2.0
|
|
||||||
|
|
||||||
The primary goals of this format is to allow a simple XML format
|
|
||||||
that is mostly human readable. The generation and parsing of the
|
|
||||||
various data types are done through the TypeConverter classes
|
|
||||||
associated with the data types.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
... ado.net/XML headers & schema ...
|
|
||||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
|
||||||
<resheader name="version">2.0</resheader>
|
|
||||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
|
||||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
|
||||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
|
||||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
|
||||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
|
||||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
|
||||||
</data>
|
|
||||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
|
||||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
|
||||||
<comment>This is a comment</comment>
|
|
||||||
</data>
|
|
||||||
|
|
||||||
There are any number of "resheader" rows that contain simple
|
|
||||||
name/value pairs.
|
|
||||||
|
|
||||||
Each data row contains a name, and value. The row also contains a
|
|
||||||
type or mimetype. Type corresponds to a .NET class that support
|
|
||||||
text/value conversion through the TypeConverter architecture.
|
|
||||||
Classes that don't support this are serialized and stored with the
|
|
||||||
mimetype set.
|
|
||||||
|
|
||||||
The mimetype is used for serialized objects, and tells the
|
|
||||||
ResXResourceReader how to depersist the object. This is currently not
|
|
||||||
extensible. For a given mimetype the value must be set accordingly:
|
|
||||||
|
|
||||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
|
||||||
that the ResXResourceWriter will generate, however the reader can
|
|
||||||
read any of the formats listed below.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.binary.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.soap.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
|
||||||
value : The object must be serialized into a byte array
|
|
||||||
: using a System.ComponentModel.TypeConverter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
-->
|
|
||||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
|
||||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
|
||||||
<xsd:element name="root" msdata:IsDataSet="true">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:choice maxOccurs="unbounded">
|
|
||||||
<xsd:element name="metadata">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="assembly">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:attribute name="alias" type="xsd:string" />
|
|
||||||
<xsd:attribute name="name" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="data">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="resheader">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:choice>
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:schema>
|
|
||||||
<resheader name="resmimetype">
|
|
||||||
<value>text/microsoft-resx</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="version">
|
|
||||||
<value>2.0</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="reader">
|
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="writer">
|
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
|
||||||
<data name="pictureLogo.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
|
||||||
<value>
|
|
||||||
iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH
|
|
||||||
DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKOWlDQ1BQaG90b3Nob3AgSUNDIHByb2Zp
|
|
||||||
bGUAAEjHnZZ3VFTXFofPvXd6oc0wAlKG3rvAANJ7k15FYZgZYCgDDjM0sSGiAhFFRJoiSFDEgNFQJFZE
|
|
||||||
sRAUVLAHJAgoMRhFVCxvRtaLrqy89/Ly++Osb+2z97n77L3PWhcAkqcvl5cGSwGQyhPwgzyc6RGRUXTs
|
|
||||||
AIABHmCAKQBMVka6X7B7CBDJy82FniFyAl8EAfB6WLwCcNPQM4BOB/+fpFnpfIHomAARm7M5GSwRF4g4
|
|
||||||
JUuQLrbPipgalyxmGCVmvihBEcuJOWGRDT77LLKjmNmpPLaIxTmns1PZYu4V8bZMIUfEiK+ICzO5nCwR
|
|
||||||
3xKxRoowlSviN+LYVA4zAwAUSWwXcFiJIjYRMYkfEuQi4uUA4EgJX3HcVyzgZAvEl3JJS8/hcxMSBXQd
|
|
||||||
li7d1NqaQffkZKVwBALDACYrmcln013SUtOZvBwAFu/8WTLi2tJFRbY0tba0NDQzMv2qUP91829K3NtF
|
|
||||||
ehn4uWcQrf+L7a/80hoAYMyJarPziy2uCoDOLQDI3fti0zgAgKSobx3Xv7oPTTwviQJBuo2xcVZWlhGX
|
|
||||||
wzISF/QP/U+Hv6GvvmckPu6P8tBdOfFMYYqALq4bKy0lTcinZ6QzWRy64Z+H+B8H/nUeBkGceA6fwxNF
|
|
||||||
hImmjMtLELWbx+YKuGk8Opf3n5r4D8P+pMW5FonS+BFQY4yA1HUqQH7tBygKESDR+8Vd/6NvvvgwIH55
|
|
||||||
4SqTi3P/7zf9Z8Gl4iWDm/A5ziUohM4S8jMX98TPEqABAUgCKpAHykAd6ABDYAasgC1wBG7AG/iDEBAJ
|
|
||||||
VgMWSASpgA+yQB7YBApBMdgJ9oBqUAcaQTNoBcdBJzgFzoNL4Bq4AW6D+2AUTIBnYBa8BgsQBGEhMkSB
|
|
||||||
5CEVSBPSh8wgBmQPuUG+UBAUCcVCCRAPEkJ50GaoGCqDqqF6qBn6HjoJnYeuQIPQXWgMmoZ+h97BCEyC
|
|
||||||
qbASrAUbwwzYCfaBQ+BVcAK8Bs6FC+AdcCXcAB+FO+Dz8DX4NjwKP4PnEIAQERqiihgiDMQF8UeikHiE
|
|
||||||
j6xHipAKpAFpRbqRPuQmMorMIG9RGBQFRUcZomxRnqhQFAu1BrUeVYKqRh1GdaB6UTdRY6hZ1Ec0Ga2I
|
|
||||||
1kfboL3QEegEdBa6EF2BbkK3oy+ib6Mn0K8xGAwNo42xwnhiIjFJmLWYEsw+TBvmHGYQM46Zw2Kx8lh9
|
|
||||||
rB3WH8vECrCF2CrsUexZ7BB2AvsGR8Sp4Mxw7rgoHA+Xj6vAHcGdwQ3hJnELeCm8Jt4G749n43PwpfhG
|
|
||||||
fDf+On4Cv0CQJmgT7AghhCTCJkIloZVwkfCA8JJIJKoRrYmBRC5xI7GSeIx4mThGfEuSIemRXEjRJCFp
|
|
||||||
B+kQ6RzpLuklmUzWIjuSo8gC8g5yM/kC+RH5jQRFwkjCS4ItsUGiRqJDYkjiuSReUlPSSXK1ZK5kheQJ
|
|
||||||
yeuSM1J4KS0pFymm1HqpGqmTUiNSc9IUaVNpf+lU6RLpI9JXpKdksDJaMm4ybJkCmYMyF2TGKQhFneJC
|
|
||||||
YVE2UxopFykTVAxVm+pFTaIWU7+jDlBnZWVkl8mGyWbL1sielh2lITQtmhcthVZKO04bpr1borTEaQln
|
|
||||||
yfYlrUuGlszLLZVzlOPIFcm1yd2WeydPl3eTT5bfJd8p/1ABpaCnEKiQpbBf4aLCzFLqUtulrKVFS48v
|
|
||||||
vacIK+opBimuVTyo2K84p6Ss5KGUrlSldEFpRpmm7KicpFyufEZ5WoWiYq/CVSlXOavylC5Ld6Kn0Cvp
|
|
||||||
vfRZVUVVT1Whar3qgOqCmrZaqFq+WpvaQ3WCOkM9Xr1cvUd9VkNFw08jT6NF454mXpOhmai5V7NPc15L
|
|
||||||
Wytca6tWp9aUtpy2l3audov2Ax2yjoPOGp0GnVu6GF2GbrLuPt0berCehV6iXo3edX1Y31Kfq79Pf9AA
|
|
||||||
bWBtwDNoMBgxJBk6GWYathiOGdGMfI3yjTqNnhtrGEcZ7zLuM/5oYmGSYtJoct9UxtTbNN+02/R3Mz0z
|
|
||||||
llmN2S1zsrm7+QbzLvMXy/SXcZbtX3bHgmLhZ7HVosfig6WVJd+y1XLaSsMq1qrWaoRBZQQwShiXrdHW
|
|
||||||
ztYbrE9Zv7WxtBHYHLf5zdbQNtn2iO3Ucu3lnOWNy8ft1OyYdvV2o/Z0+1j7A/ajDqoOTIcGh8eO6o5s
|
|
||||||
xybHSSddpySno07PnU2c+c7tzvMuNi7rXM65Iq4erkWuA24ybqFu1W6P3NXcE9xb3Gc9LDzWepzzRHv6
|
|
||||||
eO7yHPFS8mJ5NXvNelt5r/Pu9SH5BPtU+zz21fPl+3b7wX7efrv9HqzQXMFb0ekP/L38d/s/DNAOWBPw
|
|
||||||
YyAmMCCwJvBJkGlQXlBfMCU4JvhI8OsQ55DSkPuhOqHC0J4wybDosOaw+XDX8LLw0QjjiHUR1yIVIrmR
|
|
||||||
XVHYqLCopqi5lW4r96yciLaILoweXqW9KnvVldUKq1NWn46RjGHGnIhFx4bHHol9z/RnNjDn4rziauNm
|
|
||||||
WS6svaxnbEd2OXuaY8cp40zG28WXxU8l2CXsTphOdEisSJzhunCruS+SPJPqkuaT/ZMPJX9KCU9pS8Wl
|
|
||||||
xqae5Mnwknm9acpp2WmD6frphemja2zW7Fkzy/fhN2VAGasyugRU0c9Uv1BHuEU4lmmfWZP5Jiss60S2
|
|
||||||
dDYvuz9HL2d7zmSue+63a1FrWWt78lTzNuWNrXNaV78eWh+3vmeD+oaCDRMbPTYe3kTYlLzpp3yT/LL8
|
|
||||||
V5vDN3cXKBVsLBjf4rGlpVCikF84stV2a9021DbutoHt5turtn8sYhddLTYprih+X8IqufqN6TeV33za
|
|
||||||
Eb9joNSydP9OzE7ezuFdDrsOl0mX5ZaN7/bb3VFOLy8qf7UnZs+VimUVdXsJe4V7Ryt9K7uqNKp2Vr2v
|
|
||||||
Tqy+XeNc01arWLu9dn4fe9/Qfsf9rXVKdcV17w5wD9yp96jvaNBqqDiIOZh58EljWGPft4xvm5sUmoqb
|
|
||||||
PhziHRo9HHS4t9mqufmI4pHSFrhF2DJ9NProje9cv+tqNWytb6O1FR8Dx4THnn4f+/3wcZ/jPScYJ1p/
|
|
||||||
0Pyhtp3SXtQBdeR0zHYmdo52RXYNnvQ+2dNt293+o9GPh06pnqo5LXu69AzhTMGZT2dzz86dSz83cz7h
|
|
||||||
/HhPTM/9CxEXbvUG9g5c9Ll4+ZL7pQt9Tn1nL9tdPnXF5srJq4yrndcsr3X0W/S3/2TxU/uA5UDHdavr
|
|
||||||
XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS
|
|
||||||
fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+
|
|
||||||
tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/
|
|
||||||
6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAAuIgAALiIBquLdkgAAEVpJREFUeF7tXQl0VNd5
|
|
||||||
Thq3Tk7tc+qmiZMm7YmdJj1OT3Gd0kTMG3mJnZQEJzaSjXETx0lqNwt2jWscQGixBAJLSMhgA8YYbIyQ
|
|
||||||
hHYJI4lFGMwioQWxyewgMdoXtKFd4u/337lPjDRv9pk3g+A75zsMWv577/fd+9/l3Rl9johu0Y/U/OIt
|
|
||||||
6sfrLwIYT2de+SJ4F/j34LfB+8Ap4L9J8uvvgfy9b4DfBO8EPy9DBBwC3gCI93fgDHAuuA7cDVaDzWAX
|
|
||||||
OAAOgcNgP9gN8vc+A4vB9eBr4M/Be8GAMiPgDIBAXwVDwbXgEbAPJC+RDToGvgfOBr8mi/UbAsIACMFp
|
|
||||||
ZRaYC7aBWuL5gh3gdvBZ8C5ZHV3hVwPQaM7hS0ETqCWQnqwDE8Apsnq6wC8GoJEPgFtAzt9aYviTPJ9k
|
|
||||||
gkGyuj6FrgagUd8CeVIcBLUaH0gcATeD35XV9wl0MQCN4OXjn8EroFZjA5m8qooE/1o2x6vwuQGouAEs
|
|
||||||
A7UadyPxOPgj2SyvwacGoMILwRsh3ThLTksx4BdkEz2GTwxABb8C8pJSqxGTgTvAb8jmegSvG4CK/QvI
|
|
||||||
O1Wtik8mXgSnyma7Da8agAo9Auq5kfI3+Shkhmy+W/CaAajI42CvrNjNRJ7jZksZXIZXDEAFWPxA3FTp
|
|
||||||
xVHQLRM8NgAFPwTejD1/InkH/biUxWl4ZAAK5LP3mynnO+JV0KWJ2W0DUNCXwVOy4Fu8zhrQ6SWqJwbk
|
|
||||||
WxQa2Mxop6fSWyk0rYlCUhspZEs9zdxSJ8iv+WuhW5vpqYw27d93nXvB26RUduGWAQg+36KwwCULv7VF
|
|
||||||
iDx3Wx1tPNxCBy92UU17P7VdHaLWniE619JLu8900Nv7m+jFLBgCM9gs/l3NmCqlqU+nt+D/msYtk3LZ
|
|
||||||
hcsGIPB/gPaPF7jyKrW+rwNZnJCUBoraUU9H63po9No1NM8++odGac/ZDno5r45C2QitESGF59gv5dVT
|
|
||||||
clUHzc5gEyb8XOaVa6DDsyMU67wBCHg7WCULsEkezi9/jEptbfKLCdzrn0s30b5znWiS6xgeuUaby1so
|
|
||||||
NKVubDSwGZzCOG3NzTdRQXW7+NnM4+b2atUDPAPeIeXTBEK4ZMA8i+Ca5Ir+LrOOOvtHKGkfcit6kp4m
|
|
||||||
sBh/zDGRqaMfzfEMh5CuZiXXUOgWE72Ua6L1Jc10qqmXRkbNo4nT2PMw2sHcESvl0wTCOGcAAv0DyFtv
|
|
||||||
rULGyAKsO9SMUERD6EnRO+t1M4F76++zTNTUNSjK9wYutvVhzujTTGGrMG/wqNCqiwX5IsA/SxmtgDBO
|
|
||||||
G7DBIqhN8oR3suEqQpnRh7watcOcU31pAvfCWUgZ1Y3Xy/YlCk+Z28rlqrTTvkwpoxUQyrEBCPCvoONz
|
|
||||||
fVTg1xkm6hkYQajr4Mktdpd5uecrE9jg5IpWWaJvwRN1SHKtaA/PCfMLmyiq2DxPaNUN5KMKg5RzHBDO
|
|
||||||
KQNSLYLZJFfgVSz3tMBDeM0BrMNlr9H6fXfJ8V7AErK7f1iW5hsMjYxSSnkjPbnxLP1vbq2YE04399KV
|
|
||||||
vmGak9/kqF0FUs5xQFj7BuAXvwM6ddDGOfiNnQ0IYxvbTrYjVWDiwkrFW6OB83DaEd/3/obOfiq71Ekt
|
|
||||||
3YOkzgg8NUTxPOdgLpiV1TE6K7vzASnrGBDCoQF8b0cz6ESyqDG77BvAOI2VxJycy7bX2q4QJoYgDVxo
|
|
||||||
7ZPR9QVv4OzNb7OyOll8mpnWTNPXnlwnZR0DQtg2AAHuAPnCkmbwieQREFZQjzCOwfPChlJs/3mt7cFo
|
|
||||||
YAPn5NTRsFwa6on3kII05zUIjt4uXv9icx099u5pCn7rKBkSynoMC1K/LuUVQBi7BswcF9gBWYzfZ5vE
|
|
||||||
RsZZnG/powjsVsXc4IYR/DtLix2POm+C9wGrPjWfK1nWl3v6MxA+FB1xxgeX6OF3TpKSdASsIiMMMK48
|
|
||||||
TkpM4RwprwDC2TUgTw3uFFEZXgo2dA4glPNgu8pruyms0HxAJnaWThrBP7v2oHnfoQd48xWBelqmHe7t
|
|
||||||
Is2kNNJ/rj9HD648RsoKC+FVwgBj/MGDUl4BhNQ2AIH/FuTLq1aNtkfuFYWfXUEo18FGHKvrofg9DfRs
|
|
||||||
mknEcjQq2ABejeiFyEKTWXyUbU4z7fSLj0z06NpTELnKLLyl6BOZVDVgDM+8R8ps14AQy4Y6S1fmAXvg
|
|
||||||
npZ/oo0iiuro2VSYkdIgVhocX0zc0hQ2YDWWt3phIdrGp5+hW1vpZxsv0SOcZrR6uy1iFAQvLvqDlNmu
|
|
||||||
Ae9aCus0IQzn8/LL3QjnHbAZpZe6RE9fsL2O/jvTJFIdlzMz2URRhZflT/oer+fX0E/ePUXBttKMI3Ia
|
|
||||||
enNfhpRZ2wAI+XnQ4amnLXLamPdxHQ1i4+IL8AqqHvMMp6vdZ65Q8en2sXW5r/HbjZVYzVRoi+sMYZwx
|
|
||||||
saxWWbj1Swhn04B/BPkQSVNgu+TUAHKefB/LzMkE3s3PXgfxsbLRFNd5XlMWZT6AkDYN+JmVsE5QLEPz
|
|
||||||
WujXGY0iZ3N60GOHqheuDgzT4++U80SqJarz5DQUXfAcQlobACE5/fAb4jRFtkdOPatLWqmrf4RSKlvo
|
|
||||||
1fzL9MSGM7TuQJ04R7nR0dDRSw8mlGqL6gpXniDjkp2xyoKULyCslQH81MutCZgNWLz7+qaI83Jz9yAm
|
|
||||||
0A5q6/HeGb2/cPxyBxnivWEAT8T7c4Mjc+5EWCsD/gbkt4JqimyP6rGA+sRosqHgWD0Zlh/WFtUVsgHL
|
|
||||||
S44aI3O/hrBWBvCboN273cwTMJaHvEKZjEgsOkNKogcrIJViJVTeaIzefi/CWhnA7zJvGiesC+TVT85x
|
|
||||||
8wPryYYXNpl3upqiukQYsKKyR1my63sIa2UAv3WU3xelKbAj8k71lXz/nE76Em09A/Tjt5B+PF0BqUw6
|
|
||||||
MogN2RSEtjKAHz+6twdg8k6Yz4NOuXceFKgorm7yTv5XmXRkVIk78H2EtjLgfpBv+moL7AR5Mv5NRp1X
|
|
||||||
byf4GzH5n3kn/6vkkbS8dCpCWxnAnzrikQFMPiRbWFAnbkXc6OAN2BNreAPmjfwvyQbEH9I0gD/yxfM3
|
|
||||||
W/BxRFqTuBrYOzj+lsSNht0nG72bfphJVddgwL8jvJUBHk3C4yhNeCXfRJfaPL+p5i+8ln4Cq59KbSHd
|
|
||||||
ZVLloLJs7/0Ib2UAL0NbxgnpCWEC75Bnp5rog7IW6ujz7dURb+NsYxdvmswpQ0tItyiWod1KTJHmMpQ3
|
|
||||||
YvxhR9qCukiekGenN4tHjU9+VENPbzpLcbtq6GS9954X+BLLtp/y7uTLNG/EmozRBd9GEVYG8Gf37LEU
|
|
||||||
0RNy7/+o8gqdae6jQxc76eCFTqqo7aTGzsBPSRdbeuihRG/3fpANiC85qkTkaB5F8Adr8CeaaArqKsUj
|
|
||||||
yiJ9by14C2/keXnpqXIV5pTYPblB8zZ9BcVYGcDH0f9nKaJH5I1ZSgMduNCF8DcOjtS0k+L13C/JBize
|
|
||||||
EWeYn3wbihpvgHwgw+/71RbUDfIo+FNuvdWl3UAFn+a+KM59vLzyUWl+IPMbFHVd97EXZgPuAb3yKSfq
|
|
||||||
ZSUeBbFFNSgi8PHRwRrzut8Xvd/Ma8FR+XYfSf4FyJ+PoymqM1TvRIakNtP098/TQ5h4psWXUnzBaRQT
|
|
||||||
uDhZ1yknXi/uei0JHZTlpbVBr6z7IoqzNkAlRHR9Ira4E/lEcv31O5Hq9Q2Qe9bCrJPU3T+EYgILPajT
|
|
||||||
r96v8F3qYSL/G5bszuKOjiLHeP2FBETkj5G0FlmDapp5amsrzfiwhh5ZPeFOpCXxNSWxnGauKaed2OI7
|
|
||||||
8eZF3RCejXqjbj5MPWYDInJfZo1RpF0D+EOX7L4nbOzqdWqTSDN8J3Kst2sVbkF+sMGj4fmNlZR2uFas
|
|
||||||
uYflg3t/mLJy11lf530Q6/+3qoaw+vkOa4xibRvAgMj8oaYTRLe+eu3UnUgt8mhgIxLKKBhLvsdXltDc
|
|
||||||
zRV0qUXfXfKHBy7pID4ongUfKpfyOmXAf00U3ubVa0+IOCzAM+vKqOxCG6qhHzbziodvOvhq0rUk0k9Q
|
|
||||||
WPpLUl4BVMG2AbOyu+4CW1j8Jx1dvXaHLDx6/09XHabU0loaHNb32cG7n1zQT3w+fkgs75r6Pwl3S3kF
|
|
||||||
UA3bBjB+vvH8CnH1WqYLzeCukEcNVhnc459YXSaGf0evvk/O2OjovGqZdnQQn/l2NQVF5G2Qso4B1bFv
|
|
||||||
gCEs/X6kmhHNoCp5NHBDBPm1ShYbTKwQPZ1723T09tfTT4hnrL2D+h9N17Zdpd9uNI88UUet9viCGAFB
|
|
||||||
r29WpKxjQJXsG8AwLtv3sbhOpxUYjZi+5hg9s+E4zVpfRT9ZeZh+nFRKP11ZRqFry+mFD6soKreakg/V
|
|
||||||
iPzuz/V/TqVJ1E2s83UVX9yE2294baPV3y5AtRwboIRnT0OgUavAko++fZR++cFxKj7VQgPDI9Q3OCKE
|
|
||||||
HhgKjLOfc03d9ErqcX1TjiVhADLJdCnnOKB6jg1gGOP2pwsntQpAbxLzw/JSCsuqprNocCCgoaOPEgrP
|
|
||||||
0MOJJeZjZT17vUo++Vz6yU4poxVQTScNWJT5XfSefvNmQqMgJhuBhirxJTQ/4wRVXGqnUT9c0Drf3E3L
|
|
||||||
IfyPON2Ina0fer0gVoxJVcNBr31g9QZtFaiucwYwjEt2xdqcCywpRgRWOph0f7m+QuT/y+1XfbrD5Ztr
|
|
||||||
24/V05wtR8Wmzr/CS7JWscWrpHyaQNWdN0AJS7vDmFh2zmYqmkiZmnjF8WBCibhbuWbPeTqMyZiXnp4Y
|
|
||||||
wgdnfF2cl7Gc3x9Db+ccr/sEa4u87l9R3hAcnvllKZ8m0BTnDWAo4VmPGldyIXZSkRalGdwzeWTwaonP
|
|
||||||
gRZlV9O6vRcoq8JEu7E0LTnXSidMHSKNHK29Qofwf76Xw99/Dz8XiRXV7z48QjPeLkOqg+gwN2BEtyRv
|
|
||||||
WCNyQqRsNuGyAQxlya44p1KRPaqGQDxhCnrvGFlYlRZf558TcwxP+IEmuCXFI8eda6RcduGWAcaFaX9p
|
|
||||||
jD/0qdOp6GYia7K8pCp4UfqXpFx24ZYBDGVB6jeNKypMt0ywoPm8p9UYkW3zI8omwm0DGIbXN//AuKKy
|
|
||||||
VxSsVaGbiWYNhrBpdenPnHhkAAMTzUwUPnxTm6C2PWrbc1IWp+GxAQxDePavxlXkpiLazO2OKfqjlMMl
|
|
||||||
eMUABruPCt1kI4HbiuVm9PY/SRlchtcMYBjCMkJQMcwJN8HEzB0tqWrIGF3wvGy+W/CqAQwlLH2aknDY
|
|
||||||
xGthzYpPBnIHW1HRYozMeUw222143QDGtD8n3yP2CcKESZaSeAOaUFpuDM+8TzbXI/jEAIZxYepfGaIL
|
|
||||||
48yVngQpiVMO2qHEFq81Lkr32p819JkBKgyLMmeYD/Bu4NHAdU8sr1Ui85+SzfIafG4Aw7go4y5jbPEy
|
|
||||||
8TzhRpobxMitGjYu3fOOMWzrV2VzvApdDFDxw3mbpyhL92aL09RATkuibhitb35agIn2h7L6PoGuBqgw
|
|
||||||
hOc8Zow7UCQayyMiIPYOnONlmow7sEeJzPPoL+Q5C78YoAI76KBpMTtXK4nlLcZV6HVqz9MUyEfkMpkr
|
|
||||||
KnuMSz/ZpETkPCyrpwv8aoCKH8zdcPe0yG0vYum6X8wTLIivRoZczQgmVQ2izBIluvBVZeHWb8nq6IqA
|
|
||||||
MMASWDX9k+GN7X8wxO5JU5aXnjeLxoKxIVI4YYzKCQKrX7cUWpiJf/n7CWW1yrJ9WcaYwpeU8Cynj419
|
|
||||||
hYAzwBJB8zbdHhyVd78xpuA5ZfHOWEzgWeixFVgSNiBldGG0DICj4uE7PyEzvx4Q6YQ/ECm+5Cgm0jxl
|
|
||||||
8Y5lyhsfPw9zpyrzU3zyp8ndRUAbwFDrZViQdlvQ/NQ7kKPvNkYX3GuIKbpPWfrJFP7IFyXu4FQYM1V5
|
|
||||||
c//3lWV7p/A70JWobfcq4dlfN4Zn3WmYn3y7GseSgYCxulhW7Bb1p+YXb1Ev0uf+H9A3E1Z4VJUaAAAA
|
|
||||||
AElFTkSuQmCC
|
|
||||||
</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
|
||||||
@@ -6,42 +6,82 @@ using CefSharp.WinForms;
|
|||||||
using TweetDuck.Core.Controls;
|
using TweetDuck.Core.Controls;
|
||||||
using TweetDuck.Core.Handling;
|
using TweetDuck.Core.Handling;
|
||||||
using TweetDuck.Core.Handling.General;
|
using TweetDuck.Core.Handling.General;
|
||||||
using TweetDuck.Core.Other.Analytics;
|
|
||||||
using TweetDuck.Core.Utils;
|
using TweetDuck.Core.Utils;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
using TweetDuck.Data;
|
||||||
|
using TweetDuck.Resources;
|
||||||
|
|
||||||
namespace TweetDuck.Core.Other{
|
namespace TweetDuck.Core.Other{
|
||||||
sealed partial class FormGuide : Form{
|
sealed partial class FormGuide : Form{
|
||||||
private const string GuideUrl = "https://tweetduck.chylex.com/guide/v2/";
|
private const string GuideUrl = "https://tweetduck.chylex.com/guide/v2/";
|
||||||
|
private const string GuidePathRegex = @"^guide(?:/v\d+)?(?:/(#.*))?";
|
||||||
|
|
||||||
private readonly ChromiumWebBrowser browser;
|
private static readonly ResourceLink DummyPage = new ResourceLink("http://td/dummy", ResourceHandler.FromString(""));
|
||||||
|
|
||||||
public FormGuide(){
|
public static bool CheckGuideUrl(string url, out string hash){
|
||||||
InitializeComponent();
|
if (!url.Contains("//tweetduck.chylex.com/guide")){
|
||||||
|
hash = null;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
Text = Program.BrandName+" Guide";
|
string path = url.Substring(url.IndexOf("/guide")+1);
|
||||||
|
Match match = Regex.Match(path, GuidePathRegex);
|
||||||
|
|
||||||
|
if (match.Success){
|
||||||
|
hash = match.Groups[1].Value;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
hash = null;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Show(string hash = null){
|
||||||
|
string url = GuideUrl+(hash ?? string.Empty);
|
||||||
|
FormGuide guide = FormManager.TryFind<FormGuide>();
|
||||||
|
|
||||||
|
if (guide == null){
|
||||||
FormBrowser owner = FormManager.TryFind<FormBrowser>();
|
FormBrowser owner = FormManager.TryFind<FormBrowser>();
|
||||||
|
|
||||||
if (owner != null){
|
if (owner != null){
|
||||||
|
owner.AnalyticsFile.OpenGuide.Trigger();
|
||||||
|
new FormGuide(url, owner).Show(owner);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
guide.Reload(url);
|
||||||
|
guide.Activate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private readonly ChromiumWebBrowser browser;
|
||||||
|
private string nextUrl;
|
||||||
|
|
||||||
|
private FormGuide(string url, FormBrowser owner){
|
||||||
|
InitializeComponent();
|
||||||
|
|
||||||
|
Text = Program.BrandName+" Guide";
|
||||||
Size = new Size(owner.Size.Width*3/4, owner.Size.Height*3/4);
|
Size = new Size(owner.Size.Width*3/4, owner.Size.Height*3/4);
|
||||||
VisibleChanged += (sender, args) => this.MoveToCenter(owner);
|
VisibleChanged += (sender, args) => this.MoveToCenter(owner);
|
||||||
|
|
||||||
owner.TriggerAnalyticsEvent(AnalyticsFile.Event.OpenGuide);
|
this.browser = new ChromiumWebBrowser(url){
|
||||||
}
|
MenuHandler = new ContextMenuGuide(owner),
|
||||||
|
|
||||||
this.browser = new ChromiumWebBrowser(GuideUrl){
|
|
||||||
MenuHandler = new ContextMenuGuide(),
|
|
||||||
JsDialogHandler = new JavaScriptDialogHandler(),
|
JsDialogHandler = new JavaScriptDialogHandler(),
|
||||||
LifeSpanHandler = new LifeSpanHandler(),
|
LifeSpanHandler = new LifeSpanHandler(),
|
||||||
RequestHandler = new RequestHandlerBrowser()
|
RequestHandler = new RequestHandlerBase(true)
|
||||||
};
|
};
|
||||||
|
|
||||||
browser.LoadingStateChanged += browser_LoadingStateChanged;
|
browser.LoadingStateChanged += browser_LoadingStateChanged;
|
||||||
browser.FrameLoadStart += browser_FrameLoadStart;
|
browser.FrameLoadStart += browser_FrameLoadStart;
|
||||||
|
browser.FrameLoadEnd += browser_FrameLoadEnd;
|
||||||
|
|
||||||
browser.BrowserSettings.BackgroundColor = (uint)BackColor.ToArgb();
|
browser.BrowserSettings.BackgroundColor = (uint)BackColor.ToArgb();
|
||||||
browser.Dock = DockStyle.None;
|
browser.Dock = DockStyle.None;
|
||||||
browser.Location = ControlExtensions.InvisibleLocation;
|
browser.Location = ControlExtensions.InvisibleLocation;
|
||||||
|
|
||||||
|
browser.SetupResourceHandler(DummyPage);
|
||||||
|
|
||||||
Controls.Add(browser);
|
Controls.Add(browser);
|
||||||
|
|
||||||
Disposed += (sender, args) => {
|
Disposed += (sender, args) => {
|
||||||
@@ -52,8 +92,20 @@ namespace TweetDuck.Core.Other{
|
|||||||
Program.UserConfig.ZoomLevelChanged += Config_ZoomLevelChanged;
|
Program.UserConfig.ZoomLevelChanged += Config_ZoomLevelChanged;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void Reload(string url){
|
||||||
|
nextUrl = url;
|
||||||
|
browser.LoadingStateChanged += browser_LoadingStateChanged;
|
||||||
|
browser.Dock = DockStyle.None;
|
||||||
|
browser.Location = ControlExtensions.InvisibleLocation;
|
||||||
|
browser.Load(DummyPage.Url);
|
||||||
|
}
|
||||||
|
|
||||||
private void browser_LoadingStateChanged(object sender, LoadingStateChangedEventArgs e){
|
private void browser_LoadingStateChanged(object sender, LoadingStateChangedEventArgs e){
|
||||||
if (!e.IsLoading){
|
if (!e.IsLoading){
|
||||||
|
if (browser.Address == DummyPage.Url){
|
||||||
|
browser.Load(nextUrl);
|
||||||
|
}
|
||||||
|
else{
|
||||||
this.InvokeAsyncSafe(() => {
|
this.InvokeAsyncSafe(() => {
|
||||||
browser.Location = Point.Empty;
|
browser.Location = Point.Empty;
|
||||||
browser.Dock = DockStyle.Fill;
|
browser.Dock = DockStyle.Fill;
|
||||||
@@ -62,11 +114,16 @@ namespace TweetDuck.Core.Other{
|
|||||||
browser.LoadingStateChanged -= browser_LoadingStateChanged;
|
browser.LoadingStateChanged -= browser_LoadingStateChanged;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void browser_FrameLoadStart(object sender, FrameLoadStartEventArgs e){
|
private void browser_FrameLoadStart(object sender, FrameLoadStartEventArgs e){
|
||||||
BrowserUtils.SetZoomLevel(browser.GetBrowser(), Program.UserConfig.ZoomLevel);
|
BrowserUtils.SetZoomLevel(browser.GetBrowser(), Program.UserConfig.ZoomLevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void browser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e){
|
||||||
|
ScriptLoader.ExecuteScript(e.Frame, "Array.prototype.forEach.call(document.getElementsByTagName('A'), ele => ele.addEventListener('click', e => { e.preventDefault(); window.open(ele.getAttribute('href')); }))", "gen:links");
|
||||||
|
}
|
||||||
|
|
||||||
private void Config_ZoomLevelChanged(object sender, EventArgs e){
|
private void Config_ZoomLevelChanged(object sender, EventArgs e){
|
||||||
BrowserUtils.SetZoomLevel(browser.GetBrowser(), Program.UserConfig.ZoomLevel);
|
BrowserUtils.SetZoomLevel(browser.GetBrowser(), Program.UserConfig.ZoomLevel);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -133,7 +133,7 @@ namespace TweetDuck.Core.Other{
|
|||||||
Font = SystemFonts.MessageBoxFont,
|
Font = SystemFonts.MessageBoxFont,
|
||||||
Location = new Point(0, 12),
|
Location = new Point(0, 12),
|
||||||
Size = new Size(BrowserUtils.Scale(88, dpiScale), BrowserUtils.Scale(26, dpiScale)),
|
Size = new Size(BrowserUtils.Scale(88, dpiScale), BrowserUtils.Scale(26, dpiScale)),
|
||||||
TabIndex = buttonCount,
|
TabIndex = 256-buttonCount,
|
||||||
Text = title,
|
Text = title,
|
||||||
UseVisualStyleBackColor = true
|
UseVisualStyleBackColor = true
|
||||||
};
|
};
|
||||||
|
|||||||
37
Core/Other/FormPlugins.Designer.cs
generated
37
Core/Other/FormPlugins.Designer.cs
generated
@@ -23,20 +23,23 @@
|
|||||||
/// the contents of this method with the code editor.
|
/// the contents of this method with the code editor.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void InitializeComponent() {
|
private void InitializeComponent() {
|
||||||
|
this.components = new System.ComponentModel.Container();
|
||||||
this.btnClose = new System.Windows.Forms.Button();
|
this.btnClose = new System.Windows.Forms.Button();
|
||||||
this.btnReload = new System.Windows.Forms.Button();
|
this.btnReload = new System.Windows.Forms.Button();
|
||||||
this.btnOpenFolder = new System.Windows.Forms.Button();
|
this.btnOpenFolder = new System.Windows.Forms.Button();
|
||||||
this.flowLayoutPlugins = new TweetDuck.Plugins.Controls.PluginListFlowLayout();
|
this.flowLayoutPlugins = new TweetDuck.Plugins.Controls.PluginListFlowLayout();
|
||||||
|
this.timerLayout = new System.Windows.Forms.Timer(this.components);
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
//
|
//
|
||||||
// btnClose
|
// btnClose
|
||||||
//
|
//
|
||||||
this.btnClose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
this.btnClose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||||
this.btnClose.AutoSize = true;
|
this.btnClose.AutoSize = true;
|
||||||
this.btnClose.Location = new System.Drawing.Point(643, 439);
|
this.btnClose.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.btnClose.Location = new System.Drawing.Point(642, 433);
|
||||||
this.btnClose.Name = "btnClose";
|
this.btnClose.Name = "btnClose";
|
||||||
this.btnClose.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
this.btnClose.Padding = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||||
this.btnClose.Size = new System.Drawing.Size(49, 23);
|
this.btnClose.Size = new System.Drawing.Size(50, 25);
|
||||||
this.btnClose.TabIndex = 1;
|
this.btnClose.TabIndex = 1;
|
||||||
this.btnClose.Text = "Close";
|
this.btnClose.Text = "Close";
|
||||||
this.btnClose.UseVisualStyleBackColor = true;
|
this.btnClose.UseVisualStyleBackColor = true;
|
||||||
@@ -46,10 +49,11 @@
|
|||||||
//
|
//
|
||||||
this.btnReload.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
|
this.btnReload.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
|
||||||
this.btnReload.AutoSize = true;
|
this.btnReload.AutoSize = true;
|
||||||
this.btnReload.Location = new System.Drawing.Point(131, 439);
|
this.btnReload.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.btnReload.Location = new System.Drawing.Point(141, 433);
|
||||||
this.btnReload.Name = "btnReload";
|
this.btnReload.Name = "btnReload";
|
||||||
this.btnReload.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
this.btnReload.Padding = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||||
this.btnReload.Size = new System.Drawing.Size(71, 23);
|
this.btnReload.Size = new System.Drawing.Size(74, 25);
|
||||||
this.btnReload.TabIndex = 2;
|
this.btnReload.TabIndex = 2;
|
||||||
this.btnReload.Text = "Reload All";
|
this.btnReload.Text = "Reload All";
|
||||||
this.btnReload.UseVisualStyleBackColor = true;
|
this.btnReload.UseVisualStyleBackColor = true;
|
||||||
@@ -59,10 +63,11 @@
|
|||||||
//
|
//
|
||||||
this.btnOpenFolder.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
|
this.btnOpenFolder.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
|
||||||
this.btnOpenFolder.AutoSize = true;
|
this.btnOpenFolder.AutoSize = true;
|
||||||
this.btnOpenFolder.Location = new System.Drawing.Point(12, 439);
|
this.btnOpenFolder.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.btnOpenFolder.Location = new System.Drawing.Point(12, 433);
|
||||||
this.btnOpenFolder.Name = "btnOpenFolder";
|
this.btnOpenFolder.Name = "btnOpenFolder";
|
||||||
this.btnOpenFolder.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
this.btnOpenFolder.Padding = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||||
this.btnOpenFolder.Size = new System.Drawing.Size(113, 23);
|
this.btnOpenFolder.Size = new System.Drawing.Size(123, 25);
|
||||||
this.btnOpenFolder.TabIndex = 3;
|
this.btnOpenFolder.TabIndex = 3;
|
||||||
this.btnOpenFolder.Text = "Open Plugin Folder";
|
this.btnOpenFolder.Text = "Open Plugin Folder";
|
||||||
this.btnOpenFolder.UseVisualStyleBackColor = true;
|
this.btnOpenFolder.UseVisualStyleBackColor = true;
|
||||||
@@ -77,22 +82,29 @@
|
|||||||
this.flowLayoutPlugins.FlowDirection = System.Windows.Forms.FlowDirection.TopDown;
|
this.flowLayoutPlugins.FlowDirection = System.Windows.Forms.FlowDirection.TopDown;
|
||||||
this.flowLayoutPlugins.Location = new System.Drawing.Point(12, 12);
|
this.flowLayoutPlugins.Location = new System.Drawing.Point(12, 12);
|
||||||
this.flowLayoutPlugins.Name = "flowLayoutPlugins";
|
this.flowLayoutPlugins.Name = "flowLayoutPlugins";
|
||||||
this.flowLayoutPlugins.Size = new System.Drawing.Size(680, 421);
|
this.flowLayoutPlugins.Size = new System.Drawing.Size(680, 415);
|
||||||
this.flowLayoutPlugins.TabIndex = 0;
|
this.flowLayoutPlugins.TabIndex = 0;
|
||||||
this.flowLayoutPlugins.WrapContents = false;
|
this.flowLayoutPlugins.WrapContents = false;
|
||||||
this.flowLayoutPlugins.Resize += new System.EventHandler(this.flowLayoutPlugins_Resize);
|
this.flowLayoutPlugins.Resize += new System.EventHandler(this.flowLayoutPlugins_Resize);
|
||||||
//
|
//
|
||||||
|
// timerLayout
|
||||||
|
//
|
||||||
|
this.timerLayout.Interval = 99;
|
||||||
|
this.timerLayout.Tick += new System.EventHandler(this.timerLayout_Tick);
|
||||||
|
//
|
||||||
// FormPlugins
|
// FormPlugins
|
||||||
//
|
//
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
this.ClientSize = new System.Drawing.Size(704, 474);
|
this.ClientSize = new System.Drawing.Size(704, 470);
|
||||||
this.Controls.Add(this.flowLayoutPlugins);
|
this.Controls.Add(this.flowLayoutPlugins);
|
||||||
this.Controls.Add(this.btnOpenFolder);
|
this.Controls.Add(this.btnOpenFolder);
|
||||||
this.Controls.Add(this.btnReload);
|
this.Controls.Add(this.btnReload);
|
||||||
this.Controls.Add(this.btnClose);
|
this.Controls.Add(this.btnClose);
|
||||||
this.Icon = global::TweetDuck.Properties.Resources.icon;
|
this.Icon = global::TweetDuck.Properties.Resources.icon;
|
||||||
this.MinimumSize = new System.Drawing.Size(480, 320);
|
this.MaximizeBox = false;
|
||||||
|
this.MinimizeBox = false;
|
||||||
|
this.MinimumSize = new System.Drawing.Size(640, 360);
|
||||||
this.Name = "FormPlugins";
|
this.Name = "FormPlugins";
|
||||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
|
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
|
||||||
this.ResumeLayout(false);
|
this.ResumeLayout(false);
|
||||||
@@ -106,5 +118,6 @@
|
|||||||
private System.Windows.Forms.Button btnReload;
|
private System.Windows.Forms.Button btnReload;
|
||||||
private System.Windows.Forms.Button btnOpenFolder;
|
private System.Windows.Forms.Button btnOpenFolder;
|
||||||
private Plugins.Controls.PluginListFlowLayout flowLayoutPlugins;
|
private Plugins.Controls.PluginListFlowLayout flowLayoutPlugins;
|
||||||
|
private System.Windows.Forms.Timer timerLayout;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -19,15 +19,23 @@ namespace TweetDuck.Core.Other{
|
|||||||
public FormPlugins(PluginManager pluginManager) : this(){
|
public FormPlugins(PluginManager pluginManager) : this(){
|
||||||
this.pluginManager = pluginManager;
|
this.pluginManager = pluginManager;
|
||||||
|
|
||||||
|
if (!Program.UserConfig.PluginsWindowSize.IsEmpty){
|
||||||
|
Size targetSize = Program.UserConfig.PluginsWindowSize;
|
||||||
|
Size = new Size(Math.Max(MinimumSize.Width, targetSize.Width), Math.Max(MinimumSize.Height, targetSize.Height));
|
||||||
|
}
|
||||||
|
|
||||||
Shown += (sender, args) => {
|
Shown += (sender, args) => {
|
||||||
Program.UserConfig.PluginsWindow.Restore(this, false);
|
|
||||||
ReloadPluginList();
|
ReloadPluginList();
|
||||||
};
|
};
|
||||||
|
|
||||||
FormClosed += (sender, args) => {
|
FormClosed += (sender, args) => {
|
||||||
Program.UserConfig.PluginsWindow.Save(this);
|
Program.UserConfig.PluginsWindowSize = Size;
|
||||||
Program.UserConfig.Save();
|
Program.UserConfig.Save();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
ResizeEnd += (sender, args) => {
|
||||||
|
timerLayout.Start();
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private int GetPluginOrderIndex(Plugin plugin){
|
private int GetPluginOrderIndex(Plugin plugin){
|
||||||
@@ -50,18 +58,26 @@ namespace TweetDuck.Core.Other{
|
|||||||
|
|
||||||
flowLayoutPlugins.ResumeLayout(true);
|
flowLayoutPlugins.ResumeLayout(true);
|
||||||
|
|
||||||
// sorry, I guess...
|
timerLayout_Tick(null, EventArgs.Empty);
|
||||||
Padding = new Padding(Padding.Left, Padding.Top, Padding.Right+1, Padding.Bottom);
|
timerLayout.Start();
|
||||||
Padding = new Padding(Padding.Left, Padding.Top, Padding.Right-1, Padding.Bottom);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void flowLayoutPlugins_Resize(object sender, EventArgs e){
|
private void timerLayout_Tick(object sender, EventArgs e){
|
||||||
if (flowLayoutPlugins.Controls.Count == 0){
|
timerLayout.Stop();
|
||||||
|
|
||||||
|
// stupid WinForms scrollbars and panels
|
||||||
|
Padding = new Padding(Padding.Left, Padding.Top, Padding.Right+1, Padding.Bottom+1);
|
||||||
|
Padding = new Padding(Padding.Left, Padding.Top, Padding.Right-1, Padding.Bottom-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void flowLayoutPlugins_Resize(object sender, EventArgs e){
|
||||||
|
Control lastPlugin = flowLayoutPlugins.Controls.OfType<PluginControl>().LastOrDefault();
|
||||||
|
|
||||||
|
if (lastPlugin == null){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Control lastControl = flowLayoutPlugins.Controls[flowLayoutPlugins.Controls.Count-1];
|
bool showScrollBar = lastPlugin.Location.Y+lastPlugin.Height+1 >= flowLayoutPlugins.Height;
|
||||||
bool showScrollBar = lastControl.Location.Y+lastControl.Height >= flowLayoutPlugins.Height;
|
|
||||||
int horizontalOffset = showScrollBar ? SystemInformation.VerticalScrollBarWidth : 0;
|
int horizontalOffset = showScrollBar ? SystemInformation.VerticalScrollBarWidth : 0;
|
||||||
|
|
||||||
flowLayoutPlugins.AutoScroll = showScrollBar;
|
flowLayoutPlugins.AutoScroll = showScrollBar;
|
||||||
@@ -71,12 +87,12 @@ namespace TweetDuck.Core.Other{
|
|||||||
control.Width = flowLayoutPlugins.Width-control.Margin.Horizontal-horizontalOffset;
|
control.Width = flowLayoutPlugins.Width-control.Margin.Horizontal-horizontalOffset;
|
||||||
}
|
}
|
||||||
|
|
||||||
lastControl.Visible = !showScrollBar;
|
flowLayoutPlugins.Controls[flowLayoutPlugins.Controls.Count-1].Visible = !showScrollBar;
|
||||||
flowLayoutPlugins.Focus();
|
flowLayoutPlugins.Focus();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnOpenFolder_Click(object sender, EventArgs e){
|
private void btnOpenFolder_Click(object sender, EventArgs e){
|
||||||
using(Process.Start("explorer.exe", "\""+pluginManager.PathCustomPlugins+"\"")){}
|
using(Process.Start("explorer.exe", '"'+pluginManager.PathCustomPlugins+'"')){}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnReload_Click(object sender, EventArgs e){
|
private void btnReload_Click(object sender, EventArgs e){
|
||||||
|
|||||||
20
Core/Other/FormSettings.Designer.cs
generated
20
Core/Other/FormSettings.Designer.cs
generated
@@ -33,10 +33,11 @@
|
|||||||
//
|
//
|
||||||
this.btnClose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
this.btnClose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||||
this.btnClose.AutoSize = true;
|
this.btnClose.AutoSize = true;
|
||||||
this.btnClose.Location = new System.Drawing.Point(449, 447);
|
this.btnClose.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.btnClose.Location = new System.Drawing.Point(448, 525);
|
||||||
this.btnClose.Name = "btnClose";
|
this.btnClose.Name = "btnClose";
|
||||||
this.btnClose.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
this.btnClose.Padding = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||||
this.btnClose.Size = new System.Drawing.Size(49, 23);
|
this.btnClose.Size = new System.Drawing.Size(50, 25);
|
||||||
this.btnClose.TabIndex = 3;
|
this.btnClose.TabIndex = 3;
|
||||||
this.btnClose.Text = "Close";
|
this.btnClose.Text = "Close";
|
||||||
this.btnClose.UseVisualStyleBackColor = true;
|
this.btnClose.UseVisualStyleBackColor = true;
|
||||||
@@ -52,7 +53,7 @@
|
|||||||
this.panelContents.Location = new System.Drawing.Point(135, 12);
|
this.panelContents.Location = new System.Drawing.Point(135, 12);
|
||||||
this.panelContents.Margin = new System.Windows.Forms.Padding(0, 3, 3, 3);
|
this.panelContents.Margin = new System.Windows.Forms.Padding(0, 3, 3, 3);
|
||||||
this.panelContents.Name = "panelContents";
|
this.panelContents.Name = "panelContents";
|
||||||
this.panelContents.Size = new System.Drawing.Size(363, 429);
|
this.panelContents.Size = new System.Drawing.Size(363, 507);
|
||||||
this.panelContents.TabIndex = 1;
|
this.panelContents.TabIndex = 1;
|
||||||
//
|
//
|
||||||
// panelButtons
|
// panelButtons
|
||||||
@@ -63,17 +64,18 @@
|
|||||||
this.panelButtons.Location = new System.Drawing.Point(12, 12);
|
this.panelButtons.Location = new System.Drawing.Point(12, 12);
|
||||||
this.panelButtons.Margin = new System.Windows.Forms.Padding(3, 3, 0, 3);
|
this.panelButtons.Margin = new System.Windows.Forms.Padding(3, 3, 0, 3);
|
||||||
this.panelButtons.Name = "panelButtons";
|
this.panelButtons.Name = "panelButtons";
|
||||||
this.panelButtons.Size = new System.Drawing.Size(124, 429);
|
this.panelButtons.Size = new System.Drawing.Size(124, 507);
|
||||||
this.panelButtons.TabIndex = 0;
|
this.panelButtons.TabIndex = 0;
|
||||||
//
|
//
|
||||||
// btnManageOptions
|
// btnManageOptions
|
||||||
//
|
//
|
||||||
this.btnManageOptions.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
|
this.btnManageOptions.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
|
||||||
this.btnManageOptions.AutoSize = true;
|
this.btnManageOptions.AutoSize = true;
|
||||||
this.btnManageOptions.Location = new System.Drawing.Point(12, 447);
|
this.btnManageOptions.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.btnManageOptions.Location = new System.Drawing.Point(12, 525);
|
||||||
this.btnManageOptions.Name = "btnManageOptions";
|
this.btnManageOptions.Name = "btnManageOptions";
|
||||||
this.btnManageOptions.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
this.btnManageOptions.Padding = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||||
this.btnManageOptions.Size = new System.Drawing.Size(101, 23);
|
this.btnManageOptions.Size = new System.Drawing.Size(109, 25);
|
||||||
this.btnManageOptions.TabIndex = 4;
|
this.btnManageOptions.TabIndex = 4;
|
||||||
this.btnManageOptions.Text = "Manage Options";
|
this.btnManageOptions.Text = "Manage Options";
|
||||||
this.btnManageOptions.UseVisualStyleBackColor = true;
|
this.btnManageOptions.UseVisualStyleBackColor = true;
|
||||||
@@ -83,7 +85,7 @@
|
|||||||
//
|
//
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
this.ClientSize = new System.Drawing.Size(510, 482);
|
this.ClientSize = new System.Drawing.Size(510, 562);
|
||||||
this.Controls.Add(this.btnManageOptions);
|
this.Controls.Add(this.btnManageOptions);
|
||||||
this.Controls.Add(this.panelContents);
|
this.Controls.Add(this.panelContents);
|
||||||
this.Controls.Add(this.panelButtons);
|
this.Controls.Add(this.panelButtons);
|
||||||
|
|||||||
@@ -36,10 +36,11 @@ namespace TweetDuck.Core.Other{
|
|||||||
|
|
||||||
this.buttonHeight = BrowserUtils.Scale(39, this.GetDPIScale()) | 1;
|
this.buttonHeight = BrowserUtils.Scale(39, this.GetDPIScale()) | 1;
|
||||||
|
|
||||||
AddButton("General", () => new TabSettingsGeneral(this.browser, updates));
|
AddButton("General", () => new TabSettingsGeneral(this.browser.ReloadColumns, updates));
|
||||||
|
AddButton("Locales", () => new TabSettingsLocales());
|
||||||
AddButton("System Tray", () => new TabSettingsTray());
|
AddButton("System Tray", () => new TabSettingsTray());
|
||||||
AddButton("Notifications", () => new TabSettingsNotifications(new FormNotificationExample(this.browser, this.plugins)));
|
AddButton("Notifications", () => new TabSettingsNotifications(new FormNotificationExample(this.browser, this.plugins)));
|
||||||
AddButton("Sounds", () => new TabSettingsSounds());
|
AddButton("Sounds", () => new TabSettingsSounds(this.browser.PlaySoundNotification));
|
||||||
AddButton("Feedback", () => new TabSettingsFeedback(analytics, AnalyticsReportGenerator.ExternalInfo.From(this.browser), this.plugins));
|
AddButton("Feedback", () => new TabSettingsFeedback(analytics, AnalyticsReportGenerator.ExternalInfo.From(this.browser), this.plugins));
|
||||||
AddButton("Advanced", () => new TabSettingsAdvanced(this.browser.ReinjectCustomCSS));
|
AddButton("Advanced", () => new TabSettingsAdvanced(this.browser.ReinjectCustomCSS));
|
||||||
|
|
||||||
@@ -66,10 +67,13 @@ namespace TweetDuck.Core.Other{
|
|||||||
FormClosing -= FormSettings_FormClosing;
|
FormClosing -= FormSettings_FormClosing;
|
||||||
|
|
||||||
if (dialog.ShowDialog() == DialogResult.OK){
|
if (dialog.ShowDialog() == DialogResult.OK){
|
||||||
|
if (!dialog.IsRestarting){
|
||||||
browser.ResumeNotification();
|
browser.ResumeNotification();
|
||||||
|
|
||||||
BrowserProcessHandler.UpdatePrefs();
|
BrowserProcessHandler.UpdatePrefs();
|
||||||
ShouldReloadBrowser = dialog.ShouldReloadBrowser;
|
ShouldReloadBrowser = dialog.ShouldReloadBrowser;
|
||||||
|
}
|
||||||
|
|
||||||
Close();
|
Close();
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@@ -86,6 +90,7 @@ namespace TweetDuck.Core.Other{
|
|||||||
FlatButton btn = new FlatButton{
|
FlatButton btn = new FlatButton{
|
||||||
BackColor = SystemColors.Control,
|
BackColor = SystemColors.Control,
|
||||||
FlatStyle = FlatStyle.Flat,
|
FlatStyle = FlatStyle.Flat,
|
||||||
|
Font = SystemFonts.MessageBoxFont,
|
||||||
Location = new Point(0, (buttonHeight+1)*(panelButtons.Controls.Count/2)),
|
Location = new Point(0, (buttonHeight+1)*(panelButtons.Controls.Count/2)),
|
||||||
Margin = new Padding(0),
|
Margin = new Padding(0),
|
||||||
Size = new Size(panelButtons.Width, buttonHeight),
|
Size = new Size(panelButtons.Width, buttonHeight),
|
||||||
@@ -152,6 +157,10 @@ namespace TweetDuck.Core.Other{
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void control_MouseLeave(object sender, EventArgs e){
|
private void control_MouseLeave(object sender, EventArgs e){
|
||||||
|
if (sender is ComboBox cb && cb.DroppedDown){
|
||||||
|
return; // prevents comboboxes from closing when MouseLeave event triggers during opening animation
|
||||||
|
}
|
||||||
|
|
||||||
panelContents.Focus();
|
panelContents.Focus();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
12
Core/Other/Interfaces/ITweetDeckBrowser.cs
Normal file
12
Core/Other/Interfaces/ITweetDeckBrowser.cs
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
using System;
|
||||||
|
using CefSharp;
|
||||||
|
|
||||||
|
namespace TweetDuck.Core.Other.Interfaces{
|
||||||
|
interface ITweetDeckBrowser{
|
||||||
|
bool IsTweetDeckWebsite { get; }
|
||||||
|
|
||||||
|
void RegisterBridge(string name, object obj);
|
||||||
|
void OnFrameLoaded(Action<IFrame> callback);
|
||||||
|
void ExecuteFunction(string name, params object[] args);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
using System.Collections.Generic;
|
|
||||||
using System.Diagnostics;
|
|
||||||
using CefSharp;
|
|
||||||
using TweetDuck.Core.Utils;
|
|
||||||
|
|
||||||
namespace TweetDuck.Core.Other.Management{
|
|
||||||
static class BrowserProcesses{
|
|
||||||
private static readonly Dictionary<int, int> PIDs = new Dictionary<int, int>();
|
|
||||||
|
|
||||||
public static void Link(int identifier, int pid){
|
|
||||||
PIDs[identifier] = pid;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void Forget(int identifier){
|
|
||||||
PIDs.Remove(identifier);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Process FindProcess(IBrowser browser){
|
|
||||||
if (PIDs.TryGetValue(browser.Identifier, out int pid) && WindowsUtils.IsChildProcess(pid)){ // child process is checked in two places for safety
|
|
||||||
return Process.GetProcessById(pid);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,93 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Diagnostics;
|
|
||||||
using System.Timers;
|
|
||||||
using CefSharp;
|
|
||||||
using CefSharp.WinForms;
|
|
||||||
using TweetDuck.Core.Controls;
|
|
||||||
using Timer = System.Timers.Timer;
|
|
||||||
|
|
||||||
namespace TweetDuck.Core.Other.Management{
|
|
||||||
sealed class MemoryUsageTracker : IDisposable{
|
|
||||||
private const int IntervalMemoryCheck = 60000*30; // 30 minutes
|
|
||||||
private const int IntervalCleanupAttempt = 60000*5; // 5 minutes
|
|
||||||
|
|
||||||
private readonly string script;
|
|
||||||
private readonly Timer timer;
|
|
||||||
private FormBrowser owner;
|
|
||||||
private IBrowser browser;
|
|
||||||
|
|
||||||
private long threshold;
|
|
||||||
private bool needsCleanup;
|
|
||||||
|
|
||||||
public MemoryUsageTracker(string cleanupFunctionName){
|
|
||||||
this.script = $"window.{cleanupFunctionName} && window.{cleanupFunctionName}()";
|
|
||||||
|
|
||||||
this.timer = new Timer{ Interval = IntervalMemoryCheck };
|
|
||||||
this.timer.Elapsed += timer_Elapsed;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Start(ChromiumWebBrowser control, int thresholdMB){
|
|
||||||
Stop();
|
|
||||||
|
|
||||||
this.owner = (FormBrowser)control.Parent; // TODO ugly
|
|
||||||
this.browser = control.GetBrowser();
|
|
||||||
this.threshold = thresholdMB*1024L*1024L;
|
|
||||||
this.timer.SynchronizingObject = owner;
|
|
||||||
this.timer.Start();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Stop(){
|
|
||||||
timer.Stop();
|
|
||||||
timer.SynchronizingObject = null;
|
|
||||||
owner = null;
|
|
||||||
browser = null;
|
|
||||||
SetNeedsCleanup(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Dispose(){
|
|
||||||
timer.SynchronizingObject = null;
|
|
||||||
timer.Dispose();
|
|
||||||
owner = null;
|
|
||||||
browser = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void SetNeedsCleanup(bool value){
|
|
||||||
if (needsCleanup != value){
|
|
||||||
needsCleanup = value;
|
|
||||||
timer.Interval = value ? IntervalCleanupAttempt : IntervalMemoryCheck; // restarts timer
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void timer_Elapsed(object sender, ElapsedEventArgs e){
|
|
||||||
if (owner == null || browser == null){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (needsCleanup){
|
|
||||||
if (!owner.ContainsFocus){
|
|
||||||
using(IFrame frame = browser.MainFrame){
|
|
||||||
frame.EvaluateScriptAsync(script).ContinueWith(task => {
|
|
||||||
JavascriptResponse response = task.Result;
|
|
||||||
|
|
||||||
if (response.Success && (response.Result as bool? ?? false)){
|
|
||||||
SetNeedsCleanup(false);
|
|
||||||
owner.InvokeAsyncSafe(() => owner.TriggerAnalyticsEvent(Analytics.AnalyticsFile.Event.GCReload));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
try{
|
|
||||||
using(Process process = BrowserProcesses.FindProcess(browser)){
|
|
||||||
if (process?.PrivateMemorySize64 > threshold){
|
|
||||||
SetNeedsCleanup(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}catch{
|
|
||||||
// ignore I guess?
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using TweetDuck.Configuration;
|
using TweetDuck.Configuration;
|
||||||
|
|
||||||
@@ -9,12 +8,21 @@ namespace TweetDuck.Core.Other.Settings{
|
|||||||
|
|
||||||
public IEnumerable<Control> InteractiveControls{
|
public IEnumerable<Control> InteractiveControls{
|
||||||
get{
|
get{
|
||||||
foreach(Panel panel in Controls.OfType<Panel>()){
|
IEnumerable<Control> FindInteractiveControls(Control parent){
|
||||||
foreach(Control control in panel.Controls){
|
foreach(Control control in parent.Controls){
|
||||||
|
if (control is Panel subPanel){
|
||||||
|
foreach(Control subControl in FindInteractiveControls(subPanel)){
|
||||||
|
yield return subControl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
yield return control;
|
yield return control;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return FindInteractiveControls(this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected BaseTabSettings(){
|
protected BaseTabSettings(){
|
||||||
|
|||||||
@@ -34,21 +34,23 @@
|
|||||||
| System.Windows.Forms.AnchorStyles.Left)
|
| System.Windows.Forms.AnchorStyles.Left)
|
||||||
| System.Windows.Forms.AnchorStyles.Right)));
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
this.textBoxReport.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
this.textBoxReport.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.textBoxReport.Location = new System.Drawing.Point(12, 41);
|
this.textBoxReport.Location = new System.Drawing.Point(12, 45);
|
||||||
this.textBoxReport.Multiline = true;
|
this.textBoxReport.Multiline = true;
|
||||||
this.textBoxReport.Name = "textBoxReport";
|
this.textBoxReport.Name = "textBoxReport";
|
||||||
this.textBoxReport.ReadOnly = true;
|
this.textBoxReport.ReadOnly = true;
|
||||||
this.textBoxReport.ScrollBars = System.Windows.Forms.ScrollBars.Both;
|
this.textBoxReport.ScrollBars = System.Windows.Forms.ScrollBars.Both;
|
||||||
this.textBoxReport.Size = new System.Drawing.Size(460, 480);
|
this.textBoxReport.Size = new System.Drawing.Size(435, 474);
|
||||||
this.textBoxReport.TabIndex = 1;
|
this.textBoxReport.TabIndex = 1;
|
||||||
//
|
//
|
||||||
// btnClose
|
// btnClose
|
||||||
//
|
//
|
||||||
this.btnClose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
this.btnClose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||||
this.btnClose.Location = new System.Drawing.Point(416, 527);
|
this.btnClose.AutoSize = true;
|
||||||
|
this.btnClose.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.btnClose.Location = new System.Drawing.Point(397, 525);
|
||||||
this.btnClose.Name = "btnClose";
|
this.btnClose.Name = "btnClose";
|
||||||
this.btnClose.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
this.btnClose.Padding = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||||
this.btnClose.Size = new System.Drawing.Size(56, 23);
|
this.btnClose.Size = new System.Drawing.Size(50, 25);
|
||||||
this.btnClose.TabIndex = 2;
|
this.btnClose.TabIndex = 2;
|
||||||
this.btnClose.Text = "Close";
|
this.btnClose.Text = "Close";
|
||||||
this.btnClose.UseVisualStyleBackColor = true;
|
this.btnClose.UseVisualStyleBackColor = true;
|
||||||
@@ -56,23 +58,25 @@
|
|||||||
//
|
//
|
||||||
// labelInfo
|
// labelInfo
|
||||||
//
|
//
|
||||||
|
this.labelInfo.AutoSize = true;
|
||||||
|
this.labelInfo.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.labelInfo.Location = new System.Drawing.Point(12, 9);
|
this.labelInfo.Location = new System.Drawing.Point(12, 9);
|
||||||
this.labelInfo.Margin = new System.Windows.Forms.Padding(3, 0, 3, 3);
|
this.labelInfo.Margin = new System.Windows.Forms.Padding(3, 0, 3, 3);
|
||||||
this.labelInfo.Name = "labelInfo";
|
this.labelInfo.Name = "labelInfo";
|
||||||
this.labelInfo.Size = new System.Drawing.Size(460, 26);
|
this.labelInfo.Size = new System.Drawing.Size(434, 30);
|
||||||
this.labelInfo.TabIndex = 0;
|
this.labelInfo.TabIndex = 0;
|
||||||
this.labelInfo.Text = "When enabled, this data will be sent over a secure network roughly once every wee" +
|
this.labelInfo.Text = "When enabled, this data will be sent over a secure network roughly every 14 days." +
|
||||||
"k.\r\nSome numbers in the report were made imprecise on purpose.";
|
"\r\nSome numbers in the report were made imprecise on purpose.";
|
||||||
//
|
//
|
||||||
// DialogSettingsAnalytics
|
// DialogSettingsAnalytics
|
||||||
//
|
//
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
this.ClientSize = new System.Drawing.Size(484, 562);
|
this.ClientSize = new System.Drawing.Size(459, 562);
|
||||||
this.Controls.Add(this.labelInfo);
|
this.Controls.Add(this.labelInfo);
|
||||||
this.Controls.Add(this.btnClose);
|
this.Controls.Add(this.btnClose);
|
||||||
this.Controls.Add(this.textBoxReport);
|
this.Controls.Add(this.textBoxReport);
|
||||||
this.MinimumSize = new System.Drawing.Size(450, 340);
|
this.MinimumSize = new System.Drawing.Size(475, 340);
|
||||||
this.Name = "DialogSettingsAnalytics";
|
this.Name = "DialogSettingsAnalytics";
|
||||||
this.ShowIcon = false;
|
this.ShowIcon = false;
|
||||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
|
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
|
||||||
|
|||||||
@@ -42,14 +42,16 @@
|
|||||||
//
|
//
|
||||||
// textBoxBrowserCSS
|
// textBoxBrowserCSS
|
||||||
//
|
//
|
||||||
this.textBoxBrowserCSS.Dock = System.Windows.Forms.DockStyle.Bottom;
|
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.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.Location = new System.Drawing.Point(0, 16);
|
||||||
this.textBoxBrowserCSS.Margin = new System.Windows.Forms.Padding(0, 3, 0, 0);
|
this.textBoxBrowserCSS.Margin = new System.Windows.Forms.Padding(0, 3, 0, 0);
|
||||||
this.textBoxBrowserCSS.Multiline = true;
|
this.textBoxBrowserCSS.Multiline = true;
|
||||||
this.textBoxBrowserCSS.Name = "textBoxBrowserCSS";
|
this.textBoxBrowserCSS.Name = "textBoxBrowserCSS";
|
||||||
this.textBoxBrowserCSS.ScrollBars = System.Windows.Forms.ScrollBars.Both;
|
this.textBoxBrowserCSS.ScrollBars = System.Windows.Forms.ScrollBars.Both;
|
||||||
this.textBoxBrowserCSS.Size = new System.Drawing.Size(378, 253);
|
this.textBoxBrowserCSS.Size = new System.Drawing.Size(378, 251);
|
||||||
this.textBoxBrowserCSS.TabIndex = 1;
|
this.textBoxBrowserCSS.TabIndex = 1;
|
||||||
this.textBoxBrowserCSS.WordWrap = false;
|
this.textBoxBrowserCSS.WordWrap = false;
|
||||||
this.textBoxBrowserCSS.KeyUp += new System.Windows.Forms.KeyEventHandler(this.textBoxBrowserCSS_KeyUp);
|
this.textBoxBrowserCSS.KeyUp += new System.Windows.Forms.KeyEventHandler(this.textBoxBrowserCSS_KeyUp);
|
||||||
@@ -57,10 +59,12 @@
|
|||||||
// btnCancel
|
// btnCancel
|
||||||
//
|
//
|
||||||
this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||||
this.btnCancel.Location = new System.Drawing.Point(654, 287);
|
this.btnCancel.AutoSize = true;
|
||||||
|
this.btnCancel.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||||
|
this.btnCancel.Location = new System.Drawing.Point(657, 285);
|
||||||
this.btnCancel.Name = "btnCancel";
|
this.btnCancel.Name = "btnCancel";
|
||||||
this.btnCancel.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
this.btnCancel.Padding = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||||
this.btnCancel.Size = new System.Drawing.Size(56, 23);
|
this.btnCancel.Size = new System.Drawing.Size(57, 25);
|
||||||
this.btnCancel.TabIndex = 2;
|
this.btnCancel.TabIndex = 2;
|
||||||
this.btnCancel.Text = "Cancel";
|
this.btnCancel.Text = "Cancel";
|
||||||
this.btnCancel.UseVisualStyleBackColor = true;
|
this.btnCancel.UseVisualStyleBackColor = true;
|
||||||
@@ -69,10 +73,12 @@
|
|||||||
// btnApply
|
// btnApply
|
||||||
//
|
//
|
||||||
this.btnApply.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
this.btnApply.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||||
this.btnApply.Location = new System.Drawing.Point(716, 287);
|
this.btnApply.AutoSize = true;
|
||||||
|
this.btnApply.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||||
|
this.btnApply.Location = new System.Drawing.Point(720, 285);
|
||||||
this.btnApply.Name = "btnApply";
|
this.btnApply.Name = "btnApply";
|
||||||
this.btnApply.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
this.btnApply.Padding = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||||
this.btnApply.Size = new System.Drawing.Size(56, 23);
|
this.btnApply.Size = new System.Drawing.Size(52, 25);
|
||||||
this.btnApply.TabIndex = 1;
|
this.btnApply.TabIndex = 1;
|
||||||
this.btnApply.Text = "Apply";
|
this.btnApply.Text = "Apply";
|
||||||
this.btnApply.UseVisualStyleBackColor = true;
|
this.btnApply.UseVisualStyleBackColor = true;
|
||||||
@@ -97,7 +103,7 @@
|
|||||||
this.splitContainer.Panel2.Controls.Add(this.labelNotification);
|
this.splitContainer.Panel2.Controls.Add(this.labelNotification);
|
||||||
this.splitContainer.Panel2.Controls.Add(this.textBoxNotificationCSS);
|
this.splitContainer.Panel2.Controls.Add(this.textBoxNotificationCSS);
|
||||||
this.splitContainer.Panel2MinSize = 64;
|
this.splitContainer.Panel2MinSize = 64;
|
||||||
this.splitContainer.Size = new System.Drawing.Size(760, 269);
|
this.splitContainer.Size = new System.Drawing.Size(760, 267);
|
||||||
this.splitContainer.SplitterDistance = 378;
|
this.splitContainer.SplitterDistance = 378;
|
||||||
this.splitContainer.SplitterWidth = 5;
|
this.splitContainer.SplitterWidth = 5;
|
||||||
this.splitContainer.TabIndex = 0;
|
this.splitContainer.TabIndex = 0;
|
||||||
@@ -105,33 +111,37 @@
|
|||||||
// labelBrowser
|
// labelBrowser
|
||||||
//
|
//
|
||||||
this.labelBrowser.AutoSize = true;
|
this.labelBrowser.AutoSize = true;
|
||||||
|
this.labelBrowser.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||||
this.labelBrowser.Location = new System.Drawing.Point(-3, 0);
|
this.labelBrowser.Location = new System.Drawing.Point(-3, 0);
|
||||||
this.labelBrowser.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);
|
this.labelBrowser.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);
|
||||||
this.labelBrowser.Name = "labelBrowser";
|
this.labelBrowser.Name = "labelBrowser";
|
||||||
this.labelBrowser.Size = new System.Drawing.Size(45, 13);
|
this.labelBrowser.Size = new System.Drawing.Size(49, 15);
|
||||||
this.labelBrowser.TabIndex = 0;
|
this.labelBrowser.TabIndex = 0;
|
||||||
this.labelBrowser.Text = "Browser";
|
this.labelBrowser.Text = "Browser";
|
||||||
//
|
//
|
||||||
// labelNotification
|
// labelNotification
|
||||||
//
|
//
|
||||||
this.labelNotification.AutoSize = true;
|
this.labelNotification.AutoSize = true;
|
||||||
|
this.labelNotification.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||||
this.labelNotification.Location = new System.Drawing.Point(-3, 0);
|
this.labelNotification.Location = new System.Drawing.Point(-3, 0);
|
||||||
this.labelNotification.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);
|
this.labelNotification.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);
|
||||||
this.labelNotification.Name = "labelNotification";
|
this.labelNotification.Name = "labelNotification";
|
||||||
this.labelNotification.Size = new System.Drawing.Size(60, 13);
|
this.labelNotification.Size = new System.Drawing.Size(70, 15);
|
||||||
this.labelNotification.TabIndex = 0;
|
this.labelNotification.TabIndex = 0;
|
||||||
this.labelNotification.Text = "Notification";
|
this.labelNotification.Text = "Notification";
|
||||||
//
|
//
|
||||||
// textBoxNotificationCSS
|
// textBoxNotificationCSS
|
||||||
//
|
//
|
||||||
this.textBoxNotificationCSS.Dock = System.Windows.Forms.DockStyle.Bottom;
|
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.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.Location = new System.Drawing.Point(0, 16);
|
||||||
this.textBoxNotificationCSS.Margin = new System.Windows.Forms.Padding(0, 3, 0, 0);
|
this.textBoxNotificationCSS.Margin = new System.Windows.Forms.Padding(0, 3, 0, 0);
|
||||||
this.textBoxNotificationCSS.Multiline = true;
|
this.textBoxNotificationCSS.Multiline = true;
|
||||||
this.textBoxNotificationCSS.Name = "textBoxNotificationCSS";
|
this.textBoxNotificationCSS.Name = "textBoxNotificationCSS";
|
||||||
this.textBoxNotificationCSS.ScrollBars = System.Windows.Forms.ScrollBars.Both;
|
this.textBoxNotificationCSS.ScrollBars = System.Windows.Forms.ScrollBars.Both;
|
||||||
this.textBoxNotificationCSS.Size = new System.Drawing.Size(377, 253);
|
this.textBoxNotificationCSS.Size = new System.Drawing.Size(372, 251);
|
||||||
this.textBoxNotificationCSS.TabIndex = 1;
|
this.textBoxNotificationCSS.TabIndex = 1;
|
||||||
this.textBoxNotificationCSS.WordWrap = false;
|
this.textBoxNotificationCSS.WordWrap = false;
|
||||||
//
|
//
|
||||||
@@ -139,19 +149,22 @@
|
|||||||
//
|
//
|
||||||
this.labelWarning.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
|
this.labelWarning.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
|
||||||
this.labelWarning.AutoSize = true;
|
this.labelWarning.AutoSize = true;
|
||||||
this.labelWarning.Location = new System.Drawing.Point(91, 292);
|
this.labelWarning.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.labelWarning.Location = new System.Drawing.Point(94, 290);
|
||||||
this.labelWarning.Name = "labelWarning";
|
this.labelWarning.Name = "labelWarning";
|
||||||
this.labelWarning.Size = new System.Drawing.Size(341, 13);
|
this.labelWarning.Size = new System.Drawing.Size(373, 15);
|
||||||
this.labelWarning.TabIndex = 3;
|
this.labelWarning.TabIndex = 3;
|
||||||
this.labelWarning.Text = "The code is not validated, please make sure there are no syntax errors.";
|
this.labelWarning.Text = "The code is not validated, please make sure there are no syntax errors.";
|
||||||
//
|
//
|
||||||
// btnOpenWiki
|
// btnOpenWiki
|
||||||
//
|
//
|
||||||
this.btnOpenWiki.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
|
this.btnOpenWiki.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
|
||||||
this.btnOpenWiki.Location = new System.Drawing.Point(12, 287);
|
this.btnOpenWiki.AutoSize = true;
|
||||||
|
this.btnOpenWiki.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||||
|
this.btnOpenWiki.Location = new System.Drawing.Point(12, 285);
|
||||||
this.btnOpenWiki.Name = "btnOpenWiki";
|
this.btnOpenWiki.Name = "btnOpenWiki";
|
||||||
this.btnOpenWiki.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
this.btnOpenWiki.Padding = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||||
this.btnOpenWiki.Size = new System.Drawing.Size(73, 23);
|
this.btnOpenWiki.Size = new System.Drawing.Size(76, 25);
|
||||||
this.btnOpenWiki.TabIndex = 4;
|
this.btnOpenWiki.TabIndex = 4;
|
||||||
this.btnOpenWiki.Text = "Open Wiki";
|
this.btnOpenWiki.Text = "Open Wiki";
|
||||||
this.btnOpenWiki.UseVisualStyleBackColor = true;
|
this.btnOpenWiki.UseVisualStyleBackColor = true;
|
||||||
@@ -172,7 +185,7 @@
|
|||||||
this.Controls.Add(this.splitContainer);
|
this.Controls.Add(this.splitContainer);
|
||||||
this.Controls.Add(this.btnApply);
|
this.Controls.Add(this.btnApply);
|
||||||
this.Controls.Add(this.btnCancel);
|
this.Controls.Add(this.btnCancel);
|
||||||
this.MinimumSize = new System.Drawing.Size(600, 160);
|
this.MinimumSize = new System.Drawing.Size(620, 160);
|
||||||
this.Name = "DialogSettingsCSS";
|
this.Name = "DialogSettingsCSS";
|
||||||
this.ShowIcon = false;
|
this.ShowIcon = false;
|
||||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
|
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ namespace TweetDuck.Core.Other.Settings.Dialogs{
|
|||||||
|
|
||||||
private readonly Action<string> reinjectBrowserCSS;
|
private readonly Action<string> reinjectBrowserCSS;
|
||||||
|
|
||||||
public DialogSettingsCSS(Action<string> reinjectBrowserCSS){
|
public DialogSettingsCSS(Action<string> reinjectBrowserCSS){ // TODO high dpi breaks scaling of things inside the panel...
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
Text = Program.BrandName+" Options - CSS";
|
Text = Program.BrandName+" Options - CSS";
|
||||||
|
|||||||
@@ -36,19 +36,21 @@
|
|||||||
| System.Windows.Forms.AnchorStyles.Left)
|
| System.Windows.Forms.AnchorStyles.Left)
|
||||||
| System.Windows.Forms.AnchorStyles.Right)));
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
this.textBoxArgs.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
this.textBoxArgs.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.textBoxArgs.Location = new System.Drawing.Point(12, 28);
|
this.textBoxArgs.Location = new System.Drawing.Point(12, 30);
|
||||||
this.textBoxArgs.Multiline = true;
|
this.textBoxArgs.Multiline = true;
|
||||||
this.textBoxArgs.Name = "textBoxArgs";
|
this.textBoxArgs.Name = "textBoxArgs";
|
||||||
this.textBoxArgs.Size = new System.Drawing.Size(460, 193);
|
this.textBoxArgs.Size = new System.Drawing.Size(480, 189);
|
||||||
this.textBoxArgs.TabIndex = 1;
|
this.textBoxArgs.TabIndex = 1;
|
||||||
//
|
//
|
||||||
// btnCancel
|
// btnCancel
|
||||||
//
|
//
|
||||||
this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
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.AutoSize = true;
|
||||||
|
this.btnCancel.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.btnCancel.Location = new System.Drawing.Point(377, 225);
|
||||||
this.btnCancel.Name = "btnCancel";
|
this.btnCancel.Name = "btnCancel";
|
||||||
this.btnCancel.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
this.btnCancel.Padding = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||||
this.btnCancel.Size = new System.Drawing.Size(56, 23);
|
this.btnCancel.Size = new System.Drawing.Size(57, 25);
|
||||||
this.btnCancel.TabIndex = 3;
|
this.btnCancel.TabIndex = 3;
|
||||||
this.btnCancel.Text = "Cancel";
|
this.btnCancel.Text = "Cancel";
|
||||||
this.btnCancel.UseVisualStyleBackColor = true;
|
this.btnCancel.UseVisualStyleBackColor = true;
|
||||||
@@ -57,10 +59,12 @@
|
|||||||
// btnApply
|
// btnApply
|
||||||
//
|
//
|
||||||
this.btnApply.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
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.AutoSize = true;
|
||||||
|
this.btnApply.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.btnApply.Location = new System.Drawing.Point(440, 225);
|
||||||
this.btnApply.Name = "btnApply";
|
this.btnApply.Name = "btnApply";
|
||||||
this.btnApply.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
this.btnApply.Padding = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||||
this.btnApply.Size = new System.Drawing.Size(56, 23);
|
this.btnApply.Size = new System.Drawing.Size(52, 25);
|
||||||
this.btnApply.TabIndex = 2;
|
this.btnApply.TabIndex = 2;
|
||||||
this.btnApply.Text = "Apply";
|
this.btnApply.Text = "Apply";
|
||||||
this.btnApply.UseVisualStyleBackColor = true;
|
this.btnApply.UseVisualStyleBackColor = true;
|
||||||
@@ -69,10 +73,12 @@
|
|||||||
// btnHelp
|
// btnHelp
|
||||||
//
|
//
|
||||||
this.btnHelp.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
|
this.btnHelp.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
|
||||||
this.btnHelp.Location = new System.Drawing.Point(12, 227);
|
this.btnHelp.AutoSize = true;
|
||||||
|
this.btnHelp.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.btnHelp.Location = new System.Drawing.Point(12, 225);
|
||||||
this.btnHelp.Name = "btnHelp";
|
this.btnHelp.Name = "btnHelp";
|
||||||
this.btnHelp.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
this.btnHelp.Padding = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||||
this.btnHelp.Size = new System.Drawing.Size(124, 23);
|
this.btnHelp.Size = new System.Drawing.Size(141, 25);
|
||||||
this.btnHelp.TabIndex = 4;
|
this.btnHelp.TabIndex = 4;
|
||||||
this.btnHelp.Text = "List of Chromium Args";
|
this.btnHelp.Text = "List of Chromium Args";
|
||||||
this.btnHelp.UseVisualStyleBackColor = true;
|
this.btnHelp.UseVisualStyleBackColor = true;
|
||||||
@@ -81,10 +87,11 @@
|
|||||||
// labelWarning
|
// labelWarning
|
||||||
//
|
//
|
||||||
this.labelWarning.AutoSize = true;
|
this.labelWarning.AutoSize = true;
|
||||||
|
this.labelWarning.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.labelWarning.Location = new System.Drawing.Point(12, 9);
|
this.labelWarning.Location = new System.Drawing.Point(12, 9);
|
||||||
this.labelWarning.Margin = new System.Windows.Forms.Padding(3, 0, 3, 3);
|
this.labelWarning.Margin = new System.Windows.Forms.Padding(3, 0, 3, 3);
|
||||||
this.labelWarning.Name = "labelWarning";
|
this.labelWarning.Name = "labelWarning";
|
||||||
this.labelWarning.Size = new System.Drawing.Size(423, 13);
|
this.labelWarning.Size = new System.Drawing.Size(478, 15);
|
||||||
this.labelWarning.TabIndex = 0;
|
this.labelWarning.TabIndex = 0;
|
||||||
this.labelWarning.Text = "Warning: Some arguments may cause the program to stop working, edit at your own r" +
|
this.labelWarning.Text = "Warning: Some arguments may cause the program to stop working, edit at your own r" +
|
||||||
"isk.";
|
"isk.";
|
||||||
@@ -93,13 +100,13 @@
|
|||||||
//
|
//
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
this.ClientSize = new System.Drawing.Size(484, 262);
|
this.ClientSize = new System.Drawing.Size(504, 262);
|
||||||
this.Controls.Add(this.labelWarning);
|
this.Controls.Add(this.labelWarning);
|
||||||
this.Controls.Add(this.btnHelp);
|
this.Controls.Add(this.btnHelp);
|
||||||
this.Controls.Add(this.btnApply);
|
this.Controls.Add(this.btnApply);
|
||||||
this.Controls.Add(this.btnCancel);
|
this.Controls.Add(this.btnCancel);
|
||||||
this.Controls.Add(this.textBoxArgs);
|
this.Controls.Add(this.textBoxArgs);
|
||||||
this.MinimumSize = new System.Drawing.Size(500, 160);
|
this.MinimumSize = new System.Drawing.Size(520, 160);
|
||||||
this.Name = "DialogSettingsCefArgs";
|
this.Name = "DialogSettingsCefArgs";
|
||||||
this.ShowIcon = false;
|
this.ShowIcon = false;
|
||||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
|
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
|
||||||
|
|||||||
@@ -26,26 +26,29 @@
|
|||||||
this.components = new System.ComponentModel.Container();
|
this.components = new System.ComponentModel.Container();
|
||||||
this.btnCancel = new System.Windows.Forms.Button();
|
this.btnCancel = new System.Windows.Forms.Button();
|
||||||
this.btnContinue = new System.Windows.Forms.Button();
|
this.btnContinue = new System.Windows.Forms.Button();
|
||||||
this.cbConfig = new System.Windows.Forms.CheckBox();
|
this.cbProgramConfig = new System.Windows.Forms.CheckBox();
|
||||||
this.cbSession = new System.Windows.Forms.CheckBox();
|
this.cbSession = new System.Windows.Forms.CheckBox();
|
||||||
this.cbPluginData = new System.Windows.Forms.CheckBox();
|
this.cbPluginData = new System.Windows.Forms.CheckBox();
|
||||||
this.toolTip = new System.Windows.Forms.ToolTip(this.components);
|
this.toolTip = new System.Windows.Forms.ToolTip(this.components);
|
||||||
this.panelExport = new System.Windows.Forms.Panel();
|
this.cbSystemConfig = new System.Windows.Forms.CheckBox();
|
||||||
this.panelDecision = new System.Windows.Forms.Panel();
|
this.panelSelection = new System.Windows.Forms.FlowLayoutPanel();
|
||||||
this.radioReset = new System.Windows.Forms.RadioButton();
|
this.panelDecision = new System.Windows.Forms.FlowLayoutPanel();
|
||||||
this.radioExport = new System.Windows.Forms.RadioButton();
|
|
||||||
this.radioImport = new System.Windows.Forms.RadioButton();
|
this.radioImport = new System.Windows.Forms.RadioButton();
|
||||||
this.panelExport.SuspendLayout();
|
this.radioExport = new System.Windows.Forms.RadioButton();
|
||||||
|
this.radioReset = new System.Windows.Forms.RadioButton();
|
||||||
|
this.panelSelection.SuspendLayout();
|
||||||
this.panelDecision.SuspendLayout();
|
this.panelDecision.SuspendLayout();
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
//
|
//
|
||||||
// btnCancel
|
// btnCancel
|
||||||
//
|
//
|
||||||
this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||||
this.btnCancel.Location = new System.Drawing.Point(176, 97);
|
this.btnCancel.AutoSize = true;
|
||||||
|
this.btnCancel.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.btnCancel.Location = new System.Drawing.Point(165, 92);
|
||||||
this.btnCancel.Name = "btnCancel";
|
this.btnCancel.Name = "btnCancel";
|
||||||
this.btnCancel.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
this.btnCancel.Padding = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||||
this.btnCancel.Size = new System.Drawing.Size(56, 23);
|
this.btnCancel.Size = new System.Drawing.Size(57, 25);
|
||||||
this.btnCancel.TabIndex = 4;
|
this.btnCancel.TabIndex = 4;
|
||||||
this.btnCancel.Text = "Cancel";
|
this.btnCancel.Text = "Cancel";
|
||||||
this.btnCancel.UseVisualStyleBackColor = true;
|
this.btnCancel.UseVisualStyleBackColor = true;
|
||||||
@@ -56,127 +59,163 @@
|
|||||||
this.btnContinue.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
this.btnContinue.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||||
this.btnContinue.AutoSize = true;
|
this.btnContinue.AutoSize = true;
|
||||||
this.btnContinue.Enabled = false;
|
this.btnContinue.Enabled = false;
|
||||||
this.btnContinue.Location = new System.Drawing.Point(125, 97);
|
this.btnContinue.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.btnContinue.Location = new System.Drawing.Point(114, 92);
|
||||||
this.btnContinue.Name = "btnContinue";
|
this.btnContinue.Name = "btnContinue";
|
||||||
this.btnContinue.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
this.btnContinue.Padding = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||||
this.btnContinue.Size = new System.Drawing.Size(45, 23);
|
this.btnContinue.Size = new System.Drawing.Size(45, 25);
|
||||||
this.btnContinue.TabIndex = 3;
|
this.btnContinue.TabIndex = 3;
|
||||||
this.btnContinue.Text = "Next";
|
this.btnContinue.Text = "Next";
|
||||||
this.btnContinue.UseVisualStyleBackColor = true;
|
this.btnContinue.UseVisualStyleBackColor = true;
|
||||||
this.btnContinue.Click += new System.EventHandler(this.btnContinue_Click);
|
this.btnContinue.Click += new System.EventHandler(this.btnContinue_Click);
|
||||||
//
|
//
|
||||||
// cbConfig
|
// cbProgramConfig
|
||||||
//
|
//
|
||||||
this.cbConfig.AutoSize = true;
|
this.cbProgramConfig.AutoSize = true;
|
||||||
this.cbConfig.Location = new System.Drawing.Point(0, 3);
|
this.cbProgramConfig.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.cbConfig.Name = "cbConfig";
|
this.cbProgramConfig.Location = new System.Drawing.Point(3, 3);
|
||||||
this.cbConfig.Size = new System.Drawing.Size(104, 17);
|
this.cbProgramConfig.Margin = new System.Windows.Forms.Padding(3, 3, 3, 2);
|
||||||
this.cbConfig.TabIndex = 0;
|
this.cbProgramConfig.Name = "cbProgramConfig";
|
||||||
this.cbConfig.Text = "Program Options";
|
this.cbProgramConfig.Size = new System.Drawing.Size(117, 19);
|
||||||
this.toolTip.SetToolTip(this.cbConfig, "Interface, notification, and update options.");
|
this.cbProgramConfig.TabIndex = 0;
|
||||||
this.cbConfig.UseVisualStyleBackColor = true;
|
this.cbProgramConfig.Text = "Program Options";
|
||||||
this.cbConfig.CheckedChanged += new System.EventHandler(this.cbConfig_CheckedChanged);
|
this.toolTip.SetToolTip(this.cbProgramConfig, "Interface, notification, and update options.");
|
||||||
|
this.cbProgramConfig.UseVisualStyleBackColor = true;
|
||||||
|
this.cbProgramConfig.CheckedChanged += new System.EventHandler(this.checkBoxSelection_CheckedChanged);
|
||||||
//
|
//
|
||||||
// cbSession
|
// cbSession
|
||||||
//
|
//
|
||||||
this.cbSession.AutoSize = true;
|
this.cbSession.AutoSize = true;
|
||||||
this.cbSession.Location = new System.Drawing.Point(0, 27);
|
this.cbSession.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.cbSession.Location = new System.Drawing.Point(3, 51);
|
||||||
|
this.cbSession.Margin = new System.Windows.Forms.Padding(3, 3, 3, 2);
|
||||||
this.cbSession.Name = "cbSession";
|
this.cbSession.Name = "cbSession";
|
||||||
this.cbSession.Size = new System.Drawing.Size(92, 17);
|
this.cbSession.Size = new System.Drawing.Size(98, 19);
|
||||||
this.cbSession.TabIndex = 1;
|
this.cbSession.TabIndex = 2;
|
||||||
this.cbSession.Text = "Login Session";
|
this.cbSession.Text = "Login Session";
|
||||||
this.toolTip.SetToolTip(this.cbSession, "A token that allows logging into the\r\ncurrent TweetDeck account.");
|
this.toolTip.SetToolTip(this.cbSession, "A token that allows logging into the\r\ncurrent TweetDeck account.");
|
||||||
this.cbSession.UseVisualStyleBackColor = true;
|
this.cbSession.UseVisualStyleBackColor = true;
|
||||||
this.cbSession.CheckedChanged += new System.EventHandler(this.cbSession_CheckedChanged);
|
this.cbSession.CheckedChanged += new System.EventHandler(this.checkBoxSelection_CheckedChanged);
|
||||||
//
|
//
|
||||||
// cbPluginData
|
// cbPluginData
|
||||||
//
|
//
|
||||||
this.cbPluginData.AutoSize = true;
|
this.cbPluginData.AutoSize = true;
|
||||||
this.cbPluginData.Location = new System.Drawing.Point(0, 51);
|
this.cbPluginData.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.cbPluginData.Location = new System.Drawing.Point(3, 75);
|
||||||
|
this.cbPluginData.Margin = new System.Windows.Forms.Padding(3, 3, 3, 2);
|
||||||
this.cbPluginData.Name = "cbPluginData";
|
this.cbPluginData.Name = "cbPluginData";
|
||||||
this.cbPluginData.Size = new System.Drawing.Size(81, 17);
|
this.cbPluginData.Size = new System.Drawing.Size(87, 19);
|
||||||
this.cbPluginData.TabIndex = 2;
|
this.cbPluginData.TabIndex = 3;
|
||||||
this.cbPluginData.Text = "Plugin Data";
|
this.cbPluginData.Text = "Plugin Data";
|
||||||
this.toolTip.SetToolTip(this.cbPluginData, "Data files generated by plugins.\r\nDoes not include the plugins themselves.");
|
this.toolTip.SetToolTip(this.cbPluginData, "Data files generated by plugins.\r\nDoes not include the plugins themselves.");
|
||||||
this.cbPluginData.UseVisualStyleBackColor = true;
|
this.cbPluginData.UseVisualStyleBackColor = true;
|
||||||
this.cbPluginData.CheckedChanged += new System.EventHandler(this.cbPluginData_CheckedChanged);
|
this.cbPluginData.CheckedChanged += new System.EventHandler(this.checkBoxSelection_CheckedChanged);
|
||||||
//
|
//
|
||||||
// panelExport
|
// cbSystemConfig
|
||||||
//
|
//
|
||||||
this.panelExport.Controls.Add(this.cbConfig);
|
this.cbSystemConfig.AutoSize = true;
|
||||||
this.panelExport.Controls.Add(this.cbPluginData);
|
this.cbSystemConfig.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.panelExport.Controls.Add(this.cbSession);
|
this.cbSystemConfig.Location = new System.Drawing.Point(3, 27);
|
||||||
this.panelExport.Location = new System.Drawing.Point(12, 12);
|
this.cbSystemConfig.Margin = new System.Windows.Forms.Padding(3, 3, 3, 2);
|
||||||
this.panelExport.Name = "panelExport";
|
this.cbSystemConfig.Name = "cbSystemConfig";
|
||||||
this.panelExport.Size = new System.Drawing.Size(220, 79);
|
this.cbSystemConfig.Size = new System.Drawing.Size(109, 19);
|
||||||
this.panelExport.TabIndex = 5;
|
this.cbSystemConfig.TabIndex = 1;
|
||||||
this.panelExport.Visible = false;
|
this.cbSystemConfig.Text = "System Options";
|
||||||
|
this.toolTip.SetToolTip(this.cbSystemConfig, "Hardware acceleration and cache options.");
|
||||||
|
this.cbSystemConfig.UseVisualStyleBackColor = true;
|
||||||
|
this.cbSystemConfig.CheckedChanged += new System.EventHandler(this.checkBoxSelection_CheckedChanged);
|
||||||
|
//
|
||||||
|
// panelSelection
|
||||||
|
//
|
||||||
|
this.panelSelection.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||||
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
|
this.panelSelection.Controls.Add(this.cbProgramConfig);
|
||||||
|
this.panelSelection.Controls.Add(this.cbSystemConfig);
|
||||||
|
this.panelSelection.Controls.Add(this.cbSession);
|
||||||
|
this.panelSelection.Controls.Add(this.cbPluginData);
|
||||||
|
this.panelSelection.FlowDirection = System.Windows.Forms.FlowDirection.TopDown;
|
||||||
|
this.panelSelection.Location = new System.Drawing.Point(12, 12);
|
||||||
|
this.panelSelection.Name = "panelSelection";
|
||||||
|
this.panelSelection.Size = new System.Drawing.Size(210, 97);
|
||||||
|
this.panelSelection.TabIndex = 2;
|
||||||
|
this.panelSelection.Visible = false;
|
||||||
|
this.panelSelection.WrapContents = false;
|
||||||
//
|
//
|
||||||
// panelDecision
|
// panelDecision
|
||||||
//
|
//
|
||||||
this.panelDecision.Controls.Add(this.radioReset);
|
this.panelDecision.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||||
this.panelDecision.Controls.Add(this.radioExport);
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
this.panelDecision.Controls.Add(this.radioImport);
|
this.panelDecision.Controls.Add(this.radioImport);
|
||||||
|
this.panelDecision.Controls.Add(this.radioExport);
|
||||||
|
this.panelDecision.Controls.Add(this.radioReset);
|
||||||
|
this.panelDecision.FlowDirection = System.Windows.Forms.FlowDirection.TopDown;
|
||||||
this.panelDecision.Location = new System.Drawing.Point(12, 12);
|
this.panelDecision.Location = new System.Drawing.Point(12, 12);
|
||||||
this.panelDecision.Name = "panelDecision";
|
this.panelDecision.Name = "panelDecision";
|
||||||
this.panelDecision.Size = new System.Drawing.Size(220, 79);
|
this.panelDecision.Size = new System.Drawing.Size(210, 75);
|
||||||
this.panelDecision.TabIndex = 6;
|
this.panelDecision.TabIndex = 0;
|
||||||
//
|
this.panelDecision.WrapContents = false;
|
||||||
// radioReset
|
|
||||||
//
|
|
||||||
this.radioReset.AutoSize = true;
|
|
||||||
this.radioReset.Location = new System.Drawing.Point(3, 49);
|
|
||||||
this.radioReset.Name = "radioReset";
|
|
||||||
this.radioReset.Size = new System.Drawing.Size(104, 17);
|
|
||||||
this.radioReset.TabIndex = 2;
|
|
||||||
this.radioReset.TabStop = true;
|
|
||||||
this.radioReset.Text = "Restore Defaults";
|
|
||||||
this.radioReset.UseVisualStyleBackColor = true;
|
|
||||||
this.radioReset.CheckedChanged += new System.EventHandler(this.radioDecision_CheckedChanged);
|
|
||||||
//
|
|
||||||
// radioExport
|
|
||||||
//
|
|
||||||
this.radioExport.AutoSize = true;
|
|
||||||
this.radioExport.Location = new System.Drawing.Point(3, 26);
|
|
||||||
this.radioExport.Name = "radioExport";
|
|
||||||
this.radioExport.Size = new System.Drawing.Size(87, 17);
|
|
||||||
this.radioExport.TabIndex = 1;
|
|
||||||
this.radioExport.TabStop = true;
|
|
||||||
this.radioExport.Text = "Export Profile";
|
|
||||||
this.radioExport.UseVisualStyleBackColor = true;
|
|
||||||
this.radioExport.CheckedChanged += new System.EventHandler(this.radioDecision_CheckedChanged);
|
|
||||||
//
|
//
|
||||||
// radioImport
|
// radioImport
|
||||||
//
|
//
|
||||||
this.radioImport.AutoSize = true;
|
this.radioImport.AutoSize = true;
|
||||||
|
this.radioImport.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.radioImport.Location = new System.Drawing.Point(3, 3);
|
this.radioImport.Location = new System.Drawing.Point(3, 3);
|
||||||
|
this.radioImport.Margin = new System.Windows.Forms.Padding(3, 3, 3, 2);
|
||||||
this.radioImport.Name = "radioImport";
|
this.radioImport.Name = "radioImport";
|
||||||
this.radioImport.Size = new System.Drawing.Size(86, 17);
|
this.radioImport.Size = new System.Drawing.Size(98, 19);
|
||||||
this.radioImport.TabIndex = 0;
|
this.radioImport.TabIndex = 0;
|
||||||
this.radioImport.TabStop = true;
|
this.radioImport.TabStop = true;
|
||||||
this.radioImport.Text = "Import Profile";
|
this.radioImport.Text = "Import Profile";
|
||||||
this.radioImport.UseVisualStyleBackColor = true;
|
this.radioImport.UseVisualStyleBackColor = true;
|
||||||
this.radioImport.CheckedChanged += new System.EventHandler(this.radioDecision_CheckedChanged);
|
this.radioImport.CheckedChanged += new System.EventHandler(this.radioDecision_CheckedChanged);
|
||||||
//
|
//
|
||||||
|
// radioExport
|
||||||
|
//
|
||||||
|
this.radioExport.AutoSize = true;
|
||||||
|
this.radioExport.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.radioExport.Location = new System.Drawing.Point(3, 27);
|
||||||
|
this.radioExport.Margin = new System.Windows.Forms.Padding(3, 3, 3, 2);
|
||||||
|
this.radioExport.Name = "radioExport";
|
||||||
|
this.radioExport.Size = new System.Drawing.Size(95, 19);
|
||||||
|
this.radioExport.TabIndex = 1;
|
||||||
|
this.radioExport.TabStop = true;
|
||||||
|
this.radioExport.Text = "Export Profile";
|
||||||
|
this.radioExport.UseVisualStyleBackColor = true;
|
||||||
|
this.radioExport.CheckedChanged += new System.EventHandler(this.radioDecision_CheckedChanged);
|
||||||
|
//
|
||||||
|
// radioReset
|
||||||
|
//
|
||||||
|
this.radioReset.AutoSize = true;
|
||||||
|
this.radioReset.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.radioReset.Location = new System.Drawing.Point(3, 51);
|
||||||
|
this.radioReset.Margin = new System.Windows.Forms.Padding(3, 3, 3, 2);
|
||||||
|
this.radioReset.Name = "radioReset";
|
||||||
|
this.radioReset.Size = new System.Drawing.Size(110, 19);
|
||||||
|
this.radioReset.TabIndex = 2;
|
||||||
|
this.radioReset.TabStop = true;
|
||||||
|
this.radioReset.Text = "Restore Defaults";
|
||||||
|
this.radioReset.UseVisualStyleBackColor = true;
|
||||||
|
this.radioReset.CheckedChanged += new System.EventHandler(this.radioDecision_CheckedChanged);
|
||||||
|
//
|
||||||
// DialogSettingsManage
|
// DialogSettingsManage
|
||||||
//
|
//
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
this.ClientSize = new System.Drawing.Size(244, 132);
|
this.ClientSize = new System.Drawing.Size(234, 129);
|
||||||
this.Controls.Add(this.panelDecision);
|
|
||||||
this.Controls.Add(this.panelExport);
|
|
||||||
this.Controls.Add(this.btnContinue);
|
this.Controls.Add(this.btnContinue);
|
||||||
this.Controls.Add(this.btnCancel);
|
this.Controls.Add(this.btnCancel);
|
||||||
|
this.Controls.Add(this.panelDecision);
|
||||||
|
this.Controls.Add(this.panelSelection);
|
||||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
|
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
|
||||||
this.MaximizeBox = false;
|
this.MaximizeBox = false;
|
||||||
this.MinimizeBox = false;
|
this.MinimizeBox = false;
|
||||||
this.MinimumSize = new System.Drawing.Size(200, 170);
|
this.MinimumSize = new System.Drawing.Size(250, 167);
|
||||||
this.Name = "DialogSettingsManage";
|
this.Name = "DialogSettingsManage";
|
||||||
this.ShowIcon = false;
|
this.ShowIcon = false;
|
||||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
|
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
|
||||||
this.Text = "Manage Options";
|
this.Text = "Manage Options";
|
||||||
this.panelExport.ResumeLayout(false);
|
this.panelSelection.ResumeLayout(false);
|
||||||
this.panelExport.PerformLayout();
|
this.panelSelection.PerformLayout();
|
||||||
this.panelDecision.ResumeLayout(false);
|
this.panelDecision.ResumeLayout(false);
|
||||||
this.panelDecision.PerformLayout();
|
this.panelDecision.PerformLayout();
|
||||||
this.ResumeLayout(false);
|
this.ResumeLayout(false);
|
||||||
@@ -188,12 +227,13 @@
|
|||||||
|
|
||||||
private System.Windows.Forms.Button btnCancel;
|
private System.Windows.Forms.Button btnCancel;
|
||||||
private System.Windows.Forms.Button btnContinue;
|
private System.Windows.Forms.Button btnContinue;
|
||||||
private System.Windows.Forms.CheckBox cbConfig;
|
private System.Windows.Forms.CheckBox cbProgramConfig;
|
||||||
|
private System.Windows.Forms.CheckBox cbSystemConfig;
|
||||||
private System.Windows.Forms.CheckBox cbSession;
|
private System.Windows.Forms.CheckBox cbSession;
|
||||||
private System.Windows.Forms.CheckBox cbPluginData;
|
private System.Windows.Forms.CheckBox cbPluginData;
|
||||||
private System.Windows.Forms.ToolTip toolTip;
|
private System.Windows.Forms.ToolTip toolTip;
|
||||||
private System.Windows.Forms.Panel panelExport;
|
private System.Windows.Forms.FlowLayoutPanel panelSelection;
|
||||||
private System.Windows.Forms.Panel panelDecision;
|
private System.Windows.Forms.FlowLayoutPanel panelDecision;
|
||||||
private System.Windows.Forms.RadioButton radioReset;
|
private System.Windows.Forms.RadioButton radioReset;
|
||||||
private System.Windows.Forms.RadioButton radioExport;
|
private System.Windows.Forms.RadioButton radioExport;
|
||||||
private System.Windows.Forms.RadioButton radioImport;
|
private System.Windows.Forms.RadioButton radioImport;
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using TweetDuck.Configuration;
|
using TweetDuck.Configuration;
|
||||||
using TweetDuck.Core.Other.Settings.Export;
|
using TweetDuck.Core.Management;
|
||||||
using TweetDuck.Plugins;
|
using TweetDuck.Plugins;
|
||||||
|
|
||||||
namespace TweetDuck.Core.Other.Settings.Dialogs{
|
namespace TweetDuck.Core.Other.Settings.Dialogs{
|
||||||
@@ -11,46 +12,47 @@ namespace TweetDuck.Core.Other.Settings.Dialogs{
|
|||||||
Deciding, Reset, Import, Export
|
Deciding, Reset, Import, Export
|
||||||
}
|
}
|
||||||
|
|
||||||
public ExportFileFlags Flags{
|
private ProfileManager.Items SelectedItems{
|
||||||
get => selectedFlags;
|
get => _selectedItems;
|
||||||
|
|
||||||
set{
|
set{
|
||||||
// this will call events and SetFlag, which also updates the UI
|
// this will call events and SetFlag, which also updates the UI
|
||||||
cbConfig.Checked = value.HasFlag(ExportFileFlags.UserConfig);
|
foreach(KeyValuePair<CheckBox, ProfileManager.Items> kvp in checkBoxMap){
|
||||||
cbSession.Checked = value.HasFlag(ExportFileFlags.Session);
|
kvp.Key.Checked = value.HasFlag(kvp.Value);
|
||||||
cbPluginData.Checked = value.HasFlag(ExportFileFlags.PluginData);
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool IsRestarting { get; private set; }
|
||||||
public bool ShouldReloadBrowser { get; private set; }
|
public bool ShouldReloadBrowser { get; private set; }
|
||||||
|
|
||||||
private readonly PluginManager plugins;
|
private readonly PluginManager plugins;
|
||||||
private State currentState;
|
private readonly Dictionary<CheckBox, ProfileManager.Items> checkBoxMap = new Dictionary<CheckBox, ProfileManager.Items>(4);
|
||||||
|
|
||||||
private ExportManager importManager;
|
private State currentState;
|
||||||
private ExportFileFlags selectedFlags = ExportFileFlags.None;
|
private ProfileManager importManager;
|
||||||
|
|
||||||
|
private ProfileManager.Items _selectedItems = ProfileManager.Items.None;
|
||||||
|
|
||||||
public DialogSettingsManage(PluginManager plugins){
|
public DialogSettingsManage(PluginManager plugins){
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
this.plugins = plugins;
|
this.plugins = plugins;
|
||||||
this.currentState = State.Deciding;
|
this.currentState = State.Deciding;
|
||||||
|
|
||||||
|
this.checkBoxMap[cbProgramConfig] = ProfileManager.Items.UserConfig;
|
||||||
|
this.checkBoxMap[cbSystemConfig] = ProfileManager.Items.SystemConfig;
|
||||||
|
this.checkBoxMap[cbSession] = ProfileManager.Items.Session;
|
||||||
|
this.checkBoxMap[cbPluginData] = ProfileManager.Items.PluginData;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void radioDecision_CheckedChanged(object sender, EventArgs e){
|
private void radioDecision_CheckedChanged(object sender, EventArgs e){
|
||||||
btnContinue.Enabled = true;
|
btnContinue.Enabled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void cbConfig_CheckedChanged(object sender, EventArgs e){
|
private void checkBoxSelection_CheckedChanged(object sender, EventArgs e){
|
||||||
SetFlag(ExportFileFlags.UserConfig, cbConfig.Checked);
|
CheckBox cb = (CheckBox)sender;
|
||||||
}
|
SetFlag(checkBoxMap[cb], cb.Checked);
|
||||||
|
|
||||||
private void cbSession_CheckedChanged(object sender, EventArgs e){
|
|
||||||
SetFlag(ExportFileFlags.Session, cbSession.Checked);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void cbPluginData_CheckedChanged(object sender, EventArgs e){
|
|
||||||
SetFlag(ExportFileFlags.PluginData, cbPluginData.Checked);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnContinue_Click(object sender, EventArgs e){
|
private void btnContinue_Click(object sender, EventArgs e){
|
||||||
@@ -63,7 +65,7 @@ namespace TweetDuck.Core.Other.Settings.Dialogs{
|
|||||||
currentState = State.Reset;
|
currentState = State.Reset;
|
||||||
|
|
||||||
Text = "Restore Defaults";
|
Text = "Restore Defaults";
|
||||||
Flags = ExportFileFlags.UserConfig;
|
SelectedItems = ProfileManager.Items.UserConfig;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Import
|
// Import
|
||||||
@@ -81,15 +83,15 @@ namespace TweetDuck.Core.Other.Settings.Dialogs{
|
|||||||
file = dialog.FileName;
|
file = dialog.FileName;
|
||||||
}
|
}
|
||||||
|
|
||||||
importManager = new ExportManager(file, plugins);
|
importManager = new ProfileManager(file, plugins);
|
||||||
currentState = State.Import;
|
currentState = State.Import;
|
||||||
|
|
||||||
Text = "Import Profile";
|
Text = "Import Profile";
|
||||||
Flags = importManager.GetImportFlags();
|
SelectedItems = importManager.FindImportItems();
|
||||||
|
|
||||||
cbConfig.Enabled = cbConfig.Checked;
|
foreach(CheckBox cb in checkBoxMap.Keys){
|
||||||
cbSession.Enabled = cbSession.Checked;
|
cb.Enabled = cb.Checked;
|
||||||
cbPluginData.Enabled = cbPluginData.Checked;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Export
|
// Export
|
||||||
@@ -98,21 +100,22 @@ namespace TweetDuck.Core.Other.Settings.Dialogs{
|
|||||||
|
|
||||||
Text = "Export Profile";
|
Text = "Export Profile";
|
||||||
btnContinue.Text = "Export Profile";
|
btnContinue.Text = "Export Profile";
|
||||||
Flags = ExportFileFlags.All & ~ExportFileFlags.Session;
|
SelectedItems = ProfileManager.Items.UserConfig | ProfileManager.Items.PluginData;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Continue...
|
// Continue...
|
||||||
panelDecision.Visible = false;
|
panelDecision.Visible = false;
|
||||||
panelExport.Visible = true;
|
panelSelection.Visible = true;
|
||||||
|
Height += panelSelection.Height-panelDecision.Height;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case State.Reset:
|
case State.Reset:
|
||||||
if (FormMessage.Warning("Reset TweetDuck Options", "This will reset the selected items. Are you sure you want to proceed?", FormMessage.Yes, FormMessage.No)){
|
if (FormMessage.Warning("Reset TweetDuck Options", "This will reset the selected items. Are you sure you want to proceed?", FormMessage.Yes, FormMessage.No)){
|
||||||
if (Flags.HasFlag(ExportFileFlags.UserConfig)){
|
if (SelectedItems.HasFlag(ProfileManager.Items.UserConfig)){
|
||||||
Program.ResetConfig();
|
Program.UserConfig.Reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Flags.HasFlag(ExportFileFlags.SystemConfig)){
|
if (SelectedItems.HasFlag(ProfileManager.Items.SystemConfig)){
|
||||||
try{
|
try{
|
||||||
File.Delete(Program.SystemConfigFilePath);
|
File.Delete(Program.SystemConfigFilePath);
|
||||||
}catch(Exception ex){
|
}catch(Exception ex){
|
||||||
@@ -120,7 +123,7 @@ namespace TweetDuck.Core.Other.Settings.Dialogs{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Flags.HasFlag(ExportFileFlags.PluginData)){
|
if (SelectedItems.HasFlag(ProfileManager.Items.PluginData)){
|
||||||
try{
|
try{
|
||||||
File.Delete(Program.PluginConfigFilePath);
|
File.Delete(Program.PluginConfigFilePath);
|
||||||
Directory.Delete(Program.PluginDataPath, true);
|
Directory.Delete(Program.PluginDataPath, true);
|
||||||
@@ -129,11 +132,11 @@ namespace TweetDuck.Core.Other.Settings.Dialogs{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Flags.HasFlag(ExportFileFlags.Session)){
|
if (SelectedItems.HasFlag(ProfileManager.Items.Session)){
|
||||||
Program.Restart(Arguments.ArgDeleteCookies);
|
RestartProgram(Arguments.ArgDeleteCookies);
|
||||||
}
|
}
|
||||||
else if (Flags.HasFlag(ExportFileFlags.SystemConfig)){
|
else if (SelectedItems.HasFlag(ProfileManager.Items.SystemConfig)){
|
||||||
Program.Restart();
|
RestartProgram();
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
ShouldReloadBrowser = true;
|
ShouldReloadBrowser = true;
|
||||||
@@ -146,24 +149,21 @@ namespace TweetDuck.Core.Other.Settings.Dialogs{
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case State.Import:
|
case State.Import:
|
||||||
if (importManager.Import(Flags)){
|
if (importManager.Import(SelectedItems)){
|
||||||
Program.UserConfig.Reload();
|
Program.UserConfig.Reload();
|
||||||
|
|
||||||
if (importManager.IsRestarting){
|
if (importManager.IsRestarting){
|
||||||
if (Flags.HasFlag(ExportFileFlags.Session)){
|
if (SelectedItems.HasFlag(ProfileManager.Items.Session)){
|
||||||
Program.Restart(Arguments.ArgImportCookies);
|
RestartProgram(Arguments.ArgImportCookies);
|
||||||
}
|
}
|
||||||
else if (Flags.HasFlag(ExportFileFlags.SystemConfig)){
|
else if (SelectedItems.HasFlag(ProfileManager.Items.SystemConfig)){
|
||||||
Program.Restart();
|
RestartProgram();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
ShouldReloadBrowser = true;
|
ShouldReloadBrowser = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
|
||||||
Program.Reporter.HandleException("Profile Import Error", "An exception happened while importing TweetDuck profile.", true, importManager.LastException);
|
|
||||||
}
|
|
||||||
|
|
||||||
DialogResult = DialogResult.OK;
|
DialogResult = DialogResult.OK;
|
||||||
Close();
|
Close();
|
||||||
@@ -189,11 +189,7 @@ namespace TweetDuck.Core.Other.Settings.Dialogs{
|
|||||||
Program.UserConfig.Save();
|
Program.UserConfig.Save();
|
||||||
Program.SystemConfig.Save();
|
Program.SystemConfig.Save();
|
||||||
|
|
||||||
ExportManager manager = new ExportManager(file, plugins);
|
new ProfileManager(file, plugins).Export(SelectedItems);
|
||||||
|
|
||||||
if (!manager.Export(Flags)){
|
|
||||||
Program.Reporter.HandleException("Profile Export Error", "An exception happened while exporting TweetDuck profile.", true, manager.LastException);
|
|
||||||
}
|
|
||||||
|
|
||||||
DialogResult = DialogResult.OK;
|
DialogResult = DialogResult.OK;
|
||||||
Close();
|
Close();
|
||||||
@@ -206,16 +202,21 @@ namespace TweetDuck.Core.Other.Settings.Dialogs{
|
|||||||
Close();
|
Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SetFlag(ExportFileFlags flag, bool enable){
|
private void SetFlag(ProfileManager.Items flag, bool enable){
|
||||||
selectedFlags = enable ? selectedFlags | flag : selectedFlags & ~flag;
|
_selectedItems = enable ? _selectedItems | flag : _selectedItems & ~flag;
|
||||||
btnContinue.Enabled = selectedFlags != ExportFileFlags.None;
|
btnContinue.Enabled = _selectedItems != ProfileManager.Items.None;
|
||||||
|
|
||||||
if (currentState == State.Import){
|
if (currentState == State.Import){
|
||||||
btnContinue.Text = selectedFlags.HasFlag(ExportFileFlags.Session) ? "Import && Restart" : "Import Profile";
|
btnContinue.Text = _selectedItems.NeedsRestart() ? "Import && Restart" : "Import Profile";
|
||||||
}
|
}
|
||||||
else if (currentState == State.Reset){
|
else if (currentState == State.Reset){
|
||||||
btnContinue.Text = selectedFlags.HasFlag(ExportFileFlags.Session) ? "Restore && Restart" : "Restore Defaults";
|
btnContinue.Text = _selectedItems.NeedsRestart() ? "Restore && Restart" : "Restore Defaults";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void RestartProgram(params string[] extraArgs){
|
||||||
|
IsRestarting = true;
|
||||||
|
Program.Restart(extraArgs);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,23 +28,24 @@
|
|||||||
this.btnRestart = new System.Windows.Forms.Button();
|
this.btnRestart = new System.Windows.Forms.Button();
|
||||||
this.cbLogging = new System.Windows.Forms.CheckBox();
|
this.cbLogging = new System.Windows.Forms.CheckBox();
|
||||||
this.toolTip = new System.Windows.Forms.ToolTip(this.components);
|
this.toolTip = new System.Windows.Forms.ToolTip(this.components);
|
||||||
this.cbDebugUpdates = new System.Windows.Forms.CheckBox();
|
|
||||||
this.comboLocale = new System.Windows.Forms.ComboBox();
|
|
||||||
this.tbDataFolder = new System.Windows.Forms.TextBox();
|
this.tbDataFolder = new System.Windows.Forms.TextBox();
|
||||||
this.tbShortcutTarget = new System.Windows.Forms.TextBox();
|
this.tbShortcutTarget = new System.Windows.Forms.TextBox();
|
||||||
this.labelLocale = new System.Windows.Forms.Label();
|
|
||||||
this.labelDataFolder = new System.Windows.Forms.Label();
|
this.labelDataFolder = new System.Windows.Forms.Label();
|
||||||
this.labelShortcutTarget = new System.Windows.Forms.Label();
|
this.labelShortcutTarget = new System.Windows.Forms.Label();
|
||||||
|
this.flowPanel = new System.Windows.Forms.FlowLayoutPanel();
|
||||||
|
this.flowPanel.SuspendLayout();
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
//
|
//
|
||||||
// btnCancel
|
// btnCancel
|
||||||
//
|
//
|
||||||
this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||||
this.btnCancel.Location = new System.Drawing.Point(216, 217);
|
this.btnCancel.AutoSize = true;
|
||||||
|
this.btnCancel.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.btnCancel.Location = new System.Drawing.Point(215, 146);
|
||||||
this.btnCancel.Name = "btnCancel";
|
this.btnCancel.Name = "btnCancel";
|
||||||
this.btnCancel.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
this.btnCancel.Padding = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||||
this.btnCancel.Size = new System.Drawing.Size(56, 23);
|
this.btnCancel.Size = new System.Drawing.Size(57, 25);
|
||||||
this.btnCancel.TabIndex = 9;
|
this.btnCancel.TabIndex = 2;
|
||||||
this.btnCancel.Text = "Cancel";
|
this.btnCancel.Text = "Cancel";
|
||||||
this.btnCancel.UseVisualStyleBackColor = true;
|
this.btnCancel.UseVisualStyleBackColor = true;
|
||||||
this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
|
this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
|
||||||
@@ -52,11 +53,13 @@
|
|||||||
// btnRestart
|
// btnRestart
|
||||||
//
|
//
|
||||||
this.btnRestart.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
this.btnRestart.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||||
this.btnRestart.Location = new System.Drawing.Point(153, 217);
|
this.btnRestart.AutoSize = true;
|
||||||
|
this.btnRestart.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.btnRestart.Location = new System.Drawing.Point(152, 146);
|
||||||
this.btnRestart.Name = "btnRestart";
|
this.btnRestart.Name = "btnRestart";
|
||||||
this.btnRestart.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
this.btnRestart.Padding = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||||
this.btnRestart.Size = new System.Drawing.Size(57, 23);
|
this.btnRestart.Size = new System.Drawing.Size(57, 25);
|
||||||
this.btnRestart.TabIndex = 8;
|
this.btnRestart.TabIndex = 1;
|
||||||
this.btnRestart.Text = "Restart";
|
this.btnRestart.Text = "Restart";
|
||||||
this.btnRestart.UseVisualStyleBackColor = true;
|
this.btnRestart.UseVisualStyleBackColor = true;
|
||||||
this.btnRestart.Click += new System.EventHandler(this.btnRestart_Click);
|
this.btnRestart.Click += new System.EventHandler(this.btnRestart_Click);
|
||||||
@@ -64,102 +67,85 @@
|
|||||||
// cbLogging
|
// cbLogging
|
||||||
//
|
//
|
||||||
this.cbLogging.AutoSize = true;
|
this.cbLogging.AutoSize = true;
|
||||||
this.cbLogging.Location = new System.Drawing.Point(12, 12);
|
this.cbLogging.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.cbLogging.Location = new System.Drawing.Point(3, 3);
|
||||||
|
this.cbLogging.Margin = new System.Windows.Forms.Padding(3, 3, 3, 2);
|
||||||
this.cbLogging.Name = "cbLogging";
|
this.cbLogging.Name = "cbLogging";
|
||||||
this.cbLogging.Size = new System.Drawing.Size(64, 17);
|
this.cbLogging.Size = new System.Drawing.Size(70, 19);
|
||||||
this.cbLogging.TabIndex = 0;
|
this.cbLogging.TabIndex = 0;
|
||||||
this.cbLogging.Text = "Logging";
|
this.cbLogging.Text = "Logging";
|
||||||
this.toolTip.SetToolTip(this.cbLogging, "Logging JavaScript output into TD_Console.txt file in the data folder.");
|
this.toolTip.SetToolTip(this.cbLogging, "Logs JavaScript output into TD_Console.txt file in the data folder.");
|
||||||
this.cbLogging.UseVisualStyleBackColor = true;
|
this.cbLogging.UseVisualStyleBackColor = true;
|
||||||
//
|
//
|
||||||
// cbDebugUpdates
|
|
||||||
//
|
|
||||||
this.cbDebugUpdates.AutoSize = true;
|
|
||||||
this.cbDebugUpdates.Location = new System.Drawing.Point(12, 35);
|
|
||||||
this.cbDebugUpdates.Name = "cbDebugUpdates";
|
|
||||||
this.cbDebugUpdates.Size = new System.Drawing.Size(127, 17);
|
|
||||||
this.cbDebugUpdates.TabIndex = 1;
|
|
||||||
this.cbDebugUpdates.Text = "Pre-Release Updates";
|
|
||||||
this.toolTip.SetToolTip(this.cbDebugUpdates, "Allows updating to pre-releases.");
|
|
||||||
this.cbDebugUpdates.UseVisualStyleBackColor = true;
|
|
||||||
//
|
|
||||||
// comboLocale
|
|
||||||
//
|
|
||||||
this.comboLocale.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
|
||||||
| System.Windows.Forms.AnchorStyles.Right)));
|
|
||||||
this.comboLocale.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
|
||||||
this.comboLocale.FormattingEnabled = true;
|
|
||||||
this.comboLocale.Location = new System.Drawing.Point(15, 83);
|
|
||||||
this.comboLocale.Name = "comboLocale";
|
|
||||||
this.comboLocale.Size = new System.Drawing.Size(257, 21);
|
|
||||||
this.comboLocale.TabIndex = 3;
|
|
||||||
this.toolTip.SetToolTip(this.comboLocale, "Language used for spell checking.");
|
|
||||||
//
|
|
||||||
// tbDataFolder
|
// tbDataFolder
|
||||||
//
|
//
|
||||||
this.tbDataFolder.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
this.tbDataFolder.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
| System.Windows.Forms.AnchorStyles.Right)));
|
this.tbDataFolder.Location = new System.Drawing.Point(3, 54);
|
||||||
this.tbDataFolder.Location = new System.Drawing.Point(15, 135);
|
|
||||||
this.tbDataFolder.Name = "tbDataFolder";
|
this.tbDataFolder.Name = "tbDataFolder";
|
||||||
this.tbDataFolder.Size = new System.Drawing.Size(257, 20);
|
this.tbDataFolder.Size = new System.Drawing.Size(260, 23);
|
||||||
this.tbDataFolder.TabIndex = 5;
|
this.tbDataFolder.TabIndex = 2;
|
||||||
this.toolTip.SetToolTip(this.tbDataFolder, "Path to the data folder. Must be either an absolute path,\r\nor a simple folder name that will be created in LocalAppData.");
|
this.toolTip.SetToolTip(this.tbDataFolder, "Path to the data folder. Must be either an absolute path,\r\nor a simple folder nam" +
|
||||||
|
"e that will be created in LocalAppData.");
|
||||||
//
|
//
|
||||||
// tbShortcutTarget
|
// tbShortcutTarget
|
||||||
//
|
//
|
||||||
this.tbShortcutTarget.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
this.tbShortcutTarget.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||||
| System.Windows.Forms.AnchorStyles.Right)));
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
this.tbShortcutTarget.Cursor = System.Windows.Forms.Cursors.Hand;
|
this.tbShortcutTarget.Cursor = System.Windows.Forms.Cursors.Hand;
|
||||||
this.tbShortcutTarget.Location = new System.Drawing.Point(15, 186);
|
this.tbShortcutTarget.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.tbShortcutTarget.Location = new System.Drawing.Point(3, 110);
|
||||||
this.tbShortcutTarget.Name = "tbShortcutTarget";
|
this.tbShortcutTarget.Name = "tbShortcutTarget";
|
||||||
this.tbShortcutTarget.ReadOnly = true;
|
this.tbShortcutTarget.ReadOnly = true;
|
||||||
this.tbShortcutTarget.Size = new System.Drawing.Size(257, 20);
|
this.tbShortcutTarget.Size = new System.Drawing.Size(260, 23);
|
||||||
this.tbShortcutTarget.TabIndex = 7;
|
this.tbShortcutTarget.TabIndex = 4;
|
||||||
this.tbShortcutTarget.Click += new System.EventHandler(this.tbShortcutTarget_Click);
|
this.tbShortcutTarget.Click += new System.EventHandler(this.tbShortcutTarget_Click);
|
||||||
//
|
//
|
||||||
// labelLocale
|
|
||||||
//
|
|
||||||
this.labelLocale.AutoSize = true;
|
|
||||||
this.labelLocale.Location = new System.Drawing.Point(12, 67);
|
|
||||||
this.labelLocale.Margin = new System.Windows.Forms.Padding(3, 12, 3, 0);
|
|
||||||
this.labelLocale.Name = "labelLocale";
|
|
||||||
this.labelLocale.Size = new System.Drawing.Size(39, 13);
|
|
||||||
this.labelLocale.TabIndex = 2;
|
|
||||||
this.labelLocale.Text = "Locale";
|
|
||||||
//
|
|
||||||
// labelDataFolder
|
// labelDataFolder
|
||||||
//
|
//
|
||||||
this.labelDataFolder.AutoSize = true;
|
this.labelDataFolder.AutoSize = true;
|
||||||
this.labelDataFolder.Location = new System.Drawing.Point(12, 119);
|
this.labelDataFolder.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.labelDataFolder.Location = new System.Drawing.Point(3, 36);
|
||||||
this.labelDataFolder.Margin = new System.Windows.Forms.Padding(3, 12, 3, 0);
|
this.labelDataFolder.Margin = new System.Windows.Forms.Padding(3, 12, 3, 0);
|
||||||
this.labelDataFolder.Name = "labelDataFolder";
|
this.labelDataFolder.Name = "labelDataFolder";
|
||||||
this.labelDataFolder.Size = new System.Drawing.Size(62, 13);
|
this.labelDataFolder.Size = new System.Drawing.Size(67, 15);
|
||||||
this.labelDataFolder.TabIndex = 4;
|
this.labelDataFolder.TabIndex = 1;
|
||||||
this.labelDataFolder.Text = "Data Folder";
|
this.labelDataFolder.Text = "Data Folder";
|
||||||
//
|
//
|
||||||
// labelShortcutTarget
|
// labelShortcutTarget
|
||||||
//
|
//
|
||||||
this.labelShortcutTarget.AutoSize = true;
|
this.labelShortcutTarget.AutoSize = true;
|
||||||
this.labelShortcutTarget.Location = new System.Drawing.Point(12, 170);
|
this.labelShortcutTarget.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.labelShortcutTarget.Location = new System.Drawing.Point(3, 92);
|
||||||
this.labelShortcutTarget.Margin = new System.Windows.Forms.Padding(3, 12, 3, 0);
|
this.labelShortcutTarget.Margin = new System.Windows.Forms.Padding(3, 12, 3, 0);
|
||||||
this.labelShortcutTarget.Name = "labelShortcutTarget";
|
this.labelShortcutTarget.Name = "labelShortcutTarget";
|
||||||
this.labelShortcutTarget.Size = new System.Drawing.Size(155, 13);
|
this.labelShortcutTarget.Size = new System.Drawing.Size(171, 15);
|
||||||
this.labelShortcutTarget.TabIndex = 6;
|
this.labelShortcutTarget.TabIndex = 3;
|
||||||
this.labelShortcutTarget.Text = "Shortcut Target (click to select)";
|
this.labelShortcutTarget.Text = "Shortcut Target (click to select)";
|
||||||
//
|
//
|
||||||
|
// flowPanel
|
||||||
|
//
|
||||||
|
this.flowPanel.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.flowPanel.Controls.Add(this.cbLogging);
|
||||||
|
this.flowPanel.Controls.Add(this.labelDataFolder);
|
||||||
|
this.flowPanel.Controls.Add(this.tbDataFolder);
|
||||||
|
this.flowPanel.Controls.Add(this.labelShortcutTarget);
|
||||||
|
this.flowPanel.Controls.Add(this.tbShortcutTarget);
|
||||||
|
this.flowPanel.FlowDirection = System.Windows.Forms.FlowDirection.TopDown;
|
||||||
|
this.flowPanel.Location = new System.Drawing.Point(9, 9);
|
||||||
|
this.flowPanel.Margin = new System.Windows.Forms.Padding(0);
|
||||||
|
this.flowPanel.Name = "flowPanel";
|
||||||
|
this.flowPanel.Size = new System.Drawing.Size(266, 136);
|
||||||
|
this.flowPanel.TabIndex = 0;
|
||||||
|
this.flowPanel.WrapContents = false;
|
||||||
|
//
|
||||||
// DialogSettingsRestart
|
// DialogSettingsRestart
|
||||||
//
|
//
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
this.ClientSize = new System.Drawing.Size(284, 252);
|
this.ClientSize = new System.Drawing.Size(284, 183);
|
||||||
this.Controls.Add(this.tbShortcutTarget);
|
this.Controls.Add(this.flowPanel);
|
||||||
this.Controls.Add(this.labelShortcutTarget);
|
|
||||||
this.Controls.Add(this.tbDataFolder);
|
|
||||||
this.Controls.Add(this.labelDataFolder);
|
|
||||||
this.Controls.Add(this.comboLocale);
|
|
||||||
this.Controls.Add(this.labelLocale);
|
|
||||||
this.Controls.Add(this.cbDebugUpdates);
|
|
||||||
this.Controls.Add(this.cbLogging);
|
|
||||||
this.Controls.Add(this.btnRestart);
|
this.Controls.Add(this.btnRestart);
|
||||||
this.Controls.Add(this.btnCancel);
|
this.Controls.Add(this.btnCancel);
|
||||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
|
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
|
||||||
@@ -168,6 +154,8 @@
|
|||||||
this.Name = "DialogSettingsRestart";
|
this.Name = "DialogSettingsRestart";
|
||||||
this.ShowIcon = false;
|
this.ShowIcon = false;
|
||||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
|
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
|
||||||
|
this.flowPanel.ResumeLayout(false);
|
||||||
|
this.flowPanel.PerformLayout();
|
||||||
this.ResumeLayout(false);
|
this.ResumeLayout(false);
|
||||||
this.PerformLayout();
|
this.PerformLayout();
|
||||||
|
|
||||||
@@ -179,12 +167,10 @@
|
|||||||
private System.Windows.Forms.Button btnRestart;
|
private System.Windows.Forms.Button btnRestart;
|
||||||
private System.Windows.Forms.CheckBox cbLogging;
|
private System.Windows.Forms.CheckBox cbLogging;
|
||||||
private System.Windows.Forms.ToolTip toolTip;
|
private System.Windows.Forms.ToolTip toolTip;
|
||||||
private System.Windows.Forms.CheckBox cbDebugUpdates;
|
|
||||||
private System.Windows.Forms.Label labelLocale;
|
|
||||||
private System.Windows.Forms.ComboBox comboLocale;
|
|
||||||
private System.Windows.Forms.Label labelDataFolder;
|
private System.Windows.Forms.Label labelDataFolder;
|
||||||
private System.Windows.Forms.TextBox tbDataFolder;
|
private System.Windows.Forms.TextBox tbDataFolder;
|
||||||
private System.Windows.Forms.TextBox tbShortcutTarget;
|
private System.Windows.Forms.TextBox tbShortcutTarget;
|
||||||
private System.Windows.Forms.Label labelShortcutTarget;
|
private System.Windows.Forms.Label labelShortcutTarget;
|
||||||
|
private System.Windows.Forms.FlowLayoutPanel flowPanel;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,33 +1,17 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using TweetDuck.Configuration;
|
using TweetDuck.Configuration;
|
||||||
using TweetDuck.Data;
|
using TweetDuck.Data;
|
||||||
|
|
||||||
namespace TweetDuck.Core.Other.Settings.Dialogs{
|
namespace TweetDuck.Core.Other.Settings.Dialogs{
|
||||||
sealed partial class DialogSettingsRestart : Form{
|
sealed partial class DialogSettingsRestart : Form{
|
||||||
private const string DefaultLocale = "en-US";
|
|
||||||
|
|
||||||
public CommandLineArgs Args { get; private set; }
|
public CommandLineArgs Args { get; private set; }
|
||||||
|
|
||||||
public DialogSettingsRestart(CommandLineArgs currentArgs){
|
public DialogSettingsRestart(CommandLineArgs currentArgs){
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
try{
|
|
||||||
object[] locales = Directory.EnumerateFiles(Path.Combine(Program.ProgramPath, "locales"), "*.pak", SearchOption.TopDirectoryOnly).Select(Path.GetFileNameWithoutExtension).ToArray<object>();
|
|
||||||
comboLocale.Items.AddRange(locales);
|
|
||||||
}catch{
|
|
||||||
comboLocale.Items.Add(DefaultLocale);
|
|
||||||
}
|
|
||||||
|
|
||||||
cbLogging.Checked = currentArgs.HasFlag(Arguments.ArgLogging);
|
cbLogging.Checked = currentArgs.HasFlag(Arguments.ArgLogging);
|
||||||
cbDebugUpdates.Checked = currentArgs.HasFlag(Arguments.ArgDebugUpdates);
|
|
||||||
comboLocale.SelectedItem = currentArgs.GetValue(Arguments.ArgLocale, DefaultLocale);
|
|
||||||
|
|
||||||
cbLogging.CheckedChanged += control_Change;
|
cbLogging.CheckedChanged += control_Change;
|
||||||
cbDebugUpdates.CheckedChanged += control_Change;
|
|
||||||
comboLocale.SelectedValueChanged += control_Change;
|
|
||||||
|
|
||||||
if (Program.IsPortable){
|
if (Program.IsPortable){
|
||||||
tbDataFolder.Text = "Not available in portable version";
|
tbDataFolder.Text = "Not available in portable version";
|
||||||
@@ -50,16 +34,6 @@ namespace TweetDuck.Core.Other.Settings.Dialogs{
|
|||||||
Args.AddFlag(Arguments.ArgLogging);
|
Args.AddFlag(Arguments.ArgLogging);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cbDebugUpdates.Checked){
|
|
||||||
Args.AddFlag(Arguments.ArgDebugUpdates);
|
|
||||||
}
|
|
||||||
|
|
||||||
string locale = comboLocale.SelectedItem as string;
|
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(locale) && locale != DefaultLocale){
|
|
||||||
Args.SetValue(Arguments.ArgLocale, locale);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(tbDataFolder.Text) && tbDataFolder.Enabled){
|
if (!string.IsNullOrWhiteSpace(tbDataFolder.Text) && tbDataFolder.Enabled){
|
||||||
Args.SetValue(Arguments.ArgDataFolder, tbDataFolder.Text);
|
Args.SetValue(Arguments.ArgDataFolder, tbDataFolder.Text);
|
||||||
}
|
}
|
||||||
|
|||||||
109
Core/Other/Settings/Dialogs/DialogSettingsSearchEngine.Designer.cs
generated
Normal file
109
Core/Other/Settings/Dialogs/DialogSettingsSearchEngine.Designer.cs
generated
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
namespace TweetDuck.Core.Other.Settings.Dialogs {
|
||||||
|
partial class DialogSettingsSearchEngine {
|
||||||
|
/// <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.textBoxUrl = new System.Windows.Forms.TextBox();
|
||||||
|
this.btnCancel = new System.Windows.Forms.Button();
|
||||||
|
this.btnApply = new System.Windows.Forms.Button();
|
||||||
|
this.labelInfo = new System.Windows.Forms.Label();
|
||||||
|
this.SuspendLayout();
|
||||||
|
//
|
||||||
|
// textBoxUrl
|
||||||
|
//
|
||||||
|
this.textBoxUrl.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.textBoxUrl.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.textBoxUrl.Location = new System.Drawing.Point(12, 30);
|
||||||
|
this.textBoxUrl.Name = "textBoxUrl";
|
||||||
|
this.textBoxUrl.Size = new System.Drawing.Size(310, 23);
|
||||||
|
this.textBoxUrl.TabIndex = 1;
|
||||||
|
//
|
||||||
|
// btnCancel
|
||||||
|
//
|
||||||
|
this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||||
|
this.btnCancel.AutoSize = true;
|
||||||
|
this.btnCancel.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.btnCancel.Location = new System.Drawing.Point(207, 59);
|
||||||
|
this.btnCancel.Name = "btnCancel";
|
||||||
|
this.btnCancel.Padding = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||||
|
this.btnCancel.Size = new System.Drawing.Size(57, 25);
|
||||||
|
this.btnCancel.TabIndex = 3;
|
||||||
|
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.AutoSize = true;
|
||||||
|
this.btnApply.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.btnApply.Location = new System.Drawing.Point(270, 59);
|
||||||
|
this.btnApply.Name = "btnApply";
|
||||||
|
this.btnApply.Padding = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||||
|
this.btnApply.Size = new System.Drawing.Size(52, 25);
|
||||||
|
this.btnApply.TabIndex = 2;
|
||||||
|
this.btnApply.Text = "Apply";
|
||||||
|
this.btnApply.UseVisualStyleBackColor = true;
|
||||||
|
this.btnApply.Click += new System.EventHandler(this.btnApply_Click);
|
||||||
|
//
|
||||||
|
// labelInfo
|
||||||
|
//
|
||||||
|
this.labelInfo.AutoSize = true;
|
||||||
|
this.labelInfo.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.labelInfo.Location = new System.Drawing.Point(12, 9);
|
||||||
|
this.labelInfo.Margin = new System.Windows.Forms.Padding(3, 0, 3, 3);
|
||||||
|
this.labelInfo.Name = "labelInfo";
|
||||||
|
this.labelInfo.Size = new System.Drawing.Size(287, 15);
|
||||||
|
this.labelInfo.TabIndex = 0;
|
||||||
|
this.labelInfo.Text = "The search query will be added at the end of the URL.";
|
||||||
|
//
|
||||||
|
// DialogSettingsSearchEngine
|
||||||
|
//
|
||||||
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
|
this.ClientSize = new System.Drawing.Size(334, 96);
|
||||||
|
this.Controls.Add(this.labelInfo);
|
||||||
|
this.Controls.Add(this.btnApply);
|
||||||
|
this.Controls.Add(this.btnCancel);
|
||||||
|
this.Controls.Add(this.textBoxUrl);
|
||||||
|
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
|
||||||
|
this.MaximizeBox = false;
|
||||||
|
this.MinimizeBox = false;
|
||||||
|
this.Name = "DialogSettingsSearchEngine";
|
||||||
|
this.ShowIcon = false;
|
||||||
|
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
|
||||||
|
this.ResumeLayout(false);
|
||||||
|
this.PerformLayout();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
private System.Windows.Forms.TextBox textBoxUrl;
|
||||||
|
private System.Windows.Forms.Button btnCancel;
|
||||||
|
private System.Windows.Forms.Button btnApply;
|
||||||
|
private System.Windows.Forms.Label labelInfo;
|
||||||
|
}
|
||||||
|
}
|
||||||
27
Core/Other/Settings/Dialogs/DialogSettingsSearchEngine.cs
Normal file
27
Core/Other/Settings/Dialogs/DialogSettingsSearchEngine.cs
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
using System;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
|
namespace TweetDuck.Core.Other.Settings.Dialogs{
|
||||||
|
sealed partial class DialogSettingsSearchEngine : Form{
|
||||||
|
public string Url => textBoxUrl.Text;
|
||||||
|
|
||||||
|
public DialogSettingsSearchEngine(){
|
||||||
|
InitializeComponent();
|
||||||
|
|
||||||
|
Text = Program.BrandName+" Options - Custom Search Engine";
|
||||||
|
|
||||||
|
textBoxUrl.Text = Program.UserConfig.SearchEngineUrl ?? "";
|
||||||
|
textBoxUrl.Select(textBoxUrl.Text.Length, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnApply_Click(object sender, EventArgs e){
|
||||||
|
DialogResult = DialogResult.OK;
|
||||||
|
Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnCancel_Click(object sender, EventArgs e){
|
||||||
|
DialogResult = DialogResult.Cancel;
|
||||||
|
Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
using System;
|
|
||||||
|
|
||||||
namespace TweetDuck.Core.Other.Settings.Export{
|
|
||||||
[Flags]
|
|
||||||
enum ExportFileFlags{
|
|
||||||
None = 0,
|
|
||||||
UserConfig = 1,
|
|
||||||
SystemConfig = 2, // TODO implement later
|
|
||||||
Session = 4,
|
|
||||||
PluginData = 8,
|
|
||||||
All = UserConfig|SystemConfig|Session|PluginData
|
|
||||||
}
|
|
||||||
}
|
|
||||||
265
Core/Other/Settings/TabSettingsAdvanced.Designer.cs
generated
265
Core/Other/Settings/TabSettingsAdvanced.Designer.cs
generated
@@ -33,236 +33,266 @@
|
|||||||
this.btnRestart = new System.Windows.Forms.Button();
|
this.btnRestart = new System.Windows.Forms.Button();
|
||||||
this.btnOpenAppFolder = new System.Windows.Forms.Button();
|
this.btnOpenAppFolder = new System.Windows.Forms.Button();
|
||||||
this.btnOpenDataFolder = new System.Windows.Forms.Button();
|
this.btnOpenDataFolder = new System.Windows.Forms.Button();
|
||||||
this.numMemoryThreshold = new TweetDuck.Core.Controls.NumericUpDownEx();
|
this.numClearCacheThreshold = new TweetDuck.Core.Controls.NumericUpDownEx();
|
||||||
this.checkBrowserGCReload = new System.Windows.Forms.CheckBox();
|
this.checkClearCacheAuto = new System.Windows.Forms.CheckBox();
|
||||||
this.labelApp = new System.Windows.Forms.Label();
|
this.labelApp = new System.Windows.Forms.Label();
|
||||||
this.panelApp = new System.Windows.Forms.Panel();
|
this.panelAppButtons = new System.Windows.Forms.Panel();
|
||||||
this.labelPerformance = new System.Windows.Forms.Label();
|
this.labelPerformance = new System.Windows.Forms.Label();
|
||||||
this.panelPerformance = new System.Windows.Forms.Panel();
|
this.panelClearCacheAuto = new System.Windows.Forms.Panel();
|
||||||
this.labelMemoryUsage = new System.Windows.Forms.Label();
|
this.labelCache = new System.Windows.Forms.Label();
|
||||||
this.panelConfiguration = new System.Windows.Forms.Panel();
|
this.panelConfiguration = new System.Windows.Forms.Panel();
|
||||||
this.labelConfiguration = new System.Windows.Forms.Label();
|
this.labelConfiguration = new System.Windows.Forms.Label();
|
||||||
((System.ComponentModel.ISupportInitialize)(this.numMemoryThreshold)).BeginInit();
|
this.flowPanel = new System.Windows.Forms.FlowLayoutPanel();
|
||||||
this.panelApp.SuspendLayout();
|
((System.ComponentModel.ISupportInitialize)(this.numClearCacheThreshold)).BeginInit();
|
||||||
this.panelPerformance.SuspendLayout();
|
this.panelAppButtons.SuspendLayout();
|
||||||
|
this.panelClearCacheAuto.SuspendLayout();
|
||||||
this.panelConfiguration.SuspendLayout();
|
this.panelConfiguration.SuspendLayout();
|
||||||
|
this.flowPanel.SuspendLayout();
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
//
|
//
|
||||||
// btnClearCache
|
// btnClearCache
|
||||||
//
|
//
|
||||||
this.btnClearCache.Location = new System.Drawing.Point(5, 28);
|
this.btnClearCache.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.btnClearCache.Location = new System.Drawing.Point(5, 179);
|
||||||
this.btnClearCache.Margin = new System.Windows.Forms.Padding(5, 3, 3, 3);
|
this.btnClearCache.Margin = new System.Windows.Forms.Padding(5, 3, 3, 3);
|
||||||
this.btnClearCache.Name = "btnClearCache";
|
this.btnClearCache.Name = "btnClearCache";
|
||||||
this.btnClearCache.Size = new System.Drawing.Size(144, 23);
|
this.btnClearCache.Size = new System.Drawing.Size(144, 25);
|
||||||
this.btnClearCache.TabIndex = 1;
|
this.btnClearCache.TabIndex = 5;
|
||||||
this.btnClearCache.Text = "Clear Cache (calculating)";
|
this.btnClearCache.Text = "Clear Cache (...)";
|
||||||
this.toolTip.SetToolTip(this.btnClearCache, "Clearing cache will free up space taken by downloaded images and other resources.");
|
|
||||||
this.btnClearCache.UseVisualStyleBackColor = true;
|
this.btnClearCache.UseVisualStyleBackColor = true;
|
||||||
//
|
//
|
||||||
// checkHardwareAcceleration
|
// checkHardwareAcceleration
|
||||||
//
|
//
|
||||||
this.checkHardwareAcceleration.AutoSize = true;
|
this.checkHardwareAcceleration.AutoSize = true;
|
||||||
this.checkHardwareAcceleration.Location = new System.Drawing.Point(6, 5);
|
this.checkHardwareAcceleration.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.checkHardwareAcceleration.Margin = new System.Windows.Forms.Padding(6, 5, 3, 3);
|
this.checkHardwareAcceleration.Location = new System.Drawing.Point(6, 128);
|
||||||
|
this.checkHardwareAcceleration.Margin = new System.Windows.Forms.Padding(6, 6, 3, 2);
|
||||||
this.checkHardwareAcceleration.Name = "checkHardwareAcceleration";
|
this.checkHardwareAcceleration.Name = "checkHardwareAcceleration";
|
||||||
this.checkHardwareAcceleration.Size = new System.Drawing.Size(134, 17);
|
this.checkHardwareAcceleration.Size = new System.Drawing.Size(146, 19);
|
||||||
this.checkHardwareAcceleration.TabIndex = 0;
|
this.checkHardwareAcceleration.TabIndex = 3;
|
||||||
this.checkHardwareAcceleration.Text = "Hardware Acceleration";
|
this.checkHardwareAcceleration.Text = "Hardware Acceleration";
|
||||||
this.toolTip.SetToolTip(this.checkHardwareAcceleration, "Uses graphics card to improve performance. Disable if you experience\r\nvisual glitches. This option will not be exported in a profile.");
|
|
||||||
this.checkHardwareAcceleration.UseVisualStyleBackColor = true;
|
this.checkHardwareAcceleration.UseVisualStyleBackColor = true;
|
||||||
//
|
//
|
||||||
// btnEditCefArgs
|
// btnEditCefArgs
|
||||||
//
|
//
|
||||||
|
this.btnEditCefArgs.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.btnEditCefArgs.Location = new System.Drawing.Point(5, 3);
|
this.btnEditCefArgs.Location = new System.Drawing.Point(5, 3);
|
||||||
this.btnEditCefArgs.Margin = new System.Windows.Forms.Padding(5, 3, 3, 3);
|
this.btnEditCefArgs.Margin = new System.Windows.Forms.Padding(5, 3, 3, 3);
|
||||||
this.btnEditCefArgs.Name = "btnEditCefArgs";
|
this.btnEditCefArgs.Name = "btnEditCefArgs";
|
||||||
this.btnEditCefArgs.Size = new System.Drawing.Size(144, 23);
|
this.btnEditCefArgs.Size = new System.Drawing.Size(144, 25);
|
||||||
this.btnEditCefArgs.TabIndex = 0;
|
this.btnEditCefArgs.TabIndex = 0;
|
||||||
this.btnEditCefArgs.Text = "Edit CEF Arguments";
|
this.btnEditCefArgs.Text = "Edit CEF Arguments";
|
||||||
this.toolTip.SetToolTip(this.btnEditCefArgs, "Set custom command line arguments for Chromium Embedded Framework.");
|
|
||||||
this.btnEditCefArgs.UseVisualStyleBackColor = true;
|
this.btnEditCefArgs.UseVisualStyleBackColor = true;
|
||||||
//
|
//
|
||||||
// btnEditCSS
|
// btnEditCSS
|
||||||
//
|
//
|
||||||
|
this.btnEditCSS.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.btnEditCSS.Location = new System.Drawing.Point(155, 3);
|
this.btnEditCSS.Location = new System.Drawing.Point(155, 3);
|
||||||
this.btnEditCSS.Name = "btnEditCSS";
|
this.btnEditCSS.Name = "btnEditCSS";
|
||||||
this.btnEditCSS.Size = new System.Drawing.Size(144, 23);
|
this.btnEditCSS.Size = new System.Drawing.Size(144, 25);
|
||||||
this.btnEditCSS.TabIndex = 1;
|
this.btnEditCSS.TabIndex = 1;
|
||||||
this.btnEditCSS.Text = "Edit CSS";
|
this.btnEditCSS.Text = "Edit CSS";
|
||||||
this.toolTip.SetToolTip(this.btnEditCSS, "Set custom CSS for browser and notification windows.");
|
|
||||||
this.btnEditCSS.UseVisualStyleBackColor = true;
|
this.btnEditCSS.UseVisualStyleBackColor = true;
|
||||||
//
|
//
|
||||||
// btnRestartArgs
|
// btnRestartArgs
|
||||||
//
|
//
|
||||||
|
this.btnRestartArgs.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.btnRestartArgs.Location = new System.Drawing.Point(155, 32);
|
this.btnRestartArgs.Location = new System.Drawing.Point(155, 32);
|
||||||
this.btnRestartArgs.Name = "btnRestartArgs";
|
this.btnRestartArgs.Name = "btnRestartArgs";
|
||||||
this.btnRestartArgs.Size = new System.Drawing.Size(144, 23);
|
this.btnRestartArgs.Size = new System.Drawing.Size(144, 25);
|
||||||
this.btnRestartArgs.TabIndex = 3;
|
this.btnRestartArgs.TabIndex = 3;
|
||||||
this.btnRestartArgs.Text = "Restart with Arguments";
|
this.btnRestartArgs.Text = "Restart with Arguments";
|
||||||
this.toolTip.SetToolTip(this.btnRestartArgs, "Restarts the program with customizable\r\ncommand line arguments.");
|
|
||||||
this.btnRestartArgs.UseVisualStyleBackColor = true;
|
this.btnRestartArgs.UseVisualStyleBackColor = true;
|
||||||
//
|
//
|
||||||
// btnRestart
|
// btnRestart
|
||||||
//
|
//
|
||||||
|
this.btnRestart.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.btnRestart.Location = new System.Drawing.Point(155, 3);
|
this.btnRestart.Location = new System.Drawing.Point(155, 3);
|
||||||
this.btnRestart.Name = "btnRestart";
|
this.btnRestart.Name = "btnRestart";
|
||||||
this.btnRestart.Size = new System.Drawing.Size(144, 23);
|
this.btnRestart.Size = new System.Drawing.Size(144, 25);
|
||||||
this.btnRestart.TabIndex = 2;
|
this.btnRestart.TabIndex = 2;
|
||||||
this.btnRestart.Text = "Restart the Program";
|
this.btnRestart.Text = "Restart the Program";
|
||||||
this.toolTip.SetToolTip(this.btnRestart, "Restarts the program using the same command\r\nline arguments that were used at launch.");
|
|
||||||
this.btnRestart.UseVisualStyleBackColor = true;
|
this.btnRestart.UseVisualStyleBackColor = true;
|
||||||
//
|
//
|
||||||
// btnOpenAppFolder
|
// btnOpenAppFolder
|
||||||
//
|
//
|
||||||
|
this.btnOpenAppFolder.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.btnOpenAppFolder.Location = new System.Drawing.Point(5, 3);
|
this.btnOpenAppFolder.Location = new System.Drawing.Point(5, 3);
|
||||||
this.btnOpenAppFolder.Margin = new System.Windows.Forms.Padding(5, 3, 3, 3);
|
this.btnOpenAppFolder.Margin = new System.Windows.Forms.Padding(5, 3, 3, 3);
|
||||||
this.btnOpenAppFolder.Name = "btnOpenAppFolder";
|
this.btnOpenAppFolder.Name = "btnOpenAppFolder";
|
||||||
this.btnOpenAppFolder.Size = new System.Drawing.Size(144, 23);
|
this.btnOpenAppFolder.Size = new System.Drawing.Size(144, 25);
|
||||||
this.btnOpenAppFolder.TabIndex = 0;
|
this.btnOpenAppFolder.TabIndex = 0;
|
||||||
this.btnOpenAppFolder.Text = "Open Program Folder";
|
this.btnOpenAppFolder.Text = "Open Program Folder";
|
||||||
this.toolTip.SetToolTip(this.btnOpenAppFolder, "Opens the folder where the app is located.");
|
|
||||||
this.btnOpenAppFolder.UseVisualStyleBackColor = true;
|
this.btnOpenAppFolder.UseVisualStyleBackColor = true;
|
||||||
//
|
//
|
||||||
// btnOpenDataFolder
|
// btnOpenDataFolder
|
||||||
//
|
//
|
||||||
|
this.btnOpenDataFolder.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.btnOpenDataFolder.Location = new System.Drawing.Point(5, 32);
|
this.btnOpenDataFolder.Location = new System.Drawing.Point(5, 32);
|
||||||
this.btnOpenDataFolder.Margin = new System.Windows.Forms.Padding(5, 3, 3, 3);
|
this.btnOpenDataFolder.Margin = new System.Windows.Forms.Padding(5, 3, 3, 3);
|
||||||
this.btnOpenDataFolder.Name = "btnOpenDataFolder";
|
this.btnOpenDataFolder.Name = "btnOpenDataFolder";
|
||||||
this.btnOpenDataFolder.Size = new System.Drawing.Size(144, 23);
|
this.btnOpenDataFolder.Size = new System.Drawing.Size(144, 25);
|
||||||
this.btnOpenDataFolder.TabIndex = 1;
|
this.btnOpenDataFolder.TabIndex = 1;
|
||||||
this.btnOpenDataFolder.Text = "Open Data Folder";
|
this.btnOpenDataFolder.Text = "Open Data Folder";
|
||||||
this.toolTip.SetToolTip(this.btnOpenDataFolder, "Opens the folder where your profile data is located.");
|
|
||||||
this.btnOpenDataFolder.UseVisualStyleBackColor = true;
|
this.btnOpenDataFolder.UseVisualStyleBackColor = true;
|
||||||
//
|
//
|
||||||
// numMemoryThreshold
|
// numClearCacheThreshold
|
||||||
//
|
//
|
||||||
this.numMemoryThreshold.Increment = new decimal(new int[] {
|
this.numClearCacheThreshold.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.numClearCacheThreshold.Increment = new decimal(new int[] {
|
||||||
50,
|
50,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0});
|
0});
|
||||||
this.numMemoryThreshold.Location = new System.Drawing.Point(202, 82);
|
this.numClearCacheThreshold.Location = new System.Drawing.Point(246, 5);
|
||||||
this.numMemoryThreshold.Maximum = 2000;
|
this.numClearCacheThreshold.Maximum = new decimal(new int[] {
|
||||||
this.numMemoryThreshold.Minimum = 200;
|
1000,
|
||||||
this.numMemoryThreshold.Name = "numMemoryThreshold";
|
0,
|
||||||
this.numMemoryThreshold.Size = new System.Drawing.Size(97, 20);
|
0,
|
||||||
this.numMemoryThreshold.TabIndex = 4;
|
0});
|
||||||
this.numMemoryThreshold.TextSuffix = " MB";
|
this.numClearCacheThreshold.Minimum = new decimal(new int[] {
|
||||||
this.toolTip.SetToolTip(this.numMemoryThreshold, "Minimum amount of memory usage by the browser process to trigger the cleanup.\r\nThis is not a limit, the usage is allowed to exceed this value.");
|
100,
|
||||||
this.numMemoryThreshold.Value = 400;
|
0,
|
||||||
|
0,
|
||||||
|
0});
|
||||||
|
this.numClearCacheThreshold.Name = "numClearCacheThreshold";
|
||||||
|
this.numClearCacheThreshold.Size = new System.Drawing.Size(68, 23);
|
||||||
|
this.numClearCacheThreshold.TabIndex = 1;
|
||||||
|
this.numClearCacheThreshold.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
|
||||||
|
this.numClearCacheThreshold.TextSuffix = " MB";
|
||||||
|
this.numClearCacheThreshold.Value = new decimal(new int[] {
|
||||||
|
250,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0});
|
||||||
//
|
//
|
||||||
// checkBrowserGCReload
|
// checkClearCacheAuto
|
||||||
//
|
//
|
||||||
this.checkBrowserGCReload.AutoSize = true;
|
this.checkClearCacheAuto.AutoSize = true;
|
||||||
this.checkBrowserGCReload.Location = new System.Drawing.Point(6, 84);
|
this.checkClearCacheAuto.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.checkBrowserGCReload.Margin = new System.Windows.Forms.Padding(6, 5, 3, 3);
|
this.checkClearCacheAuto.Location = new System.Drawing.Point(6, 6);
|
||||||
this.checkBrowserGCReload.Name = "checkBrowserGCReload";
|
this.checkClearCacheAuto.Margin = new System.Windows.Forms.Padding(6, 6, 0, 2);
|
||||||
this.checkBrowserGCReload.Size = new System.Drawing.Size(190, 17);
|
this.checkClearCacheAuto.Name = "checkClearCacheAuto";
|
||||||
this.checkBrowserGCReload.TabIndex = 3;
|
this.checkClearCacheAuto.Size = new System.Drawing.Size(237, 19);
|
||||||
this.checkBrowserGCReload.Text = "Enable Browser Memory Threshold";
|
this.checkClearCacheAuto.TabIndex = 0;
|
||||||
this.toolTip.SetToolTip(this.checkBrowserGCReload, "Automatically reloads TweetDeck to save memory. This option only works if\r\nthe browser is in a \'default state\', i.e. all modals and drawers are closed, and\r\nall columns are scrolled to top. This option will not be exported in a profile.");
|
this.checkClearCacheAuto.Text = "Clear Cache Automatically When Above";
|
||||||
this.checkBrowserGCReload.UseVisualStyleBackColor = true;
|
this.checkClearCacheAuto.UseVisualStyleBackColor = true;
|
||||||
//
|
//
|
||||||
// labelApp
|
// labelApp
|
||||||
//
|
//
|
||||||
this.labelApp.AutoSize = true;
|
this.labelApp.AutoSize = true;
|
||||||
this.labelApp.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
this.labelApp.Font = new System.Drawing.Font("Segoe UI", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.labelApp.Location = new System.Drawing.Point(6, 8);
|
this.labelApp.Location = new System.Drawing.Point(0, 0);
|
||||||
this.labelApp.Margin = new System.Windows.Forms.Padding(0, 2, 0, 0);
|
this.labelApp.Margin = new System.Windows.Forms.Padding(0);
|
||||||
this.labelApp.Name = "labelApp";
|
this.labelApp.Name = "labelApp";
|
||||||
this.labelApp.Size = new System.Drawing.Size(38, 20);
|
this.labelApp.Size = new System.Drawing.Size(37, 20);
|
||||||
this.labelApp.TabIndex = 0;
|
this.labelApp.TabIndex = 0;
|
||||||
this.labelApp.Text = "App";
|
this.labelApp.Text = "App";
|
||||||
//
|
//
|
||||||
// panelApp
|
// panelAppButtons
|
||||||
//
|
//
|
||||||
this.panelApp.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
this.panelAppButtons.Anchor = System.Windows.Forms.AnchorStyles.Top;
|
||||||
| System.Windows.Forms.AnchorStyles.Right)));
|
this.panelAppButtons.Controls.Add(this.btnOpenDataFolder);
|
||||||
this.panelApp.Controls.Add(this.btnOpenDataFolder);
|
this.panelAppButtons.Controls.Add(this.btnOpenAppFolder);
|
||||||
this.panelApp.Controls.Add(this.btnOpenAppFolder);
|
this.panelAppButtons.Controls.Add(this.btnRestart);
|
||||||
this.panelApp.Controls.Add(this.btnRestart);
|
this.panelAppButtons.Controls.Add(this.btnRestartArgs);
|
||||||
this.panelApp.Controls.Add(this.btnRestartArgs);
|
this.panelAppButtons.Location = new System.Drawing.Point(0, 20);
|
||||||
this.panelApp.Location = new System.Drawing.Point(9, 31);
|
this.panelAppButtons.Margin = new System.Windows.Forms.Padding(0);
|
||||||
this.panelApp.Name = "panelApp";
|
this.panelAppButtons.Name = "panelAppButtons";
|
||||||
this.panelApp.Size = new System.Drawing.Size(322, 59);
|
this.panelAppButtons.Size = new System.Drawing.Size(322, 62);
|
||||||
this.panelApp.TabIndex = 1;
|
this.panelAppButtons.TabIndex = 1;
|
||||||
//
|
//
|
||||||
// labelPerformance
|
// labelPerformance
|
||||||
//
|
//
|
||||||
this.labelPerformance.AutoSize = true;
|
this.labelPerformance.AutoSize = true;
|
||||||
this.labelPerformance.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
this.labelPerformance.Font = new System.Drawing.Font("Segoe UI", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.labelPerformance.Location = new System.Drawing.Point(6, 114);
|
this.labelPerformance.Location = new System.Drawing.Point(0, 102);
|
||||||
this.labelPerformance.Margin = new System.Windows.Forms.Padding(0, 21, 0, 0);
|
this.labelPerformance.Margin = new System.Windows.Forms.Padding(0, 20, 0, 0);
|
||||||
this.labelPerformance.Name = "labelPerformance";
|
this.labelPerformance.Name = "labelPerformance";
|
||||||
this.labelPerformance.Size = new System.Drawing.Size(100, 20);
|
this.labelPerformance.Size = new System.Drawing.Size(93, 20);
|
||||||
this.labelPerformance.TabIndex = 2;
|
this.labelPerformance.TabIndex = 2;
|
||||||
this.labelPerformance.Text = "Performance";
|
this.labelPerformance.Text = "Performance";
|
||||||
//
|
//
|
||||||
// panelPerformance
|
// panelClearCacheAuto
|
||||||
//
|
//
|
||||||
this.panelPerformance.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
this.panelClearCacheAuto.Anchor = System.Windows.Forms.AnchorStyles.Top;
|
||||||
| System.Windows.Forms.AnchorStyles.Right)));
|
this.panelClearCacheAuto.Controls.Add(this.checkClearCacheAuto);
|
||||||
this.panelPerformance.Controls.Add(this.checkBrowserGCReload);
|
this.panelClearCacheAuto.Controls.Add(this.numClearCacheThreshold);
|
||||||
this.panelPerformance.Controls.Add(this.numMemoryThreshold);
|
this.panelClearCacheAuto.Location = new System.Drawing.Point(0, 207);
|
||||||
this.panelPerformance.Controls.Add(this.labelMemoryUsage);
|
this.panelClearCacheAuto.Margin = new System.Windows.Forms.Padding(0);
|
||||||
this.panelPerformance.Controls.Add(this.checkHardwareAcceleration);
|
this.panelClearCacheAuto.Name = "panelClearCacheAuto";
|
||||||
this.panelPerformance.Controls.Add(this.btnClearCache);
|
this.panelClearCacheAuto.Size = new System.Drawing.Size(322, 28);
|
||||||
this.panelPerformance.Location = new System.Drawing.Point(9, 137);
|
this.panelClearCacheAuto.TabIndex = 6;
|
||||||
this.panelPerformance.Name = "panelPerformance";
|
|
||||||
this.panelPerformance.Size = new System.Drawing.Size(322, 105);
|
|
||||||
this.panelPerformance.TabIndex = 3;
|
|
||||||
//
|
//
|
||||||
// labelMemoryUsage
|
// labelCache
|
||||||
//
|
//
|
||||||
this.labelMemoryUsage.AutoSize = true;
|
this.labelCache.AutoSize = true;
|
||||||
this.labelMemoryUsage.Location = new System.Drawing.Point(3, 66);
|
this.labelCache.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.labelMemoryUsage.Margin = new System.Windows.Forms.Padding(3, 12, 3, 0);
|
this.labelCache.Location = new System.Drawing.Point(3, 161);
|
||||||
this.labelMemoryUsage.Name = "labelMemoryUsage";
|
this.labelCache.Margin = new System.Windows.Forms.Padding(3, 12, 3, 0);
|
||||||
this.labelMemoryUsage.Size = new System.Drawing.Size(78, 13);
|
this.labelCache.Name = "labelCache";
|
||||||
this.labelMemoryUsage.TabIndex = 2;
|
this.labelCache.Size = new System.Drawing.Size(40, 15);
|
||||||
this.labelMemoryUsage.Text = "Memory Usage";
|
this.labelCache.TabIndex = 4;
|
||||||
|
this.labelCache.Text = "Cache";
|
||||||
//
|
//
|
||||||
// panelConfiguration
|
// panelConfiguration
|
||||||
//
|
//
|
||||||
this.panelConfiguration.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
this.panelConfiguration.Anchor = System.Windows.Forms.AnchorStyles.Top;
|
||||||
| System.Windows.Forms.AnchorStyles.Right)));
|
|
||||||
this.panelConfiguration.Controls.Add(this.btnEditCSS);
|
this.panelConfiguration.Controls.Add(this.btnEditCSS);
|
||||||
this.panelConfiguration.Controls.Add(this.btnEditCefArgs);
|
this.panelConfiguration.Controls.Add(this.btnEditCefArgs);
|
||||||
this.panelConfiguration.Location = new System.Drawing.Point(9, 289);
|
this.panelConfiguration.Location = new System.Drawing.Point(0, 275);
|
||||||
|
this.panelConfiguration.Margin = new System.Windows.Forms.Padding(0);
|
||||||
this.panelConfiguration.Name = "panelConfiguration";
|
this.panelConfiguration.Name = "panelConfiguration";
|
||||||
this.panelConfiguration.Size = new System.Drawing.Size(322, 29);
|
this.panelConfiguration.Size = new System.Drawing.Size(322, 31);
|
||||||
this.panelConfiguration.TabIndex = 5;
|
this.panelConfiguration.TabIndex = 8;
|
||||||
//
|
//
|
||||||
// labelConfiguration
|
// labelConfiguration
|
||||||
//
|
//
|
||||||
this.labelConfiguration.AutoSize = true;
|
this.labelConfiguration.AutoSize = true;
|
||||||
this.labelConfiguration.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
this.labelConfiguration.Font = new System.Drawing.Font("Segoe UI", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.labelConfiguration.Location = new System.Drawing.Point(6, 266);
|
this.labelConfiguration.Location = new System.Drawing.Point(0, 255);
|
||||||
this.labelConfiguration.Margin = new System.Windows.Forms.Padding(0, 21, 0, 0);
|
this.labelConfiguration.Margin = new System.Windows.Forms.Padding(0, 20, 0, 0);
|
||||||
this.labelConfiguration.Name = "labelConfiguration";
|
this.labelConfiguration.Name = "labelConfiguration";
|
||||||
this.labelConfiguration.Size = new System.Drawing.Size(104, 20);
|
this.labelConfiguration.Size = new System.Drawing.Size(100, 20);
|
||||||
this.labelConfiguration.TabIndex = 4;
|
this.labelConfiguration.TabIndex = 7;
|
||||||
this.labelConfiguration.Text = "Configuration";
|
this.labelConfiguration.Text = "Configuration";
|
||||||
//
|
//
|
||||||
|
// flowPanel
|
||||||
|
//
|
||||||
|
this.flowPanel.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.flowPanel.Controls.Add(this.labelApp);
|
||||||
|
this.flowPanel.Controls.Add(this.panelAppButtons);
|
||||||
|
this.flowPanel.Controls.Add(this.labelPerformance);
|
||||||
|
this.flowPanel.Controls.Add(this.checkHardwareAcceleration);
|
||||||
|
this.flowPanel.Controls.Add(this.labelCache);
|
||||||
|
this.flowPanel.Controls.Add(this.btnClearCache);
|
||||||
|
this.flowPanel.Controls.Add(this.panelClearCacheAuto);
|
||||||
|
this.flowPanel.Controls.Add(this.labelConfiguration);
|
||||||
|
this.flowPanel.Controls.Add(this.panelConfiguration);
|
||||||
|
this.flowPanel.FlowDirection = System.Windows.Forms.FlowDirection.TopDown;
|
||||||
|
this.flowPanel.Location = new System.Drawing.Point(9, 9);
|
||||||
|
this.flowPanel.Name = "flowPanel";
|
||||||
|
this.flowPanel.Size = new System.Drawing.Size(322, 307);
|
||||||
|
this.flowPanel.TabIndex = 0;
|
||||||
|
this.flowPanel.WrapContents = false;
|
||||||
|
//
|
||||||
// TabSettingsAdvanced
|
// TabSettingsAdvanced
|
||||||
//
|
//
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
this.Controls.Add(this.labelConfiguration);
|
this.Controls.Add(this.flowPanel);
|
||||||
this.Controls.Add(this.panelConfiguration);
|
|
||||||
this.Controls.Add(this.panelPerformance);
|
|
||||||
this.Controls.Add(this.labelPerformance);
|
|
||||||
this.Controls.Add(this.panelApp);
|
|
||||||
this.Controls.Add(this.labelApp);
|
|
||||||
this.Name = "TabSettingsAdvanced";
|
this.Name = "TabSettingsAdvanced";
|
||||||
this.Size = new System.Drawing.Size(340, 328);
|
this.Size = new System.Drawing.Size(340, 325);
|
||||||
((System.ComponentModel.ISupportInitialize)(this.numMemoryThreshold)).EndInit();
|
((System.ComponentModel.ISupportInitialize)(this.numClearCacheThreshold)).EndInit();
|
||||||
this.panelApp.ResumeLayout(false);
|
this.panelAppButtons.ResumeLayout(false);
|
||||||
this.panelPerformance.ResumeLayout(false);
|
this.panelClearCacheAuto.ResumeLayout(false);
|
||||||
this.panelPerformance.PerformLayout();
|
this.panelClearCacheAuto.PerformLayout();
|
||||||
this.panelConfiguration.ResumeLayout(false);
|
this.panelConfiguration.ResumeLayout(false);
|
||||||
|
this.flowPanel.ResumeLayout(false);
|
||||||
|
this.flowPanel.PerformLayout();
|
||||||
this.ResumeLayout(false);
|
this.ResumeLayout(false);
|
||||||
this.PerformLayout();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -278,13 +308,14 @@
|
|||||||
private System.Windows.Forms.Button btnOpenAppFolder;
|
private System.Windows.Forms.Button btnOpenAppFolder;
|
||||||
private System.Windows.Forms.Button btnOpenDataFolder;
|
private System.Windows.Forms.Button btnOpenDataFolder;
|
||||||
private System.Windows.Forms.Label labelApp;
|
private System.Windows.Forms.Label labelApp;
|
||||||
private System.Windows.Forms.Panel panelApp;
|
private System.Windows.Forms.Panel panelAppButtons;
|
||||||
private System.Windows.Forms.Label labelPerformance;
|
private System.Windows.Forms.Label labelPerformance;
|
||||||
private System.Windows.Forms.Panel panelPerformance;
|
private System.Windows.Forms.Panel panelClearCacheAuto;
|
||||||
private System.Windows.Forms.Panel panelConfiguration;
|
private System.Windows.Forms.Panel panelConfiguration;
|
||||||
private System.Windows.Forms.Label labelConfiguration;
|
private System.Windows.Forms.Label labelConfiguration;
|
||||||
private System.Windows.Forms.Label labelMemoryUsage;
|
private System.Windows.Forms.Label labelCache;
|
||||||
private Controls.NumericUpDownEx numMemoryThreshold;
|
private Controls.NumericUpDownEx numClearCacheThreshold;
|
||||||
private System.Windows.Forms.CheckBox checkBrowserGCReload;
|
private System.Windows.Forms.CheckBox checkClearCacheAuto;
|
||||||
|
private System.Windows.Forms.FlowLayoutPanel flowPanel;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
using System.Threading.Tasks;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using TweetDuck.Configuration;
|
using TweetDuck.Configuration;
|
||||||
using TweetDuck.Core.Controls;
|
using TweetDuck.Core.Controls;
|
||||||
|
using TweetDuck.Core.Management;
|
||||||
using TweetDuck.Core.Other.Settings.Dialogs;
|
using TweetDuck.Core.Other.Settings.Dialogs;
|
||||||
using TweetDuck.Core.Utils;
|
using TweetDuck.Core.Utils;
|
||||||
|
|
||||||
@@ -17,6 +19,19 @@ namespace TweetDuck.Core.Other.Settings{
|
|||||||
|
|
||||||
this.reinjectBrowserCSS = reinjectBrowserCSS;
|
this.reinjectBrowserCSS = reinjectBrowserCSS;
|
||||||
|
|
||||||
|
toolTip.SetToolTip(btnOpenAppFolder, "Opens the folder where the app is located.");
|
||||||
|
toolTip.SetToolTip(btnOpenDataFolder, "Opens the folder where your profile data is located.");
|
||||||
|
toolTip.SetToolTip(btnRestart, "Restarts the program using the same command\r\nline arguments that were used at launch.");
|
||||||
|
toolTip.SetToolTip(btnRestartArgs, "Restarts the program with customizable\r\ncommand line arguments.");
|
||||||
|
|
||||||
|
toolTip.SetToolTip(checkHardwareAcceleration, "Uses graphics card to improve performance. Disable if you experience\r\nvisual glitches. This option will not be exported in a profile.");
|
||||||
|
|
||||||
|
toolTip.SetToolTip(btnClearCache, "Clearing cache will free up space taken by downloaded images and other resources.");
|
||||||
|
toolTip.SetToolTip(checkClearCacheAuto, "Automatically clears cache when its size exceeds the set threshold. Note that cache can only be cleared when closing TweetDuck.");
|
||||||
|
|
||||||
|
toolTip.SetToolTip(btnEditCefArgs, "Set custom command line arguments for Chromium Embedded Framework.");
|
||||||
|
toolTip.SetToolTip(btnEditCSS, "Set custom CSS for browser and notification windows.");
|
||||||
|
|
||||||
if (SystemConfig.IsHardwareAccelerationSupported){
|
if (SystemConfig.IsHardwareAccelerationSupported){
|
||||||
checkHardwareAcceleration.Checked = SysConfig.HardwareAcceleration;
|
checkHardwareAcceleration.Checked = SysConfig.HardwareAcceleration;
|
||||||
}
|
}
|
||||||
@@ -25,33 +40,34 @@ namespace TweetDuck.Core.Other.Settings{
|
|||||||
checkHardwareAcceleration.Checked = false;
|
checkHardwareAcceleration.Checked = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
checkBrowserGCReload.Checked = SysConfig.EnableBrowserGCReload;
|
checkClearCacheAuto.Checked = SysConfig.ClearCacheAutomatically;
|
||||||
numMemoryThreshold.Enabled = checkBrowserGCReload.Checked;
|
numClearCacheThreshold.Enabled = checkClearCacheAuto.Checked;
|
||||||
numMemoryThreshold.SetValueSafe(SysConfig.BrowserMemoryThreshold);
|
numClearCacheThreshold.SetValueSafe(SysConfig.ClearCacheThreshold);
|
||||||
|
|
||||||
BrowserCache.CalculateCacheSize(task => {
|
BrowserCache.GetCacheSize(task => {
|
||||||
string text = task.IsCompleted ? (int)Math.Ceiling(task.Result/(1024.0*1024.0))+" MB" : "(unknown size)";
|
string text = task.Status == TaskStatus.RanToCompletion ? (int)Math.Ceiling(task.Result/(1024.0*1024.0))+" MB" : "unknown";
|
||||||
this.InvokeSafe(() => btnClearCache.Text = $"Clear Cache ({text})");
|
this.InvokeSafe(() => btnClearCache.Text = $"Clear Cache ({text})");
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void OnReady(){
|
public override void OnReady(){
|
||||||
btnClearCache.Click += btnClearCache_Click;
|
|
||||||
checkHardwareAcceleration.CheckedChanged += checkHardwareAcceleration_CheckedChanged;
|
|
||||||
|
|
||||||
checkBrowserGCReload.CheckedChanged += checkBrowserGCReload_CheckedChanged;
|
|
||||||
numMemoryThreshold.ValueChanged += numMemoryThreshold_ValueChanged;
|
|
||||||
|
|
||||||
btnEditCefArgs.Click += btnEditCefArgs_Click;
|
|
||||||
btnEditCSS.Click += btnEditCSS_Click;
|
|
||||||
|
|
||||||
btnOpenAppFolder.Click += btnOpenAppFolder_Click;
|
btnOpenAppFolder.Click += btnOpenAppFolder_Click;
|
||||||
btnOpenDataFolder.Click += btnOpenDataFolder_Click;
|
btnOpenDataFolder.Click += btnOpenDataFolder_Click;
|
||||||
btnRestart.Click += btnRestart_Click;
|
btnRestart.Click += btnRestart_Click;
|
||||||
btnRestartArgs.Click += btnRestartArgs_Click;
|
btnRestartArgs.Click += btnRestartArgs_Click;
|
||||||
|
|
||||||
|
checkHardwareAcceleration.CheckedChanged += checkHardwareAcceleration_CheckedChanged;
|
||||||
|
|
||||||
|
btnClearCache.Click += btnClearCache_Click;
|
||||||
|
checkClearCacheAuto.CheckedChanged += checkClearCacheAuto_CheckedChanged;
|
||||||
|
|
||||||
|
btnEditCefArgs.Click += btnEditCefArgs_Click;
|
||||||
|
btnEditCSS.Click += btnEditCSS_Click;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void OnClosing(){
|
public override void OnClosing(){
|
||||||
|
SysConfig.ClearCacheAutomatically = checkClearCacheAuto.Checked;
|
||||||
|
SysConfig.ClearCacheThreshold = (int)numClearCacheThreshold.Value;
|
||||||
SysConfig.Save();
|
SysConfig.Save();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -61,20 +77,15 @@ namespace TweetDuck.Core.Other.Settings{
|
|||||||
FormMessage.Information("Clear Cache", "Cache will be automatically cleared when TweetDuck exits.", FormMessage.OK);
|
FormMessage.Information("Clear Cache", "Cache will be automatically cleared when TweetDuck exits.", FormMessage.OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void checkClearCacheAuto_CheckedChanged(object sender, EventArgs e){
|
||||||
|
numClearCacheThreshold.Enabled = checkClearCacheAuto.Checked;
|
||||||
|
}
|
||||||
|
|
||||||
private void checkHardwareAcceleration_CheckedChanged(object sender, EventArgs e){
|
private void checkHardwareAcceleration_CheckedChanged(object sender, EventArgs e){
|
||||||
SysConfig.HardwareAcceleration = checkHardwareAcceleration.Checked;
|
SysConfig.HardwareAcceleration = checkHardwareAcceleration.Checked;
|
||||||
PromptRestart(); // calls OnClosing
|
PromptRestart(); // calls OnClosing
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkBrowserGCReload_CheckedChanged(object sender, EventArgs e){
|
|
||||||
SysConfig.EnableBrowserGCReload = checkBrowserGCReload.Checked;
|
|
||||||
numMemoryThreshold.Enabled = checkBrowserGCReload.Checked;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void numMemoryThreshold_ValueChanged(object sender, EventArgs e){
|
|
||||||
SysConfig.BrowserMemoryThreshold = (int)numMemoryThreshold.Value;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void btnEditCefArgs_Click(object sender, EventArgs e){
|
private void btnEditCefArgs_Click(object sender, EventArgs e){
|
||||||
DialogSettingsCefArgs form = new DialogSettingsCefArgs();
|
DialogSettingsCefArgs form = new DialogSettingsCefArgs();
|
||||||
|
|
||||||
|
|||||||
149
Core/Other/Settings/TabSettingsFeedback.Designer.cs
generated
149
Core/Other/Settings/TabSettingsFeedback.Designer.cs
generated
@@ -24,36 +24,63 @@
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
private void InitializeComponent() {
|
private void InitializeComponent() {
|
||||||
this.components = new System.ComponentModel.Container();
|
this.components = new System.ComponentModel.Container();
|
||||||
this.panelFeedback = new System.Windows.Forms.Panel();
|
this.panelDataCollection = new System.Windows.Forms.Panel();
|
||||||
|
this.labelDataCollectionLink = new System.Windows.Forms.LinkLabel();
|
||||||
|
this.checkDataCollection = new System.Windows.Forms.CheckBox();
|
||||||
this.labelDataCollectionMessage = new System.Windows.Forms.Label();
|
this.labelDataCollectionMessage = new System.Windows.Forms.Label();
|
||||||
this.btnViewReport = new System.Windows.Forms.Button();
|
this.btnViewReport = new System.Windows.Forms.Button();
|
||||||
this.btnSendFeedback = new System.Windows.Forms.Button();
|
this.btnSendFeedback = new System.Windows.Forms.Button();
|
||||||
this.labelDataCollectionLink = new System.Windows.Forms.LinkLabel();
|
|
||||||
this.checkDataCollection = new System.Windows.Forms.CheckBox();
|
|
||||||
this.labelDataCollection = new System.Windows.Forms.Label();
|
this.labelDataCollection = new System.Windows.Forms.Label();
|
||||||
this.labelFeedback = new System.Windows.Forms.Label();
|
this.labelFeedback = new System.Windows.Forms.Label();
|
||||||
this.toolTip = new System.Windows.Forms.ToolTip(this.components);
|
this.toolTip = new System.Windows.Forms.ToolTip(this.components);
|
||||||
this.panelFeedback.SuspendLayout();
|
this.flowPanel = new System.Windows.Forms.FlowLayoutPanel();
|
||||||
|
this.panelDataCollection.SuspendLayout();
|
||||||
|
this.flowPanel.SuspendLayout();
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
//
|
//
|
||||||
// panelFeedback
|
// panelDataCollection
|
||||||
//
|
//
|
||||||
this.panelFeedback.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
this.panelDataCollection.Anchor = System.Windows.Forms.AnchorStyles.Top;
|
||||||
| System.Windows.Forms.AnchorStyles.Right)));
|
this.panelDataCollection.Controls.Add(this.labelDataCollectionLink);
|
||||||
this.panelFeedback.Controls.Add(this.labelDataCollectionMessage);
|
this.panelDataCollection.Controls.Add(this.checkDataCollection);
|
||||||
this.panelFeedback.Controls.Add(this.btnViewReport);
|
this.panelDataCollection.Location = new System.Drawing.Point(0, 78);
|
||||||
this.panelFeedback.Controls.Add(this.btnSendFeedback);
|
this.panelDataCollection.Margin = new System.Windows.Forms.Padding(0);
|
||||||
this.panelFeedback.Controls.Add(this.labelDataCollectionLink);
|
this.panelDataCollection.Name = "panelDataCollection";
|
||||||
this.panelFeedback.Controls.Add(this.checkDataCollection);
|
this.panelDataCollection.Size = new System.Drawing.Size(322, 28);
|
||||||
this.panelFeedback.Controls.Add(this.labelDataCollection);
|
this.panelDataCollection.TabIndex = 3;
|
||||||
this.panelFeedback.Location = new System.Drawing.Point(9, 31);
|
//
|
||||||
this.panelFeedback.Name = "panelFeedback";
|
// labelDataCollectionLink
|
||||||
this.panelFeedback.Size = new System.Drawing.Size(322, 188);
|
//
|
||||||
this.panelFeedback.TabIndex = 1;
|
this.labelDataCollectionLink.AutoSize = true;
|
||||||
|
this.labelDataCollectionLink.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.labelDataCollectionLink.LinkArea = new System.Windows.Forms.LinkArea(1, 10);
|
||||||
|
this.labelDataCollectionLink.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline;
|
||||||
|
this.labelDataCollectionLink.Location = new System.Drawing.Point(153, 4);
|
||||||
|
this.labelDataCollectionLink.Margin = new System.Windows.Forms.Padding(0);
|
||||||
|
this.labelDataCollectionLink.Name = "labelDataCollectionLink";
|
||||||
|
this.labelDataCollectionLink.Size = new System.Drawing.Size(71, 21);
|
||||||
|
this.labelDataCollectionLink.TabIndex = 1;
|
||||||
|
this.labelDataCollectionLink.TabStop = true;
|
||||||
|
this.labelDataCollectionLink.Text = "(learn more)";
|
||||||
|
this.labelDataCollectionLink.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
|
||||||
|
this.labelDataCollectionLink.UseCompatibleTextRendering = true;
|
||||||
|
//
|
||||||
|
// checkDataCollection
|
||||||
|
//
|
||||||
|
this.checkDataCollection.AutoSize = true;
|
||||||
|
this.checkDataCollection.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.checkDataCollection.Location = new System.Drawing.Point(6, 6);
|
||||||
|
this.checkDataCollection.Margin = new System.Windows.Forms.Padding(6, 6, 0, 2);
|
||||||
|
this.checkDataCollection.Name = "checkDataCollection";
|
||||||
|
this.checkDataCollection.Size = new System.Drawing.Size(147, 19);
|
||||||
|
this.checkDataCollection.TabIndex = 0;
|
||||||
|
this.checkDataCollection.Text = "Send Anonymous Data";
|
||||||
|
this.checkDataCollection.UseVisualStyleBackColor = true;
|
||||||
//
|
//
|
||||||
// labelDataCollectionMessage
|
// labelDataCollectionMessage
|
||||||
//
|
//
|
||||||
this.labelDataCollectionMessage.Location = new System.Drawing.Point(6, 114);
|
this.labelDataCollectionMessage.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.labelDataCollectionMessage.Location = new System.Drawing.Point(6, 143);
|
||||||
this.labelDataCollectionMessage.Margin = new System.Windows.Forms.Padding(6);
|
this.labelDataCollectionMessage.Margin = new System.Windows.Forms.Padding(6);
|
||||||
this.labelDataCollectionMessage.Name = "labelDataCollectionMessage";
|
this.labelDataCollectionMessage.Name = "labelDataCollectionMessage";
|
||||||
this.labelDataCollectionMessage.Size = new System.Drawing.Size(310, 67);
|
this.labelDataCollectionMessage.Size = new System.Drawing.Size(310, 67);
|
||||||
@@ -62,10 +89,12 @@
|
|||||||
// btnViewReport
|
// btnViewReport
|
||||||
//
|
//
|
||||||
this.btnViewReport.AutoSize = true;
|
this.btnViewReport.AutoSize = true;
|
||||||
this.btnViewReport.Location = new System.Drawing.Point(6, 82);
|
this.btnViewReport.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.btnViewReport.Location = new System.Drawing.Point(5, 109);
|
||||||
this.btnViewReport.Margin = new System.Windows.Forms.Padding(5, 3, 3, 3);
|
this.btnViewReport.Margin = new System.Windows.Forms.Padding(5, 3, 3, 3);
|
||||||
this.btnViewReport.Name = "btnViewReport";
|
this.btnViewReport.Name = "btnViewReport";
|
||||||
this.btnViewReport.Size = new System.Drawing.Size(144, 23);
|
this.btnViewReport.Padding = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||||
|
this.btnViewReport.Size = new System.Drawing.Size(155, 25);
|
||||||
this.btnViewReport.TabIndex = 4;
|
this.btnViewReport.TabIndex = 4;
|
||||||
this.btnViewReport.Text = "View My Analytics Report";
|
this.btnViewReport.Text = "View My Analytics Report";
|
||||||
this.btnViewReport.UseVisualStyleBackColor = true;
|
this.btnViewReport.UseVisualStyleBackColor = true;
|
||||||
@@ -73,79 +102,74 @@
|
|||||||
// btnSendFeedback
|
// btnSendFeedback
|
||||||
//
|
//
|
||||||
this.btnSendFeedback.AutoSize = true;
|
this.btnSendFeedback.AutoSize = true;
|
||||||
this.btnSendFeedback.Location = new System.Drawing.Point(5, 3);
|
this.btnSendFeedback.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.btnSendFeedback.Location = new System.Drawing.Point(5, 23);
|
||||||
this.btnSendFeedback.Margin = new System.Windows.Forms.Padding(5, 3, 3, 3);
|
this.btnSendFeedback.Margin = new System.Windows.Forms.Padding(5, 3, 3, 3);
|
||||||
this.btnSendFeedback.Name = "btnSendFeedback";
|
this.btnSendFeedback.Name = "btnSendFeedback";
|
||||||
this.btnSendFeedback.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
this.btnSendFeedback.Padding = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||||
this.btnSendFeedback.Size = new System.Drawing.Size(164, 23);
|
this.btnSendFeedback.Size = new System.Drawing.Size(170, 25);
|
||||||
this.btnSendFeedback.TabIndex = 0;
|
this.btnSendFeedback.TabIndex = 1;
|
||||||
this.btnSendFeedback.Text = "Send Feedback / Bug Report";
|
this.btnSendFeedback.Text = "Send Feedback / Bug Report";
|
||||||
this.btnSendFeedback.UseVisualStyleBackColor = true;
|
this.btnSendFeedback.UseVisualStyleBackColor = true;
|
||||||
//
|
//
|
||||||
// labelDataCollectionLink
|
|
||||||
//
|
|
||||||
this.labelDataCollectionLink.AutoSize = true;
|
|
||||||
this.labelDataCollectionLink.LinkArea = new System.Windows.Forms.LinkArea(1, 10);
|
|
||||||
this.labelDataCollectionLink.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline;
|
|
||||||
this.labelDataCollectionLink.Location = new System.Drawing.Point(141, 60);
|
|
||||||
this.labelDataCollectionLink.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);
|
|
||||||
this.labelDataCollectionLink.Name = "labelDataCollectionLink";
|
|
||||||
this.labelDataCollectionLink.Size = new System.Drawing.Size(66, 17);
|
|
||||||
this.labelDataCollectionLink.TabIndex = 3;
|
|
||||||
this.labelDataCollectionLink.TabStop = true;
|
|
||||||
this.labelDataCollectionLink.Text = "(learn more)";
|
|
||||||
this.labelDataCollectionLink.UseCompatibleTextRendering = true;
|
|
||||||
//
|
|
||||||
// checkDataCollection
|
|
||||||
//
|
|
||||||
this.checkDataCollection.AutoSize = true;
|
|
||||||
this.checkDataCollection.Location = new System.Drawing.Point(6, 59);
|
|
||||||
this.checkDataCollection.Margin = new System.Windows.Forms.Padding(6, 5, 0, 3);
|
|
||||||
this.checkDataCollection.Name = "checkDataCollection";
|
|
||||||
this.checkDataCollection.Size = new System.Drawing.Size(135, 17);
|
|
||||||
this.checkDataCollection.TabIndex = 2;
|
|
||||||
this.checkDataCollection.Text = "Send Anonymous Data";
|
|
||||||
this.checkDataCollection.UseVisualStyleBackColor = true;
|
|
||||||
//
|
|
||||||
// labelDataCollection
|
// labelDataCollection
|
||||||
//
|
//
|
||||||
this.labelDataCollection.AutoSize = true;
|
this.labelDataCollection.AutoSize = true;
|
||||||
this.labelDataCollection.Location = new System.Drawing.Point(3, 41);
|
this.labelDataCollection.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.labelDataCollection.Location = new System.Drawing.Point(3, 63);
|
||||||
this.labelDataCollection.Margin = new System.Windows.Forms.Padding(3, 12, 3, 0);
|
this.labelDataCollection.Margin = new System.Windows.Forms.Padding(3, 12, 3, 0);
|
||||||
this.labelDataCollection.Name = "labelDataCollection";
|
this.labelDataCollection.Name = "labelDataCollection";
|
||||||
this.labelDataCollection.Size = new System.Drawing.Size(79, 13);
|
this.labelDataCollection.Size = new System.Drawing.Size(88, 15);
|
||||||
this.labelDataCollection.TabIndex = 1;
|
this.labelDataCollection.TabIndex = 2;
|
||||||
this.labelDataCollection.Text = "Data Collection";
|
this.labelDataCollection.Text = "Data Collection";
|
||||||
//
|
//
|
||||||
// labelFeedback
|
// labelFeedback
|
||||||
//
|
//
|
||||||
this.labelFeedback.AutoSize = true;
|
this.labelFeedback.AutoSize = true;
|
||||||
this.labelFeedback.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
this.labelFeedback.Font = new System.Drawing.Font("Segoe UI", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.labelFeedback.Location = new System.Drawing.Point(6, 8);
|
this.labelFeedback.Location = new System.Drawing.Point(0, 0);
|
||||||
this.labelFeedback.Margin = new System.Windows.Forms.Padding(0, 2, 0, 0);
|
this.labelFeedback.Margin = new System.Windows.Forms.Padding(0);
|
||||||
this.labelFeedback.Name = "labelFeedback";
|
this.labelFeedback.Name = "labelFeedback";
|
||||||
this.labelFeedback.Size = new System.Drawing.Size(80, 20);
|
this.labelFeedback.Size = new System.Drawing.Size(72, 20);
|
||||||
this.labelFeedback.TabIndex = 0;
|
this.labelFeedback.TabIndex = 0;
|
||||||
this.labelFeedback.Text = "Feedback";
|
this.labelFeedback.Text = "Feedback";
|
||||||
//
|
//
|
||||||
|
// flowPanel
|
||||||
|
//
|
||||||
|
this.flowPanel.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.flowPanel.Controls.Add(this.labelFeedback);
|
||||||
|
this.flowPanel.Controls.Add(this.btnSendFeedback);
|
||||||
|
this.flowPanel.Controls.Add(this.labelDataCollection);
|
||||||
|
this.flowPanel.Controls.Add(this.panelDataCollection);
|
||||||
|
this.flowPanel.Controls.Add(this.btnViewReport);
|
||||||
|
this.flowPanel.Controls.Add(this.labelDataCollectionMessage);
|
||||||
|
this.flowPanel.FlowDirection = System.Windows.Forms.FlowDirection.TopDown;
|
||||||
|
this.flowPanel.Location = new System.Drawing.Point(9, 9);
|
||||||
|
this.flowPanel.Name = "flowPanel";
|
||||||
|
this.flowPanel.Size = new System.Drawing.Size(322, 212);
|
||||||
|
this.flowPanel.TabIndex = 0;
|
||||||
|
this.flowPanel.WrapContents = false;
|
||||||
|
//
|
||||||
// TabSettingsFeedback
|
// TabSettingsFeedback
|
||||||
//
|
//
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
this.Controls.Add(this.panelFeedback);
|
this.Controls.Add(this.flowPanel);
|
||||||
this.Controls.Add(this.labelFeedback);
|
|
||||||
this.Name = "TabSettingsFeedback";
|
this.Name = "TabSettingsFeedback";
|
||||||
this.Size = new System.Drawing.Size(340, 230);
|
this.Size = new System.Drawing.Size(340, 230);
|
||||||
this.panelFeedback.ResumeLayout(false);
|
this.panelDataCollection.ResumeLayout(false);
|
||||||
this.panelFeedback.PerformLayout();
|
this.panelDataCollection.PerformLayout();
|
||||||
|
this.flowPanel.ResumeLayout(false);
|
||||||
|
this.flowPanel.PerformLayout();
|
||||||
this.ResumeLayout(false);
|
this.ResumeLayout(false);
|
||||||
this.PerformLayout();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
private System.Windows.Forms.Panel panelFeedback;
|
private System.Windows.Forms.Panel panelDataCollection;
|
||||||
private System.Windows.Forms.CheckBox checkDataCollection;
|
private System.Windows.Forms.CheckBox checkDataCollection;
|
||||||
private System.Windows.Forms.Label labelDataCollection;
|
private System.Windows.Forms.Label labelDataCollection;
|
||||||
private System.Windows.Forms.Label labelFeedback;
|
private System.Windows.Forms.Label labelFeedback;
|
||||||
@@ -154,5 +178,6 @@
|
|||||||
private System.Windows.Forms.Button btnSendFeedback;
|
private System.Windows.Forms.Button btnSendFeedback;
|
||||||
private System.Windows.Forms.Button btnViewReport;
|
private System.Windows.Forms.Button btnViewReport;
|
||||||
private System.Windows.Forms.Label labelDataCollectionMessage;
|
private System.Windows.Forms.Label labelDataCollectionMessage;
|
||||||
|
private System.Windows.Forms.FlowLayoutPanel flowPanel;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
320
Core/Other/Settings/TabSettingsGeneral.Designer.cs
generated
320
Core/Other/Settings/TabSettingsGeneral.Designer.cs
generated
@@ -26,119 +26,102 @@
|
|||||||
this.components = new System.ComponentModel.Container();
|
this.components = new System.ComponentModel.Container();
|
||||||
this.checkExpandLinks = new System.Windows.Forms.CheckBox();
|
this.checkExpandLinks = new System.Windows.Forms.CheckBox();
|
||||||
this.toolTip = new System.Windows.Forms.ToolTip(this.components);
|
this.toolTip = new System.Windows.Forms.ToolTip(this.components);
|
||||||
this.checkSpellCheck = new System.Windows.Forms.CheckBox();
|
|
||||||
this.checkUpdateNotifications = new System.Windows.Forms.CheckBox();
|
this.checkUpdateNotifications = new System.Windows.Forms.CheckBox();
|
||||||
this.btnCheckUpdates = new System.Windows.Forms.Button();
|
this.btnCheckUpdates = new System.Windows.Forms.Button();
|
||||||
this.labelZoomValue = new System.Windows.Forms.Label();
|
this.labelZoomValue = new System.Windows.Forms.Label();
|
||||||
this.checkSwitchAccountSelectors = new System.Windows.Forms.CheckBox();
|
|
||||||
this.checkBestImageQuality = new System.Windows.Forms.CheckBox();
|
this.checkBestImageQuality = new System.Windows.Forms.CheckBox();
|
||||||
this.checkOpenSearchInFirstColumn = new System.Windows.Forms.CheckBox();
|
this.checkOpenSearchInFirstColumn = new System.Windows.Forms.CheckBox();
|
||||||
this.trackBarZoom = new System.Windows.Forms.TrackBar();
|
this.trackBarZoom = new System.Windows.Forms.TrackBar();
|
||||||
this.labelZoom = new System.Windows.Forms.Label();
|
this.labelZoom = new System.Windows.Forms.Label();
|
||||||
this.zoomUpdateTimer = new System.Windows.Forms.Timer(this.components);
|
this.zoomUpdateTimer = new System.Windows.Forms.Timer(this.components);
|
||||||
this.labelUI = new System.Windows.Forms.Label();
|
this.labelUI = new System.Windows.Forms.Label();
|
||||||
this.panelUI = new System.Windows.Forms.Panel();
|
this.panelZoom = new System.Windows.Forms.Panel();
|
||||||
this.panelUpdates = new System.Windows.Forms.Panel();
|
|
||||||
this.labelUpdates = new System.Windows.Forms.Label();
|
|
||||||
this.checkAnimatedAvatars = new System.Windows.Forms.CheckBox();
|
this.checkAnimatedAvatars = new System.Windows.Forms.CheckBox();
|
||||||
|
this.labelUpdates = new System.Windows.Forms.Label();
|
||||||
|
this.flowPanel = new System.Windows.Forms.FlowLayoutPanel();
|
||||||
|
this.checkKeepLikeFollowDialogsOpen = new System.Windows.Forms.CheckBox();
|
||||||
|
this.labelBrowserSettings = new System.Windows.Forms.Label();
|
||||||
|
this.checkSmoothScrolling = new System.Windows.Forms.CheckBox();
|
||||||
|
this.labelBrowserPath = new System.Windows.Forms.Label();
|
||||||
|
this.comboBoxBrowserPath = new System.Windows.Forms.ComboBox();
|
||||||
|
this.labelSearchEngine = new System.Windows.Forms.Label();
|
||||||
|
this.comboBoxSearchEngine = new System.Windows.Forms.ComboBox();
|
||||||
((System.ComponentModel.ISupportInitialize)(this.trackBarZoom)).BeginInit();
|
((System.ComponentModel.ISupportInitialize)(this.trackBarZoom)).BeginInit();
|
||||||
this.panelUI.SuspendLayout();
|
this.panelZoom.SuspendLayout();
|
||||||
this.panelUpdates.SuspendLayout();
|
this.flowPanel.SuspendLayout();
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
//
|
//
|
||||||
// checkExpandLinks
|
// checkExpandLinks
|
||||||
//
|
//
|
||||||
this.checkExpandLinks.AutoSize = true;
|
this.checkExpandLinks.AutoSize = true;
|
||||||
this.checkExpandLinks.Location = new System.Drawing.Point(6, 5);
|
this.checkExpandLinks.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.checkExpandLinks.Margin = new System.Windows.Forms.Padding(6, 5, 3, 3);
|
this.checkExpandLinks.Location = new System.Drawing.Point(6, 26);
|
||||||
|
this.checkExpandLinks.Margin = new System.Windows.Forms.Padding(6, 6, 3, 2);
|
||||||
this.checkExpandLinks.Name = "checkExpandLinks";
|
this.checkExpandLinks.Name = "checkExpandLinks";
|
||||||
this.checkExpandLinks.Size = new System.Drawing.Size(166, 17);
|
this.checkExpandLinks.Size = new System.Drawing.Size(176, 19);
|
||||||
this.checkExpandLinks.TabIndex = 0;
|
this.checkExpandLinks.TabIndex = 1;
|
||||||
this.checkExpandLinks.Text = "Expand Links When Hovered";
|
this.checkExpandLinks.Text = "Expand Links When Hovered";
|
||||||
this.toolTip.SetToolTip(this.checkExpandLinks, "Expands links inside the tweets. If disabled,\r\nthe full links show up in a tooltip instead.");
|
|
||||||
this.checkExpandLinks.UseVisualStyleBackColor = true;
|
this.checkExpandLinks.UseVisualStyleBackColor = true;
|
||||||
//
|
//
|
||||||
// checkSpellCheck
|
|
||||||
//
|
|
||||||
this.checkSpellCheck.AutoSize = true;
|
|
||||||
this.checkSpellCheck.Location = new System.Drawing.Point(6, 120);
|
|
||||||
this.checkSpellCheck.Margin = new System.Windows.Forms.Padding(6, 3, 3, 3);
|
|
||||||
this.checkSpellCheck.Name = "checkSpellCheck";
|
|
||||||
this.checkSpellCheck.Size = new System.Drawing.Size(119, 17);
|
|
||||||
this.checkSpellCheck.TabIndex = 5;
|
|
||||||
this.checkSpellCheck.Text = "Enable Spell Check";
|
|
||||||
this.toolTip.SetToolTip(this.checkSpellCheck, "Underlines words that are spelled incorrectly.");
|
|
||||||
this.checkSpellCheck.UseVisualStyleBackColor = true;
|
|
||||||
//
|
|
||||||
// checkUpdateNotifications
|
// checkUpdateNotifications
|
||||||
//
|
//
|
||||||
this.checkUpdateNotifications.AutoSize = true;
|
this.checkUpdateNotifications.AutoSize = true;
|
||||||
this.checkUpdateNotifications.Location = new System.Drawing.Point(6, 5);
|
this.checkUpdateNotifications.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.checkUpdateNotifications.Margin = new System.Windows.Forms.Padding(6, 5, 3, 3);
|
this.checkUpdateNotifications.Location = new System.Drawing.Point(6, 427);
|
||||||
|
this.checkUpdateNotifications.Margin = new System.Windows.Forms.Padding(6, 6, 3, 2);
|
||||||
this.checkUpdateNotifications.Name = "checkUpdateNotifications";
|
this.checkUpdateNotifications.Name = "checkUpdateNotifications";
|
||||||
this.checkUpdateNotifications.Size = new System.Drawing.Size(165, 17);
|
this.checkUpdateNotifications.Size = new System.Drawing.Size(182, 19);
|
||||||
this.checkUpdateNotifications.TabIndex = 0;
|
this.checkUpdateNotifications.TabIndex = 15;
|
||||||
this.checkUpdateNotifications.Text = "Check Updates Automatically";
|
this.checkUpdateNotifications.Text = "Check Updates Automatically";
|
||||||
this.toolTip.SetToolTip(this.checkUpdateNotifications, "Checks for updates every hour.\r\nIf an update is dismissed, it will not appear again.");
|
|
||||||
this.checkUpdateNotifications.UseVisualStyleBackColor = true;
|
this.checkUpdateNotifications.UseVisualStyleBackColor = true;
|
||||||
//
|
//
|
||||||
// btnCheckUpdates
|
// btnCheckUpdates
|
||||||
//
|
//
|
||||||
this.btnCheckUpdates.Location = new System.Drawing.Point(5, 28);
|
this.btnCheckUpdates.AutoSize = true;
|
||||||
|
this.btnCheckUpdates.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.btnCheckUpdates.Location = new System.Drawing.Point(5, 451);
|
||||||
this.btnCheckUpdates.Margin = new System.Windows.Forms.Padding(5, 3, 3, 3);
|
this.btnCheckUpdates.Margin = new System.Windows.Forms.Padding(5, 3, 3, 3);
|
||||||
this.btnCheckUpdates.Name = "btnCheckUpdates";
|
this.btnCheckUpdates.Name = "btnCheckUpdates";
|
||||||
this.btnCheckUpdates.Size = new System.Drawing.Size(144, 23);
|
this.btnCheckUpdates.Padding = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||||
this.btnCheckUpdates.TabIndex = 1;
|
this.btnCheckUpdates.Size = new System.Drawing.Size(128, 25);
|
||||||
|
this.btnCheckUpdates.TabIndex = 16;
|
||||||
this.btnCheckUpdates.Text = "Check Updates Now";
|
this.btnCheckUpdates.Text = "Check Updates Now";
|
||||||
this.toolTip.SetToolTip(this.btnCheckUpdates, "Forces an update check, even for updates that had been dismissed.");
|
|
||||||
this.btnCheckUpdates.UseVisualStyleBackColor = true;
|
this.btnCheckUpdates.UseVisualStyleBackColor = true;
|
||||||
//
|
//
|
||||||
// labelZoomValue
|
// labelZoomValue
|
||||||
//
|
//
|
||||||
this.labelZoomValue.BackColor = System.Drawing.Color.Transparent;
|
this.labelZoomValue.BackColor = System.Drawing.Color.Transparent;
|
||||||
this.labelZoomValue.Location = new System.Drawing.Point(147, 169);
|
this.labelZoomValue.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.labelZoomValue.Location = new System.Drawing.Point(147, 4);
|
||||||
this.labelZoomValue.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);
|
this.labelZoomValue.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);
|
||||||
this.labelZoomValue.Name = "labelZoomValue";
|
this.labelZoomValue.Name = "labelZoomValue";
|
||||||
this.labelZoomValue.Size = new System.Drawing.Size(38, 13);
|
this.labelZoomValue.Size = new System.Drawing.Size(38, 13);
|
||||||
this.labelZoomValue.TabIndex = 8;
|
this.labelZoomValue.TabIndex = 1;
|
||||||
this.labelZoomValue.Text = "100%";
|
this.labelZoomValue.Text = "100%";
|
||||||
this.labelZoomValue.TextAlign = System.Drawing.ContentAlignment.TopRight;
|
this.labelZoomValue.TextAlign = System.Drawing.ContentAlignment.TopRight;
|
||||||
this.toolTip.SetToolTip(this.labelZoomValue, "Changes the zoom level.\r\nAlso affects notifications and screenshots.");
|
|
||||||
//
|
|
||||||
// checkSwitchAccountSelectors
|
|
||||||
//
|
|
||||||
this.checkSwitchAccountSelectors.AutoSize = true;
|
|
||||||
this.checkSwitchAccountSelectors.Location = new System.Drawing.Point(6, 28);
|
|
||||||
this.checkSwitchAccountSelectors.Margin = new System.Windows.Forms.Padding(6, 3, 3, 3);
|
|
||||||
this.checkSwitchAccountSelectors.Name = "checkSwitchAccountSelectors";
|
|
||||||
this.checkSwitchAccountSelectors.Size = new System.Drawing.Size(172, 17);
|
|
||||||
this.checkSwitchAccountSelectors.TabIndex = 1;
|
|
||||||
this.checkSwitchAccountSelectors.Text = "Shift Selects Multiple Accounts";
|
|
||||||
this.toolTip.SetToolTip(this.checkSwitchAccountSelectors, "When (re)tweeting, click to select a single account or hold Shift to\r\nselect multiple accounts, instead of TweetDeck\'s default behavior.");
|
|
||||||
this.checkSwitchAccountSelectors.UseVisualStyleBackColor = true;
|
|
||||||
//
|
//
|
||||||
// checkBestImageQuality
|
// checkBestImageQuality
|
||||||
//
|
//
|
||||||
this.checkBestImageQuality.AutoSize = true;
|
this.checkBestImageQuality.AutoSize = true;
|
||||||
this.checkBestImageQuality.Location = new System.Drawing.Point(6, 74);
|
this.checkBestImageQuality.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.checkBestImageQuality.Margin = new System.Windows.Forms.Padding(6, 3, 3, 3);
|
this.checkBestImageQuality.Location = new System.Drawing.Point(6, 98);
|
||||||
|
this.checkBestImageQuality.Margin = new System.Windows.Forms.Padding(6, 3, 3, 2);
|
||||||
this.checkBestImageQuality.Name = "checkBestImageQuality";
|
this.checkBestImageQuality.Name = "checkBestImageQuality";
|
||||||
this.checkBestImageQuality.Size = new System.Drawing.Size(114, 17);
|
this.checkBestImageQuality.Size = new System.Drawing.Size(125, 19);
|
||||||
this.checkBestImageQuality.TabIndex = 3;
|
this.checkBestImageQuality.TabIndex = 4;
|
||||||
this.checkBestImageQuality.Text = "Best Image Quality";
|
this.checkBestImageQuality.Text = "Best Image Quality";
|
||||||
this.toolTip.SetToolTip(this.checkBestImageQuality, "When right-clicking a tweet image, the context menu options\r\nwill use links to the original image size (:orig in the URL).");
|
|
||||||
this.checkBestImageQuality.UseVisualStyleBackColor = true;
|
this.checkBestImageQuality.UseVisualStyleBackColor = true;
|
||||||
//
|
//
|
||||||
// checkOpenSearchInFirstColumn
|
// checkOpenSearchInFirstColumn
|
||||||
//
|
//
|
||||||
this.checkOpenSearchInFirstColumn.AutoSize = true;
|
this.checkOpenSearchInFirstColumn.AutoSize = true;
|
||||||
this.checkOpenSearchInFirstColumn.Location = new System.Drawing.Point(6, 51);
|
this.checkOpenSearchInFirstColumn.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.checkOpenSearchInFirstColumn.Margin = new System.Windows.Forms.Padding(6, 3, 3, 3);
|
this.checkOpenSearchInFirstColumn.Location = new System.Drawing.Point(6, 50);
|
||||||
|
this.checkOpenSearchInFirstColumn.Margin = new System.Windows.Forms.Padding(6, 3, 3, 2);
|
||||||
this.checkOpenSearchInFirstColumn.Name = "checkOpenSearchInFirstColumn";
|
this.checkOpenSearchInFirstColumn.Name = "checkOpenSearchInFirstColumn";
|
||||||
this.checkOpenSearchInFirstColumn.Size = new System.Drawing.Size(219, 17);
|
this.checkOpenSearchInFirstColumn.Size = new System.Drawing.Size(245, 19);
|
||||||
this.checkOpenSearchInFirstColumn.TabIndex = 2;
|
this.checkOpenSearchInFirstColumn.TabIndex = 2;
|
||||||
this.checkOpenSearchInFirstColumn.Text = "Add Search Columns Before First Column";
|
this.checkOpenSearchInFirstColumn.Text = "Add Search Columns Before First Column";
|
||||||
this.toolTip.SetToolTip(this.checkOpenSearchInFirstColumn, "By default, TweetDeck adds Search columns at the end.\r\nThis option makes them appear before the first column instead.");
|
|
||||||
this.checkOpenSearchInFirstColumn.UseVisualStyleBackColor = true;
|
this.checkOpenSearchInFirstColumn.UseVisualStyleBackColor = true;
|
||||||
//
|
//
|
||||||
// trackBarZoom
|
// trackBarZoom
|
||||||
@@ -146,24 +129,25 @@
|
|||||||
this.trackBarZoom.AutoSize = false;
|
this.trackBarZoom.AutoSize = false;
|
||||||
this.trackBarZoom.BackColor = System.Drawing.SystemColors.Control;
|
this.trackBarZoom.BackColor = System.Drawing.SystemColors.Control;
|
||||||
this.trackBarZoom.LargeChange = 25;
|
this.trackBarZoom.LargeChange = 25;
|
||||||
this.trackBarZoom.Location = new System.Drawing.Point(3, 168);
|
this.trackBarZoom.Location = new System.Drawing.Point(3, 3);
|
||||||
this.trackBarZoom.Maximum = 200;
|
this.trackBarZoom.Maximum = 200;
|
||||||
this.trackBarZoom.Minimum = 50;
|
this.trackBarZoom.Minimum = 50;
|
||||||
this.trackBarZoom.Name = "trackBarZoom";
|
this.trackBarZoom.Name = "trackBarZoom";
|
||||||
this.trackBarZoom.Size = new System.Drawing.Size(148, 30);
|
this.trackBarZoom.Size = new System.Drawing.Size(148, 30);
|
||||||
this.trackBarZoom.SmallChange = 5;
|
this.trackBarZoom.SmallChange = 5;
|
||||||
this.trackBarZoom.TabIndex = 7;
|
this.trackBarZoom.TabIndex = 0;
|
||||||
this.trackBarZoom.TickFrequency = 25;
|
this.trackBarZoom.TickFrequency = 25;
|
||||||
this.trackBarZoom.Value = 100;
|
this.trackBarZoom.Value = 100;
|
||||||
//
|
//
|
||||||
// labelZoom
|
// labelZoom
|
||||||
//
|
//
|
||||||
this.labelZoom.AutoSize = true;
|
this.labelZoom.AutoSize = true;
|
||||||
this.labelZoom.Location = new System.Drawing.Point(3, 152);
|
this.labelZoom.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.labelZoom.Location = new System.Drawing.Point(3, 330);
|
||||||
this.labelZoom.Margin = new System.Windows.Forms.Padding(3, 12, 3, 0);
|
this.labelZoom.Margin = new System.Windows.Forms.Padding(3, 12, 3, 0);
|
||||||
this.labelZoom.Name = "labelZoom";
|
this.labelZoom.Name = "labelZoom";
|
||||||
this.labelZoom.Size = new System.Drawing.Size(34, 13);
|
this.labelZoom.Size = new System.Drawing.Size(39, 15);
|
||||||
this.labelZoom.TabIndex = 6;
|
this.labelZoom.TabIndex = 12;
|
||||||
this.labelZoom.Text = "Zoom";
|
this.labelZoom.Text = "Zoom";
|
||||||
//
|
//
|
||||||
// zoomUpdateTimer
|
// zoomUpdateTimer
|
||||||
@@ -174,83 +158,168 @@
|
|||||||
// labelUI
|
// labelUI
|
||||||
//
|
//
|
||||||
this.labelUI.AutoSize = true;
|
this.labelUI.AutoSize = true;
|
||||||
this.labelUI.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
this.labelUI.Font = new System.Drawing.Font("Segoe UI", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.labelUI.Location = new System.Drawing.Point(6, 8);
|
this.labelUI.Location = new System.Drawing.Point(0, 0);
|
||||||
this.labelUI.Margin = new System.Windows.Forms.Padding(0, 2, 0, 0);
|
this.labelUI.Margin = new System.Windows.Forms.Padding(0);
|
||||||
this.labelUI.Name = "labelUI";
|
this.labelUI.Name = "labelUI";
|
||||||
this.labelUI.Size = new System.Drawing.Size(111, 20);
|
this.labelUI.Size = new System.Drawing.Size(100, 20);
|
||||||
this.labelUI.TabIndex = 0;
|
this.labelUI.TabIndex = 0;
|
||||||
this.labelUI.Text = "User Interface";
|
this.labelUI.Text = "User Interface";
|
||||||
//
|
//
|
||||||
// panelUI
|
// panelZoom
|
||||||
//
|
//
|
||||||
this.panelUI.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
this.panelZoom.Anchor = System.Windows.Forms.AnchorStyles.Top;
|
||||||
| System.Windows.Forms.AnchorStyles.Right)));
|
this.panelZoom.Controls.Add(this.trackBarZoom);
|
||||||
this.panelUI.Controls.Add(this.checkAnimatedAvatars);
|
this.panelZoom.Controls.Add(this.labelZoomValue);
|
||||||
this.panelUI.Controls.Add(this.checkOpenSearchInFirstColumn);
|
this.panelZoom.Location = new System.Drawing.Point(0, 345);
|
||||||
this.panelUI.Controls.Add(this.checkBestImageQuality);
|
this.panelZoom.Margin = new System.Windows.Forms.Padding(0);
|
||||||
this.panelUI.Controls.Add(this.checkExpandLinks);
|
this.panelZoom.Name = "panelZoom";
|
||||||
this.panelUI.Controls.Add(this.checkSwitchAccountSelectors);
|
this.panelZoom.Size = new System.Drawing.Size(322, 36);
|
||||||
this.panelUI.Controls.Add(this.checkSpellCheck);
|
this.panelZoom.TabIndex = 13;
|
||||||
this.panelUI.Controls.Add(this.labelZoom);
|
|
||||||
this.panelUI.Controls.Add(this.trackBarZoom);
|
|
||||||
this.panelUI.Controls.Add(this.labelZoomValue);
|
|
||||||
this.panelUI.Location = new System.Drawing.Point(9, 31);
|
|
||||||
this.panelUI.Name = "panelUI";
|
|
||||||
this.panelUI.Size = new System.Drawing.Size(322, 205);
|
|
||||||
this.panelUI.TabIndex = 1;
|
|
||||||
//
|
|
||||||
// panelUpdates
|
|
||||||
//
|
|
||||||
this.panelUpdates.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
|
||||||
| System.Windows.Forms.AnchorStyles.Right)));
|
|
||||||
this.panelUpdates.Controls.Add(this.checkUpdateNotifications);
|
|
||||||
this.panelUpdates.Controls.Add(this.btnCheckUpdates);
|
|
||||||
this.panelUpdates.Location = new System.Drawing.Point(8, 283);
|
|
||||||
this.panelUpdates.Name = "panelUpdates";
|
|
||||||
this.panelUpdates.Size = new System.Drawing.Size(322, 55);
|
|
||||||
this.panelUpdates.TabIndex = 3;
|
|
||||||
//
|
|
||||||
// labelUpdates
|
|
||||||
//
|
|
||||||
this.labelUpdates.AutoSize = true;
|
|
||||||
this.labelUpdates.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
|
||||||
this.labelUpdates.Location = new System.Drawing.Point(5, 260);
|
|
||||||
this.labelUpdates.Margin = new System.Windows.Forms.Padding(0, 21, 0, 0);
|
|
||||||
this.labelUpdates.Name = "labelUpdates";
|
|
||||||
this.labelUpdates.Size = new System.Drawing.Size(70, 20);
|
|
||||||
this.labelUpdates.TabIndex = 2;
|
|
||||||
this.labelUpdates.Text = "Updates";
|
|
||||||
//
|
//
|
||||||
// checkAnimatedAvatars
|
// checkAnimatedAvatars
|
||||||
//
|
//
|
||||||
this.checkAnimatedAvatars.AutoSize = true;
|
this.checkAnimatedAvatars.AutoSize = true;
|
||||||
this.checkAnimatedAvatars.Location = new System.Drawing.Point(6, 97);
|
this.checkAnimatedAvatars.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.checkAnimatedAvatars.Margin = new System.Windows.Forms.Padding(6, 3, 3, 3);
|
this.checkAnimatedAvatars.Location = new System.Drawing.Point(6, 122);
|
||||||
|
this.checkAnimatedAvatars.Margin = new System.Windows.Forms.Padding(6, 3, 3, 2);
|
||||||
this.checkAnimatedAvatars.Name = "checkAnimatedAvatars";
|
this.checkAnimatedAvatars.Name = "checkAnimatedAvatars";
|
||||||
this.checkAnimatedAvatars.Size = new System.Drawing.Size(145, 17);
|
this.checkAnimatedAvatars.Size = new System.Drawing.Size(158, 19);
|
||||||
this.checkAnimatedAvatars.TabIndex = 4;
|
this.checkAnimatedAvatars.TabIndex = 5;
|
||||||
this.checkAnimatedAvatars.Text = "Enable Animated Avatars";
|
this.checkAnimatedAvatars.Text = "Enable Animated Avatars";
|
||||||
this.toolTip.SetToolTip(this.checkAnimatedAvatars, "Some old Twitter avatars could be uploaded as animated GIFs.");
|
|
||||||
this.checkAnimatedAvatars.UseVisualStyleBackColor = true;
|
this.checkAnimatedAvatars.UseVisualStyleBackColor = true;
|
||||||
//
|
//
|
||||||
|
// labelUpdates
|
||||||
|
//
|
||||||
|
this.labelUpdates.AutoSize = true;
|
||||||
|
this.labelUpdates.Font = new System.Drawing.Font("Segoe UI", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.labelUpdates.Location = new System.Drawing.Point(0, 401);
|
||||||
|
this.labelUpdates.Margin = new System.Windows.Forms.Padding(0, 20, 0, 0);
|
||||||
|
this.labelUpdates.Name = "labelUpdates";
|
||||||
|
this.labelUpdates.Size = new System.Drawing.Size(64, 20);
|
||||||
|
this.labelUpdates.TabIndex = 14;
|
||||||
|
this.labelUpdates.Text = "Updates";
|
||||||
|
//
|
||||||
|
// flowPanel
|
||||||
|
//
|
||||||
|
this.flowPanel.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.flowPanel.Controls.Add(this.labelUI);
|
||||||
|
this.flowPanel.Controls.Add(this.checkExpandLinks);
|
||||||
|
this.flowPanel.Controls.Add(this.checkOpenSearchInFirstColumn);
|
||||||
|
this.flowPanel.Controls.Add(this.checkKeepLikeFollowDialogsOpen);
|
||||||
|
this.flowPanel.Controls.Add(this.checkBestImageQuality);
|
||||||
|
this.flowPanel.Controls.Add(this.checkAnimatedAvatars);
|
||||||
|
this.flowPanel.Controls.Add(this.labelBrowserSettings);
|
||||||
|
this.flowPanel.Controls.Add(this.checkSmoothScrolling);
|
||||||
|
this.flowPanel.Controls.Add(this.labelBrowserPath);
|
||||||
|
this.flowPanel.Controls.Add(this.comboBoxBrowserPath);
|
||||||
|
this.flowPanel.Controls.Add(this.labelSearchEngine);
|
||||||
|
this.flowPanel.Controls.Add(this.comboBoxSearchEngine);
|
||||||
|
this.flowPanel.Controls.Add(this.labelZoom);
|
||||||
|
this.flowPanel.Controls.Add(this.panelZoom);
|
||||||
|
this.flowPanel.Controls.Add(this.labelUpdates);
|
||||||
|
this.flowPanel.Controls.Add(this.checkUpdateNotifications);
|
||||||
|
this.flowPanel.Controls.Add(this.btnCheckUpdates);
|
||||||
|
this.flowPanel.FlowDirection = System.Windows.Forms.FlowDirection.TopDown;
|
||||||
|
this.flowPanel.Location = new System.Drawing.Point(9, 9);
|
||||||
|
this.flowPanel.Name = "flowPanel";
|
||||||
|
this.flowPanel.Size = new System.Drawing.Size(322, 486);
|
||||||
|
this.flowPanel.TabIndex = 0;
|
||||||
|
this.flowPanel.WrapContents = false;
|
||||||
|
//
|
||||||
|
// checkKeepLikeFollowDialogsOpen
|
||||||
|
//
|
||||||
|
this.checkKeepLikeFollowDialogsOpen.AutoSize = true;
|
||||||
|
this.checkKeepLikeFollowDialogsOpen.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.checkKeepLikeFollowDialogsOpen.Location = new System.Drawing.Point(6, 74);
|
||||||
|
this.checkKeepLikeFollowDialogsOpen.Margin = new System.Windows.Forms.Padding(6, 3, 3, 2);
|
||||||
|
this.checkKeepLikeFollowDialogsOpen.Name = "checkKeepLikeFollowDialogsOpen";
|
||||||
|
this.checkKeepLikeFollowDialogsOpen.Size = new System.Drawing.Size(190, 19);
|
||||||
|
this.checkKeepLikeFollowDialogsOpen.TabIndex = 3;
|
||||||
|
this.checkKeepLikeFollowDialogsOpen.Text = "Keep Like/Follow Dialogs Open";
|
||||||
|
this.checkKeepLikeFollowDialogsOpen.UseVisualStyleBackColor = true;
|
||||||
|
//
|
||||||
|
// labelBrowserSettings
|
||||||
|
//
|
||||||
|
this.labelBrowserSettings.AutoSize = true;
|
||||||
|
this.labelBrowserSettings.Font = new System.Drawing.Font("Segoe UI", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.labelBrowserSettings.Location = new System.Drawing.Point(0, 163);
|
||||||
|
this.labelBrowserSettings.Margin = new System.Windows.Forms.Padding(0, 20, 0, 0);
|
||||||
|
this.labelBrowserSettings.Name = "labelBrowserSettings";
|
||||||
|
this.labelBrowserSettings.Size = new System.Drawing.Size(119, 20);
|
||||||
|
this.labelBrowserSettings.TabIndex = 6;
|
||||||
|
this.labelBrowserSettings.Text = "Browser Settings";
|
||||||
|
//
|
||||||
|
// checkSmoothScrolling
|
||||||
|
//
|
||||||
|
this.checkSmoothScrolling.AutoSize = true;
|
||||||
|
this.checkSmoothScrolling.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.checkSmoothScrolling.Location = new System.Drawing.Point(6, 189);
|
||||||
|
this.checkSmoothScrolling.Margin = new System.Windows.Forms.Padding(6, 6, 3, 2);
|
||||||
|
this.checkSmoothScrolling.Name = "checkSmoothScrolling";
|
||||||
|
this.checkSmoothScrolling.Size = new System.Drawing.Size(117, 19);
|
||||||
|
this.checkSmoothScrolling.TabIndex = 7;
|
||||||
|
this.checkSmoothScrolling.Text = "Smooth Scrolling";
|
||||||
|
this.checkSmoothScrolling.UseVisualStyleBackColor = true;
|
||||||
|
//
|
||||||
|
// labelBrowserPath
|
||||||
|
//
|
||||||
|
this.labelBrowserPath.AutoSize = true;
|
||||||
|
this.labelBrowserPath.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.labelBrowserPath.Location = new System.Drawing.Point(3, 222);
|
||||||
|
this.labelBrowserPath.Margin = new System.Windows.Forms.Padding(3, 12, 3, 0);
|
||||||
|
this.labelBrowserPath.Name = "labelBrowserPath";
|
||||||
|
this.labelBrowserPath.Size = new System.Drawing.Size(103, 15);
|
||||||
|
this.labelBrowserPath.TabIndex = 8;
|
||||||
|
this.labelBrowserPath.Text = "Open Links With...";
|
||||||
|
//
|
||||||
|
// comboBoxBrowserPath
|
||||||
|
//
|
||||||
|
this.comboBoxBrowserPath.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||||
|
this.comboBoxBrowserPath.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.comboBoxBrowserPath.FormattingEnabled = true;
|
||||||
|
this.comboBoxBrowserPath.Location = new System.Drawing.Point(5, 240);
|
||||||
|
this.comboBoxBrowserPath.Margin = new System.Windows.Forms.Padding(5, 3, 3, 3);
|
||||||
|
this.comboBoxBrowserPath.Name = "comboBoxBrowserPath";
|
||||||
|
this.comboBoxBrowserPath.Size = new System.Drawing.Size(173, 23);
|
||||||
|
this.comboBoxBrowserPath.TabIndex = 9;
|
||||||
|
//
|
||||||
|
// labelSearchEngine
|
||||||
|
//
|
||||||
|
this.labelSearchEngine.AutoSize = true;
|
||||||
|
this.labelSearchEngine.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.labelSearchEngine.Location = new System.Drawing.Point(3, 276);
|
||||||
|
this.labelSearchEngine.Margin = new System.Windows.Forms.Padding(3, 12, 3, 0);
|
||||||
|
this.labelSearchEngine.Name = "labelSearchEngine";
|
||||||
|
this.labelSearchEngine.Size = new System.Drawing.Size(81, 15);
|
||||||
|
this.labelSearchEngine.TabIndex = 10;
|
||||||
|
this.labelSearchEngine.Text = "Search Engine";
|
||||||
|
//
|
||||||
|
// comboBoxSearchEngine
|
||||||
|
//
|
||||||
|
this.comboBoxSearchEngine.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||||
|
this.comboBoxSearchEngine.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.comboBoxSearchEngine.FormattingEnabled = true;
|
||||||
|
this.comboBoxSearchEngine.Location = new System.Drawing.Point(5, 294);
|
||||||
|
this.comboBoxSearchEngine.Margin = new System.Windows.Forms.Padding(5, 3, 3, 3);
|
||||||
|
this.comboBoxSearchEngine.Name = "comboBoxSearchEngine";
|
||||||
|
this.comboBoxSearchEngine.Size = new System.Drawing.Size(173, 23);
|
||||||
|
this.comboBoxSearchEngine.TabIndex = 11;
|
||||||
|
//
|
||||||
// TabSettingsGeneral
|
// TabSettingsGeneral
|
||||||
//
|
//
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
this.Controls.Add(this.labelUpdates);
|
this.Controls.Add(this.flowPanel);
|
||||||
this.Controls.Add(this.panelUpdates);
|
|
||||||
this.Controls.Add(this.panelUI);
|
|
||||||
this.Controls.Add(this.labelUI);
|
|
||||||
this.Name = "TabSettingsGeneral";
|
this.Name = "TabSettingsGeneral";
|
||||||
this.Size = new System.Drawing.Size(340, 348);
|
this.Size = new System.Drawing.Size(340, 504);
|
||||||
((System.ComponentModel.ISupportInitialize)(this.trackBarZoom)).EndInit();
|
((System.ComponentModel.ISupportInitialize)(this.trackBarZoom)).EndInit();
|
||||||
this.panelUI.ResumeLayout(false);
|
this.panelZoom.ResumeLayout(false);
|
||||||
this.panelUI.PerformLayout();
|
this.flowPanel.ResumeLayout(false);
|
||||||
this.panelUpdates.ResumeLayout(false);
|
this.flowPanel.PerformLayout();
|
||||||
this.panelUpdates.PerformLayout();
|
|
||||||
this.ResumeLayout(false);
|
this.ResumeLayout(false);
|
||||||
this.PerformLayout();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -258,20 +327,25 @@
|
|||||||
|
|
||||||
private System.Windows.Forms.CheckBox checkExpandLinks;
|
private System.Windows.Forms.CheckBox checkExpandLinks;
|
||||||
private System.Windows.Forms.ToolTip toolTip;
|
private System.Windows.Forms.ToolTip toolTip;
|
||||||
private System.Windows.Forms.CheckBox checkSpellCheck;
|
|
||||||
private System.Windows.Forms.CheckBox checkUpdateNotifications;
|
private System.Windows.Forms.CheckBox checkUpdateNotifications;
|
||||||
private System.Windows.Forms.Button btnCheckUpdates;
|
private System.Windows.Forms.Button btnCheckUpdates;
|
||||||
private System.Windows.Forms.Label labelZoom;
|
private System.Windows.Forms.Label labelZoom;
|
||||||
private System.Windows.Forms.Label labelZoomValue;
|
private System.Windows.Forms.Label labelZoomValue;
|
||||||
private System.Windows.Forms.TrackBar trackBarZoom;
|
private System.Windows.Forms.TrackBar trackBarZoom;
|
||||||
private System.Windows.Forms.Timer zoomUpdateTimer;
|
private System.Windows.Forms.Timer zoomUpdateTimer;
|
||||||
private System.Windows.Forms.CheckBox checkSwitchAccountSelectors;
|
|
||||||
private System.Windows.Forms.Label labelUI;
|
private System.Windows.Forms.Label labelUI;
|
||||||
private System.Windows.Forms.Panel panelUI;
|
private System.Windows.Forms.Panel panelZoom;
|
||||||
private System.Windows.Forms.Panel panelUpdates;
|
|
||||||
private System.Windows.Forms.Label labelUpdates;
|
private System.Windows.Forms.Label labelUpdates;
|
||||||
private System.Windows.Forms.CheckBox checkBestImageQuality;
|
private System.Windows.Forms.CheckBox checkBestImageQuality;
|
||||||
private System.Windows.Forms.CheckBox checkOpenSearchInFirstColumn;
|
private System.Windows.Forms.CheckBox checkOpenSearchInFirstColumn;
|
||||||
private System.Windows.Forms.CheckBox checkAnimatedAvatars;
|
private System.Windows.Forms.CheckBox checkAnimatedAvatars;
|
||||||
|
private System.Windows.Forms.FlowLayoutPanel flowPanel;
|
||||||
|
private System.Windows.Forms.CheckBox checkKeepLikeFollowDialogsOpen;
|
||||||
|
private System.Windows.Forms.Label labelBrowserPath;
|
||||||
|
private System.Windows.Forms.ComboBox comboBoxBrowserPath;
|
||||||
|
private System.Windows.Forms.Label labelBrowserSettings;
|
||||||
|
private System.Windows.Forms.CheckBox checkSmoothScrolling;
|
||||||
|
private System.Windows.Forms.Label labelSearchEngine;
|
||||||
|
private System.Windows.Forms.ComboBox comboBoxSearchEngine;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,44 +1,90 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Windows.Forms;
|
||||||
using TweetDuck.Core.Controls;
|
using TweetDuck.Core.Controls;
|
||||||
using TweetDuck.Core.Handling.General;
|
using TweetDuck.Core.Handling.General;
|
||||||
|
using TweetDuck.Core.Other.Settings.Dialogs;
|
||||||
|
using TweetDuck.Core.Utils;
|
||||||
using TweetDuck.Updates;
|
using TweetDuck.Updates;
|
||||||
|
using TweetDuck.Updates.Events;
|
||||||
|
|
||||||
namespace TweetDuck.Core.Other.Settings{
|
namespace TweetDuck.Core.Other.Settings{
|
||||||
sealed partial class TabSettingsGeneral : BaseTabSettings{
|
sealed partial class TabSettingsGeneral : BaseTabSettings{
|
||||||
private readonly FormBrowser browser;
|
private readonly Action reloadColumns;
|
||||||
|
|
||||||
private readonly UpdateHandler updates;
|
private readonly UpdateHandler updates;
|
||||||
private int updateCheckEventId = -1;
|
private int updateCheckEventId = -1;
|
||||||
|
|
||||||
public TabSettingsGeneral(FormBrowser browser, UpdateHandler updates){
|
private readonly int browserListIndexDefault;
|
||||||
|
private readonly int browserListIndexCustom;
|
||||||
|
|
||||||
|
private readonly int searchEngineIndexDefault;
|
||||||
|
private readonly int searchEngineIndexCustom;
|
||||||
|
|
||||||
|
public TabSettingsGeneral(Action reloadColumns, UpdateHandler updates){
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
this.browser = browser;
|
this.reloadColumns = reloadColumns;
|
||||||
|
|
||||||
this.updates = updates;
|
this.updates = updates;
|
||||||
this.updates.CheckFinished += updates_CheckFinished;
|
this.updates.CheckFinished += updates_CheckFinished;
|
||||||
Disposed += (sender, args) => this.updates.CheckFinished -= updates_CheckFinished;
|
Disposed += (sender, args) => this.updates.CheckFinished -= updates_CheckFinished;
|
||||||
|
|
||||||
|
toolTip.SetToolTip(checkExpandLinks, "Expands links inside the tweets. If disabled,\r\nthe full links show up in a tooltip instead.");
|
||||||
|
toolTip.SetToolTip(checkOpenSearchInFirstColumn, "By default, TweetDeck adds Search columns at the end.\r\nThis option makes them appear before the first column instead.");
|
||||||
|
toolTip.SetToolTip(checkKeepLikeFollowDialogsOpen, "Allows liking and following from multiple accounts at once,\r\ninstead of automatically closing the dialog after taking an action.");
|
||||||
|
toolTip.SetToolTip(checkBestImageQuality, "When right-clicking a tweet image, the context menu options\r\nwill use links to the original image size (:orig in the URL).");
|
||||||
|
toolTip.SetToolTip(checkAnimatedAvatars, "Some old Twitter avatars could be uploaded as animated GIFs.");
|
||||||
|
|
||||||
|
toolTip.SetToolTip(checkSmoothScrolling, "Toggles smooth mouse wheel scrolling.");
|
||||||
|
toolTip.SetToolTip(comboBoxBrowserPath, "Sets the default browser for opening links.");
|
||||||
|
toolTip.SetToolTip(labelZoomValue, "Changes the zoom level.\r\nAlso affects notifications and screenshots.");
|
||||||
toolTip.SetToolTip(trackBarZoom, toolTip.GetToolTip(labelZoomValue));
|
toolTip.SetToolTip(trackBarZoom, toolTip.GetToolTip(labelZoomValue));
|
||||||
trackBarZoom.SetValueSafe(Config.ZoomLevel);
|
|
||||||
labelZoomValue.Text = trackBarZoom.Value+"%";
|
toolTip.SetToolTip(checkUpdateNotifications, "Checks for updates every hour.\r\nIf an update is dismissed, it will not appear again.");
|
||||||
|
toolTip.SetToolTip(btnCheckUpdates, "Forces an update check, even for updates that had been dismissed.");
|
||||||
|
|
||||||
checkExpandLinks.Checked = Config.ExpandLinksOnHover;
|
checkExpandLinks.Checked = Config.ExpandLinksOnHover;
|
||||||
checkSwitchAccountSelectors.Checked = Config.SwitchAccountSelectors;
|
|
||||||
checkOpenSearchInFirstColumn.Checked = Config.OpenSearchInFirstColumn;
|
checkOpenSearchInFirstColumn.Checked = Config.OpenSearchInFirstColumn;
|
||||||
|
checkKeepLikeFollowDialogsOpen.Checked = Config.KeepLikeFollowDialogsOpen;
|
||||||
checkBestImageQuality.Checked = Config.BestImageQuality;
|
checkBestImageQuality.Checked = Config.BestImageQuality;
|
||||||
checkAnimatedAvatars.Checked = Config.EnableAnimatedImages;
|
checkAnimatedAvatars.Checked = Config.EnableAnimatedImages;
|
||||||
checkSpellCheck.Checked = Config.EnableSpellCheck;
|
|
||||||
|
checkSmoothScrolling.Checked = Config.EnableSmoothScrolling;
|
||||||
|
|
||||||
|
foreach(WindowsUtils.Browser browserInfo in WindowsUtils.FindInstalledBrowsers()){
|
||||||
|
comboBoxBrowserPath.Items.Add(browserInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
browserListIndexDefault = comboBoxBrowserPath.Items.Add("(default browser)");
|
||||||
|
browserListIndexCustom = comboBoxBrowserPath.Items.Add("(custom program...)");
|
||||||
|
UpdateBrowserPathSelection();
|
||||||
|
|
||||||
|
comboBoxSearchEngine.Items.Add(new SearchEngine("DuckDuckGo", "https://duckduckgo.com/?q="));
|
||||||
|
comboBoxSearchEngine.Items.Add(new SearchEngine("Google", "https://www.google.com/search?q="));
|
||||||
|
comboBoxSearchEngine.Items.Add(new SearchEngine("Bing", "https://www.bing.com/search?q="));
|
||||||
|
comboBoxSearchEngine.Items.Add(new SearchEngine("Yahoo", "https://search.yahoo.com/search?p="));
|
||||||
|
searchEngineIndexDefault = comboBoxSearchEngine.Items.Add("(no engine set)");
|
||||||
|
searchEngineIndexCustom = comboBoxSearchEngine.Items.Add("(custom url...)");
|
||||||
|
UpdateSearchEngineSelection();
|
||||||
|
|
||||||
|
trackBarZoom.SetValueSafe(Config.ZoomLevel);
|
||||||
|
labelZoomValue.Text = trackBarZoom.Value+"%";
|
||||||
|
|
||||||
checkUpdateNotifications.Checked = Config.EnableUpdateCheck;
|
checkUpdateNotifications.Checked = Config.EnableUpdateCheck;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void OnReady(){
|
public override void OnReady(){
|
||||||
checkExpandLinks.CheckedChanged += checkExpandLinks_CheckedChanged;
|
checkExpandLinks.CheckedChanged += checkExpandLinks_CheckedChanged;
|
||||||
checkSwitchAccountSelectors.CheckedChanged += checkSwitchAccountSelectors_CheckedChanged;
|
|
||||||
checkOpenSearchInFirstColumn.CheckedChanged += checkOpenSearchInFirstColumn_CheckedChanged;
|
checkOpenSearchInFirstColumn.CheckedChanged += checkOpenSearchInFirstColumn_CheckedChanged;
|
||||||
|
checkKeepLikeFollowDialogsOpen.CheckedChanged += checkKeepLikeFollowDialogsOpen_CheckedChanged;
|
||||||
checkBestImageQuality.CheckedChanged += checkBestImageQuality_CheckedChanged;
|
checkBestImageQuality.CheckedChanged += checkBestImageQuality_CheckedChanged;
|
||||||
checkAnimatedAvatars.CheckedChanged += checkAnimatedAvatars_CheckedChanged;
|
checkAnimatedAvatars.CheckedChanged += checkAnimatedAvatars_CheckedChanged;
|
||||||
checkSpellCheck.CheckedChanged += checkSpellCheck_CheckedChanged;
|
|
||||||
|
checkSmoothScrolling.CheckedChanged += checkSmoothScrolling_CheckedChanged;
|
||||||
|
comboBoxBrowserPath.SelectedIndexChanged += comboBoxBrowserPath_SelectedIndexChanged;
|
||||||
|
comboBoxSearchEngine.SelectedIndexChanged += comboBoxSearchEngine_SelectedIndexChanged;
|
||||||
trackBarZoom.ValueChanged += trackBarZoom_ValueChanged;
|
trackBarZoom.ValueChanged += trackBarZoom_ValueChanged;
|
||||||
|
|
||||||
checkUpdateNotifications.CheckedChanged += checkUpdateNotifications_CheckedChanged;
|
checkUpdateNotifications.CheckedChanged += checkUpdateNotifications_CheckedChanged;
|
||||||
@@ -53,26 +99,98 @@ namespace TweetDuck.Core.Other.Settings{
|
|||||||
Config.ExpandLinksOnHover = checkExpandLinks.Checked;
|
Config.ExpandLinksOnHover = checkExpandLinks.Checked;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkSwitchAccountSelectors_CheckedChanged(object sender, EventArgs e){
|
|
||||||
Config.SwitchAccountSelectors = checkSwitchAccountSelectors.Checked;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void checkOpenSearchInFirstColumn_CheckedChanged(object sender, EventArgs e){
|
private void checkOpenSearchInFirstColumn_CheckedChanged(object sender, EventArgs e){
|
||||||
Config.OpenSearchInFirstColumn = checkOpenSearchInFirstColumn.Checked;
|
Config.OpenSearchInFirstColumn = checkOpenSearchInFirstColumn.Checked;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void checkKeepLikeFollowDialogsOpen_CheckedChanged(object sender, EventArgs e){
|
||||||
|
Config.KeepLikeFollowDialogsOpen = checkKeepLikeFollowDialogsOpen.Checked;
|
||||||
|
}
|
||||||
|
|
||||||
private void checkBestImageQuality_CheckedChanged(object sender, EventArgs e){
|
private void checkBestImageQuality_CheckedChanged(object sender, EventArgs e){
|
||||||
Config.BestImageQuality = checkBestImageQuality.Checked;
|
Config.BestImageQuality = checkBestImageQuality.Checked;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkAnimatedAvatars_CheckedChanged(object sender, EventArgs e){
|
private void checkAnimatedAvatars_CheckedChanged(object sender, EventArgs e){
|
||||||
Config.EnableAnimatedImages = checkAnimatedAvatars.Checked;
|
Config.EnableAnimatedImages = checkAnimatedAvatars.Checked;
|
||||||
BrowserProcessHandler.UpdatePrefs().ContinueWith(task => browser.ReloadColumns());
|
BrowserProcessHandler.UpdatePrefs().ContinueWith(task => reloadColumns());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkSpellCheck_CheckedChanged(object sender, EventArgs e){
|
private void checkSmoothScrolling_CheckedChanged(object sender, EventArgs e){
|
||||||
Config.EnableSpellCheck = checkSpellCheck.Checked;
|
Config.EnableSmoothScrolling = checkSmoothScrolling.Checked;
|
||||||
BrowserProcessHandler.UpdatePrefs();
|
PromptRestart();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateBrowserPathSelection(){
|
||||||
|
if (string.IsNullOrEmpty(Config.BrowserPath) || !File.Exists(Config.BrowserPath)){
|
||||||
|
comboBoxBrowserPath.SelectedIndex = browserListIndexDefault;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
WindowsUtils.Browser browserInfo = comboBoxBrowserPath.Items.OfType<WindowsUtils.Browser>().FirstOrDefault(browser => browser.Path == Config.BrowserPath);
|
||||||
|
|
||||||
|
if (browserInfo == null){
|
||||||
|
comboBoxBrowserPath.SelectedIndex = browserListIndexCustom;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
comboBoxBrowserPath.SelectedItem = browserInfo;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void comboBoxBrowserPath_SelectedIndexChanged(object sender, EventArgs e){
|
||||||
|
if (comboBoxBrowserPath.SelectedIndex == browserListIndexCustom){
|
||||||
|
using(OpenFileDialog dialog = new OpenFileDialog{
|
||||||
|
AutoUpgradeEnabled = true,
|
||||||
|
DereferenceLinks = true,
|
||||||
|
InitialDirectory = Path.GetDirectoryName(Config.BrowserPath), // returns null if argument is null
|
||||||
|
Title = "Open Links With...",
|
||||||
|
Filter = "Executables (*.exe;*.bat;*.cmd)|*.exe;*.bat;*.cmd|All Files (*.*)|*.*"
|
||||||
|
}){
|
||||||
|
if (dialog.ShowDialog() == DialogResult.OK){
|
||||||
|
Config.BrowserPath = dialog.FileName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
comboBoxBrowserPath.SelectedIndexChanged -= comboBoxBrowserPath_SelectedIndexChanged;
|
||||||
|
UpdateBrowserPathSelection();
|
||||||
|
comboBoxBrowserPath.SelectedIndexChanged += comboBoxBrowserPath_SelectedIndexChanged;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
Config.BrowserPath = (comboBoxBrowserPath.SelectedItem as WindowsUtils.Browser)?.Path; // default browser item is a string and casts to null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void comboBoxSearchEngine_SelectedIndexChanged(object sender, EventArgs e){
|
||||||
|
if (comboBoxSearchEngine.SelectedIndex == searchEngineIndexCustom){
|
||||||
|
using(DialogSettingsSearchEngine dialog = new DialogSettingsSearchEngine()){
|
||||||
|
if (dialog.ShowDialog() == DialogResult.OK){
|
||||||
|
Config.SearchEngineUrl = dialog.Url.Trim();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
comboBoxSearchEngine.SelectedIndexChanged -= comboBoxSearchEngine_SelectedIndexChanged;
|
||||||
|
UpdateSearchEngineSelection();
|
||||||
|
comboBoxSearchEngine.SelectedIndexChanged += comboBoxSearchEngine_SelectedIndexChanged;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
Config.SearchEngineUrl = (comboBoxSearchEngine.SelectedItem as SearchEngine)?.Url; // default search engine item is a string and casts to null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateSearchEngineSelection(){
|
||||||
|
if (string.IsNullOrEmpty(Config.SearchEngineUrl)){
|
||||||
|
comboBoxSearchEngine.SelectedIndex = searchEngineIndexDefault;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
SearchEngine engineInfo = comboBoxSearchEngine.Items.OfType<SearchEngine>().FirstOrDefault(engine => engine.Url == Config.SearchEngineUrl);
|
||||||
|
|
||||||
|
if (engineInfo == null){
|
||||||
|
comboBoxSearchEngine.SelectedIndex = searchEngineIndexCustom;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
comboBoxSearchEngine.SelectedItem = engineInfo;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void trackBarZoom_ValueChanged(object sender, EventArgs e){
|
private void trackBarZoom_ValueChanged(object sender, EventArgs e){
|
||||||
@@ -92,23 +210,44 @@ namespace TweetDuck.Core.Other.Settings{
|
|||||||
|
|
||||||
btnCheckUpdates.Enabled = false;
|
btnCheckUpdates.Enabled = false;
|
||||||
updateCheckEventId = updates.Check(true);
|
updateCheckEventId = updates.Check(true);
|
||||||
|
|
||||||
|
if (updateCheckEventId == UpdateHandler.CheckCodeNotOnTweetDeck){
|
||||||
|
FormMessage.Error("Update Check", "Updates can only be checked once TweetDeck is fully loaded.", FormMessage.OK);
|
||||||
|
btnCheckUpdates.Enabled = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updates_CheckFinished(object sender, UpdateEventArgs e){
|
private void updates_CheckFinished(object sender, UpdateCheckEventArgs e){
|
||||||
this.InvokeAsyncSafe(() => {
|
|
||||||
if (e.EventId == updateCheckEventId){
|
if (e.EventId == updateCheckEventId){
|
||||||
btnCheckUpdates.Enabled = true;
|
btnCheckUpdates.Enabled = true;
|
||||||
|
|
||||||
if (!e.IsUpdateAvailable){
|
e.Result.Handle(update => {
|
||||||
|
if (update.VersionTag == Program.VersionTag){
|
||||||
FormMessage.Information("No Updates Available", "Your version of TweetDuck is up to date.", FormMessage.OK);
|
FormMessage.Information("No Updates Available", "Your version of TweetDuck is up to date.", FormMessage.OK);
|
||||||
}
|
}
|
||||||
}
|
}, ex => {
|
||||||
|
Program.Reporter.HandleException("Update Check Error", "An error occurred while checking for updates.", true, ex);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void zoomUpdateTimer_Tick(object sender, EventArgs e){
|
private void zoomUpdateTimer_Tick(object sender, EventArgs e){
|
||||||
Config.ZoomLevel = trackBarZoom.Value;
|
Config.ZoomLevel = trackBarZoom.Value;
|
||||||
zoomUpdateTimer.Stop();
|
zoomUpdateTimer.Stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private sealed class SearchEngine{
|
||||||
|
private string Name { get; }
|
||||||
|
public string Url { get; }
|
||||||
|
|
||||||
|
public SearchEngine(string name, string url){
|
||||||
|
Name = name;
|
||||||
|
Url = url;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override int GetHashCode() => Name.GetHashCode();
|
||||||
|
public override bool Equals(object obj) => obj is SearchEngine other && Name == other.Name;
|
||||||
|
public override string ToString() => Name;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
160
Core/Other/Settings/TabSettingsLocales.Designer.cs
generated
Normal file
160
Core/Other/Settings/TabSettingsLocales.Designer.cs
generated
Normal file
@@ -0,0 +1,160 @@
|
|||||||
|
namespace TweetDuck.Core.Other.Settings {
|
||||||
|
partial class TabSettingsLocales {
|
||||||
|
/// <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 Component 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.components = new System.ComponentModel.Container();
|
||||||
|
this.toolTip = new System.Windows.Forms.ToolTip(this.components);
|
||||||
|
this.checkSpellCheck = new System.Windows.Forms.CheckBox();
|
||||||
|
this.labelLocales = new System.Windows.Forms.Label();
|
||||||
|
this.flowPanel = new System.Windows.Forms.FlowLayoutPanel();
|
||||||
|
this.labelSpellCheckLanguage = new System.Windows.Forms.Label();
|
||||||
|
this.comboBoxSpellCheckLanguage = new System.Windows.Forms.ComboBox();
|
||||||
|
this.labelTranslations = new System.Windows.Forms.Label();
|
||||||
|
this.labelTranslationTarget = new System.Windows.Forms.Label();
|
||||||
|
this.comboBoxTranslationTarget = new System.Windows.Forms.ComboBox();
|
||||||
|
this.flowPanel.SuspendLayout();
|
||||||
|
this.SuspendLayout();
|
||||||
|
//
|
||||||
|
// checkSpellCheck
|
||||||
|
//
|
||||||
|
this.checkSpellCheck.AutoSize = true;
|
||||||
|
this.checkSpellCheck.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.checkSpellCheck.Location = new System.Drawing.Point(6, 26);
|
||||||
|
this.checkSpellCheck.Margin = new System.Windows.Forms.Padding(6, 6, 3, 2);
|
||||||
|
this.checkSpellCheck.Name = "checkSpellCheck";
|
||||||
|
this.checkSpellCheck.Size = new System.Drawing.Size(125, 19);
|
||||||
|
this.checkSpellCheck.TabIndex = 1;
|
||||||
|
this.checkSpellCheck.Text = "Enable Spell Check";
|
||||||
|
this.checkSpellCheck.UseVisualStyleBackColor = true;
|
||||||
|
//
|
||||||
|
// labelLocales
|
||||||
|
//
|
||||||
|
this.labelLocales.AutoSize = true;
|
||||||
|
this.labelLocales.Font = new System.Drawing.Font("Segoe UI", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.labelLocales.Location = new System.Drawing.Point(0, 0);
|
||||||
|
this.labelLocales.Margin = new System.Windows.Forms.Padding(0);
|
||||||
|
this.labelLocales.Name = "labelLocales";
|
||||||
|
this.labelLocales.Size = new System.Drawing.Size(58, 20);
|
||||||
|
this.labelLocales.TabIndex = 0;
|
||||||
|
this.labelLocales.Text = "Locales";
|
||||||
|
//
|
||||||
|
// flowPanel
|
||||||
|
//
|
||||||
|
this.flowPanel.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.flowPanel.Controls.Add(this.labelLocales);
|
||||||
|
this.flowPanel.Controls.Add(this.checkSpellCheck);
|
||||||
|
this.flowPanel.Controls.Add(this.labelSpellCheckLanguage);
|
||||||
|
this.flowPanel.Controls.Add(this.comboBoxSpellCheckLanguage);
|
||||||
|
this.flowPanel.Controls.Add(this.labelTranslations);
|
||||||
|
this.flowPanel.Controls.Add(this.labelTranslationTarget);
|
||||||
|
this.flowPanel.Controls.Add(this.comboBoxTranslationTarget);
|
||||||
|
this.flowPanel.FlowDirection = System.Windows.Forms.FlowDirection.TopDown;
|
||||||
|
this.flowPanel.Location = new System.Drawing.Point(9, 9);
|
||||||
|
this.flowPanel.Name = "flowPanel";
|
||||||
|
this.flowPanel.Size = new System.Drawing.Size(322, 201);
|
||||||
|
this.flowPanel.TabIndex = 0;
|
||||||
|
this.flowPanel.WrapContents = false;
|
||||||
|
//
|
||||||
|
// labelSpellCheckLanguage
|
||||||
|
//
|
||||||
|
this.labelSpellCheckLanguage.AutoSize = true;
|
||||||
|
this.labelSpellCheckLanguage.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.labelSpellCheckLanguage.Location = new System.Drawing.Point(3, 59);
|
||||||
|
this.labelSpellCheckLanguage.Margin = new System.Windows.Forms.Padding(3, 12, 3, 0);
|
||||||
|
this.labelSpellCheckLanguage.Name = "labelSpellCheckLanguage";
|
||||||
|
this.labelSpellCheckLanguage.Size = new System.Drawing.Size(123, 15);
|
||||||
|
this.labelSpellCheckLanguage.TabIndex = 2;
|
||||||
|
this.labelSpellCheckLanguage.Text = "Spell Check Language";
|
||||||
|
//
|
||||||
|
// comboBoxSpellCheckLanguage
|
||||||
|
//
|
||||||
|
this.comboBoxSpellCheckLanguage.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||||
|
this.comboBoxSpellCheckLanguage.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.comboBoxSpellCheckLanguage.FormattingEnabled = true;
|
||||||
|
this.comboBoxSpellCheckLanguage.Location = new System.Drawing.Point(5, 77);
|
||||||
|
this.comboBoxSpellCheckLanguage.Margin = new System.Windows.Forms.Padding(5, 3, 3, 3);
|
||||||
|
this.comboBoxSpellCheckLanguage.Name = "comboBoxSpellCheckLanguage";
|
||||||
|
this.comboBoxSpellCheckLanguage.Size = new System.Drawing.Size(311, 23);
|
||||||
|
this.comboBoxSpellCheckLanguage.TabIndex = 3;
|
||||||
|
//
|
||||||
|
// labelTranslations
|
||||||
|
//
|
||||||
|
this.labelTranslations.AutoSize = true;
|
||||||
|
this.labelTranslations.Font = new System.Drawing.Font("Segoe UI", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.labelTranslations.Location = new System.Drawing.Point(0, 123);
|
||||||
|
this.labelTranslations.Margin = new System.Windows.Forms.Padding(0, 20, 0, 0);
|
||||||
|
this.labelTranslations.Name = "labelTranslations";
|
||||||
|
this.labelTranslations.Size = new System.Drawing.Size(109, 20);
|
||||||
|
this.labelTranslations.TabIndex = 4;
|
||||||
|
this.labelTranslations.Text = "Bing Translator";
|
||||||
|
//
|
||||||
|
// labelTranslationTarget
|
||||||
|
//
|
||||||
|
this.labelTranslationTarget.AutoSize = true;
|
||||||
|
this.labelTranslationTarget.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.labelTranslationTarget.Location = new System.Drawing.Point(3, 155);
|
||||||
|
this.labelTranslationTarget.Margin = new System.Windows.Forms.Padding(3, 12, 3, 0);
|
||||||
|
this.labelTranslationTarget.Name = "labelTranslationTarget";
|
||||||
|
this.labelTranslationTarget.Size = new System.Drawing.Size(96, 15);
|
||||||
|
this.labelTranslationTarget.TabIndex = 5;
|
||||||
|
this.labelTranslationTarget.Text = "Target Language";
|
||||||
|
//
|
||||||
|
// comboBoxTranslationTarget
|
||||||
|
//
|
||||||
|
this.comboBoxTranslationTarget.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||||
|
this.comboBoxTranslationTarget.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.comboBoxTranslationTarget.FormattingEnabled = true;
|
||||||
|
this.comboBoxTranslationTarget.Location = new System.Drawing.Point(5, 173);
|
||||||
|
this.comboBoxTranslationTarget.Margin = new System.Windows.Forms.Padding(5, 3, 3, 3);
|
||||||
|
this.comboBoxTranslationTarget.Name = "comboBoxTranslationTarget";
|
||||||
|
this.comboBoxTranslationTarget.Size = new System.Drawing.Size(311, 23);
|
||||||
|
this.comboBoxTranslationTarget.TabIndex = 6;
|
||||||
|
//
|
||||||
|
// TabSettingsLocales
|
||||||
|
//
|
||||||
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
|
this.Controls.Add(this.flowPanel);
|
||||||
|
this.Name = "TabSettingsLocales";
|
||||||
|
this.Size = new System.Drawing.Size(340, 219);
|
||||||
|
this.flowPanel.ResumeLayout(false);
|
||||||
|
this.flowPanel.PerformLayout();
|
||||||
|
this.ResumeLayout(false);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
private System.Windows.Forms.ToolTip toolTip;
|
||||||
|
private System.Windows.Forms.CheckBox checkSpellCheck;
|
||||||
|
private System.Windows.Forms.Label labelLocales;
|
||||||
|
private System.Windows.Forms.FlowLayoutPanel flowPanel;
|
||||||
|
private System.Windows.Forms.ComboBox comboBoxTranslationTarget;
|
||||||
|
private System.Windows.Forms.Label labelTranslationTarget;
|
||||||
|
private System.Windows.Forms.ComboBox comboBoxSpellCheckLanguage;
|
||||||
|
private System.Windows.Forms.Label labelTranslations;
|
||||||
|
private System.Windows.Forms.Label labelSpellCheckLanguage;
|
||||||
|
}
|
||||||
|
}
|
||||||
53
Core/Other/Settings/TabSettingsLocales.cs
Normal file
53
Core/Other/Settings/TabSettingsLocales.cs
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
using System;
|
||||||
|
using TweetDuck.Core.Handling.General;
|
||||||
|
using TweetDuck.Core.Utils;
|
||||||
|
|
||||||
|
namespace TweetDuck.Core.Other.Settings{
|
||||||
|
sealed partial class TabSettingsLocales : BaseTabSettings{
|
||||||
|
public TabSettingsLocales(){
|
||||||
|
InitializeComponent();
|
||||||
|
|
||||||
|
toolTip.SetToolTip(checkSpellCheck, "Underlines words that are spelled incorrectly.");
|
||||||
|
toolTip.SetToolTip(comboBoxSpellCheckLanguage, "Language used for spell check.");
|
||||||
|
toolTip.SetToolTip(comboBoxTranslationTarget, "Language tweets are translated into.");
|
||||||
|
|
||||||
|
checkSpellCheck.Checked = Config.EnableSpellCheck;
|
||||||
|
|
||||||
|
try{
|
||||||
|
foreach(LocaleUtils.Item item in LocaleUtils.SpellCheckLanguages){
|
||||||
|
comboBoxSpellCheckLanguage.Items.Add(item);
|
||||||
|
}
|
||||||
|
}catch{
|
||||||
|
comboBoxSpellCheckLanguage.Items.Add(new LocaleUtils.Item("en-US"));
|
||||||
|
}
|
||||||
|
|
||||||
|
comboBoxSpellCheckLanguage.SelectedItem = new LocaleUtils.Item(Config.SpellCheckLanguage);
|
||||||
|
|
||||||
|
foreach(LocaleUtils.Item item in LocaleUtils.TweetDeckTranslationLocales){
|
||||||
|
comboBoxTranslationTarget.Items.Add(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
comboBoxTranslationTarget.SelectedItem = new LocaleUtils.Item(Config.TranslationTarget);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void OnReady(){
|
||||||
|
checkSpellCheck.CheckedChanged += checkSpellCheck_CheckedChanged;
|
||||||
|
comboBoxSpellCheckLanguage.SelectedValueChanged += comboBoxSpellCheckLanguage_SelectedValueChanged;
|
||||||
|
comboBoxTranslationTarget.SelectedValueChanged += comboBoxTranslationTarget_SelectedValueChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkSpellCheck_CheckedChanged(object sender, EventArgs e){
|
||||||
|
Config.EnableSpellCheck = checkSpellCheck.Checked;
|
||||||
|
BrowserProcessHandler.UpdatePrefs();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void comboBoxSpellCheckLanguage_SelectedValueChanged(object sender, EventArgs e){
|
||||||
|
Config.SpellCheckLanguage = (comboBoxSpellCheckLanguage.SelectedItem as LocaleUtils.Item)?.Code ?? "en-US";
|
||||||
|
PromptRestart();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void comboBoxTranslationTarget_SelectedValueChanged(object sender, EventArgs e){
|
||||||
|
Config.TranslationTarget = (comboBoxTranslationTarget.SelectedItem as LocaleUtils.Item)?.Code ?? "en";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
400
Core/Other/Settings/TabSettingsNotifications.Designer.cs
generated
400
Core/Other/Settings/TabSettingsNotifications.Designer.cs
generated
@@ -51,7 +51,8 @@
|
|||||||
this.radioSizeAuto = new System.Windows.Forms.RadioButton();
|
this.radioSizeAuto = new System.Windows.Forms.RadioButton();
|
||||||
this.radioSizeCustom = new System.Windows.Forms.RadioButton();
|
this.radioSizeCustom = new System.Windows.Forms.RadioButton();
|
||||||
this.labelGeneral = new System.Windows.Forms.Label();
|
this.labelGeneral = new System.Windows.Forms.Label();
|
||||||
this.panelGeneral = new System.Windows.Forms.Panel();
|
this.panelEdgeDistance = new System.Windows.Forms.Panel();
|
||||||
|
this.checkMediaPreviews = new System.Windows.Forms.CheckBox();
|
||||||
this.labelScrollSpeedValue = new System.Windows.Forms.Label();
|
this.labelScrollSpeedValue = new System.Windows.Forms.Label();
|
||||||
this.trackBarScrollSpeed = new System.Windows.Forms.TrackBar();
|
this.trackBarScrollSpeed = new System.Windows.Forms.TrackBar();
|
||||||
this.labelScrollSpeed = new System.Windows.Forms.Label();
|
this.labelScrollSpeed = new System.Windows.Forms.Label();
|
||||||
@@ -61,79 +62,85 @@
|
|||||||
this.labelDuration = new System.Windows.Forms.Label();
|
this.labelDuration = new System.Windows.Forms.Label();
|
||||||
this.labelTimer = new System.Windows.Forms.Label();
|
this.labelTimer = new System.Windows.Forms.Label();
|
||||||
this.labelSize = new System.Windows.Forms.Label();
|
this.labelSize = new System.Windows.Forms.Label();
|
||||||
this.panelMiscellaneous = new System.Windows.Forms.Panel();
|
this.panelSize = new System.Windows.Forms.Panel();
|
||||||
this.durationUpdateTimer = new System.Windows.Forms.Timer(this.components);
|
this.durationUpdateTimer = new System.Windows.Forms.Timer(this.components);
|
||||||
this.checkMediaPreviews = new System.Windows.Forms.CheckBox();
|
this.flowPanel = new System.Windows.Forms.FlowLayoutPanel();
|
||||||
|
this.panelScrollSpeed = new System.Windows.Forms.Panel();
|
||||||
((System.ComponentModel.ISupportInitialize)(this.trackBarEdgeDistance)).BeginInit();
|
((System.ComponentModel.ISupportInitialize)(this.trackBarEdgeDistance)).BeginInit();
|
||||||
this.tableLayoutDurationButtons.SuspendLayout();
|
this.tableLayoutDurationButtons.SuspendLayout();
|
||||||
((System.ComponentModel.ISupportInitialize)(this.trackBarDuration)).BeginInit();
|
((System.ComponentModel.ISupportInitialize)(this.trackBarDuration)).BeginInit();
|
||||||
this.panelGeneral.SuspendLayout();
|
this.panelEdgeDistance.SuspendLayout();
|
||||||
((System.ComponentModel.ISupportInitialize)(this.trackBarScrollSpeed)).BeginInit();
|
((System.ComponentModel.ISupportInitialize)(this.trackBarScrollSpeed)).BeginInit();
|
||||||
this.panelLocation.SuspendLayout();
|
this.panelLocation.SuspendLayout();
|
||||||
this.panelTimer.SuspendLayout();
|
this.panelTimer.SuspendLayout();
|
||||||
this.panelMiscellaneous.SuspendLayout();
|
this.panelSize.SuspendLayout();
|
||||||
|
this.flowPanel.SuspendLayout();
|
||||||
|
this.panelScrollSpeed.SuspendLayout();
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
//
|
//
|
||||||
// labelEdgeDistanceValue
|
// labelEdgeDistanceValue
|
||||||
//
|
//
|
||||||
this.labelEdgeDistanceValue.Location = new System.Drawing.Point(147, 129);
|
this.labelEdgeDistanceValue.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.labelEdgeDistanceValue.Location = new System.Drawing.Point(145, 4);
|
||||||
this.labelEdgeDistanceValue.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);
|
this.labelEdgeDistanceValue.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);
|
||||||
this.labelEdgeDistanceValue.Name = "labelEdgeDistanceValue";
|
this.labelEdgeDistanceValue.Name = "labelEdgeDistanceValue";
|
||||||
this.labelEdgeDistanceValue.Size = new System.Drawing.Size(40, 13);
|
this.labelEdgeDistanceValue.Size = new System.Drawing.Size(40, 15);
|
||||||
this.labelEdgeDistanceValue.TabIndex = 9;
|
this.labelEdgeDistanceValue.TabIndex = 1;
|
||||||
this.labelEdgeDistanceValue.Text = "0 px";
|
this.labelEdgeDistanceValue.Text = "0 px";
|
||||||
this.labelEdgeDistanceValue.TextAlign = System.Drawing.ContentAlignment.TopRight;
|
this.labelEdgeDistanceValue.TextAlign = System.Drawing.ContentAlignment.TopRight;
|
||||||
//
|
//
|
||||||
// labelDisplay
|
// labelDisplay
|
||||||
//
|
//
|
||||||
this.labelDisplay.AutoSize = true;
|
this.labelDisplay.AutoSize = true;
|
||||||
this.labelDisplay.Location = new System.Drawing.Point(3, 60);
|
this.labelDisplay.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.labelDisplay.Location = new System.Drawing.Point(3, 465);
|
||||||
this.labelDisplay.Margin = new System.Windows.Forms.Padding(3, 12, 3, 0);
|
this.labelDisplay.Margin = new System.Windows.Forms.Padding(3, 12, 3, 0);
|
||||||
this.labelDisplay.Name = "labelDisplay";
|
this.labelDisplay.Name = "labelDisplay";
|
||||||
this.labelDisplay.Size = new System.Drawing.Size(41, 13);
|
this.labelDisplay.Size = new System.Drawing.Size(45, 15);
|
||||||
this.labelDisplay.TabIndex = 5;
|
this.labelDisplay.TabIndex = 15;
|
||||||
this.labelDisplay.Text = "Display";
|
this.labelDisplay.Text = "Display";
|
||||||
//
|
//
|
||||||
// comboBoxDisplay
|
// comboBoxDisplay
|
||||||
//
|
//
|
||||||
this.comboBoxDisplay.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
|
||||||
| System.Windows.Forms.AnchorStyles.Right)));
|
|
||||||
this.comboBoxDisplay.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
this.comboBoxDisplay.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||||
|
this.comboBoxDisplay.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.comboBoxDisplay.FormattingEnabled = true;
|
this.comboBoxDisplay.FormattingEnabled = true;
|
||||||
this.comboBoxDisplay.Location = new System.Drawing.Point(5, 76);
|
this.comboBoxDisplay.Location = new System.Drawing.Point(5, 483);
|
||||||
this.comboBoxDisplay.Margin = new System.Windows.Forms.Padding(5, 3, 3, 3);
|
this.comboBoxDisplay.Margin = new System.Windows.Forms.Padding(5, 3, 3, 3);
|
||||||
this.comboBoxDisplay.Name = "comboBoxDisplay";
|
this.comboBoxDisplay.Name = "comboBoxDisplay";
|
||||||
this.comboBoxDisplay.Size = new System.Drawing.Size(144, 21);
|
this.comboBoxDisplay.Size = new System.Drawing.Size(144, 23);
|
||||||
this.comboBoxDisplay.TabIndex = 6;
|
this.comboBoxDisplay.TabIndex = 16;
|
||||||
//
|
//
|
||||||
// labelEdgeDistance
|
// labelEdgeDistance
|
||||||
//
|
//
|
||||||
this.labelEdgeDistance.AutoSize = true;
|
this.labelEdgeDistance.AutoSize = true;
|
||||||
this.labelEdgeDistance.Location = new System.Drawing.Point(3, 112);
|
this.labelEdgeDistance.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.labelEdgeDistance.Location = new System.Drawing.Point(3, 521);
|
||||||
this.labelEdgeDistance.Margin = new System.Windows.Forms.Padding(3, 12, 3, 0);
|
this.labelEdgeDistance.Margin = new System.Windows.Forms.Padding(3, 12, 3, 0);
|
||||||
this.labelEdgeDistance.Name = "labelEdgeDistance";
|
this.labelEdgeDistance.Name = "labelEdgeDistance";
|
||||||
this.labelEdgeDistance.Size = new System.Drawing.Size(103, 13);
|
this.labelEdgeDistance.Size = new System.Drawing.Size(112, 15);
|
||||||
this.labelEdgeDistance.TabIndex = 7;
|
this.labelEdgeDistance.TabIndex = 17;
|
||||||
this.labelEdgeDistance.Text = "Distance From Edge";
|
this.labelEdgeDistance.Text = "Distance From Edge";
|
||||||
//
|
//
|
||||||
// radioLocCustom
|
// radioLocCustom
|
||||||
//
|
//
|
||||||
|
this.radioLocCustom.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.radioLocCustom.Location = new System.Drawing.Point(205, 4);
|
this.radioLocCustom.Location = new System.Drawing.Point(205, 4);
|
||||||
this.radioLocCustom.Margin = new System.Windows.Forms.Padding(5, 4, 3, 3);
|
this.radioLocCustom.Margin = new System.Windows.Forms.Padding(5, 4, 3, 3);
|
||||||
this.radioLocCustom.Name = "radioLocCustom";
|
this.radioLocCustom.Name = "radioLocCustom";
|
||||||
this.radioLocCustom.Size = new System.Drawing.Size(65, 41);
|
this.radioLocCustom.Size = new System.Drawing.Size(70, 43);
|
||||||
this.radioLocCustom.TabIndex = 4;
|
this.radioLocCustom.TabIndex = 4;
|
||||||
this.radioLocCustom.TabStop = true;
|
this.radioLocCustom.TabStop = true;
|
||||||
this.radioLocCustom.Text = "Custom";
|
this.radioLocCustom.Text = "Custom";
|
||||||
this.toolTip.SetToolTip(this.radioLocCustom, "Drag the example notification window to the desired location.");
|
|
||||||
this.radioLocCustom.UseVisualStyleBackColor = true;
|
this.radioLocCustom.UseVisualStyleBackColor = true;
|
||||||
//
|
//
|
||||||
// radioLocBR
|
// radioLocBR
|
||||||
//
|
//
|
||||||
|
this.radioLocBR.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.radioLocBR.Location = new System.Drawing.Point(105, 28);
|
this.radioLocBR.Location = new System.Drawing.Point(105, 28);
|
||||||
this.radioLocBR.Margin = new System.Windows.Forms.Padding(5, 4, 3, 3);
|
this.radioLocBR.Margin = new System.Windows.Forms.Padding(5, 4, 3, 3);
|
||||||
this.radioLocBR.Name = "radioLocBR";
|
this.radioLocBR.Name = "radioLocBR";
|
||||||
this.radioLocBR.Size = new System.Drawing.Size(92, 17);
|
this.radioLocBR.Size = new System.Drawing.Size(92, 19);
|
||||||
this.radioLocBR.TabIndex = 3;
|
this.radioLocBR.TabIndex = 3;
|
||||||
this.radioLocBR.TabStop = true;
|
this.radioLocBR.TabStop = true;
|
||||||
this.radioLocBR.Text = "Bottom Right";
|
this.radioLocBR.Text = "Bottom Right";
|
||||||
@@ -141,10 +148,11 @@
|
|||||||
//
|
//
|
||||||
// radioLocBL
|
// radioLocBL
|
||||||
//
|
//
|
||||||
|
this.radioLocBL.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.radioLocBL.Location = new System.Drawing.Point(5, 28);
|
this.radioLocBL.Location = new System.Drawing.Point(5, 28);
|
||||||
this.radioLocBL.Margin = new System.Windows.Forms.Padding(5, 4, 3, 3);
|
this.radioLocBL.Margin = new System.Windows.Forms.Padding(5, 4, 3, 3);
|
||||||
this.radioLocBL.Name = "radioLocBL";
|
this.radioLocBL.Name = "radioLocBL";
|
||||||
this.radioLocBL.Size = new System.Drawing.Size(92, 17);
|
this.radioLocBL.Size = new System.Drawing.Size(92, 19);
|
||||||
this.radioLocBL.TabIndex = 2;
|
this.radioLocBL.TabIndex = 2;
|
||||||
this.radioLocBL.TabStop = true;
|
this.radioLocBL.TabStop = true;
|
||||||
this.radioLocBL.Text = "Bottom Left";
|
this.radioLocBL.Text = "Bottom Left";
|
||||||
@@ -152,10 +160,11 @@
|
|||||||
//
|
//
|
||||||
// radioLocTR
|
// radioLocTR
|
||||||
//
|
//
|
||||||
|
this.radioLocTR.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.radioLocTR.Location = new System.Drawing.Point(105, 4);
|
this.radioLocTR.Location = new System.Drawing.Point(105, 4);
|
||||||
this.radioLocTR.Margin = new System.Windows.Forms.Padding(5, 4, 3, 3);
|
this.radioLocTR.Margin = new System.Windows.Forms.Padding(5, 4, 3, 3);
|
||||||
this.radioLocTR.Name = "radioLocTR";
|
this.radioLocTR.Name = "radioLocTR";
|
||||||
this.radioLocTR.Size = new System.Drawing.Size(92, 17);
|
this.radioLocTR.Size = new System.Drawing.Size(92, 19);
|
||||||
this.radioLocTR.TabIndex = 1;
|
this.radioLocTR.TabIndex = 1;
|
||||||
this.radioLocTR.TabStop = true;
|
this.radioLocTR.TabStop = true;
|
||||||
this.radioLocTR.Text = "Top Right";
|
this.radioLocTR.Text = "Top Right";
|
||||||
@@ -163,10 +172,11 @@
|
|||||||
//
|
//
|
||||||
// radioLocTL
|
// radioLocTL
|
||||||
//
|
//
|
||||||
|
this.radioLocTL.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.radioLocTL.Location = new System.Drawing.Point(5, 4);
|
this.radioLocTL.Location = new System.Drawing.Point(5, 4);
|
||||||
this.radioLocTL.Margin = new System.Windows.Forms.Padding(5, 4, 3, 3);
|
this.radioLocTL.Margin = new System.Windows.Forms.Padding(5, 4, 3, 3);
|
||||||
this.radioLocTL.Name = "radioLocTL";
|
this.radioLocTL.Name = "radioLocTL";
|
||||||
this.radioLocTL.Size = new System.Drawing.Size(92, 17);
|
this.radioLocTL.Size = new System.Drawing.Size(92, 19);
|
||||||
this.radioLocTL.TabIndex = 0;
|
this.radioLocTL.TabIndex = 0;
|
||||||
this.radioLocTL.TabStop = true;
|
this.radioLocTL.TabStop = true;
|
||||||
this.radioLocTL.Text = "Top Left";
|
this.radioLocTL.Text = "Top Left";
|
||||||
@@ -176,13 +186,13 @@
|
|||||||
//
|
//
|
||||||
this.trackBarEdgeDistance.AutoSize = false;
|
this.trackBarEdgeDistance.AutoSize = false;
|
||||||
this.trackBarEdgeDistance.LargeChange = 8;
|
this.trackBarEdgeDistance.LargeChange = 8;
|
||||||
this.trackBarEdgeDistance.Location = new System.Drawing.Point(5, 128);
|
this.trackBarEdgeDistance.Location = new System.Drawing.Point(3, 3);
|
||||||
this.trackBarEdgeDistance.Maximum = 40;
|
this.trackBarEdgeDistance.Maximum = 40;
|
||||||
this.trackBarEdgeDistance.Minimum = 8;
|
this.trackBarEdgeDistance.Minimum = 8;
|
||||||
this.trackBarEdgeDistance.Name = "trackBarEdgeDistance";
|
this.trackBarEdgeDistance.Name = "trackBarEdgeDistance";
|
||||||
this.trackBarEdgeDistance.Size = new System.Drawing.Size(148, 30);
|
this.trackBarEdgeDistance.Size = new System.Drawing.Size(148, 30);
|
||||||
this.trackBarEdgeDistance.SmallChange = 2;
|
this.trackBarEdgeDistance.SmallChange = 2;
|
||||||
this.trackBarEdgeDistance.TabIndex = 8;
|
this.trackBarEdgeDistance.TabIndex = 0;
|
||||||
this.trackBarEdgeDistance.TickFrequency = 4;
|
this.trackBarEdgeDistance.TickFrequency = 4;
|
||||||
this.trackBarEdgeDistance.Value = 8;
|
this.trackBarEdgeDistance.Value = 8;
|
||||||
//
|
//
|
||||||
@@ -195,12 +205,12 @@
|
|||||||
this.tableLayoutDurationButtons.Controls.Add(this.btnDurationMedium, 0, 0);
|
this.tableLayoutDurationButtons.Controls.Add(this.btnDurationMedium, 0, 0);
|
||||||
this.tableLayoutDurationButtons.Controls.Add(this.btnDurationLong, 1, 0);
|
this.tableLayoutDurationButtons.Controls.Add(this.btnDurationLong, 1, 0);
|
||||||
this.tableLayoutDurationButtons.Controls.Add(this.btnDurationShort, 0, 0);
|
this.tableLayoutDurationButtons.Controls.Add(this.btnDurationShort, 0, 0);
|
||||||
this.tableLayoutDurationButtons.Location = new System.Drawing.Point(3, 113);
|
this.tableLayoutDurationButtons.Location = new System.Drawing.Point(3, 332);
|
||||||
this.tableLayoutDurationButtons.Name = "tableLayoutDurationButtons";
|
this.tableLayoutDurationButtons.Name = "tableLayoutDurationButtons";
|
||||||
this.tableLayoutDurationButtons.RowCount = 1;
|
this.tableLayoutDurationButtons.RowCount = 1;
|
||||||
this.tableLayoutDurationButtons.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
|
this.tableLayoutDurationButtons.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
|
||||||
this.tableLayoutDurationButtons.Size = new System.Drawing.Size(171, 27);
|
this.tableLayoutDurationButtons.Size = new System.Drawing.Size(180, 27);
|
||||||
this.tableLayoutDurationButtons.TabIndex = 5;
|
this.tableLayoutDurationButtons.TabIndex = 12;
|
||||||
//
|
//
|
||||||
// btnDurationMedium
|
// btnDurationMedium
|
||||||
//
|
//
|
||||||
@@ -209,10 +219,11 @@
|
|||||||
this.btnDurationMedium.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.ControlLight;
|
this.btnDurationMedium.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.ControlLight;
|
||||||
this.btnDurationMedium.FlatAppearance.MouseOverBackColor = System.Drawing.Color.White;
|
this.btnDurationMedium.FlatAppearance.MouseOverBackColor = System.Drawing.Color.White;
|
||||||
this.btnDurationMedium.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
this.btnDurationMedium.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||||
this.btnDurationMedium.Location = new System.Drawing.Point(55, 1);
|
this.btnDurationMedium.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.btnDurationMedium.Location = new System.Drawing.Point(58, 1);
|
||||||
this.btnDurationMedium.Margin = new System.Windows.Forms.Padding(1);
|
this.btnDurationMedium.Margin = new System.Windows.Forms.Padding(1);
|
||||||
this.btnDurationMedium.Name = "btnDurationMedium";
|
this.btnDurationMedium.Name = "btnDurationMedium";
|
||||||
this.btnDurationMedium.Size = new System.Drawing.Size(59, 25);
|
this.btnDurationMedium.Size = new System.Drawing.Size(62, 25);
|
||||||
this.btnDurationMedium.TabIndex = 1;
|
this.btnDurationMedium.TabIndex = 1;
|
||||||
this.btnDurationMedium.Text = "Medium";
|
this.btnDurationMedium.Text = "Medium";
|
||||||
this.btnDurationMedium.UseVisualStyleBackColor = true;
|
this.btnDurationMedium.UseVisualStyleBackColor = true;
|
||||||
@@ -224,10 +235,11 @@
|
|||||||
this.btnDurationLong.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.ControlLight;
|
this.btnDurationLong.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.ControlLight;
|
||||||
this.btnDurationLong.FlatAppearance.MouseOverBackColor = System.Drawing.Color.White;
|
this.btnDurationLong.FlatAppearance.MouseOverBackColor = System.Drawing.Color.White;
|
||||||
this.btnDurationLong.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
this.btnDurationLong.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||||
this.btnDurationLong.Location = new System.Drawing.Point(116, 1);
|
this.btnDurationLong.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.btnDurationLong.Location = new System.Drawing.Point(122, 1);
|
||||||
this.btnDurationLong.Margin = new System.Windows.Forms.Padding(1);
|
this.btnDurationLong.Margin = new System.Windows.Forms.Padding(1);
|
||||||
this.btnDurationLong.Name = "btnDurationLong";
|
this.btnDurationLong.Name = "btnDurationLong";
|
||||||
this.btnDurationLong.Size = new System.Drawing.Size(54, 25);
|
this.btnDurationLong.Size = new System.Drawing.Size(57, 25);
|
||||||
this.btnDurationLong.TabIndex = 2;
|
this.btnDurationLong.TabIndex = 2;
|
||||||
this.btnDurationLong.Text = "Long";
|
this.btnDurationLong.Text = "Long";
|
||||||
this.btnDurationLong.UseVisualStyleBackColor = true;
|
this.btnDurationLong.UseVisualStyleBackColor = true;
|
||||||
@@ -239,10 +251,11 @@
|
|||||||
this.btnDurationShort.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.ControlLight;
|
this.btnDurationShort.FlatAppearance.MouseDownBackColor = System.Drawing.SystemColors.ControlLight;
|
||||||
this.btnDurationShort.FlatAppearance.MouseOverBackColor = System.Drawing.Color.White;
|
this.btnDurationShort.FlatAppearance.MouseOverBackColor = System.Drawing.Color.White;
|
||||||
this.btnDurationShort.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
this.btnDurationShort.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
|
||||||
|
this.btnDurationShort.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.btnDurationShort.Location = new System.Drawing.Point(1, 1);
|
this.btnDurationShort.Location = new System.Drawing.Point(1, 1);
|
||||||
this.btnDurationShort.Margin = new System.Windows.Forms.Padding(1);
|
this.btnDurationShort.Margin = new System.Windows.Forms.Padding(1);
|
||||||
this.btnDurationShort.Name = "btnDurationShort";
|
this.btnDurationShort.Name = "btnDurationShort";
|
||||||
this.btnDurationShort.Size = new System.Drawing.Size(52, 25);
|
this.btnDurationShort.Size = new System.Drawing.Size(55, 25);
|
||||||
this.btnDurationShort.TabIndex = 0;
|
this.btnDurationShort.TabIndex = 0;
|
||||||
this.btnDurationShort.Text = "Short";
|
this.btnDurationShort.Text = "Short";
|
||||||
this.btnDurationShort.UseVisualStyleBackColor = true;
|
this.btnDurationShort.UseVisualStyleBackColor = true;
|
||||||
@@ -250,164 +263,175 @@
|
|||||||
// labelDurationValue
|
// labelDurationValue
|
||||||
//
|
//
|
||||||
this.labelDurationValue.BackColor = System.Drawing.Color.Transparent;
|
this.labelDurationValue.BackColor = System.Drawing.Color.Transparent;
|
||||||
this.labelDurationValue.Location = new System.Drawing.Point(147, 77);
|
this.labelDurationValue.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.labelDurationValue.Location = new System.Drawing.Point(147, 4);
|
||||||
this.labelDurationValue.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);
|
this.labelDurationValue.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);
|
||||||
this.labelDurationValue.Name = "labelDurationValue";
|
this.labelDurationValue.Name = "labelDurationValue";
|
||||||
this.labelDurationValue.Size = new System.Drawing.Size(52, 13);
|
this.labelDurationValue.Size = new System.Drawing.Size(52, 15);
|
||||||
this.labelDurationValue.TabIndex = 4;
|
this.labelDurationValue.TabIndex = 1;
|
||||||
this.labelDurationValue.Text = "0 ms/c";
|
this.labelDurationValue.Text = "0 ms/c";
|
||||||
this.labelDurationValue.TextAlign = System.Drawing.ContentAlignment.TopRight;
|
this.labelDurationValue.TextAlign = System.Drawing.ContentAlignment.TopRight;
|
||||||
this.toolTip.SetToolTip(this.labelDurationValue, "Milliseconds per character.");
|
|
||||||
//
|
//
|
||||||
// trackBarDuration
|
// trackBarDuration
|
||||||
//
|
//
|
||||||
this.trackBarDuration.AutoSize = false;
|
this.trackBarDuration.AutoSize = false;
|
||||||
this.trackBarDuration.Location = new System.Drawing.Point(3, 76);
|
this.trackBarDuration.Location = new System.Drawing.Point(3, 3);
|
||||||
this.trackBarDuration.Maximum = 60;
|
this.trackBarDuration.Maximum = 60;
|
||||||
this.trackBarDuration.Minimum = 10;
|
this.trackBarDuration.Minimum = 10;
|
||||||
this.trackBarDuration.Name = "trackBarDuration";
|
this.trackBarDuration.Name = "trackBarDuration";
|
||||||
this.trackBarDuration.Size = new System.Drawing.Size(148, 30);
|
this.trackBarDuration.Size = new System.Drawing.Size(148, 30);
|
||||||
this.trackBarDuration.TabIndex = 3;
|
this.trackBarDuration.TabIndex = 0;
|
||||||
this.trackBarDuration.TickFrequency = 5;
|
this.trackBarDuration.TickFrequency = 5;
|
||||||
this.trackBarDuration.Value = 25;
|
this.trackBarDuration.Value = 25;
|
||||||
//
|
//
|
||||||
// checkSkipOnLinkClick
|
// checkSkipOnLinkClick
|
||||||
//
|
//
|
||||||
this.checkSkipOnLinkClick.AutoSize = true;
|
this.checkSkipOnLinkClick.AutoSize = true;
|
||||||
this.checkSkipOnLinkClick.Location = new System.Drawing.Point(6, 51);
|
this.checkSkipOnLinkClick.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.checkSkipOnLinkClick.Margin = new System.Windows.Forms.Padding(6, 3, 3, 3);
|
this.checkSkipOnLinkClick.Location = new System.Drawing.Point(6, 74);
|
||||||
|
this.checkSkipOnLinkClick.Margin = new System.Windows.Forms.Padding(6, 3, 3, 2);
|
||||||
this.checkSkipOnLinkClick.Name = "checkSkipOnLinkClick";
|
this.checkSkipOnLinkClick.Name = "checkSkipOnLinkClick";
|
||||||
this.checkSkipOnLinkClick.Size = new System.Drawing.Size(113, 17);
|
this.checkSkipOnLinkClick.Size = new System.Drawing.Size(121, 19);
|
||||||
this.checkSkipOnLinkClick.TabIndex = 2;
|
this.checkSkipOnLinkClick.TabIndex = 3;
|
||||||
this.checkSkipOnLinkClick.Text = "Skip On Link Click";
|
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;
|
this.checkSkipOnLinkClick.UseVisualStyleBackColor = true;
|
||||||
//
|
//
|
||||||
// checkColumnName
|
// checkColumnName
|
||||||
//
|
//
|
||||||
this.checkColumnName.AutoSize = true;
|
this.checkColumnName.AutoSize = true;
|
||||||
this.checkColumnName.Location = new System.Drawing.Point(6, 5);
|
this.checkColumnName.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.checkColumnName.Margin = new System.Windows.Forms.Padding(6, 5, 3, 3);
|
this.checkColumnName.Location = new System.Drawing.Point(6, 26);
|
||||||
|
this.checkColumnName.Margin = new System.Windows.Forms.Padding(6, 6, 3, 2);
|
||||||
this.checkColumnName.Name = "checkColumnName";
|
this.checkColumnName.Name = "checkColumnName";
|
||||||
this.checkColumnName.Size = new System.Drawing.Size(129, 17);
|
this.checkColumnName.Size = new System.Drawing.Size(145, 19);
|
||||||
this.checkColumnName.TabIndex = 0;
|
this.checkColumnName.TabIndex = 1;
|
||||||
this.checkColumnName.Text = "Display Column Name";
|
this.checkColumnName.Text = "Display Column Name";
|
||||||
this.toolTip.SetToolTip(this.checkColumnName, "Shows column name each notification originated\r\nfrom in the notification window title.");
|
|
||||||
this.checkColumnName.UseVisualStyleBackColor = true;
|
this.checkColumnName.UseVisualStyleBackColor = true;
|
||||||
//
|
//
|
||||||
// labelIdlePause
|
// labelIdlePause
|
||||||
//
|
//
|
||||||
this.labelIdlePause.AutoSize = true;
|
this.labelIdlePause.AutoSize = true;
|
||||||
this.labelIdlePause.Location = new System.Drawing.Point(3, 106);
|
this.labelIdlePause.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.labelIdlePause.Location = new System.Drawing.Point(3, 131);
|
||||||
this.labelIdlePause.Margin = new System.Windows.Forms.Padding(3, 12, 3, 0);
|
this.labelIdlePause.Margin = new System.Windows.Forms.Padding(3, 12, 3, 0);
|
||||||
this.labelIdlePause.Name = "labelIdlePause";
|
this.labelIdlePause.Name = "labelIdlePause";
|
||||||
this.labelIdlePause.Size = new System.Drawing.Size(89, 13);
|
this.labelIdlePause.Size = new System.Drawing.Size(94, 15);
|
||||||
this.labelIdlePause.TabIndex = 4;
|
this.labelIdlePause.TabIndex = 5;
|
||||||
this.labelIdlePause.Text = "Pause When Idle";
|
this.labelIdlePause.Text = "Pause When Idle";
|
||||||
//
|
//
|
||||||
// comboBoxIdlePause
|
// comboBoxIdlePause
|
||||||
//
|
//
|
||||||
this.comboBoxIdlePause.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
this.comboBoxIdlePause.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||||
|
this.comboBoxIdlePause.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.comboBoxIdlePause.FormattingEnabled = true;
|
this.comboBoxIdlePause.FormattingEnabled = true;
|
||||||
this.comboBoxIdlePause.Location = new System.Drawing.Point(5, 122);
|
this.comboBoxIdlePause.Location = new System.Drawing.Point(5, 149);
|
||||||
this.comboBoxIdlePause.Margin = new System.Windows.Forms.Padding(5, 3, 3, 3);
|
this.comboBoxIdlePause.Margin = new System.Windows.Forms.Padding(5, 3, 3, 3);
|
||||||
this.comboBoxIdlePause.Name = "comboBoxIdlePause";
|
this.comboBoxIdlePause.Name = "comboBoxIdlePause";
|
||||||
this.comboBoxIdlePause.Size = new System.Drawing.Size(144, 21);
|
this.comboBoxIdlePause.Size = new System.Drawing.Size(144, 23);
|
||||||
this.comboBoxIdlePause.TabIndex = 5;
|
this.comboBoxIdlePause.TabIndex = 6;
|
||||||
this.toolTip.SetToolTip(this.comboBoxIdlePause, "Pauses new notifications after going idle for a set amount of time.");
|
|
||||||
//
|
//
|
||||||
// checkNonIntrusive
|
// checkNonIntrusive
|
||||||
//
|
//
|
||||||
this.checkNonIntrusive.AutoSize = true;
|
this.checkNonIntrusive.AutoSize = true;
|
||||||
this.checkNonIntrusive.Location = new System.Drawing.Point(6, 74);
|
this.checkNonIntrusive.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.checkNonIntrusive.Margin = new System.Windows.Forms.Padding(6, 3, 3, 3);
|
this.checkNonIntrusive.Location = new System.Drawing.Point(6, 98);
|
||||||
|
this.checkNonIntrusive.Margin = new System.Windows.Forms.Padding(6, 3, 3, 2);
|
||||||
this.checkNonIntrusive.Name = "checkNonIntrusive";
|
this.checkNonIntrusive.Name = "checkNonIntrusive";
|
||||||
this.checkNonIntrusive.Size = new System.Drawing.Size(128, 17);
|
this.checkNonIntrusive.Size = new System.Drawing.Size(142, 19);
|
||||||
this.checkNonIntrusive.TabIndex = 3;
|
this.checkNonIntrusive.TabIndex = 4;
|
||||||
this.checkNonIntrusive.Text = "Non-Intrusive Popups";
|
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;
|
this.checkNonIntrusive.UseVisualStyleBackColor = true;
|
||||||
//
|
//
|
||||||
// checkTimerCountDown
|
// checkTimerCountDown
|
||||||
//
|
//
|
||||||
this.checkTimerCountDown.AutoSize = true;
|
this.checkTimerCountDown.AutoSize = true;
|
||||||
this.checkTimerCountDown.Location = new System.Drawing.Point(6, 28);
|
this.checkTimerCountDown.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.checkTimerCountDown.Margin = new System.Windows.Forms.Padding(6, 3, 3, 3);
|
this.checkTimerCountDown.Location = new System.Drawing.Point(6, 245);
|
||||||
|
this.checkTimerCountDown.Margin = new System.Windows.Forms.Padding(6, 3, 3, 2);
|
||||||
this.checkTimerCountDown.Name = "checkTimerCountDown";
|
this.checkTimerCountDown.Name = "checkTimerCountDown";
|
||||||
this.checkTimerCountDown.Size = new System.Drawing.Size(119, 17);
|
this.checkTimerCountDown.Size = new System.Drawing.Size(132, 19);
|
||||||
this.checkTimerCountDown.TabIndex = 1;
|
this.checkTimerCountDown.TabIndex = 9;
|
||||||
this.checkTimerCountDown.Text = "Timer Counts Down";
|
this.checkTimerCountDown.Text = "Timer Counts Down";
|
||||||
this.toolTip.SetToolTip(this.checkTimerCountDown, "The notification timer counts down instead of up.");
|
|
||||||
this.checkTimerCountDown.UseVisualStyleBackColor = true;
|
this.checkTimerCountDown.UseVisualStyleBackColor = true;
|
||||||
//
|
//
|
||||||
// checkNotificationTimer
|
// checkNotificationTimer
|
||||||
//
|
//
|
||||||
this.checkNotificationTimer.AutoSize = true;
|
this.checkNotificationTimer.AutoSize = true;
|
||||||
this.checkNotificationTimer.Location = new System.Drawing.Point(6, 5);
|
this.checkNotificationTimer.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.checkNotificationTimer.Margin = new System.Windows.Forms.Padding(6, 5, 3, 3);
|
this.checkNotificationTimer.Location = new System.Drawing.Point(6, 221);
|
||||||
|
this.checkNotificationTimer.Margin = new System.Windows.Forms.Padding(6, 6, 3, 2);
|
||||||
this.checkNotificationTimer.Name = "checkNotificationTimer";
|
this.checkNotificationTimer.Name = "checkNotificationTimer";
|
||||||
this.checkNotificationTimer.Size = new System.Drawing.Size(145, 17);
|
this.checkNotificationTimer.Size = new System.Drawing.Size(164, 19);
|
||||||
this.checkNotificationTimer.TabIndex = 0;
|
this.checkNotificationTimer.TabIndex = 8;
|
||||||
this.checkNotificationTimer.Text = "Display Notification Timer";
|
this.checkNotificationTimer.Text = "Display Notification Timer";
|
||||||
this.checkNotificationTimer.UseVisualStyleBackColor = true;
|
this.checkNotificationTimer.UseVisualStyleBackColor = true;
|
||||||
//
|
//
|
||||||
// radioSizeAuto
|
// radioSizeAuto
|
||||||
//
|
//
|
||||||
this.radioSizeAuto.Location = new System.Drawing.Point(6, 4);
|
this.radioSizeAuto.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.radioSizeAuto.Location = new System.Drawing.Point(5, 4);
|
||||||
this.radioSizeAuto.Margin = new System.Windows.Forms.Padding(5, 4, 3, 3);
|
this.radioSizeAuto.Margin = new System.Windows.Forms.Padding(5, 4, 3, 3);
|
||||||
this.radioSizeAuto.Name = "radioSizeAuto";
|
this.radioSizeAuto.Name = "radioSizeAuto";
|
||||||
this.radioSizeAuto.Size = new System.Drawing.Size(92, 17);
|
this.radioSizeAuto.Size = new System.Drawing.Size(92, 19);
|
||||||
this.radioSizeAuto.TabIndex = 0;
|
this.radioSizeAuto.TabIndex = 0;
|
||||||
this.radioSizeAuto.TabStop = true;
|
this.radioSizeAuto.TabStop = true;
|
||||||
this.radioSizeAuto.Text = "Auto";
|
this.radioSizeAuto.Text = "Auto";
|
||||||
this.toolTip.SetToolTip(this.radioSizeAuto, "Notification size is based on the font size and browser zoom level.");
|
|
||||||
this.radioSizeAuto.UseVisualStyleBackColor = true;
|
this.radioSizeAuto.UseVisualStyleBackColor = true;
|
||||||
//
|
//
|
||||||
// radioSizeCustom
|
// radioSizeCustom
|
||||||
//
|
//
|
||||||
this.radioSizeCustom.Location = new System.Drawing.Point(106, 4);
|
this.radioSizeCustom.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.radioSizeCustom.Location = new System.Drawing.Point(105, 4);
|
||||||
this.radioSizeCustom.Margin = new System.Windows.Forms.Padding(5, 4, 3, 3);
|
this.radioSizeCustom.Margin = new System.Windows.Forms.Padding(5, 4, 3, 3);
|
||||||
this.radioSizeCustom.Name = "radioSizeCustom";
|
this.radioSizeCustom.Name = "radioSizeCustom";
|
||||||
this.radioSizeCustom.Size = new System.Drawing.Size(92, 17);
|
this.radioSizeCustom.Size = new System.Drawing.Size(92, 19);
|
||||||
this.radioSizeCustom.TabIndex = 1;
|
this.radioSizeCustom.TabIndex = 1;
|
||||||
this.radioSizeCustom.TabStop = true;
|
this.radioSizeCustom.TabStop = true;
|
||||||
this.radioSizeCustom.Text = "Custom";
|
this.radioSizeCustom.Text = "Custom";
|
||||||
this.toolTip.SetToolTip(this.radioSizeCustom, "Resize the example notification window to the desired size.");
|
|
||||||
this.radioSizeCustom.UseVisualStyleBackColor = true;
|
this.radioSizeCustom.UseVisualStyleBackColor = true;
|
||||||
//
|
//
|
||||||
// labelGeneral
|
// labelGeneral
|
||||||
//
|
//
|
||||||
this.labelGeneral.AutoSize = true;
|
this.labelGeneral.AutoSize = true;
|
||||||
this.labelGeneral.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
this.labelGeneral.Font = new System.Drawing.Font("Segoe UI", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.labelGeneral.Location = new System.Drawing.Point(6, 8);
|
this.labelGeneral.Location = new System.Drawing.Point(0, 0);
|
||||||
this.labelGeneral.Margin = new System.Windows.Forms.Padding(0, 2, 0, 0);
|
this.labelGeneral.Margin = new System.Windows.Forms.Padding(0);
|
||||||
this.labelGeneral.Name = "labelGeneral";
|
this.labelGeneral.Name = "labelGeneral";
|
||||||
this.labelGeneral.Size = new System.Drawing.Size(66, 20);
|
this.labelGeneral.Size = new System.Drawing.Size(60, 20);
|
||||||
this.labelGeneral.TabIndex = 0;
|
this.labelGeneral.TabIndex = 0;
|
||||||
this.labelGeneral.Text = "General";
|
this.labelGeneral.Text = "General";
|
||||||
//
|
//
|
||||||
// panelGeneral
|
// panelEdgeDistance
|
||||||
//
|
//
|
||||||
this.panelGeneral.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
this.panelEdgeDistance.Anchor = System.Windows.Forms.AnchorStyles.Top;
|
||||||
| System.Windows.Forms.AnchorStyles.Right)));
|
this.panelEdgeDistance.Controls.Add(this.trackBarEdgeDistance);
|
||||||
this.panelGeneral.Controls.Add(this.checkMediaPreviews);
|
this.panelEdgeDistance.Controls.Add(this.labelEdgeDistanceValue);
|
||||||
this.panelGeneral.Controls.Add(this.checkColumnName);
|
this.panelEdgeDistance.Location = new System.Drawing.Point(0, 536);
|
||||||
this.panelGeneral.Controls.Add(this.checkSkipOnLinkClick);
|
this.panelEdgeDistance.Margin = new System.Windows.Forms.Padding(0);
|
||||||
this.panelGeneral.Controls.Add(this.checkNonIntrusive);
|
this.panelEdgeDistance.Name = "panelEdgeDistance";
|
||||||
this.panelGeneral.Controls.Add(this.labelIdlePause);
|
this.panelEdgeDistance.Size = new System.Drawing.Size(322, 36);
|
||||||
this.panelGeneral.Controls.Add(this.comboBoxIdlePause);
|
this.panelEdgeDistance.TabIndex = 18;
|
||||||
this.panelGeneral.Location = new System.Drawing.Point(9, 31);
|
//
|
||||||
this.panelGeneral.Name = "panelGeneral";
|
// checkMediaPreviews
|
||||||
this.panelGeneral.Size = new System.Drawing.Size(322, 149);
|
//
|
||||||
this.panelGeneral.TabIndex = 1;
|
this.checkMediaPreviews.AutoSize = true;
|
||||||
|
this.checkMediaPreviews.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.checkMediaPreviews.Location = new System.Drawing.Point(6, 50);
|
||||||
|
this.checkMediaPreviews.Margin = new System.Windows.Forms.Padding(6, 3, 3, 2);
|
||||||
|
this.checkMediaPreviews.Name = "checkMediaPreviews";
|
||||||
|
this.checkMediaPreviews.Size = new System.Drawing.Size(140, 19);
|
||||||
|
this.checkMediaPreviews.TabIndex = 2;
|
||||||
|
this.checkMediaPreviews.Text = "Show Media Previews";
|
||||||
|
this.checkMediaPreviews.UseVisualStyleBackColor = true;
|
||||||
//
|
//
|
||||||
// labelScrollSpeedValue
|
// labelScrollSpeedValue
|
||||||
//
|
//
|
||||||
this.labelScrollSpeedValue.Location = new System.Drawing.Point(147, 53);
|
this.labelScrollSpeedValue.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.labelScrollSpeedValue.Location = new System.Drawing.Point(145, 4);
|
||||||
this.labelScrollSpeedValue.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);
|
this.labelScrollSpeedValue.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);
|
||||||
this.labelScrollSpeedValue.Name = "labelScrollSpeedValue";
|
this.labelScrollSpeedValue.Name = "labelScrollSpeedValue";
|
||||||
this.labelScrollSpeedValue.Size = new System.Drawing.Size(38, 13);
|
this.labelScrollSpeedValue.Size = new System.Drawing.Size(38, 15);
|
||||||
this.labelScrollSpeedValue.TabIndex = 4;
|
this.labelScrollSpeedValue.TabIndex = 1;
|
||||||
this.labelScrollSpeedValue.Text = "100%";
|
this.labelScrollSpeedValue.Text = "100%";
|
||||||
this.labelScrollSpeedValue.TextAlign = System.Drawing.ContentAlignment.TopRight;
|
this.labelScrollSpeedValue.TextAlign = System.Drawing.ContentAlignment.TopRight;
|
||||||
//
|
//
|
||||||
@@ -415,163 +439,179 @@
|
|||||||
//
|
//
|
||||||
this.trackBarScrollSpeed.AutoSize = false;
|
this.trackBarScrollSpeed.AutoSize = false;
|
||||||
this.trackBarScrollSpeed.LargeChange = 25;
|
this.trackBarScrollSpeed.LargeChange = 25;
|
||||||
this.trackBarScrollSpeed.Location = new System.Drawing.Point(5, 52);
|
this.trackBarScrollSpeed.Location = new System.Drawing.Point(3, 3);
|
||||||
this.trackBarScrollSpeed.Maximum = 200;
|
this.trackBarScrollSpeed.Maximum = 200;
|
||||||
this.trackBarScrollSpeed.Minimum = 25;
|
this.trackBarScrollSpeed.Minimum = 25;
|
||||||
this.trackBarScrollSpeed.Name = "trackBarScrollSpeed";
|
this.trackBarScrollSpeed.Name = "trackBarScrollSpeed";
|
||||||
this.trackBarScrollSpeed.Size = new System.Drawing.Size(148, 30);
|
this.trackBarScrollSpeed.Size = new System.Drawing.Size(148, 30);
|
||||||
this.trackBarScrollSpeed.SmallChange = 5;
|
this.trackBarScrollSpeed.SmallChange = 5;
|
||||||
this.trackBarScrollSpeed.TabIndex = 3;
|
this.trackBarScrollSpeed.TabIndex = 0;
|
||||||
this.trackBarScrollSpeed.TickFrequency = 25;
|
this.trackBarScrollSpeed.TickFrequency = 25;
|
||||||
this.trackBarScrollSpeed.Value = 100;
|
this.trackBarScrollSpeed.Value = 100;
|
||||||
//
|
//
|
||||||
// labelScrollSpeed
|
// labelScrollSpeed
|
||||||
//
|
//
|
||||||
this.labelScrollSpeed.AutoSize = true;
|
this.labelScrollSpeed.AutoSize = true;
|
||||||
this.labelScrollSpeed.Location = new System.Drawing.Point(3, 36);
|
this.labelScrollSpeed.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.labelScrollSpeed.Location = new System.Drawing.Point(3, 651);
|
||||||
this.labelScrollSpeed.Margin = new System.Windows.Forms.Padding(3, 12, 3, 0);
|
this.labelScrollSpeed.Margin = new System.Windows.Forms.Padding(3, 12, 3, 0);
|
||||||
this.labelScrollSpeed.Name = "labelScrollSpeed";
|
this.labelScrollSpeed.Name = "labelScrollSpeed";
|
||||||
this.labelScrollSpeed.Size = new System.Drawing.Size(67, 13);
|
this.labelScrollSpeed.Size = new System.Drawing.Size(71, 15);
|
||||||
this.labelScrollSpeed.TabIndex = 2;
|
this.labelScrollSpeed.TabIndex = 21;
|
||||||
this.labelScrollSpeed.Text = "Scroll Speed";
|
this.labelScrollSpeed.Text = "Scroll Speed";
|
||||||
//
|
//
|
||||||
// labelLocation
|
// labelLocation
|
||||||
//
|
//
|
||||||
this.labelLocation.AutoSize = true;
|
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.Font = new System.Drawing.Font("Segoe UI", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.labelLocation.Location = new System.Drawing.Point(6, 395);
|
this.labelLocation.Location = new System.Drawing.Point(0, 382);
|
||||||
this.labelLocation.Margin = new System.Windows.Forms.Padding(0, 21, 0, 0);
|
this.labelLocation.Margin = new System.Windows.Forms.Padding(0, 20, 0, 0);
|
||||||
this.labelLocation.Name = "labelLocation";
|
this.labelLocation.Name = "labelLocation";
|
||||||
this.labelLocation.Size = new System.Drawing.Size(70, 20);
|
this.labelLocation.Size = new System.Drawing.Size(66, 20);
|
||||||
this.labelLocation.TabIndex = 4;
|
this.labelLocation.TabIndex = 13;
|
||||||
this.labelLocation.Text = "Location";
|
this.labelLocation.Text = "Location";
|
||||||
//
|
//
|
||||||
// panelLocation
|
// panelLocation
|
||||||
//
|
//
|
||||||
this.panelLocation.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
this.panelLocation.Anchor = System.Windows.Forms.AnchorStyles.Top;
|
||||||
| System.Windows.Forms.AnchorStyles.Right)));
|
|
||||||
this.panelLocation.Controls.Add(this.radioLocTL);
|
this.panelLocation.Controls.Add(this.radioLocTL);
|
||||||
this.panelLocation.Controls.Add(this.labelDisplay);
|
|
||||||
this.panelLocation.Controls.Add(this.trackBarEdgeDistance);
|
|
||||||
this.panelLocation.Controls.Add(this.comboBoxDisplay);
|
|
||||||
this.panelLocation.Controls.Add(this.radioLocTR);
|
this.panelLocation.Controls.Add(this.radioLocTR);
|
||||||
this.panelLocation.Controls.Add(this.labelEdgeDistance);
|
|
||||||
this.panelLocation.Controls.Add(this.radioLocBL);
|
this.panelLocation.Controls.Add(this.radioLocBL);
|
||||||
this.panelLocation.Controls.Add(this.radioLocCustom);
|
this.panelLocation.Controls.Add(this.radioLocCustom);
|
||||||
this.panelLocation.Controls.Add(this.radioLocBR);
|
this.panelLocation.Controls.Add(this.radioLocBR);
|
||||||
this.panelLocation.Controls.Add(this.labelEdgeDistanceValue);
|
this.panelLocation.Location = new System.Drawing.Point(0, 402);
|
||||||
this.panelLocation.Location = new System.Drawing.Point(9, 418);
|
this.panelLocation.Margin = new System.Windows.Forms.Padding(0);
|
||||||
this.panelLocation.Name = "panelLocation";
|
this.panelLocation.Name = "panelLocation";
|
||||||
this.panelLocation.Size = new System.Drawing.Size(322, 165);
|
this.panelLocation.Size = new System.Drawing.Size(322, 51);
|
||||||
this.panelLocation.TabIndex = 5;
|
this.panelLocation.TabIndex = 14;
|
||||||
//
|
//
|
||||||
// panelTimer
|
// panelTimer
|
||||||
//
|
//
|
||||||
this.panelTimer.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
this.panelTimer.Anchor = System.Windows.Forms.AnchorStyles.Top;
|
||||||
| System.Windows.Forms.AnchorStyles.Right)));
|
|
||||||
this.panelTimer.Controls.Add(this.labelDuration);
|
|
||||||
this.panelTimer.Controls.Add(this.checkNotificationTimer);
|
|
||||||
this.panelTimer.Controls.Add(this.tableLayoutDurationButtons);
|
|
||||||
this.panelTimer.Controls.Add(this.checkTimerCountDown);
|
|
||||||
this.panelTimer.Controls.Add(this.labelDurationValue);
|
this.panelTimer.Controls.Add(this.labelDurationValue);
|
||||||
this.panelTimer.Controls.Add(this.trackBarDuration);
|
this.panelTimer.Controls.Add(this.trackBarDuration);
|
||||||
this.panelTimer.Location = new System.Drawing.Point(9, 227);
|
this.panelTimer.Location = new System.Drawing.Point(0, 293);
|
||||||
|
this.panelTimer.Margin = new System.Windows.Forms.Padding(0);
|
||||||
this.panelTimer.Name = "panelTimer";
|
this.panelTimer.Name = "panelTimer";
|
||||||
this.panelTimer.Size = new System.Drawing.Size(322, 144);
|
this.panelTimer.Size = new System.Drawing.Size(322, 36);
|
||||||
this.panelTimer.TabIndex = 3;
|
this.panelTimer.TabIndex = 11;
|
||||||
//
|
//
|
||||||
// labelDuration
|
// labelDuration
|
||||||
//
|
//
|
||||||
this.labelDuration.AutoSize = true;
|
this.labelDuration.AutoSize = true;
|
||||||
this.labelDuration.Location = new System.Drawing.Point(3, 60);
|
this.labelDuration.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.labelDuration.Location = new System.Drawing.Point(3, 278);
|
||||||
this.labelDuration.Margin = new System.Windows.Forms.Padding(3, 12, 3, 0);
|
this.labelDuration.Margin = new System.Windows.Forms.Padding(3, 12, 3, 0);
|
||||||
this.labelDuration.Name = "labelDuration";
|
this.labelDuration.Name = "labelDuration";
|
||||||
this.labelDuration.Size = new System.Drawing.Size(47, 13);
|
this.labelDuration.Size = new System.Drawing.Size(53, 15);
|
||||||
this.labelDuration.TabIndex = 2;
|
this.labelDuration.TabIndex = 10;
|
||||||
this.labelDuration.Text = "Duration";
|
this.labelDuration.Text = "Duration";
|
||||||
//
|
//
|
||||||
// labelTimer
|
// labelTimer
|
||||||
//
|
//
|
||||||
this.labelTimer.AutoSize = true;
|
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.Font = new System.Drawing.Font("Segoe UI", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.labelTimer.Location = new System.Drawing.Point(6, 204);
|
this.labelTimer.Location = new System.Drawing.Point(0, 195);
|
||||||
this.labelTimer.Margin = new System.Windows.Forms.Padding(0, 21, 0, 0);
|
this.labelTimer.Margin = new System.Windows.Forms.Padding(0, 20, 0, 0);
|
||||||
this.labelTimer.Name = "labelTimer";
|
this.labelTimer.Name = "labelTimer";
|
||||||
this.labelTimer.Size = new System.Drawing.Size(48, 20);
|
this.labelTimer.Size = new System.Drawing.Size(47, 20);
|
||||||
this.labelTimer.TabIndex = 2;
|
this.labelTimer.TabIndex = 7;
|
||||||
this.labelTimer.Text = "Timer";
|
this.labelTimer.Text = "Timer";
|
||||||
//
|
//
|
||||||
// labelSize
|
// labelSize
|
||||||
//
|
//
|
||||||
this.labelSize.AutoSize = true;
|
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.Font = new System.Drawing.Font("Segoe UI", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.labelSize.Location = new System.Drawing.Point(6, 607);
|
this.labelSize.Location = new System.Drawing.Point(0, 592);
|
||||||
this.labelSize.Margin = new System.Windows.Forms.Padding(0, 21, 0, 0);
|
this.labelSize.Margin = new System.Windows.Forms.Padding(0, 20, 0, 0);
|
||||||
this.labelSize.Name = "labelSize";
|
this.labelSize.Name = "labelSize";
|
||||||
this.labelSize.Size = new System.Drawing.Size(40, 20);
|
this.labelSize.Size = new System.Drawing.Size(36, 20);
|
||||||
this.labelSize.TabIndex = 6;
|
this.labelSize.TabIndex = 19;
|
||||||
this.labelSize.Text = "Size";
|
this.labelSize.Text = "Size";
|
||||||
//
|
//
|
||||||
// panelMiscellaneous
|
// panelSize
|
||||||
//
|
//
|
||||||
this.panelMiscellaneous.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
this.panelSize.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||||
| System.Windows.Forms.AnchorStyles.Right)));
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
this.panelMiscellaneous.Controls.Add(this.radioSizeCustom);
|
this.panelSize.Controls.Add(this.radioSizeCustom);
|
||||||
this.panelMiscellaneous.Controls.Add(this.radioSizeAuto);
|
this.panelSize.Controls.Add(this.radioSizeAuto);
|
||||||
this.panelMiscellaneous.Controls.Add(this.labelScrollSpeedValue);
|
this.panelSize.Location = new System.Drawing.Point(0, 612);
|
||||||
this.panelMiscellaneous.Controls.Add(this.trackBarScrollSpeed);
|
this.panelSize.Margin = new System.Windows.Forms.Padding(0);
|
||||||
this.panelMiscellaneous.Controls.Add(this.labelScrollSpeed);
|
this.panelSize.Name = "panelSize";
|
||||||
this.panelMiscellaneous.Location = new System.Drawing.Point(9, 630);
|
this.panelSize.Size = new System.Drawing.Size(322, 27);
|
||||||
this.panelMiscellaneous.Name = "panelMiscellaneous";
|
this.panelSize.TabIndex = 20;
|
||||||
this.panelMiscellaneous.Size = new System.Drawing.Size(322, 92);
|
|
||||||
this.panelMiscellaneous.TabIndex = 7;
|
|
||||||
//
|
//
|
||||||
// durationUpdateTimer
|
// durationUpdateTimer
|
||||||
//
|
//
|
||||||
this.durationUpdateTimer.Interval = 200;
|
this.durationUpdateTimer.Interval = 200;
|
||||||
this.durationUpdateTimer.Tick += new System.EventHandler(this.durationUpdateTimer_Tick);
|
this.durationUpdateTimer.Tick += new System.EventHandler(this.durationUpdateTimer_Tick);
|
||||||
//
|
//
|
||||||
// checkMediaPreviews
|
// flowPanel
|
||||||
//
|
//
|
||||||
this.checkMediaPreviews.AutoSize = true;
|
this.flowPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||||
this.checkMediaPreviews.Location = new System.Drawing.Point(6, 28);
|
| System.Windows.Forms.AnchorStyles.Left)
|
||||||
this.checkMediaPreviews.Margin = new System.Windows.Forms.Padding(6, 3, 3, 3);
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
this.checkMediaPreviews.Name = "checkMediaPreviews";
|
this.flowPanel.Controls.Add(this.labelGeneral);
|
||||||
this.checkMediaPreviews.Size = new System.Drawing.Size(131, 17);
|
this.flowPanel.Controls.Add(this.checkColumnName);
|
||||||
this.checkMediaPreviews.TabIndex = 1;
|
this.flowPanel.Controls.Add(this.checkMediaPreviews);
|
||||||
this.checkMediaPreviews.Text = "Show Media Previews";
|
this.flowPanel.Controls.Add(this.checkSkipOnLinkClick);
|
||||||
this.toolTip.SetToolTip(this.checkMediaPreviews, "Shows image and video thumbnails in the notification window.");
|
this.flowPanel.Controls.Add(this.checkNonIntrusive);
|
||||||
this.checkMediaPreviews.UseVisualStyleBackColor = true;
|
this.flowPanel.Controls.Add(this.labelIdlePause);
|
||||||
|
this.flowPanel.Controls.Add(this.comboBoxIdlePause);
|
||||||
|
this.flowPanel.Controls.Add(this.labelTimer);
|
||||||
|
this.flowPanel.Controls.Add(this.checkNotificationTimer);
|
||||||
|
this.flowPanel.Controls.Add(this.checkTimerCountDown);
|
||||||
|
this.flowPanel.Controls.Add(this.labelDuration);
|
||||||
|
this.flowPanel.Controls.Add(this.panelTimer);
|
||||||
|
this.flowPanel.Controls.Add(this.tableLayoutDurationButtons);
|
||||||
|
this.flowPanel.Controls.Add(this.labelLocation);
|
||||||
|
this.flowPanel.Controls.Add(this.panelLocation);
|
||||||
|
this.flowPanel.Controls.Add(this.labelDisplay);
|
||||||
|
this.flowPanel.Controls.Add(this.comboBoxDisplay);
|
||||||
|
this.flowPanel.Controls.Add(this.labelEdgeDistance);
|
||||||
|
this.flowPanel.Controls.Add(this.panelEdgeDistance);
|
||||||
|
this.flowPanel.Controls.Add(this.labelSize);
|
||||||
|
this.flowPanel.Controls.Add(this.panelSize);
|
||||||
|
this.flowPanel.Controls.Add(this.labelScrollSpeed);
|
||||||
|
this.flowPanel.Controls.Add(this.panelScrollSpeed);
|
||||||
|
this.flowPanel.FlowDirection = System.Windows.Forms.FlowDirection.TopDown;
|
||||||
|
this.flowPanel.Location = new System.Drawing.Point(9, 9);
|
||||||
|
this.flowPanel.Name = "flowPanel";
|
||||||
|
this.flowPanel.Size = new System.Drawing.Size(322, 698);
|
||||||
|
this.flowPanel.TabIndex = 0;
|
||||||
|
this.flowPanel.WrapContents = false;
|
||||||
|
//
|
||||||
|
// panelScrollSpeed
|
||||||
|
//
|
||||||
|
this.panelScrollSpeed.Anchor = System.Windows.Forms.AnchorStyles.Top;
|
||||||
|
this.panelScrollSpeed.Controls.Add(this.trackBarScrollSpeed);
|
||||||
|
this.panelScrollSpeed.Controls.Add(this.labelScrollSpeedValue);
|
||||||
|
this.panelScrollSpeed.Location = new System.Drawing.Point(0, 666);
|
||||||
|
this.panelScrollSpeed.Margin = new System.Windows.Forms.Padding(0);
|
||||||
|
this.panelScrollSpeed.Name = "panelScrollSpeed";
|
||||||
|
this.panelScrollSpeed.Size = new System.Drawing.Size(322, 36);
|
||||||
|
this.panelScrollSpeed.TabIndex = 22;
|
||||||
//
|
//
|
||||||
// TabSettingsNotifications
|
// TabSettingsNotifications
|
||||||
//
|
//
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
this.Controls.Add(this.panelMiscellaneous);
|
this.Controls.Add(this.flowPanel);
|
||||||
this.Controls.Add(this.labelSize);
|
|
||||||
this.Controls.Add(this.labelTimer);
|
|
||||||
this.Controls.Add(this.panelLocation);
|
|
||||||
this.Controls.Add(this.labelLocation);
|
|
||||||
this.Controls.Add(this.panelGeneral);
|
|
||||||
this.Controls.Add(this.labelGeneral);
|
|
||||||
this.Controls.Add(this.panelTimer);
|
|
||||||
this.Name = "TabSettingsNotifications";
|
this.Name = "TabSettingsNotifications";
|
||||||
this.Size = new System.Drawing.Size(340, 731);
|
this.Size = new System.Drawing.Size(340, 717);
|
||||||
this.ParentChanged += new System.EventHandler(this.TabSettingsNotifications_ParentChanged);
|
this.ParentChanged += new System.EventHandler(this.TabSettingsNotifications_ParentChanged);
|
||||||
((System.ComponentModel.ISupportInitialize)(this.trackBarEdgeDistance)).EndInit();
|
((System.ComponentModel.ISupportInitialize)(this.trackBarEdgeDistance)).EndInit();
|
||||||
this.tableLayoutDurationButtons.ResumeLayout(false);
|
this.tableLayoutDurationButtons.ResumeLayout(false);
|
||||||
((System.ComponentModel.ISupportInitialize)(this.trackBarDuration)).EndInit();
|
((System.ComponentModel.ISupportInitialize)(this.trackBarDuration)).EndInit();
|
||||||
this.panelGeneral.ResumeLayout(false);
|
this.panelEdgeDistance.ResumeLayout(false);
|
||||||
this.panelGeneral.PerformLayout();
|
|
||||||
((System.ComponentModel.ISupportInitialize)(this.trackBarScrollSpeed)).EndInit();
|
((System.ComponentModel.ISupportInitialize)(this.trackBarScrollSpeed)).EndInit();
|
||||||
this.panelLocation.ResumeLayout(false);
|
this.panelLocation.ResumeLayout(false);
|
||||||
this.panelLocation.PerformLayout();
|
|
||||||
this.panelTimer.ResumeLayout(false);
|
this.panelTimer.ResumeLayout(false);
|
||||||
this.panelTimer.PerformLayout();
|
this.panelSize.ResumeLayout(false);
|
||||||
this.panelMiscellaneous.ResumeLayout(false);
|
this.flowPanel.ResumeLayout(false);
|
||||||
this.panelMiscellaneous.PerformLayout();
|
this.flowPanel.PerformLayout();
|
||||||
|
this.panelScrollSpeed.ResumeLayout(false);
|
||||||
this.ResumeLayout(false);
|
this.ResumeLayout(false);
|
||||||
this.PerformLayout();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -601,7 +641,7 @@
|
|||||||
private System.Windows.Forms.CheckBox checkTimerCountDown;
|
private System.Windows.Forms.CheckBox checkTimerCountDown;
|
||||||
private System.Windows.Forms.CheckBox checkNotificationTimer;
|
private System.Windows.Forms.CheckBox checkNotificationTimer;
|
||||||
private System.Windows.Forms.Label labelGeneral;
|
private System.Windows.Forms.Label labelGeneral;
|
||||||
private System.Windows.Forms.Panel panelGeneral;
|
private System.Windows.Forms.Panel panelEdgeDistance;
|
||||||
private System.Windows.Forms.Label labelLocation;
|
private System.Windows.Forms.Label labelLocation;
|
||||||
private System.Windows.Forms.Panel panelLocation;
|
private System.Windows.Forms.Panel panelLocation;
|
||||||
private System.Windows.Forms.Panel panelTimer;
|
private System.Windows.Forms.Panel panelTimer;
|
||||||
@@ -610,11 +650,13 @@
|
|||||||
private System.Windows.Forms.TrackBar trackBarScrollSpeed;
|
private System.Windows.Forms.TrackBar trackBarScrollSpeed;
|
||||||
private System.Windows.Forms.Label labelScrollSpeed;
|
private System.Windows.Forms.Label labelScrollSpeed;
|
||||||
private System.Windows.Forms.Label labelSize;
|
private System.Windows.Forms.Label labelSize;
|
||||||
private System.Windows.Forms.Panel panelMiscellaneous;
|
private System.Windows.Forms.Panel panelSize;
|
||||||
private System.Windows.Forms.Label labelDuration;
|
private System.Windows.Forms.Label labelDuration;
|
||||||
private System.Windows.Forms.Timer durationUpdateTimer;
|
private System.Windows.Forms.Timer durationUpdateTimer;
|
||||||
private System.Windows.Forms.RadioButton radioSizeCustom;
|
private System.Windows.Forms.RadioButton radioSizeCustom;
|
||||||
private System.Windows.Forms.RadioButton radioSizeAuto;
|
private System.Windows.Forms.RadioButton radioSizeAuto;
|
||||||
private System.Windows.Forms.CheckBox checkMediaPreviews;
|
private System.Windows.Forms.CheckBox checkMediaPreviews;
|
||||||
|
private System.Windows.Forms.FlowLayoutPanel flowPanel;
|
||||||
|
private System.Windows.Forms.Panel panelScrollSpeed;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ namespace TweetDuck.Core.Other.Settings{
|
|||||||
|
|
||||||
this.notification = notification;
|
this.notification = notification;
|
||||||
|
|
||||||
this.notification.Initialized += (sender, args) => {
|
this.notification.Ready += (sender, args) => {
|
||||||
this.InvokeAsyncSafe(() => {
|
this.InvokeAsyncSafe(() => {
|
||||||
this.notification.ShowExampleNotification(true);
|
this.notification.ShowExampleNotification(true);
|
||||||
this.notification.Move += notification_Move;
|
this.notification.Move += notification_Move;
|
||||||
@@ -26,6 +26,41 @@ namespace TweetDuck.Core.Other.Settings{
|
|||||||
this.notification.Activated += notification_Activated;
|
this.notification.Activated += notification_Activated;
|
||||||
this.notification.Show();
|
this.notification.Show();
|
||||||
|
|
||||||
|
toolTip.SetToolTip(checkColumnName, "Shows column name each notification originated\r\nfrom in the notification window title.");
|
||||||
|
toolTip.SetToolTip(checkMediaPreviews, "Shows image and video thumbnails in the notification window.");
|
||||||
|
toolTip.SetToolTip(checkSkipOnLinkClick, "Skips current notification when a link\r\ninside the notification is clicked.");
|
||||||
|
toolTip.SetToolTip(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.");
|
||||||
|
|
||||||
|
toolTip.SetToolTip(comboBoxIdlePause, "Pauses new notifications after going idle for a set amount of time.");
|
||||||
|
|
||||||
|
toolTip.SetToolTip(checkTimerCountDown, "The notification timer counts down instead of up.");
|
||||||
|
toolTip.SetToolTip(labelDurationValue, "Milliseconds per character.");
|
||||||
|
toolTip.SetToolTip(trackBarDuration, toolTip.GetToolTip(labelDurationValue));
|
||||||
|
|
||||||
|
toolTip.SetToolTip(radioLocCustom, "Drag the example notification window to the desired location.");
|
||||||
|
|
||||||
|
toolTip.SetToolTip(radioSizeAuto, "Notification size is based on the font size and browser zoom level.");
|
||||||
|
toolTip.SetToolTip(radioSizeCustom, "Resize the example notification window to the desired size.");
|
||||||
|
|
||||||
|
checkColumnName.Checked = Config.DisplayNotificationColumn;
|
||||||
|
checkMediaPreviews.Checked = Config.NotificationMediaPreviews;
|
||||||
|
checkSkipOnLinkClick.Checked = Config.NotificationSkipOnLinkClick;
|
||||||
|
checkNonIntrusive.Checked = Config.NotificationNonIntrusiveMode;
|
||||||
|
|
||||||
|
comboBoxIdlePause.Items.Add("Disabled");
|
||||||
|
comboBoxIdlePause.Items.Add("30 seconds");
|
||||||
|
comboBoxIdlePause.Items.Add("1 minute");
|
||||||
|
comboBoxIdlePause.Items.Add("2 minutes");
|
||||||
|
comboBoxIdlePause.Items.Add("5 minutes");
|
||||||
|
comboBoxIdlePause.SelectedIndex = Math.Max(0, Array.FindIndex(IdlePauseSeconds, val => val == Config.NotificationIdlePauseSeconds));
|
||||||
|
|
||||||
|
checkNotificationTimer.Checked = Config.DisplayNotificationTimer;
|
||||||
|
checkTimerCountDown.Enabled = checkNotificationTimer.Checked;
|
||||||
|
checkTimerCountDown.Checked = Config.NotificationTimerCountDown;
|
||||||
|
|
||||||
|
trackBarDuration.SetValueSafe(Config.NotificationDurationValue);
|
||||||
|
labelDurationValue.Text = Config.NotificationDurationValue+" ms/c";
|
||||||
|
|
||||||
switch(Config.NotificationPosition){
|
switch(Config.NotificationPosition){
|
||||||
case TweetNotification.Position.TopLeft: radioLocTL.Checked = true; break;
|
case TweetNotification.Position.TopLeft: radioLocTL.Checked = true; break;
|
||||||
case TweetNotification.Position.TopRight: radioLocTR.Checked = true; break;
|
case TweetNotification.Position.TopRight: radioLocTR.Checked = true; break;
|
||||||
@@ -35,23 +70,6 @@ namespace TweetDuck.Core.Other.Settings{
|
|||||||
}
|
}
|
||||||
|
|
||||||
comboBoxDisplay.Enabled = trackBarEdgeDistance.Enabled = !radioLocCustom.Checked;
|
comboBoxDisplay.Enabled = trackBarEdgeDistance.Enabled = !radioLocCustom.Checked;
|
||||||
|
|
||||||
switch(Config.NotificationSize){
|
|
||||||
case TweetNotification.Size.Auto: radioSizeAuto.Checked = true; break;
|
|
||||||
case TweetNotification.Size.Custom: radioSizeCustom.Checked = true; break;
|
|
||||||
}
|
|
||||||
|
|
||||||
toolTip.SetToolTip(trackBarDuration, toolTip.GetToolTip(labelDurationValue));
|
|
||||||
trackBarDuration.SetValueSafe(Config.NotificationDurationValue);
|
|
||||||
labelDurationValue.Text = Config.NotificationDurationValue+" ms/c";
|
|
||||||
|
|
||||||
comboBoxIdlePause.Items.Add("Disabled");
|
|
||||||
comboBoxIdlePause.Items.Add("30 seconds");
|
|
||||||
comboBoxIdlePause.Items.Add("1 minute");
|
|
||||||
comboBoxIdlePause.Items.Add("2 minutes");
|
|
||||||
comboBoxIdlePause.Items.Add("5 minutes");
|
|
||||||
comboBoxIdlePause.SelectedIndex = Math.Max(0, Array.FindIndex(IdlePauseSeconds, val => val == Config.NotificationIdlePauseSeconds));
|
|
||||||
|
|
||||||
comboBoxDisplay.Items.Add("(Same as TweetDuck)");
|
comboBoxDisplay.Items.Add("(Same as TweetDuck)");
|
||||||
|
|
||||||
foreach(Screen screen in Screen.AllScreens){
|
foreach(Screen screen in Screen.AllScreens){
|
||||||
@@ -60,50 +78,49 @@ namespace TweetDuck.Core.Other.Settings{
|
|||||||
|
|
||||||
comboBoxDisplay.SelectedIndex = Math.Min(comboBoxDisplay.Items.Count-1, Config.NotificationDisplay);
|
comboBoxDisplay.SelectedIndex = Math.Min(comboBoxDisplay.Items.Count-1, Config.NotificationDisplay);
|
||||||
|
|
||||||
checkColumnName.Checked = Config.DisplayNotificationColumn;
|
trackBarEdgeDistance.SetValueSafe(Config.NotificationEdgeDistance);
|
||||||
checkNotificationTimer.Checked = Config.DisplayNotificationTimer;
|
labelEdgeDistanceValue.Text = trackBarEdgeDistance.Value+" px";
|
||||||
checkTimerCountDown.Enabled = checkNotificationTimer.Checked;
|
|
||||||
checkTimerCountDown.Checked = Config.NotificationTimerCountDown;
|
switch(Config.NotificationSize){
|
||||||
checkMediaPreviews.Checked = Config.NotificationMediaPreviews;
|
case TweetNotification.Size.Auto: radioSizeAuto.Checked = true; break;
|
||||||
checkSkipOnLinkClick.Checked = Config.NotificationSkipOnLinkClick;
|
case TweetNotification.Size.Custom: radioSizeCustom.Checked = true; break;
|
||||||
checkNonIntrusive.Checked = Config.NotificationNonIntrusiveMode;
|
}
|
||||||
|
|
||||||
trackBarScrollSpeed.SetValueSafe(Config.NotificationScrollSpeed);
|
trackBarScrollSpeed.SetValueSafe(Config.NotificationScrollSpeed);
|
||||||
labelScrollSpeedValue.Text = trackBarScrollSpeed.Value+"%";
|
labelScrollSpeedValue.Text = trackBarScrollSpeed.Value+"%";
|
||||||
|
|
||||||
trackBarEdgeDistance.SetValueSafe(Config.NotificationEdgeDistance);
|
|
||||||
labelEdgeDistanceValue.Text = trackBarEdgeDistance.Value+" px";
|
|
||||||
|
|
||||||
Disposed += (sender, args) => this.notification.Dispose();
|
Disposed += (sender, args) => this.notification.Dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void OnReady(){
|
public override void OnReady(){
|
||||||
radioLocTL.CheckedChanged += radioLoc_CheckedChanged;
|
checkColumnName.CheckedChanged += checkColumnName_CheckedChanged;
|
||||||
radioLocTR.CheckedChanged += radioLoc_CheckedChanged;
|
checkMediaPreviews.CheckedChanged += checkMediaPreviews_CheckedChanged;
|
||||||
radioLocBL.CheckedChanged += radioLoc_CheckedChanged;
|
checkSkipOnLinkClick.CheckedChanged += checkSkipOnLinkClick_CheckedChanged;
|
||||||
radioLocBR.CheckedChanged += radioLoc_CheckedChanged;
|
checkNonIntrusive.CheckedChanged += checkNonIntrusive_CheckedChanged;
|
||||||
radioLocCustom.Click += radioLocCustom_Click;
|
|
||||||
|
|
||||||
radioSizeAuto.CheckedChanged += radioSize_CheckedChanged;
|
comboBoxIdlePause.SelectedValueChanged += comboBoxIdlePause_SelectedValueChanged;
|
||||||
radioSizeCustom.Click += radioSizeCustom_Click;
|
|
||||||
|
checkNotificationTimer.CheckedChanged += checkNotificationTimer_CheckedChanged;
|
||||||
|
checkTimerCountDown.CheckedChanged += checkTimerCountDown_CheckedChanged;
|
||||||
|
|
||||||
trackBarDuration.ValueChanged += trackBarDuration_ValueChanged;
|
trackBarDuration.ValueChanged += trackBarDuration_ValueChanged;
|
||||||
btnDurationShort.Click += btnDurationShort_Click;
|
btnDurationShort.Click += btnDurationShort_Click;
|
||||||
btnDurationMedium.Click += btnDurationMedium_Click;
|
btnDurationMedium.Click += btnDurationMedium_Click;
|
||||||
btnDurationLong.Click += btnDurationLong_Click;
|
btnDurationLong.Click += btnDurationLong_Click;
|
||||||
|
|
||||||
checkColumnName.CheckedChanged += checkColumnName_CheckedChanged;
|
radioLocTL.CheckedChanged += radioLoc_CheckedChanged;
|
||||||
checkNotificationTimer.CheckedChanged += checkNotificationTimer_CheckedChanged;
|
radioLocTR.CheckedChanged += radioLoc_CheckedChanged;
|
||||||
checkTimerCountDown.CheckedChanged += checkTimerCountDown_CheckedChanged;
|
radioLocBL.CheckedChanged += radioLoc_CheckedChanged;
|
||||||
checkMediaPreviews.CheckedChanged += checkMediaPreviews_CheckedChanged;
|
radioLocBR.CheckedChanged += radioLoc_CheckedChanged;
|
||||||
checkSkipOnLinkClick.CheckedChanged += checkSkipOnLinkClick_CheckedChanged;
|
radioLocCustom.Click += radioLocCustom_Click;
|
||||||
checkNonIntrusive.CheckedChanged += checkNonIntrusive_CheckedChanged;
|
|
||||||
|
|
||||||
comboBoxIdlePause.SelectedValueChanged += comboBoxIdlePause_SelectedValueChanged;
|
|
||||||
trackBarScrollSpeed.ValueChanged += trackBarScrollSpeed_ValueChanged;
|
|
||||||
|
|
||||||
comboBoxDisplay.SelectedValueChanged += comboBoxDisplay_SelectedValueChanged;
|
comboBoxDisplay.SelectedValueChanged += comboBoxDisplay_SelectedValueChanged;
|
||||||
trackBarEdgeDistance.ValueChanged += trackBarEdgeDistance_ValueChanged;
|
trackBarEdgeDistance.ValueChanged += trackBarEdgeDistance_ValueChanged;
|
||||||
|
|
||||||
|
radioSizeAuto.CheckedChanged += radioSize_CheckedChanged;
|
||||||
|
radioSizeCustom.Click += radioSizeCustom_Click;
|
||||||
|
|
||||||
|
trackBarScrollSpeed.ValueChanged += trackBarScrollSpeed_ValueChanged;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void TabSettingsNotifications_ParentChanged(object sender, EventArgs e){
|
private void TabSettingsNotifications_ParentChanged(object sender, EventArgs e){
|
||||||
@@ -153,7 +170,7 @@ namespace TweetDuck.Core.Other.Settings{
|
|||||||
comboBoxDisplay.Enabled = trackBarEdgeDistance.Enabled = false;
|
comboBoxDisplay.Enabled = trackBarEdgeDistance.Enabled = false;
|
||||||
notification.ShowExampleNotification(false);
|
notification.ShowExampleNotification(false);
|
||||||
|
|
||||||
if (notification.IsFullyOutsideView() && FormMessage.Question("Notification is outside view", "The notification seems to be outside of view, would you like to reset its position?", FormMessage.Yes, FormMessage.No)){
|
if (notification.IsFullyOutsideView() && FormMessage.Question("Notification is Outside View", "The notification seems to be outside of view, would you like to reset its position?", FormMessage.Yes, FormMessage.No)){
|
||||||
Config.NotificationPosition = TweetNotification.Position.TopRight;
|
Config.NotificationPosition = TweetNotification.Position.TopRight;
|
||||||
notification.MoveToVisibleLocation();
|
notification.MoveToVisibleLocation();
|
||||||
|
|
||||||
|
|||||||
113
Core/Other/Settings/TabSettingsSounds.Designer.cs
generated
113
Core/Other/Settings/TabSettingsSounds.Designer.cs
generated
@@ -34,28 +34,34 @@
|
|||||||
this.panelSoundNotification = new System.Windows.Forms.Panel();
|
this.panelSoundNotification = new System.Windows.Forms.Panel();
|
||||||
this.labelVolume = new System.Windows.Forms.Label();
|
this.labelVolume = new System.Windows.Forms.Label();
|
||||||
this.trackBarVolume = new System.Windows.Forms.TrackBar();
|
this.trackBarVolume = new System.Windows.Forms.TrackBar();
|
||||||
|
this.flowPanel = new System.Windows.Forms.FlowLayoutPanel();
|
||||||
|
this.panelVolume = new System.Windows.Forms.Panel();
|
||||||
|
this.volumeUpdateTimer = new System.Windows.Forms.Timer(this.components);
|
||||||
this.panelSoundNotification.SuspendLayout();
|
this.panelSoundNotification.SuspendLayout();
|
||||||
((System.ComponentModel.ISupportInitialize)(this.trackBarVolume)).BeginInit();
|
((System.ComponentModel.ISupportInitialize)(this.trackBarVolume)).BeginInit();
|
||||||
|
this.flowPanel.SuspendLayout();
|
||||||
|
this.panelVolume.SuspendLayout();
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
//
|
//
|
||||||
// tbCustomSound
|
// tbCustomSound
|
||||||
//
|
//
|
||||||
this.tbCustomSound.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
this.tbCustomSound.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||||
| System.Windows.Forms.AnchorStyles.Right)));
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
|
this.tbCustomSound.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.tbCustomSound.Location = new System.Drawing.Point(3, 3);
|
this.tbCustomSound.Location = new System.Drawing.Point(3, 3);
|
||||||
this.tbCustomSound.Name = "tbCustomSound";
|
this.tbCustomSound.Name = "tbCustomSound";
|
||||||
this.tbCustomSound.Size = new System.Drawing.Size(316, 20);
|
this.tbCustomSound.Size = new System.Drawing.Size(316, 23);
|
||||||
this.tbCustomSound.TabIndex = 0;
|
this.tbCustomSound.TabIndex = 0;
|
||||||
this.toolTip.SetToolTip(this.tbCustomSound, "When empty, the default TweetDeck sound notification is used.");
|
|
||||||
//
|
//
|
||||||
// labelVolumeValue
|
// labelVolumeValue
|
||||||
//
|
//
|
||||||
this.labelVolumeValue.BackColor = System.Drawing.Color.Transparent;
|
this.labelVolumeValue.BackColor = System.Drawing.Color.Transparent;
|
||||||
this.labelVolumeValue.Location = new System.Drawing.Point(147, 84);
|
this.labelVolumeValue.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.labelVolumeValue.Location = new System.Drawing.Point(147, 4);
|
||||||
this.labelVolumeValue.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);
|
this.labelVolumeValue.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);
|
||||||
this.labelVolumeValue.Name = "labelVolumeValue";
|
this.labelVolumeValue.Name = "labelVolumeValue";
|
||||||
this.labelVolumeValue.Size = new System.Drawing.Size(38, 13);
|
this.labelVolumeValue.Size = new System.Drawing.Size(38, 15);
|
||||||
this.labelVolumeValue.TabIndex = 6;
|
this.labelVolumeValue.TabIndex = 1;
|
||||||
this.labelVolumeValue.Text = "100%";
|
this.labelVolumeValue.Text = "100%";
|
||||||
this.labelVolumeValue.TextAlign = System.Drawing.ContentAlignment.TopRight;
|
this.labelVolumeValue.TextAlign = System.Drawing.ContentAlignment.TopRight;
|
||||||
//
|
//
|
||||||
@@ -63,10 +69,11 @@
|
|||||||
//
|
//
|
||||||
this.btnPlaySound.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
|
this.btnPlaySound.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
|
||||||
this.btnPlaySound.AutoSize = true;
|
this.btnPlaySound.AutoSize = true;
|
||||||
this.btnPlaySound.Location = new System.Drawing.Point(203, 29);
|
this.btnPlaySound.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.btnPlaySound.Location = new System.Drawing.Point(202, 32);
|
||||||
this.btnPlaySound.Name = "btnPlaySound";
|
this.btnPlaySound.Name = "btnPlaySound";
|
||||||
this.btnPlaySound.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
this.btnPlaySound.Padding = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||||
this.btnPlaySound.Size = new System.Drawing.Size(43, 23);
|
this.btnPlaySound.Size = new System.Drawing.Size(43, 25);
|
||||||
this.btnPlaySound.TabIndex = 2;
|
this.btnPlaySound.TabIndex = 2;
|
||||||
this.btnPlaySound.Text = "Play";
|
this.btnPlaySound.Text = "Play";
|
||||||
this.btnPlaySound.UseVisualStyleBackColor = true;
|
this.btnPlaySound.UseVisualStyleBackColor = true;
|
||||||
@@ -74,10 +81,11 @@
|
|||||||
// btnResetSound
|
// btnResetSound
|
||||||
//
|
//
|
||||||
this.btnResetSound.AutoSize = true;
|
this.btnResetSound.AutoSize = true;
|
||||||
this.btnResetSound.Location = new System.Drawing.Point(3, 29);
|
this.btnResetSound.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.btnResetSound.Location = new System.Drawing.Point(3, 32);
|
||||||
this.btnResetSound.Name = "btnResetSound";
|
this.btnResetSound.Name = "btnResetSound";
|
||||||
this.btnResetSound.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
this.btnResetSound.Padding = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||||
this.btnResetSound.Size = new System.Drawing.Size(51, 23);
|
this.btnResetSound.Size = new System.Drawing.Size(49, 25);
|
||||||
this.btnResetSound.TabIndex = 3;
|
this.btnResetSound.TabIndex = 3;
|
||||||
this.btnResetSound.Text = "Reset";
|
this.btnResetSound.Text = "Reset";
|
||||||
this.btnResetSound.UseVisualStyleBackColor = true;
|
this.btnResetSound.UseVisualStyleBackColor = true;
|
||||||
@@ -86,10 +94,11 @@
|
|||||||
//
|
//
|
||||||
this.btnBrowseSound.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
|
this.btnBrowseSound.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
|
||||||
this.btnBrowseSound.AutoSize = true;
|
this.btnBrowseSound.AutoSize = true;
|
||||||
this.btnBrowseSound.Location = new System.Drawing.Point(252, 29);
|
this.btnBrowseSound.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.btnBrowseSound.Location = new System.Drawing.Point(251, 32);
|
||||||
this.btnBrowseSound.Name = "btnBrowseSound";
|
this.btnBrowseSound.Name = "btnBrowseSound";
|
||||||
this.btnBrowseSound.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
|
this.btnBrowseSound.Padding = new System.Windows.Forms.Padding(2, 0, 2, 0);
|
||||||
this.btnBrowseSound.Size = new System.Drawing.Size(67, 23);
|
this.btnBrowseSound.Size = new System.Drawing.Size(68, 25);
|
||||||
this.btnBrowseSound.TabIndex = 1;
|
this.btnBrowseSound.TabIndex = 1;
|
||||||
this.btnBrowseSound.Text = "Browse...";
|
this.btnBrowseSound.Text = "Browse...";
|
||||||
this.btnBrowseSound.UseVisualStyleBackColor = true;
|
this.btnBrowseSound.UseVisualStyleBackColor = true;
|
||||||
@@ -97,67 +106,96 @@
|
|||||||
// labelSoundNotification
|
// labelSoundNotification
|
||||||
//
|
//
|
||||||
this.labelSoundNotification.AutoSize = true;
|
this.labelSoundNotification.AutoSize = true;
|
||||||
this.labelSoundNotification.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
this.labelSoundNotification.Font = new System.Drawing.Font("Segoe UI", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.labelSoundNotification.Location = new System.Drawing.Point(6, 8);
|
this.labelSoundNotification.Location = new System.Drawing.Point(0, 0);
|
||||||
this.labelSoundNotification.Margin = new System.Windows.Forms.Padding(0, 2, 0, 0);
|
this.labelSoundNotification.Margin = new System.Windows.Forms.Padding(0);
|
||||||
this.labelSoundNotification.Name = "labelSoundNotification";
|
this.labelSoundNotification.Name = "labelSoundNotification";
|
||||||
this.labelSoundNotification.Size = new System.Drawing.Size(198, 20);
|
this.labelSoundNotification.Size = new System.Drawing.Size(188, 20);
|
||||||
this.labelSoundNotification.TabIndex = 1;
|
this.labelSoundNotification.TabIndex = 0;
|
||||||
this.labelSoundNotification.Text = "Custom Sound Notification";
|
this.labelSoundNotification.Text = "Custom Sound Notification";
|
||||||
//
|
//
|
||||||
// panelSoundNotification
|
// panelSoundNotification
|
||||||
//
|
//
|
||||||
this.panelSoundNotification.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
this.panelSoundNotification.Anchor = System.Windows.Forms.AnchorStyles.Top;
|
||||||
| System.Windows.Forms.AnchorStyles.Right)));
|
|
||||||
this.panelSoundNotification.Controls.Add(this.labelVolume);
|
|
||||||
this.panelSoundNotification.Controls.Add(this.trackBarVolume);
|
|
||||||
this.panelSoundNotification.Controls.Add(this.btnPlaySound);
|
this.panelSoundNotification.Controls.Add(this.btnPlaySound);
|
||||||
this.panelSoundNotification.Controls.Add(this.tbCustomSound);
|
this.panelSoundNotification.Controls.Add(this.tbCustomSound);
|
||||||
this.panelSoundNotification.Controls.Add(this.btnResetSound);
|
this.panelSoundNotification.Controls.Add(this.btnResetSound);
|
||||||
this.panelSoundNotification.Controls.Add(this.btnBrowseSound);
|
this.panelSoundNotification.Controls.Add(this.btnBrowseSound);
|
||||||
this.panelSoundNotification.Controls.Add(this.labelVolumeValue);
|
this.panelSoundNotification.Location = new System.Drawing.Point(0, 20);
|
||||||
this.panelSoundNotification.Location = new System.Drawing.Point(9, 31);
|
this.panelSoundNotification.Margin = new System.Windows.Forms.Padding(0);
|
||||||
this.panelSoundNotification.Name = "panelSoundNotification";
|
this.panelSoundNotification.Name = "panelSoundNotification";
|
||||||
this.panelSoundNotification.Size = new System.Drawing.Size(322, 119);
|
this.panelSoundNotification.Size = new System.Drawing.Size(322, 59);
|
||||||
this.panelSoundNotification.TabIndex = 2;
|
this.panelSoundNotification.TabIndex = 1;
|
||||||
//
|
//
|
||||||
// labelVolume
|
// labelVolume
|
||||||
//
|
//
|
||||||
this.labelVolume.AutoSize = true;
|
this.labelVolume.AutoSize = true;
|
||||||
this.labelVolume.Location = new System.Drawing.Point(3, 67);
|
this.labelVolume.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.labelVolume.Location = new System.Drawing.Point(3, 91);
|
||||||
this.labelVolume.Margin = new System.Windows.Forms.Padding(3, 12, 3, 0);
|
this.labelVolume.Margin = new System.Windows.Forms.Padding(3, 12, 3, 0);
|
||||||
this.labelVolume.Name = "labelVolume";
|
this.labelVolume.Name = "labelVolume";
|
||||||
this.labelVolume.Size = new System.Drawing.Size(42, 13);
|
this.labelVolume.Size = new System.Drawing.Size(48, 15);
|
||||||
this.labelVolume.TabIndex = 4;
|
this.labelVolume.TabIndex = 2;
|
||||||
this.labelVolume.Text = "Volume";
|
this.labelVolume.Text = "Volume";
|
||||||
//
|
//
|
||||||
// trackBarVolume
|
// trackBarVolume
|
||||||
//
|
//
|
||||||
this.trackBarVolume.AutoSize = false;
|
this.trackBarVolume.AutoSize = false;
|
||||||
this.trackBarVolume.BackColor = System.Drawing.SystemColors.Control;
|
this.trackBarVolume.BackColor = System.Drawing.SystemColors.Control;
|
||||||
this.trackBarVolume.Location = new System.Drawing.Point(3, 83);
|
this.trackBarVolume.Location = new System.Drawing.Point(3, 3);
|
||||||
this.trackBarVolume.Maximum = 100;
|
this.trackBarVolume.Maximum = 100;
|
||||||
this.trackBarVolume.Name = "trackBarVolume";
|
this.trackBarVolume.Name = "trackBarVolume";
|
||||||
this.trackBarVolume.Size = new System.Drawing.Size(148, 30);
|
this.trackBarVolume.Size = new System.Drawing.Size(148, 30);
|
||||||
this.trackBarVolume.SmallChange = 1;
|
this.trackBarVolume.TabIndex = 0;
|
||||||
this.trackBarVolume.TabIndex = 5;
|
|
||||||
this.trackBarVolume.TickFrequency = 10;
|
this.trackBarVolume.TickFrequency = 10;
|
||||||
this.trackBarVolume.Value = 100;
|
this.trackBarVolume.Value = 100;
|
||||||
this.trackBarVolume.ValueChanged += new System.EventHandler(this.trackBarVolume_ValueChanged);
|
this.trackBarVolume.ValueChanged += new System.EventHandler(this.trackBarVolume_ValueChanged);
|
||||||
//
|
//
|
||||||
|
// flowPanel
|
||||||
|
//
|
||||||
|
this.flowPanel.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.flowPanel.Controls.Add(this.labelSoundNotification);
|
||||||
|
this.flowPanel.Controls.Add(this.panelSoundNotification);
|
||||||
|
this.flowPanel.Controls.Add(this.labelVolume);
|
||||||
|
this.flowPanel.Controls.Add(this.panelVolume);
|
||||||
|
this.flowPanel.FlowDirection = System.Windows.Forms.FlowDirection.TopDown;
|
||||||
|
this.flowPanel.Location = new System.Drawing.Point(9, 9);
|
||||||
|
this.flowPanel.Name = "flowPanel";
|
||||||
|
this.flowPanel.Size = new System.Drawing.Size(322, 142);
|
||||||
|
this.flowPanel.TabIndex = 0;
|
||||||
|
this.flowPanel.WrapContents = false;
|
||||||
|
//
|
||||||
|
// panelVolume
|
||||||
|
//
|
||||||
|
this.panelVolume.Controls.Add(this.trackBarVolume);
|
||||||
|
this.panelVolume.Controls.Add(this.labelVolumeValue);
|
||||||
|
this.panelVolume.Location = new System.Drawing.Point(0, 106);
|
||||||
|
this.panelVolume.Margin = new System.Windows.Forms.Padding(0);
|
||||||
|
this.panelVolume.Name = "panelVolume";
|
||||||
|
this.panelVolume.Size = new System.Drawing.Size(322, 36);
|
||||||
|
this.panelVolume.TabIndex = 3;
|
||||||
|
//
|
||||||
|
// volumeUpdateTimer
|
||||||
|
//
|
||||||
|
this.volumeUpdateTimer.Interval = 250;
|
||||||
|
this.volumeUpdateTimer.Tick += new System.EventHandler(this.volumeUpdateTimer_Tick);
|
||||||
|
//
|
||||||
// TabSettingsSounds
|
// TabSettingsSounds
|
||||||
//
|
//
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
this.Controls.Add(this.panelSoundNotification);
|
this.Controls.Add(this.flowPanel);
|
||||||
this.Controls.Add(this.labelSoundNotification);
|
|
||||||
this.Name = "TabSettingsSounds";
|
this.Name = "TabSettingsSounds";
|
||||||
this.Size = new System.Drawing.Size(340, 160);
|
this.Size = new System.Drawing.Size(340, 160);
|
||||||
this.panelSoundNotification.ResumeLayout(false);
|
this.panelSoundNotification.ResumeLayout(false);
|
||||||
this.panelSoundNotification.PerformLayout();
|
this.panelSoundNotification.PerformLayout();
|
||||||
((System.ComponentModel.ISupportInitialize)(this.trackBarVolume)).EndInit();
|
((System.ComponentModel.ISupportInitialize)(this.trackBarVolume)).EndInit();
|
||||||
|
this.flowPanel.ResumeLayout(false);
|
||||||
|
this.flowPanel.PerformLayout();
|
||||||
|
this.panelVolume.ResumeLayout(false);
|
||||||
this.ResumeLayout(false);
|
this.ResumeLayout(false);
|
||||||
this.PerformLayout();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -173,5 +211,8 @@
|
|||||||
private System.Windows.Forms.Label labelVolume;
|
private System.Windows.Forms.Label labelVolume;
|
||||||
private System.Windows.Forms.Label labelVolumeValue;
|
private System.Windows.Forms.Label labelVolumeValue;
|
||||||
private System.Windows.Forms.TrackBar trackBarVolume;
|
private System.Windows.Forms.TrackBar trackBarVolume;
|
||||||
|
private System.Windows.Forms.FlowLayoutPanel flowPanel;
|
||||||
|
private System.Windows.Forms.Panel panelVolume;
|
||||||
|
private System.Windows.Forms.Timer volumeUpdateTimer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,29 +4,23 @@ using System.IO;
|
|||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using TweetDuck.Core.Controls;
|
using TweetDuck.Core.Controls;
|
||||||
using TweetDuck.Core.Notification;
|
using TweetDuck.Core.Notification;
|
||||||
using TweetLib.Audio;
|
|
||||||
|
|
||||||
namespace TweetDuck.Core.Other.Settings{
|
namespace TweetDuck.Core.Other.Settings{
|
||||||
sealed partial class TabSettingsSounds : BaseTabSettings{
|
sealed partial class TabSettingsSounds : BaseTabSettings{
|
||||||
private readonly SoundNotification soundNotification;
|
private readonly Action playSoundNotification;
|
||||||
private readonly bool supportsChangingVolume;
|
|
||||||
|
|
||||||
public TabSettingsSounds(){
|
public TabSettingsSounds(Action playSoundNotification){
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
soundNotification = new SoundNotification();
|
this.playSoundNotification = playSoundNotification;
|
||||||
soundNotification.PlaybackError += sound_PlaybackError;
|
|
||||||
|
|
||||||
supportsChangingVolume = soundNotification.SetVolume(Config.NotificationSoundVolume);
|
toolTip.SetToolTip(tbCustomSound, "When empty, the default TweetDeck sound notification is used.");
|
||||||
|
|
||||||
trackBarVolume.Enabled = supportsChangingVolume && !string.IsNullOrEmpty(Config.NotificationSoundPath);
|
|
||||||
trackBarVolume.SetValueSafe(Config.NotificationSoundVolume);
|
trackBarVolume.SetValueSafe(Config.NotificationSoundVolume);
|
||||||
labelVolumeValue.Text = trackBarVolume.Value+"%";
|
labelVolumeValue.Text = trackBarVolume.Value+"%";
|
||||||
|
|
||||||
tbCustomSound.Text = Config.NotificationSoundPath;
|
tbCustomSound.Text = Config.NotificationSoundPath;
|
||||||
tbCustomSound_TextChanged(tbCustomSound, EventArgs.Empty);
|
tbCustomSound_TextChanged(tbCustomSound, EventArgs.Empty);
|
||||||
|
|
||||||
Disposed += (sender, args) => soundNotification.Dispose();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void OnReady(){
|
public override void OnReady(){
|
||||||
@@ -38,22 +32,29 @@ namespace TweetDuck.Core.Other.Settings{
|
|||||||
|
|
||||||
public override void OnClosing(){
|
public override void OnClosing(){
|
||||||
Config.NotificationSoundPath = tbCustomSound.Text;
|
Config.NotificationSoundPath = tbCustomSound.Text;
|
||||||
|
Config.NotificationSoundVolume = trackBarVolume.Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool RefreshCanPlay(){
|
||||||
|
bool isEmpty = string.IsNullOrEmpty(tbCustomSound.Text);
|
||||||
|
bool canPlay = isEmpty || File.Exists(tbCustomSound.Text);
|
||||||
|
|
||||||
|
tbCustomSound.ForeColor = canPlay ? SystemColors.WindowText : Color.Red;
|
||||||
|
btnPlaySound.Enabled = canPlay;
|
||||||
|
btnResetSound.Enabled = !isEmpty;
|
||||||
|
return canPlay;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void tbCustomSound_TextChanged(object sender, EventArgs e){
|
private void tbCustomSound_TextChanged(object sender, EventArgs e){
|
||||||
bool isEmpty = string.IsNullOrEmpty(tbCustomSound.Text);
|
RefreshCanPlay();
|
||||||
tbCustomSound.ForeColor = isEmpty || File.Exists(tbCustomSound.Text) ? SystemColors.WindowText : Color.Red;
|
|
||||||
btnPlaySound.Enabled = !isEmpty;
|
|
||||||
btnResetSound.Enabled = !isEmpty;
|
|
||||||
trackBarVolume.Enabled = supportsChangingVolume && !isEmpty;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnPlaySound_Click(object sender, EventArgs e){
|
private void btnPlaySound_Click(object sender, EventArgs e){
|
||||||
soundNotification.Play(tbCustomSound.Text);
|
if (RefreshCanPlay()){
|
||||||
|
Config.NotificationSoundPath = tbCustomSound.Text;
|
||||||
|
Config.NotificationSoundVolume = trackBarVolume.Value;
|
||||||
|
playSoundNotification();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void sound_PlaybackError(object sender, PlaybackErrorEventArgs e){
|
|
||||||
FormMessage.Error("Notification Sound Error", "Could not play custom notification sound.\n"+e.Message, FormMessage.OK);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnBrowseSound_Click(object sender, EventArgs e){
|
private void btnBrowseSound_Click(object sender, EventArgs e){
|
||||||
@@ -61,7 +62,7 @@ namespace TweetDuck.Core.Other.Settings{
|
|||||||
AutoUpgradeEnabled = true,
|
AutoUpgradeEnabled = true,
|
||||||
DereferenceLinks = true,
|
DereferenceLinks = true,
|
||||||
Title = "Custom Notification Sound",
|
Title = "Custom Notification Sound",
|
||||||
Filter = "Sound file ("+soundNotification.SupportedFormats+")|"+soundNotification.SupportedFormats+"|All files (*.*)|*.*"
|
Filter = $"Sound file ({SoundNotification.SupportedFormats})|{SoundNotification.SupportedFormats}|All files (*.*)|*.*"
|
||||||
}){
|
}){
|
||||||
if (dialog.ShowDialog() == DialogResult.OK){
|
if (dialog.ShowDialog() == DialogResult.OK){
|
||||||
tbCustomSound.Text = dialog.FileName;
|
tbCustomSound.Text = dialog.FileName;
|
||||||
@@ -74,9 +75,14 @@ namespace TweetDuck.Core.Other.Settings{
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void trackBarVolume_ValueChanged(object sender, EventArgs e){
|
private void trackBarVolume_ValueChanged(object sender, EventArgs e){
|
||||||
|
volumeUpdateTimer.Stop();
|
||||||
|
volumeUpdateTimer.Start();
|
||||||
|
labelVolumeValue.Text = trackBarVolume.Value+"%";
|
||||||
|
}
|
||||||
|
|
||||||
|
private void volumeUpdateTimer_Tick(object sender, EventArgs e){
|
||||||
Config.NotificationSoundVolume = trackBarVolume.Value;
|
Config.NotificationSoundVolume = trackBarVolume.Value;
|
||||||
soundNotification.SetVolume(Config.NotificationSoundVolume);
|
volumeUpdateTimer.Stop();
|
||||||
labelVolumeValue.Text = Config.NotificationSoundVolume+"%";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
78
Core/Other/Settings/TabSettingsTray.Designer.cs
generated
78
Core/Other/Settings/TabSettingsTray.Designer.cs
generated
@@ -24,93 +24,95 @@
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
private void InitializeComponent() {
|
private void InitializeComponent() {
|
||||||
this.components = new System.ComponentModel.Container();
|
this.components = new System.ComponentModel.Container();
|
||||||
this.panelTray = new System.Windows.Forms.Panel();
|
|
||||||
this.checkTrayHighlight = new System.Windows.Forms.CheckBox();
|
this.checkTrayHighlight = new System.Windows.Forms.CheckBox();
|
||||||
this.comboBoxTrayType = new System.Windows.Forms.ComboBox();
|
this.comboBoxTrayType = new System.Windows.Forms.ComboBox();
|
||||||
this.labelTrayIcon = new System.Windows.Forms.Label();
|
this.labelTrayIcon = new System.Windows.Forms.Label();
|
||||||
this.labelTray = new System.Windows.Forms.Label();
|
this.labelTray = new System.Windows.Forms.Label();
|
||||||
this.toolTip = new System.Windows.Forms.ToolTip(this.components);
|
this.toolTip = new System.Windows.Forms.ToolTip(this.components);
|
||||||
this.panelTray.SuspendLayout();
|
this.flowPanel = new System.Windows.Forms.FlowLayoutPanel();
|
||||||
|
this.flowPanel.SuspendLayout();
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
//
|
//
|
||||||
// panelTray
|
|
||||||
//
|
|
||||||
this.panelTray.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
|
||||||
| System.Windows.Forms.AnchorStyles.Right)));
|
|
||||||
this.panelTray.Controls.Add(this.checkTrayHighlight);
|
|
||||||
this.panelTray.Controls.Add(this.comboBoxTrayType);
|
|
||||||
this.panelTray.Controls.Add(this.labelTrayIcon);
|
|
||||||
this.panelTray.Location = new System.Drawing.Point(9, 31);
|
|
||||||
this.panelTray.Name = "panelTray";
|
|
||||||
this.panelTray.Size = new System.Drawing.Size(322, 76);
|
|
||||||
this.panelTray.TabIndex = 1;
|
|
||||||
//
|
|
||||||
// checkTrayHighlight
|
// checkTrayHighlight
|
||||||
//
|
//
|
||||||
this.checkTrayHighlight.AutoSize = true;
|
this.checkTrayHighlight.AutoSize = true;
|
||||||
this.checkTrayHighlight.Location = new System.Drawing.Point(6, 56);
|
this.checkTrayHighlight.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.checkTrayHighlight.Margin = new System.Windows.Forms.Padding(6, 5, 3, 3);
|
this.checkTrayHighlight.Location = new System.Drawing.Point(6, 81);
|
||||||
|
this.checkTrayHighlight.Margin = new System.Windows.Forms.Padding(6, 6, 3, 2);
|
||||||
this.checkTrayHighlight.Name = "checkTrayHighlight";
|
this.checkTrayHighlight.Name = "checkTrayHighlight";
|
||||||
this.checkTrayHighlight.Size = new System.Drawing.Size(103, 17);
|
this.checkTrayHighlight.Size = new System.Drawing.Size(114, 19);
|
||||||
this.checkTrayHighlight.TabIndex = 2;
|
this.checkTrayHighlight.TabIndex = 3;
|
||||||
this.checkTrayHighlight.Text = "Enable Highlight";
|
this.checkTrayHighlight.Text = "Enable Highlight";
|
||||||
this.toolTip.SetToolTip(this.checkTrayHighlight, "Highlights the tray icon if there are new tweets.\r\nOnly works for columns with popup or audio notifications.\r\nThe icon resets when the main window is restored.");
|
|
||||||
this.checkTrayHighlight.UseVisualStyleBackColor = true;
|
this.checkTrayHighlight.UseVisualStyleBackColor = true;
|
||||||
//
|
//
|
||||||
// comboBoxTrayType
|
// comboBoxTrayType
|
||||||
//
|
//
|
||||||
this.comboBoxTrayType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
this.comboBoxTrayType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||||
|
this.comboBoxTrayType.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.comboBoxTrayType.FormattingEnabled = true;
|
this.comboBoxTrayType.FormattingEnabled = true;
|
||||||
this.comboBoxTrayType.Location = new System.Drawing.Point(5, 5);
|
this.comboBoxTrayType.Location = new System.Drawing.Point(5, 25);
|
||||||
this.comboBoxTrayType.Margin = new System.Windows.Forms.Padding(5, 5, 3, 3);
|
this.comboBoxTrayType.Margin = new System.Windows.Forms.Padding(5, 5, 3, 3);
|
||||||
this.comboBoxTrayType.Name = "comboBoxTrayType";
|
this.comboBoxTrayType.Name = "comboBoxTrayType";
|
||||||
this.comboBoxTrayType.Size = new System.Drawing.Size(144, 21);
|
this.comboBoxTrayType.Size = new System.Drawing.Size(144, 23);
|
||||||
this.comboBoxTrayType.TabIndex = 0;
|
this.comboBoxTrayType.TabIndex = 1;
|
||||||
this.toolTip.SetToolTip(this.comboBoxTrayType, "Changes behavior of the Tray icon.\r\nRight-click the icon for an action menu.");
|
|
||||||
//
|
//
|
||||||
// labelTrayIcon
|
// labelTrayIcon
|
||||||
//
|
//
|
||||||
this.labelTrayIcon.AutoSize = true;
|
this.labelTrayIcon.AutoSize = true;
|
||||||
this.labelTrayIcon.Location = new System.Drawing.Point(3, 38);
|
this.labelTrayIcon.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.labelTrayIcon.Location = new System.Drawing.Point(3, 60);
|
||||||
this.labelTrayIcon.Margin = new System.Windows.Forms.Padding(3, 9, 3, 0);
|
this.labelTrayIcon.Margin = new System.Windows.Forms.Padding(3, 9, 3, 0);
|
||||||
this.labelTrayIcon.Name = "labelTrayIcon";
|
this.labelTrayIcon.Name = "labelTrayIcon";
|
||||||
this.labelTrayIcon.Size = new System.Drawing.Size(52, 13);
|
this.labelTrayIcon.Size = new System.Drawing.Size(56, 15);
|
||||||
this.labelTrayIcon.TabIndex = 1;
|
this.labelTrayIcon.TabIndex = 2;
|
||||||
this.labelTrayIcon.Text = "Tray Icon";
|
this.labelTrayIcon.Text = "Tray Icon";
|
||||||
//
|
//
|
||||||
// labelTray
|
// labelTray
|
||||||
//
|
//
|
||||||
this.labelTray.AutoSize = true;
|
this.labelTray.AutoSize = true;
|
||||||
this.labelTray.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
this.labelTray.Font = new System.Drawing.Font("Segoe UI", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.labelTray.Location = new System.Drawing.Point(6, 8);
|
this.labelTray.Location = new System.Drawing.Point(0, 0);
|
||||||
this.labelTray.Margin = new System.Windows.Forms.Padding(0, 2, 0, 0);
|
this.labelTray.Margin = new System.Windows.Forms.Padding(0);
|
||||||
this.labelTray.Name = "labelTray";
|
this.labelTray.Name = "labelTray";
|
||||||
this.labelTray.Size = new System.Drawing.Size(96, 20);
|
this.labelTray.Size = new System.Drawing.Size(88, 20);
|
||||||
this.labelTray.TabIndex = 0;
|
this.labelTray.TabIndex = 0;
|
||||||
this.labelTray.Text = "System Tray";
|
this.labelTray.Text = "System Tray";
|
||||||
//
|
//
|
||||||
|
// flowPanel
|
||||||
|
//
|
||||||
|
this.flowPanel.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.flowPanel.Controls.Add(this.labelTray);
|
||||||
|
this.flowPanel.Controls.Add(this.comboBoxTrayType);
|
||||||
|
this.flowPanel.Controls.Add(this.labelTrayIcon);
|
||||||
|
this.flowPanel.Controls.Add(this.checkTrayHighlight);
|
||||||
|
this.flowPanel.FlowDirection = System.Windows.Forms.FlowDirection.TopDown;
|
||||||
|
this.flowPanel.Location = new System.Drawing.Point(9, 9);
|
||||||
|
this.flowPanel.Name = "flowPanel";
|
||||||
|
this.flowPanel.Size = new System.Drawing.Size(322, 102);
|
||||||
|
this.flowPanel.TabIndex = 0;
|
||||||
|
this.flowPanel.WrapContents = false;
|
||||||
|
//
|
||||||
// TabSettingsTray
|
// TabSettingsTray
|
||||||
//
|
//
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
this.Controls.Add(this.panelTray);
|
this.Controls.Add(this.flowPanel);
|
||||||
this.Controls.Add(this.labelTray);
|
|
||||||
this.Name = "TabSettingsTray";
|
this.Name = "TabSettingsTray";
|
||||||
this.Size = new System.Drawing.Size(340, 119);
|
this.Size = new System.Drawing.Size(340, 120);
|
||||||
this.panelTray.ResumeLayout(false);
|
this.flowPanel.ResumeLayout(false);
|
||||||
this.panelTray.PerformLayout();
|
this.flowPanel.PerformLayout();
|
||||||
this.ResumeLayout(false);
|
this.ResumeLayout(false);
|
||||||
this.PerformLayout();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
private System.Windows.Forms.Panel panelTray;
|
|
||||||
private System.Windows.Forms.CheckBox checkTrayHighlight;
|
private System.Windows.Forms.CheckBox checkTrayHighlight;
|
||||||
private System.Windows.Forms.ComboBox comboBoxTrayType;
|
private System.Windows.Forms.ComboBox comboBoxTrayType;
|
||||||
private System.Windows.Forms.Label labelTrayIcon;
|
private System.Windows.Forms.Label labelTrayIcon;
|
||||||
private System.Windows.Forms.Label labelTray;
|
private System.Windows.Forms.Label labelTray;
|
||||||
private System.Windows.Forms.ToolTip toolTip;
|
private System.Windows.Forms.ToolTip toolTip;
|
||||||
|
private System.Windows.Forms.FlowLayoutPanel flowPanel;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,9 @@ namespace TweetDuck.Core.Other.Settings{
|
|||||||
public TabSettingsTray(){
|
public TabSettingsTray(){
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
|
toolTip.SetToolTip(comboBoxTrayType, "Changes behavior of the Tray icon.\r\nRight-click the icon for an action menu.");
|
||||||
|
toolTip.SetToolTip(checkTrayHighlight, "Highlights the tray icon if there are new tweets.\r\nOnly works for columns with popup or audio notifications.\r\nThe icon resets when the main window is restored.");
|
||||||
|
|
||||||
comboBoxTrayType.Items.Add("Disabled");
|
comboBoxTrayType.Items.Add("Disabled");
|
||||||
comboBoxTrayType.Items.Add("Display Icon Only");
|
comboBoxTrayType.Items.Add("Display Icon Only");
|
||||||
comboBoxTrayType.Items.Add("Minimize to Tray");
|
comboBoxTrayType.Items.Add("Minimize to Tray");
|
||||||
|
|||||||
@@ -1,22 +1,21 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
|
using System.Text;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using CefSharp;
|
using CefSharp;
|
||||||
using CefSharp.WinForms;
|
using CefSharp.WinForms;
|
||||||
|
using TweetDuck.Configuration;
|
||||||
using TweetDuck.Core.Bridge;
|
using TweetDuck.Core.Bridge;
|
||||||
using TweetDuck.Core.Controls;
|
using TweetDuck.Core.Controls;
|
||||||
using TweetDuck.Core.Handling;
|
using TweetDuck.Core.Handling;
|
||||||
using TweetDuck.Core.Handling.General;
|
using TweetDuck.Core.Handling.General;
|
||||||
using TweetDuck.Core.Other.Management;
|
using TweetDuck.Core.Notification;
|
||||||
|
using TweetDuck.Core.Other.Interfaces;
|
||||||
using TweetDuck.Core.Utils;
|
using TweetDuck.Core.Utils;
|
||||||
using TweetDuck.Plugins;
|
|
||||||
using TweetDuck.Plugins.Enums;
|
|
||||||
using TweetDuck.Plugins.Events;
|
|
||||||
using TweetDuck.Resources;
|
using TweetDuck.Resources;
|
||||||
using TweetDuck.Updates;
|
|
||||||
|
|
||||||
namespace TweetDuck.Core{
|
namespace TweetDuck.Core{
|
||||||
sealed class TweetDeckBrowser : IDisposable{
|
sealed class TweetDeckBrowser : ITweetDeckBrowser, IDisposable{
|
||||||
public bool Ready { get; private set; }
|
public bool Ready { get; private set; }
|
||||||
|
|
||||||
public bool Enabled{
|
public bool Enabled{
|
||||||
@@ -26,54 +25,52 @@ namespace TweetDuck.Core{
|
|||||||
|
|
||||||
public bool IsTweetDeckWebsite{
|
public bool IsTweetDeckWebsite{
|
||||||
get{
|
get{
|
||||||
|
if (!Ready){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
using(IFrame frame = browser.GetBrowser().MainFrame){
|
using(IFrame frame = browser.GetBrowser().MainFrame){
|
||||||
return TwitterUtils.IsTweetDeckWebsite(frame);
|
return TwitterUtils.IsTweetDeckWebsite(frame);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public event EventHandler PageLoaded;
|
|
||||||
|
|
||||||
private readonly ChromiumWebBrowser browser;
|
private readonly ChromiumWebBrowser browser;
|
||||||
private readonly PluginManager plugins;
|
|
||||||
private readonly MemoryUsageTracker memoryUsageTracker;
|
|
||||||
|
|
||||||
public TweetDeckBrowser(FormBrowser owner, PluginManager plugins, TweetDeckBridge bridge){
|
private string prevSoundNotificationPath = null;
|
||||||
|
|
||||||
|
public TweetDeckBrowser(FormBrowser owner, TweetDeckBridge bridge){
|
||||||
|
RequestHandlerBrowser requestHandler = new RequestHandlerBrowser();
|
||||||
|
|
||||||
this.browser = new ChromiumWebBrowser(TwitterUtils.TweetDeckURL){
|
this.browser = new ChromiumWebBrowser(TwitterUtils.TweetDeckURL){
|
||||||
DialogHandler = new FileDialogHandler(),
|
DialogHandler = new FileDialogHandler(),
|
||||||
DragHandler = new DragHandlerBrowser(),
|
DragHandler = new DragHandlerBrowser(requestHandler),
|
||||||
MenuHandler = new ContextMenuBrowser(owner),
|
MenuHandler = new ContextMenuBrowser(owner),
|
||||||
JsDialogHandler = new JavaScriptDialogHandler(),
|
JsDialogHandler = new JavaScriptDialogHandler(),
|
||||||
KeyboardHandler = new KeyboardHandlerBrowser(owner),
|
KeyboardHandler = new KeyboardHandlerBrowser(owner),
|
||||||
LifeSpanHandler = new LifeSpanHandler(),
|
LifeSpanHandler = new LifeSpanHandler(),
|
||||||
RequestHandler = new RequestHandlerBrowser()
|
RequestHandler = requestHandler
|
||||||
};
|
};
|
||||||
|
|
||||||
#if DEBUG
|
|
||||||
this.browser.ConsoleMessage += BrowserUtils.HandleConsoleMessage;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
this.browser.LoadingStateChanged += browser_LoadingStateChanged;
|
this.browser.LoadingStateChanged += browser_LoadingStateChanged;
|
||||||
this.browser.FrameLoadStart += browser_FrameLoadStart;
|
this.browser.FrameLoadStart += browser_FrameLoadStart;
|
||||||
this.browser.FrameLoadEnd += browser_FrameLoadEnd;
|
this.browser.FrameLoadEnd += browser_FrameLoadEnd;
|
||||||
this.browser.LoadError += browser_LoadError;
|
this.browser.LoadError += browser_LoadError;
|
||||||
|
|
||||||
this.browser.RegisterAsyncJsObject("$TD", bridge);
|
this.browser.RegisterAsyncJsObject("$TD", bridge);
|
||||||
this.browser.RegisterAsyncJsObject("$TDP", plugins.Bridge);
|
|
||||||
|
|
||||||
this.browser.BrowserSettings.BackgroundColor = (uint)TwitterUtils.BackgroundColor.ToArgb();
|
this.browser.BrowserSettings.BackgroundColor = (uint)TwitterUtils.BackgroundColor.ToArgb();
|
||||||
this.browser.Dock = DockStyle.None;
|
this.browser.Dock = DockStyle.None;
|
||||||
this.browser.Location = ControlExtensions.InvisibleLocation;
|
this.browser.Location = ControlExtensions.InvisibleLocation;
|
||||||
|
|
||||||
|
this.browser.SetupResourceHandler(TweetNotification.AppLogo);
|
||||||
|
this.browser.SetupResourceHandler(TwitterUtils.LoadingSpinner);
|
||||||
|
|
||||||
owner.Controls.Add(browser);
|
owner.Controls.Add(browser);
|
||||||
|
|
||||||
this.plugins = plugins;
|
|
||||||
this.plugins.PluginChangedState += plugins_PluginChangedState;
|
|
||||||
|
|
||||||
this.memoryUsageTracker = new MemoryUsageTracker("TDGF_tryRunCleanup");
|
|
||||||
|
|
||||||
Program.UserConfig.MuteToggled += UserConfig_MuteToggled;
|
Program.UserConfig.MuteToggled += UserConfig_MuteToggled;
|
||||||
Program.UserConfig.ZoomLevelChanged += UserConfig_ZoomLevelChanged;
|
Program.UserConfig.ZoomLevelChanged += UserConfig_ZoomLevelChanged;
|
||||||
|
Program.UserConfig.SoundNotificationChanged += UserConfig_SoundNotificationInfoChanged;
|
||||||
}
|
}
|
||||||
|
|
||||||
// setup and management
|
// setup and management
|
||||||
@@ -91,15 +88,31 @@ namespace TweetDuck.Core{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void Dispose(){
|
public void Dispose(){
|
||||||
plugins.PluginChangedState -= plugins_PluginChangedState;
|
|
||||||
|
|
||||||
Program.UserConfig.MuteToggled -= UserConfig_MuteToggled;
|
Program.UserConfig.MuteToggled -= UserConfig_MuteToggled;
|
||||||
Program.UserConfig.ZoomLevelChanged -= UserConfig_ZoomLevelChanged;
|
Program.UserConfig.ZoomLevelChanged -= UserConfig_ZoomLevelChanged;
|
||||||
|
Program.UserConfig.SoundNotificationChanged -= UserConfig_SoundNotificationInfoChanged;
|
||||||
|
|
||||||
memoryUsageTracker.Dispose();
|
|
||||||
browser.Dispose();
|
browser.Dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ITweetDeckBrowser.RegisterBridge(string name, object obj){
|
||||||
|
browser.RegisterAsyncJsObject(name, obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ITweetDeckBrowser.OnFrameLoaded(Action<IFrame> callback){
|
||||||
|
browser.FrameLoadEnd += (sender, args) => {
|
||||||
|
IFrame frame = args.Frame;
|
||||||
|
|
||||||
|
if (frame.IsMain && TwitterUtils.IsTweetDeckWebsite(frame)){
|
||||||
|
callback(frame);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
void ITweetDeckBrowser.ExecuteFunction(string name, params object[] args){
|
||||||
|
browser.ExecuteScriptAsync(name, args);
|
||||||
|
}
|
||||||
|
|
||||||
// event handlers
|
// event handlers
|
||||||
|
|
||||||
private void browser_LoadingStateChanged(object sender, LoadingStateChangedEventArgs e){
|
private void browser_LoadingStateChanged(object sender, LoadingStateChangedEventArgs e){
|
||||||
@@ -114,41 +127,43 @@ namespace TweetDuck.Core{
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void browser_FrameLoadStart(object sender, FrameLoadStartEventArgs e){
|
private void browser_FrameLoadStart(object sender, FrameLoadStartEventArgs e){
|
||||||
if (e.Frame.IsMain){
|
IFrame frame = e.Frame;
|
||||||
memoryUsageTracker.Stop();
|
|
||||||
|
|
||||||
|
if (frame.IsMain){
|
||||||
if (Program.UserConfig.ZoomLevel != 100){
|
if (Program.UserConfig.ZoomLevel != 100){
|
||||||
BrowserUtils.SetZoomLevel(browser.GetBrowser(), Program.UserConfig.ZoomLevel);
|
BrowserUtils.SetZoomLevel(browser.GetBrowser(), Program.UserConfig.ZoomLevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TwitterUtils.IsTwitterWebsite(e.Frame)){
|
if (TwitterUtils.IsTwitterWebsite(frame)){
|
||||||
ScriptLoader.ExecuteFile(e.Frame, "twitter.js");
|
ScriptLoader.ExecuteFile(frame, "twitter.js", browser);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
frame.ExecuteJavaScriptAsync(TwitterUtils.BackgroundColorOverride);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void browser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e){
|
private void browser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e){
|
||||||
if (e.Frame.IsMain && TwitterUtils.IsTweetDeckWebsite(e.Frame)){
|
IFrame frame = e.Frame;
|
||||||
e.Frame.ExecuteJavaScriptAsync(TwitterUtils.BackgroundColorFix);
|
|
||||||
|
|
||||||
|
if (frame.IsMain && TwitterUtils.IsTweetDeckWebsite(frame)){
|
||||||
UpdateProperties();
|
UpdateProperties();
|
||||||
TweetDeckBridge.RestoreSessionData(e.Frame);
|
TweetDeckBridge.RestoreSessionData(frame);
|
||||||
ScriptLoader.ExecuteFile(e.Frame, "code.js");
|
ScriptLoader.ExecuteFile(frame, "code.js", browser);
|
||||||
|
ScriptLoader.ExecuteFile(frame, "update.js", browser);
|
||||||
|
|
||||||
InjectBrowserCSS();
|
InjectBrowserCSS();
|
||||||
ReinjectCustomCSS(Program.UserConfig.CustomBrowserCSS);
|
ReinjectCustomCSS(Program.UserConfig.CustomBrowserCSS);
|
||||||
plugins.ExecutePlugins(e.Frame, PluginEnvironment.Browser);
|
UserConfig_SoundNotificationInfoChanged(null, EventArgs.Empty);
|
||||||
|
|
||||||
TweetDeckBridge.ResetStaticProperties();
|
TweetDeckBridge.ResetStaticProperties();
|
||||||
|
|
||||||
if (Program.SystemConfig.EnableBrowserGCReload){
|
if (Arguments.HasFlag(Arguments.ArgIgnoreGDPR)){
|
||||||
memoryUsageTracker.Start(browser, Program.SystemConfig.BrowserMemoryThreshold);
|
ScriptLoader.ExecuteScript(frame, @"TD.storage.Account.prototype.requiresConsent = function(){ return false; }", "gen:gdpr");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Program.UserConfig.FirstRun){
|
if (Program.UserConfig.FirstRun){
|
||||||
ScriptLoader.ExecuteFile(e.Frame, "introduction.js");
|
ScriptLoader.ExecuteFile(frame, "introduction.js", browser);
|
||||||
}
|
}
|
||||||
|
|
||||||
PageLoaded?.Invoke(this, EventArgs.Empty);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -166,10 +181,6 @@ namespace TweetDuck.Core{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void plugins_PluginChangedState(object sender, PluginChangedStateEventArgs e){
|
|
||||||
browser.ExecuteScriptAsync("TDPF_setPluginState", e.Plugin, e.IsEnabled);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void UserConfig_MuteToggled(object sender, EventArgs e){
|
private void UserConfig_MuteToggled(object sender, EventArgs e){
|
||||||
UpdateProperties();
|
UpdateProperties();
|
||||||
}
|
}
|
||||||
@@ -178,21 +189,20 @@ namespace TweetDuck.Core{
|
|||||||
BrowserUtils.SetZoomLevel(browser.GetBrowser(), Program.UserConfig.ZoomLevel);
|
BrowserUtils.SetZoomLevel(browser.GetBrowser(), Program.UserConfig.ZoomLevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void UserConfig_SoundNotificationInfoChanged(object sender, EventArgs e){
|
||||||
|
const string soundUrl = "https://ton.twimg.com/tduck/updatesnd";
|
||||||
|
bool hasCustomSound = Program.UserConfig.IsCustomSoundNotificationSet;
|
||||||
|
|
||||||
|
if (prevSoundNotificationPath != Program.UserConfig.NotificationSoundPath){
|
||||||
|
browser.SetupResourceHandler(soundUrl, hasCustomSound ? SoundNotification.CreateFileHandler(Program.UserConfig.NotificationSoundPath) : null);
|
||||||
|
prevSoundNotificationPath = Program.UserConfig.NotificationSoundPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
browser.ExecuteScriptAsync("TDGF_setSoundNotificationData", hasCustomSound, Program.UserConfig.NotificationSoundVolume);
|
||||||
|
}
|
||||||
|
|
||||||
// external handling
|
// external handling
|
||||||
|
|
||||||
public UpdateHandler CreateUpdateHandler(UpdaterSettings settings){
|
|
||||||
return new UpdateHandler(browser, settings);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void RefreshMemoryTracker(){
|
|
||||||
if (Program.SystemConfig.EnableBrowserGCReload){
|
|
||||||
memoryUsageTracker.Start(browser, Program.SystemConfig.BrowserMemoryThreshold);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
memoryUsageTracker.Stop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void HideVideoOverlay(bool focus){
|
public void HideVideoOverlay(bool focus){
|
||||||
if (focus){
|
if (focus){
|
||||||
browser.GetBrowser().GetHost().SendFocusEvent(true);
|
browser.GetBrowser().GetHost().SendFocusEvent(true);
|
||||||
@@ -212,7 +222,7 @@ namespace TweetDuck.Core{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void InjectBrowserCSS(){
|
public void InjectBrowserCSS(){
|
||||||
browser.ExecuteScriptAsync("TDGF_injectBrowserCSS", ScriptLoader.LoadResource("styles/browser.css").TrimEnd());
|
browser.ExecuteScriptAsync("TDGF_injectBrowserCSS", ScriptLoader.LoadResource("styles/browser.css", false, browser)?.TrimEnd() ?? string.Empty);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ReinjectCustomCSS(string css){
|
public void ReinjectCustomCSS(string css){
|
||||||
@@ -227,6 +237,10 @@ namespace TweetDuck.Core{
|
|||||||
browser.ExecuteScriptAsync("TDGF_showTweetDetail", columnId, chirpId, fallbackUrl);
|
browser.ExecuteScriptAsync("TDGF_showTweetDetail", columnId, chirpId, fallbackUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void AddSearchColumn(string query){
|
||||||
|
browser.ExecuteScriptAsync("TDGF_performSearch", query);
|
||||||
|
}
|
||||||
|
|
||||||
public void TriggerTweetScreenshot(){
|
public void TriggerTweetScreenshot(){
|
||||||
browser.ExecuteScriptAsync("TDGF_triggerScreenshot()");
|
browser.ExecuteScriptAsync("TDGF_triggerScreenshot()");
|
||||||
}
|
}
|
||||||
@@ -235,8 +249,16 @@ namespace TweetDuck.Core{
|
|||||||
browser.ExecuteScriptAsync("TDGF_reloadColumns()");
|
browser.ExecuteScriptAsync("TDGF_reloadColumns()");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void PlaySoundNotification(){
|
||||||
|
browser.ExecuteScriptAsync("TDGF_playSoundNotification()");
|
||||||
|
}
|
||||||
|
|
||||||
public void ApplyROT13(){
|
public void ApplyROT13(){
|
||||||
browser.ExecuteScriptAsync("TDGF_applyROT13()");
|
browser.ExecuteScriptAsync("TDGF_applyROT13()");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void ShowUpdateNotification(string versionTag, string releaseNotes){
|
||||||
|
browser.ExecuteScriptAsync("TDUF_displayNotification", versionTag, Convert.ToBase64String(Encoding.GetEncoding("iso-8859-1").GetBytes(releaseNotes)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,45 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.IO;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
namespace TweetDuck.Core.Utils{
|
|
||||||
static class BrowserCache{
|
|
||||||
private static bool ClearOnExit { get; set; }
|
|
||||||
|
|
||||||
public static readonly string CacheFolder = Path.Combine(Program.StoragePath, "Cache");
|
|
||||||
private static IEnumerable<string> CacheFiles => Directory.EnumerateFiles(CacheFolder);
|
|
||||||
|
|
||||||
public static void CalculateCacheSize(Action<Task<long>> callbackBytes){
|
|
||||||
Task<long> task = new Task<long>(() => {
|
|
||||||
return CacheFiles.Select(file => {
|
|
||||||
try{
|
|
||||||
return new FileInfo(file).Length;
|
|
||||||
}catch{
|
|
||||||
return 0L;
|
|
||||||
}
|
|
||||||
}).Sum();
|
|
||||||
});
|
|
||||||
|
|
||||||
task.ContinueWith(callbackBytes);
|
|
||||||
task.Start();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void SetClearOnExit(){
|
|
||||||
ClearOnExit = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void Exit(){
|
|
||||||
if (ClearOnExit){
|
|
||||||
foreach(string file in CacheFiles){
|
|
||||||
try{
|
|
||||||
File.Delete(file);
|
|
||||||
}catch{
|
|
||||||
// welp, too bad
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -7,23 +7,12 @@ using System.Net;
|
|||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using CefSharp.WinForms;
|
using CefSharp.WinForms;
|
||||||
using TweetDuck.Core.Other;
|
using TweetDuck.Core.Other;
|
||||||
|
using TweetDuck.Data;
|
||||||
|
|
||||||
namespace TweetDuck.Core.Utils{
|
namespace TweetDuck.Core.Utils{
|
||||||
static class BrowserUtils{
|
static class BrowserUtils{
|
||||||
public static string HeaderAcceptLanguage{
|
public static string UserAgentVanilla => Program.BrandName+" "+Application.ProductVersion;
|
||||||
get{
|
public static string UserAgentChrome => "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/"+Cef.ChromiumVersion+" Safari/537.36";
|
||||||
string culture = Program.Culture.Name;
|
|
||||||
|
|
||||||
if (culture == "en"){
|
|
||||||
return "en-us,en";
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
return culture.ToLower()+",en;q=0.9";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static string HeaderUserAgent => Program.BrandName+" "+Application.ProductVersion;
|
|
||||||
|
|
||||||
public static void SetupCefArgs(IDictionary<string, string> args){
|
public static void SetupCefArgs(IDictionary<string, string> args){
|
||||||
if (!Program.SystemConfig.HardwareAcceleration){
|
if (!Program.SystemConfig.HardwareAcceleration){
|
||||||
@@ -31,6 +20,10 @@ namespace TweetDuck.Core.Utils{
|
|||||||
args["disable-gpu-vsync"] = "1";
|
args["disable-gpu-vsync"] = "1";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!Program.UserConfig.EnableSmoothScrolling){
|
||||||
|
args["disable-smooth-scrolling"] = "1";
|
||||||
|
}
|
||||||
|
|
||||||
args["disable-pdf-extension"] = "1";
|
args["disable-pdf-extension"] = "1";
|
||||||
args["disable-plugins-discovery"] = "1";
|
args["disable-plugins-discovery"] = "1";
|
||||||
args["enable-system-flash"] = "0";
|
args["enable-system-flash"] = "0";
|
||||||
@@ -47,6 +40,21 @@ namespace TweetDuck.Core.Utils{
|
|||||||
return (ChromiumWebBrowser)browserControl;
|
return (ChromiumWebBrowser)browserControl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void SetupResourceHandler(this ChromiumWebBrowser browser, string url, IResourceHandler handler){
|
||||||
|
DefaultResourceHandlerFactory factory = (DefaultResourceHandlerFactory)browser.ResourceHandlerFactory;
|
||||||
|
|
||||||
|
if (handler == null){
|
||||||
|
factory.UnregisterHandler(url);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
factory.RegisterHandler(url, handler);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void SetupResourceHandler(this ChromiumWebBrowser browser, ResourceLink resource){
|
||||||
|
browser.SetupResourceHandler(resource.Url, resource.Handler);
|
||||||
|
}
|
||||||
|
|
||||||
private const string TwitterTrackingUrl = "t.co";
|
private const string TwitterTrackingUrl = "t.co";
|
||||||
|
|
||||||
public enum UrlCheckResult{
|
public enum UrlCheckResult{
|
||||||
@@ -70,12 +78,46 @@ namespace TweetDuck.Core.Utils{
|
|||||||
|
|
||||||
switch(CheckUrl(url)){
|
switch(CheckUrl(url)){
|
||||||
case UrlCheckResult.Fine:
|
case UrlCheckResult.Fine:
|
||||||
|
if (FormGuide.CheckGuideUrl(url, out string hash)){
|
||||||
|
FormGuide.Show(hash);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
string browserPath = Program.UserConfig.BrowserPath;
|
||||||
|
|
||||||
|
if (browserPath == null || !File.Exists(browserPath)){
|
||||||
WindowsUtils.OpenAssociatedProgram(url);
|
WindowsUtils.OpenAssociatedProgram(url);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
try{
|
||||||
|
using(Process.Start(browserPath, url)){}
|
||||||
|
}catch(Exception e){
|
||||||
|
Program.Reporter.HandleException("Error Opening Browser", "Could not open the browser.", true, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case UrlCheckResult.Tracking:
|
case UrlCheckResult.Tracking:
|
||||||
if (FormMessage.Warning("Blocked URL", "TweetDuck has blocked a tracking url due to privacy concerns. Do you want to visit it anyway?\n"+url, FormMessage.Yes, FormMessage.No)){
|
if (Program.UserConfig.IgnoreTrackingUrlWarning){
|
||||||
WindowsUtils.OpenAssociatedProgram(url);
|
goto case UrlCheckResult.Fine;
|
||||||
|
}
|
||||||
|
|
||||||
|
using(FormMessage form = new FormMessage("Blocked URL", "TweetDuck has blocked a tracking url due to privacy concerns. Do you want to visit it anyway?\n"+url, MessageBoxIcon.Warning)){
|
||||||
|
form.AddButton(FormMessage.No, DialogResult.No, ControlType.Cancel | ControlType.Focused);
|
||||||
|
form.AddButton(FormMessage.Yes, DialogResult.Yes, ControlType.Accept);
|
||||||
|
form.AddButton("Always Visit", DialogResult.Ignore);
|
||||||
|
|
||||||
|
DialogResult result = form.ShowDialog();
|
||||||
|
|
||||||
|
if (result == DialogResult.Ignore){
|
||||||
|
Program.UserConfig.IgnoreTrackingUrlWarning = true;
|
||||||
|
Program.UserConfig.Save();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result == DialogResult.Ignore || result == DialogResult.Yes){
|
||||||
|
goto case UrlCheckResult.Fine;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@@ -86,6 +128,33 @@ namespace TweetDuck.Core.Utils{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void OpenExternalSearch(string query){
|
||||||
|
if (string.IsNullOrWhiteSpace(query))return;
|
||||||
|
|
||||||
|
string searchUrl = Program.UserConfig.SearchEngineUrl;
|
||||||
|
|
||||||
|
if (string.IsNullOrEmpty(searchUrl)){
|
||||||
|
if (FormMessage.Question("Search Options", "You have not configured a default search engine yet, would you like to do it now?", FormMessage.Yes, FormMessage.No)){
|
||||||
|
bool wereSettingsOpen = FormManager.TryFind<FormSettings>() != null;
|
||||||
|
|
||||||
|
FormManager.TryFind<FormBrowser>()?.OpenSettings();
|
||||||
|
if (wereSettingsOpen)return;
|
||||||
|
|
||||||
|
FormSettings settings = FormManager.TryFind<FormSettings>();
|
||||||
|
if (settings == null)return;
|
||||||
|
|
||||||
|
settings.FormClosed += (sender, args) => {
|
||||||
|
if (args.CloseReason == CloseReason.UserClosing && Program.UserConfig.SearchEngineUrl != searchUrl){
|
||||||
|
OpenExternalSearch(query);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
OpenExternalBrowser(searchUrl+Uri.EscapeUriString(query));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static string GetFileNameFromUrl(string url){
|
public static string GetFileNameFromUrl(string url){
|
||||||
string file = Path.GetFileName(new Uri(url).AbsolutePath);
|
string file = Path.GetFileName(new Uri(url).AbsolutePath);
|
||||||
return string.IsNullOrEmpty(file) ? null : file;
|
return string.IsNullOrEmpty(file) ? null : file;
|
||||||
@@ -96,8 +165,10 @@ namespace TweetDuck.Core.Utils{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static WebClient CreateWebClient(){
|
public static WebClient CreateWebClient(){
|
||||||
|
WindowsUtils.EnsureTLS12();
|
||||||
|
|
||||||
WebClient client = new WebClient{ Proxy = null };
|
WebClient client = new WebClient{ Proxy = null };
|
||||||
client.Headers[HttpRequestHeader.UserAgent] = HeaderUserAgent;
|
client.Headers[HttpRequestHeader.UserAgent] = UserAgentVanilla;
|
||||||
return client;
|
return client;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -131,11 +202,5 @@ namespace TweetDuck.Core.Utils{
|
|||||||
public static void SetZoomLevel(IBrowser browser, int percentage){
|
public static void SetZoomLevel(IBrowser browser, int percentage){
|
||||||
browser.GetHost().SetZoomLevel(Math.Log(percentage/100.0, 1.2));
|
browser.GetHost().SetZoomLevel(Math.Log(percentage/100.0, 1.2));
|
||||||
}
|
}
|
||||||
|
|
||||||
#if DEBUG
|
|
||||||
public static void HandleConsoleMessage(object sender, ConsoleMessageEventArgs e){
|
|
||||||
Debug.WriteLine("[Console] {0} ({1}:{2})", e.Message, e.Source, e.Line);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
58
Core/Utils/LocaleUtils.cs
Normal file
58
Core/Utils/LocaleUtils.cs
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Globalization;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace TweetDuck.Core.Utils{
|
||||||
|
static class LocaleUtils{
|
||||||
|
// https://cs.chromium.org/chromium/src/third_party/hunspell_dictionaries/
|
||||||
|
public static IEnumerable<Item> SpellCheckLanguages { get; } = new List<string>{
|
||||||
|
"af-ZA", "bg-BG", "ca-ES", "cs-CZ", "da-DK", "de-DE",
|
||||||
|
"el-GR", "en-AU", "en-CA", "en-GB", "en-US", "es-ES",
|
||||||
|
"et-EE", "fa-IR", "fo-FO", "fr-FR", "he-IL", "hi-IN",
|
||||||
|
"hr-HR", "hu-HU", "id-ID", "it-IT", "ko" , "lt-LT",
|
||||||
|
"lv-LV", "nb-NO", "nl-NL", "pl-PL", "pt-BR", "pt-PT",
|
||||||
|
"ro-RO", "ru-RU", "sk-SK", "sl-SI", "sq" , "sr",
|
||||||
|
"sv-SE", "ta-IN", "tg-TG", "tr" , "uk-UA", "vi-VN"
|
||||||
|
}.Select(code => {
|
||||||
|
string lang = StringUtils.ExtractBefore(code, '-', 2);
|
||||||
|
return lang == "en" || lang == "pt" ? new Item(code) : new Item(code, lang);
|
||||||
|
}).OrderBy(code => code).ToList();
|
||||||
|
|
||||||
|
// TD.languages.getSupportedTranslationDestinationLanguages() except for "ht", "in", "iw" which are missing/duplicates
|
||||||
|
public static IEnumerable<Item> TweetDeckTranslationLocales { get; } = new List<string>{
|
||||||
|
"bg", "ca", "zh-cn", "zh-tw", "cs", "da", "nl",
|
||||||
|
"en", "et", "fi", "fr", "de", "el", "he", "hi",
|
||||||
|
"hu", "id", "it", "ja", "ko", "lv", "lt", "no",
|
||||||
|
"pl", "pt", "ro", "ru", "sk", "sl", "es", "sv",
|
||||||
|
"th", "tr", "uk", "vi", "ar", "fa"
|
||||||
|
}.Select(code => new Item(code)).OrderBy(code => code).ToList();
|
||||||
|
|
||||||
|
public sealed class Item : IComparable<Item>{
|
||||||
|
public string Code { get; }
|
||||||
|
public CultureInfo Info { get; }
|
||||||
|
|
||||||
|
public Item(string code, string alt = null){
|
||||||
|
this.Code = code;
|
||||||
|
this.Info = CultureInfo.GetCultureInfo(alt ?? code);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool Equals(object obj){
|
||||||
|
return obj is Item other && Code.Equals(other.Code, StringComparison.OrdinalIgnoreCase);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override int GetHashCode(){
|
||||||
|
return Code.GetHashCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string ToString(){
|
||||||
|
string capitalizedName = Info.TextInfo.ToTitleCase(Info.NativeName);
|
||||||
|
return Info.DisplayName == Info.NativeName ? capitalizedName : $"{capitalizedName}, {Info.DisplayName}";
|
||||||
|
}
|
||||||
|
|
||||||
|
public int CompareTo(Item other){
|
||||||
|
return string.Compare(Info.NativeName, other.Info.NativeName, false, CultureInfo.InvariantCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -71,6 +71,9 @@ namespace TweetDuck.Core.Utils{
|
|||||||
[return: MarshalAs(UnmanagedType.Bool)]
|
[return: MarshalAs(UnmanagedType.Bool)]
|
||||||
private static extern bool BitBlt(IntPtr hdc, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, uint dwRop);
|
private static extern bool BitBlt(IntPtr hdc, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, uint dwRop);
|
||||||
|
|
||||||
|
[DllImport("dwmapi.dll")]
|
||||||
|
public static extern int DwmIsCompositionEnabled(out bool enabled);
|
||||||
|
|
||||||
[DllImport("user32.dll")]
|
[DllImport("user32.dll")]
|
||||||
[return: MarshalAs(UnmanagedType.Bool)]
|
[return: MarshalAs(UnmanagedType.Bool)]
|
||||||
public static extern bool ShowScrollBar(IntPtr hWnd, int wBar, bool bShow);
|
public static extern bool ShowScrollBar(IntPtr hWnd, int wBar, bool bShow);
|
||||||
|
|||||||
@@ -19,6 +19,14 @@ namespace TweetDuck.Core.Utils{
|
|||||||
return Regex.Replace(str, @"(\p{Ll})(\P{Ll})|(\P{Ll})(\P{Ll}\p{Ll})", "$1$3_$2$4").ToUpper();
|
return Regex.Replace(str, @"(\p{Ll})(\P{Ll})|(\P{Ll})(\P{Ll}\p{Ll})", "$1$3_$2$4").ToUpper();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static string ConvertRot13(string str){
|
||||||
|
return Regex.Replace(str, @"[a-zA-Z]", match => {
|
||||||
|
int code = match.Value[0];
|
||||||
|
int start = code <= 90 ? 65 : 97;
|
||||||
|
return ((char)(start+(code-start+13)%26)).ToString();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
public static int CountOccurrences(string source, string substring){
|
public static int CountOccurrences(string source, string substring){
|
||||||
int count = 0, index = 0;
|
int count = 0, index = 0;
|
||||||
|
|
||||||
|
|||||||
@@ -6,15 +6,18 @@ using System.Linq;
|
|||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using TweetDuck.Core.Other;
|
using TweetDuck.Core.Other;
|
||||||
|
using TweetDuck.Data;
|
||||||
|
|
||||||
namespace TweetDuck.Core.Utils{
|
namespace TweetDuck.Core.Utils{
|
||||||
static class TwitterUtils{
|
static class TwitterUtils{
|
||||||
public const string TweetDeckURL = "https://tweetdeck.twitter.com";
|
public const string TweetDeckURL = "https://tweetdeck.twitter.com";
|
||||||
|
|
||||||
public static readonly Color BackgroundColor = Color.FromArgb(28, 99, 153);
|
public static readonly Color BackgroundColor = Color.FromArgb(28, 99, 153);
|
||||||
public const string BackgroundColorFix = "let e=document.createElement('style');document.head.appendChild(e);e.innerHTML='body::before{background:#1c6399!important}'";
|
public const string BackgroundColorOverride = "setTimeout(function f(){let h=document.head;if(!h){setTimeout(f,5);return;}let e=document.createElement('style');e.innerHTML='body,body::before{background:#1c6399!important}';h.appendChild(e);},1)";
|
||||||
|
|
||||||
private static readonly Lazy<Regex> RegexAccountLazy = new Lazy<Regex>(() => new Regex(@"^https?://twitter\.com/(?!signup$|tos$|privacy$)([^/]+)/?$", RegexOptions.Compiled), false);
|
public static readonly ResourceLink LoadingSpinner = new ResourceLink("https://ton.twimg.com/tduck/spinner", ResourceHandler.FromByteArray(Properties.Resources.spinner, "image/apng"));
|
||||||
|
|
||||||
|
private static readonly Lazy<Regex> RegexAccountLazy = new Lazy<Regex>(() => new Regex(@"^https?://twitter\.com/(?!signup$|tos$|privacy$|search$|search-)([^/?]+)/?$", RegexOptions.Compiled), false);
|
||||||
public static Regex RegexAccount => RegexAccountLazy.Value;
|
public static Regex RegexAccount => RegexAccountLazy.Value;
|
||||||
|
|
||||||
public static readonly string[] DictionaryWords = {
|
public static readonly string[] DictionaryWords = {
|
||||||
@@ -38,8 +41,8 @@ namespace TweetDuck.Core.Utils{
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static string ExtractMediaBaseLink(string url){
|
private static string ExtractMediaBaseLink(string url){
|
||||||
int dot = url.LastIndexOf('/');
|
int slash = url.LastIndexOf('/');
|
||||||
return dot == -1 ? url : StringUtils.ExtractBefore(url, ':', dot);
|
return slash == -1 ? url : StringUtils.ExtractBefore(url, ':', slash);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static string GetMediaLink(string url, ImageQuality quality){
|
public static string GetMediaLink(string url, ImageQuality quality){
|
||||||
@@ -87,8 +90,8 @@ namespace TweetDuck.Core.Utils{
|
|||||||
using(SaveFileDialog dialog = new SaveFileDialog{
|
using(SaveFileDialog dialog = new SaveFileDialog{
|
||||||
AutoUpgradeEnabled = true,
|
AutoUpgradeEnabled = true,
|
||||||
OverwritePrompt = urls.Length == 1,
|
OverwritePrompt = urls.Length == 1,
|
||||||
Title = "Save image",
|
Title = "Save Image",
|
||||||
FileName = $"{string.Join(" ", fileNameParts.Where(part => part.Length > 0))}{ext}",
|
FileName = $"{string.Join(" ", fileNameParts.Where(part => !string.IsNullOrEmpty(part)))}{ext}",
|
||||||
Filter = (urls.Length == 1 ? "Image" : "Images")+(string.IsNullOrEmpty(ext) ? " (unknown)|*.*" : $" (*{ext})|*{ext}")
|
Filter = (urls.Length == 1 ? "Image" : "Images")+(string.IsNullOrEmpty(ext) ? " (unknown)|*.*" : $" (*{ext})|*{ext}")
|
||||||
}){
|
}){
|
||||||
if (dialog.ShowDialog() == DialogResult.OK){
|
if (dialog.ShowDialog() == DialogResult.OK){
|
||||||
@@ -118,7 +121,7 @@ namespace TweetDuck.Core.Utils{
|
|||||||
using(SaveFileDialog dialog = new SaveFileDialog{
|
using(SaveFileDialog dialog = new SaveFileDialog{
|
||||||
AutoUpgradeEnabled = true,
|
AutoUpgradeEnabled = true,
|
||||||
OverwritePrompt = true,
|
OverwritePrompt = true,
|
||||||
Title = "Save video",
|
Title = "Save Video",
|
||||||
FileName = string.IsNullOrEmpty(username) ? filename : $"{username} {filename}",
|
FileName = string.IsNullOrEmpty(username) ? filename : $"{username} {filename}",
|
||||||
Filter = "Video"+(string.IsNullOrEmpty(ext) ? " (unknown)|*.*" : $" (*{ext})|*{ext}")
|
Filter = "Video"+(string.IsNullOrEmpty(ext) ? " (unknown)|*.*" : $" (*{ext})|*{ext}")
|
||||||
}){
|
}){
|
||||||
|
|||||||
@@ -1,20 +1,26 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Management;
|
using System.Net;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
using Microsoft.Win32;
|
||||||
|
|
||||||
namespace TweetDuck.Core.Utils{
|
namespace TweetDuck.Core.Utils{
|
||||||
static class WindowsUtils{
|
static class WindowsUtils{
|
||||||
private static readonly Lazy<Regex> RegexStripHtmlStyles = new Lazy<Regex>(() => new Regex(@"\s?(?:style|class)="".*?"""), false);
|
private static readonly Lazy<Regex> RegexStripHtmlStyles = new Lazy<Regex>(() => new Regex(@"\s?(?:style|class)="".*?"""), false);
|
||||||
private static readonly Lazy<Regex> RegexOffsetClipboardHtml = new Lazy<Regex>(() => new Regex(@"(?<=EndHTML:|EndFragment:)(\d+)"), false);
|
private static readonly Lazy<Regex> RegexOffsetClipboardHtml = new Lazy<Regex>(() => new Regex(@"(?<=EndHTML:|EndFragment:)(\d+)"), false);
|
||||||
|
|
||||||
|
private static readonly bool IsWindows8OrNewer;
|
||||||
|
private static bool HasMicrosoftBeenBroughtTo2008Yet;
|
||||||
|
|
||||||
public static int CurrentProcessID { get; }
|
public static int CurrentProcessID { get; }
|
||||||
public static bool ShouldAvoidToolWindow { get; }
|
public static bool ShouldAvoidToolWindow { get; }
|
||||||
|
public static bool IsAeroEnabled => IsWindows8OrNewer || (NativeMethods.DwmIsCompositionEnabled(out bool isCompositionEnabled) == 0 && isCompositionEnabled);
|
||||||
|
|
||||||
static WindowsUtils(){
|
static WindowsUtils(){
|
||||||
using(Process me = Process.GetCurrentProcess()){
|
using(Process me = Process.GetCurrentProcess()){
|
||||||
@@ -22,7 +28,17 @@ namespace TweetDuck.Core.Utils{
|
|||||||
}
|
}
|
||||||
|
|
||||||
Version ver = Environment.OSVersion.Version;
|
Version ver = Environment.OSVersion.Version;
|
||||||
ShouldAvoidToolWindow = ver.Major == 6 && ver.Minor == 2; // windows 8/10
|
IsWindows8OrNewer = ver.Major == 6 && ver.Minor == 2; // windows 8/10
|
||||||
|
|
||||||
|
ShouldAvoidToolWindow = IsWindows8OrNewer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void EnsureTLS12(){
|
||||||
|
if (!HasMicrosoftBeenBroughtTo2008Yet){
|
||||||
|
ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12;
|
||||||
|
ServicePointManager.SecurityProtocol &= ~(SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11);
|
||||||
|
HasMicrosoftBeenBroughtTo2008Yet = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void CreateDirectoryForFile(string file){
|
public static void CreateDirectoryForFile(string file){
|
||||||
@@ -63,7 +79,7 @@ namespace TweetDuck.Core.Utils{
|
|||||||
}catch(Win32Exception e) when (e.NativeErrorCode == 0x000004C7){ // operation canceled by the user
|
}catch(Win32Exception e) when (e.NativeErrorCode == 0x000004C7){ // operation canceled by the user
|
||||||
return false;
|
return false;
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
Program.Reporter.HandleException("Error opening file", e.Message, true, e);
|
Program.Reporter.HandleException("Error Opening Program", "Could not open the associated program for "+file, true, e);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -95,20 +111,6 @@ namespace TweetDuck.Core.Utils{
|
|||||||
}).Start();
|
}).Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool IsChildProcess(int pid){
|
|
||||||
try{
|
|
||||||
using(ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT ParentProcessId FROM Win32_Process WHERE ProcessId = "+pid)){
|
|
||||||
foreach(ManagementBaseObject obj in searcher.Get()){
|
|
||||||
return (uint)obj["ParentProcessId"] == CurrentProcessID;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}catch{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void ClipboardStripHtmlStyles(){
|
public static void ClipboardStripHtmlStyles(){
|
||||||
if (!Clipboard.ContainsText(TextDataFormat.Html) || !Clipboard.ContainsText(TextDataFormat.UnicodeText)){
|
if (!Clipboard.ContainsText(TextDataFormat.Html) || !Clipboard.ContainsText(TextDataFormat.UnicodeText)){
|
||||||
return;
|
return;
|
||||||
@@ -145,5 +147,63 @@ namespace TweetDuck.Core.Utils{
|
|||||||
Program.Reporter.HandleException("Clipboard Error", "TweetDuck could not access the clipboard as it is currently used by another process.", true, e);
|
Program.Reporter.HandleException("Clipboard Error", "TweetDuck could not access the clipboard as it is currently used by another process.", true, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static IEnumerable<Browser> FindInstalledBrowsers(){
|
||||||
|
IEnumerable<Browser> ReadBrowsersFromKey(RegistryHive hive){
|
||||||
|
using(RegistryKey root = RegistryKey.OpenBaseKey(hive, RegistryView.Default))
|
||||||
|
using(RegistryKey browserList = root.OpenSubKey(@"SOFTWARE\Clients\StartMenuInternet", false)){
|
||||||
|
if (browserList == null){
|
||||||
|
yield break;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach(string sub in browserList.GetSubKeyNames()){
|
||||||
|
using(RegistryKey browserKey = browserList.OpenSubKey(sub, false))
|
||||||
|
using(RegistryKey shellKey = browserKey?.OpenSubKey(@"shell\open\command")){
|
||||||
|
if (shellKey == null){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
string browserName = browserKey.GetValue(null) as string;
|
||||||
|
string browserPath = shellKey.GetValue(null) as string;
|
||||||
|
|
||||||
|
if (string.IsNullOrEmpty(browserName) || string.IsNullOrEmpty(browserPath)){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (browserPath[0] == '"' && browserPath[browserPath.Length-1] == '"'){
|
||||||
|
browserPath = browserPath.Substring(1, browserPath.Length-2);
|
||||||
|
}
|
||||||
|
|
||||||
|
yield return new Browser(browserName, browserPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
HashSet<Browser> browsers = new HashSet<Browser>();
|
||||||
|
|
||||||
|
try{
|
||||||
|
browsers.UnionWith(ReadBrowsersFromKey(RegistryHive.CurrentUser));
|
||||||
|
browsers.UnionWith(ReadBrowsersFromKey(RegistryHive.LocalMachine));
|
||||||
|
}catch{
|
||||||
|
// oops I guess
|
||||||
|
}
|
||||||
|
|
||||||
|
return browsers;
|
||||||
|
}
|
||||||
|
|
||||||
|
public sealed class Browser{
|
||||||
|
public string Name { get; }
|
||||||
|
public string Path { get; }
|
||||||
|
|
||||||
|
public Browser(string name, string path){
|
||||||
|
this.Name = name;
|
||||||
|
this.Path = path;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override int GetHashCode() => Name.GetHashCode();
|
||||||
|
public override bool Equals(object obj) => obj is Browser other && Name == other.Name;
|
||||||
|
public override string ToString() => Name;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
13
Data/ResourceLink.cs
Normal file
13
Data/ResourceLink.cs
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
using CefSharp;
|
||||||
|
|
||||||
|
namespace TweetDuck.Data{
|
||||||
|
sealed class ResourceLink{
|
||||||
|
public string Url { get; }
|
||||||
|
public IResourceHandler Handler { get; }
|
||||||
|
|
||||||
|
public ResourceLink(string url, IResourceHandler handler){
|
||||||
|
this.Url = url;
|
||||||
|
this.Handler = handler;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
36
Data/Result.cs
Normal file
36
Data/Result.cs
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace TweetDuck.Data{
|
||||||
|
sealed class Result<T>{
|
||||||
|
public bool HasValue => exception == null;
|
||||||
|
|
||||||
|
public T Value => HasValue ? value : throw new InvalidOperationException("Requested value from a failed result.");
|
||||||
|
public Exception Exception => exception ?? throw new InvalidOperationException("Requested exception from a successful result.");
|
||||||
|
|
||||||
|
private readonly T value;
|
||||||
|
private readonly Exception exception;
|
||||||
|
|
||||||
|
public Result(T value){
|
||||||
|
this.value = value;
|
||||||
|
this.exception = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Result(Exception exception){
|
||||||
|
this.value = default(T);
|
||||||
|
this.exception = exception ?? throw new ArgumentNullException(nameof(exception));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Handle(Action<T> onSuccess, Action<Exception> onException){
|
||||||
|
if (HasValue){
|
||||||
|
onSuccess(value);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
onException(exception);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Result<R> Select<R>(Func<T, R> map){
|
||||||
|
return HasValue ? new Result<R>(map(value)) : new Result<R>(exception);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,6 +4,7 @@ using System.IO;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Runtime.Serialization;
|
using System.Runtime.Serialization;
|
||||||
|
using System.Text;
|
||||||
using TweetDuck.Core.Utils;
|
using TweetDuck.Core.Utils;
|
||||||
|
|
||||||
namespace TweetDuck.Data.Serialization{
|
namespace TweetDuck.Data.Serialization{
|
||||||
@@ -11,10 +12,45 @@ namespace TweetDuck.Data.Serialization{
|
|||||||
private const string NewLineReal = "\r\n";
|
private const string NewLineReal = "\r\n";
|
||||||
private const string NewLineCustom = "\r~\n";
|
private const string NewLineCustom = "\r~\n";
|
||||||
|
|
||||||
private static readonly ITypeConverter BasicSerializerObj = new BasicTypeConverter();
|
private static string EscapeLine(string input) => input.Replace("\\", "\\\\").Replace(Environment.NewLine, "\\\r\n");
|
||||||
|
private static string UnescapeLine(string input) => input.Replace(NewLineCustom, Environment.NewLine);
|
||||||
|
|
||||||
public delegate void HandleUnknownPropertiesHandler(T obj, Dictionary<string, string> data);
|
private static string UnescapeStream(StreamReader reader){
|
||||||
public HandleUnknownPropertiesHandler HandleUnknownProperties { get; set; }
|
string data = reader.ReadToEnd();
|
||||||
|
|
||||||
|
StringBuilder build = new StringBuilder(data.Length);
|
||||||
|
int index = 0;
|
||||||
|
|
||||||
|
while(true){
|
||||||
|
int nextIndex = data.IndexOf('\\', index);
|
||||||
|
|
||||||
|
if (nextIndex == -1 || nextIndex+1 >= data.Length){
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
build.Append(data.Substring(index, nextIndex-index));
|
||||||
|
|
||||||
|
char next = data[nextIndex+1];
|
||||||
|
|
||||||
|
if (next == '\\'){ // convert double backslash to single backslash
|
||||||
|
build.Append('\\');
|
||||||
|
index = nextIndex+2;
|
||||||
|
}
|
||||||
|
else if (next == '\r' && nextIndex+2 < data.Length && data[nextIndex+2] == '\n'){ // convert backslash followed by CRLF to custom new line
|
||||||
|
build.Append(NewLineCustom);
|
||||||
|
index = nextIndex+3;
|
||||||
|
}
|
||||||
|
else{ // single backslash
|
||||||
|
build.Append('\\');
|
||||||
|
index = nextIndex+1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return build.Append(data.Substring(index)).ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static readonly ITypeConverter BasicSerializerObj = new BasicTypeConverter();
|
||||||
|
|
||||||
private readonly Dictionary<string, PropertyInfo> props;
|
private readonly Dictionary<string, PropertyInfo> props;
|
||||||
private readonly Dictionary<Type, ITypeConverter> converters;
|
private readonly Dictionary<Type, ITypeConverter> converters;
|
||||||
@@ -36,13 +72,13 @@ namespace TweetDuck.Data.Serialization{
|
|||||||
Type type = prop.Value.PropertyType;
|
Type type = prop.Value.PropertyType;
|
||||||
object value = prop.Value.GetValue(obj);
|
object value = prop.Value.GetValue(obj);
|
||||||
|
|
||||||
if (!converters.TryGetValue(type, out ITypeConverter serializer)) {
|
if (!converters.TryGetValue(type, out ITypeConverter serializer)){
|
||||||
serializer = BasicSerializerObj;
|
serializer = BasicSerializerObj;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (serializer.TryWriteType(type, value, out string converted)){
|
if (serializer.TryWriteType(type, value, out string converted)){
|
||||||
if (converted != null){
|
if (converted != null){
|
||||||
writer.Write($"{prop.Key} {converted.Replace(Environment.NewLine, NewLineCustom)}");
|
writer.Write($"{prop.Key} {EscapeLine(converted)}");
|
||||||
writer.Write(NewLineReal);
|
writer.Write(NewLineReal);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -54,18 +90,38 @@ namespace TweetDuck.Data.Serialization{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void Read(string file, T obj){
|
public void Read(string file, T obj){
|
||||||
Dictionary<string, string> unknownProperties = new Dictionary<string, string>(4);
|
string contents;
|
||||||
|
|
||||||
using(StreamReader reader = new StreamReader(new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.Read))){
|
using(StreamReader reader = new StreamReader(new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.Read))){
|
||||||
switch(reader.Peek()){
|
contents = UnescapeStream(reader);
|
||||||
case -1:
|
}
|
||||||
|
|
||||||
|
if (string.IsNullOrWhiteSpace(contents)){
|
||||||
throw new FormatException("File is empty.");
|
throw new FormatException("File is empty.");
|
||||||
case 0:
|
}
|
||||||
case 1:
|
else if (contents[0] <= (char)1){
|
||||||
throw new FormatException("Input appears to be a binary file.");
|
throw new FormatException("Input appears to be a binary file.");
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach(string line in reader.ReadToEnd().Split(new string[]{ NewLineReal }, StringSplitOptions.RemoveEmptyEntries)){
|
int currentPos = 0;
|
||||||
|
|
||||||
|
do{
|
||||||
|
string line;
|
||||||
|
int nextPos = contents.IndexOf(NewLineReal, currentPos);
|
||||||
|
|
||||||
|
if (nextPos == -1){
|
||||||
|
line = contents.Substring(currentPos);
|
||||||
|
currentPos = -1;
|
||||||
|
|
||||||
|
if (string.IsNullOrEmpty(line)){
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
line = contents.Substring(currentPos, nextPos-currentPos);
|
||||||
|
currentPos = nextPos+NewLineReal.Length;
|
||||||
|
}
|
||||||
|
|
||||||
int space = line.IndexOf(' ');
|
int space = line.IndexOf(' ');
|
||||||
|
|
||||||
if (space == -1){
|
if (space == -1){
|
||||||
@@ -73,10 +129,10 @@ namespace TweetDuck.Data.Serialization{
|
|||||||
}
|
}
|
||||||
|
|
||||||
string property = line.Substring(0, space);
|
string property = line.Substring(0, space);
|
||||||
string value = line.Substring(space+1).Replace(NewLineCustom, Environment.NewLine);
|
string value = UnescapeLine(line.Substring(space+1));
|
||||||
|
|
||||||
if (props.TryGetValue(property, out PropertyInfo info)){
|
if (props.TryGetValue(property, out PropertyInfo info)){
|
||||||
if (!converters.TryGetValue(info.PropertyType, out ITypeConverter serializer)) {
|
if (!converters.TryGetValue(info.PropertyType, out ITypeConverter serializer)){
|
||||||
serializer = BasicSerializerObj;
|
serializer = BasicSerializerObj;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -87,19 +143,7 @@ namespace TweetDuck.Data.Serialization{
|
|||||||
throw new SerializationException($"Invalid file format, cannot convert value: {value} (property: {property})");
|
throw new SerializationException($"Invalid file format, cannot convert value: {value} (property: {property})");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
}while(currentPos != -1);
|
||||||
unknownProperties[property] = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (unknownProperties.Count > 0){
|
|
||||||
HandleUnknownProperties?.Invoke(obj, unknownProperties);
|
|
||||||
|
|
||||||
if (unknownProperties.Count > 0){
|
|
||||||
throw new SerializationException($"Invalid file format, unknown properties: {string.Join(", ", unknownProperties.Keys)}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ReadIfExists(string file, T obj){
|
public void ReadIfExists(string file, T obj){
|
||||||
|
|||||||
@@ -62,8 +62,7 @@ namespace TweetDuck.Data{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public bool Contains(K1 outerKey, K2 innerKey){
|
public bool Contains(K1 outerKey, K2 innerKey){
|
||||||
Dictionary<K2, V> innerDict;
|
return dict.TryGetValue(outerKey, out Dictionary<K2, V> innerDict) && innerDict.ContainsKey(innerKey);
|
||||||
return dict.TryGetValue(outerKey, out innerDict) && innerDict.ContainsKey(innerKey);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public int Count(){
|
public int Count(){
|
||||||
|
|||||||
126
Plugins/Controls/PluginControl.Designer.cs
generated
126
Plugins/Controls/PluginControl.Designer.cs
generated
@@ -23,6 +23,7 @@
|
|||||||
/// the contents of this method with the code editor.
|
/// the contents of this method with the code editor.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void InitializeComponent() {
|
private void InitializeComponent() {
|
||||||
|
this.components = new System.ComponentModel.Container();
|
||||||
this.btnToggleState = new System.Windows.Forms.Button();
|
this.btnToggleState = new System.Windows.Forms.Button();
|
||||||
this.labelName = new System.Windows.Forms.Label();
|
this.labelName = new System.Windows.Forms.Label();
|
||||||
this.panelDescription = new System.Windows.Forms.Panel();
|
this.panelDescription = new System.Windows.Forms.Panel();
|
||||||
@@ -31,8 +32,10 @@
|
|||||||
this.flowLayoutInfo = new System.Windows.Forms.FlowLayoutPanel();
|
this.flowLayoutInfo = new System.Windows.Forms.FlowLayoutPanel();
|
||||||
this.labelWebsite = new System.Windows.Forms.Label();
|
this.labelWebsite = new System.Windows.Forms.Label();
|
||||||
this.labelVersion = new System.Windows.Forms.Label();
|
this.labelVersion = new System.Windows.Forms.Label();
|
||||||
this.btnOpenConfig = new System.Windows.Forms.Button();
|
this.btnConfigure = new System.Windows.Forms.Button();
|
||||||
this.labelType = new TweetDuck.Core.Controls.LabelVertical();
|
this.labelType = new TweetDuck.Core.Controls.LabelVertical();
|
||||||
|
this.timerLayout = new System.Windows.Forms.Timer(this.components);
|
||||||
|
this.panelBorder = new System.Windows.Forms.Panel();
|
||||||
this.panelDescription.SuspendLayout();
|
this.panelDescription.SuspendLayout();
|
||||||
this.flowLayoutInfo.SuspendLayout();
|
this.flowLayoutInfo.SuspendLayout();
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
@@ -40,21 +43,24 @@
|
|||||||
// btnToggleState
|
// btnToggleState
|
||||||
//
|
//
|
||||||
this.btnToggleState.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
this.btnToggleState.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||||
this.btnToggleState.Location = new System.Drawing.Point(456, 80);
|
this.btnToggleState.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.btnToggleState.Location = new System.Drawing.Point(451, 59);
|
||||||
this.btnToggleState.Name = "btnToggleState";
|
this.btnToggleState.Name = "btnToggleState";
|
||||||
this.btnToggleState.Size = new System.Drawing.Size(65, 23);
|
this.btnToggleState.Size = new System.Drawing.Size(70, 23);
|
||||||
this.btnToggleState.TabIndex = 5;
|
this.btnToggleState.TabIndex = 6;
|
||||||
this.btnToggleState.Text = "Disable";
|
this.btnToggleState.Text = "Disable";
|
||||||
this.btnToggleState.UseVisualStyleBackColor = true;
|
this.btnToggleState.UseVisualStyleBackColor = true;
|
||||||
this.btnToggleState.Click += new System.EventHandler(this.btnToggleState_Click);
|
this.btnToggleState.Click += new System.EventHandler(this.btnToggleState_Click);
|
||||||
//
|
//
|
||||||
// labelName
|
// labelName
|
||||||
//
|
//
|
||||||
|
this.labelName.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
|
||||||
this.labelName.AutoSize = true;
|
this.labelName.AutoSize = true;
|
||||||
this.labelName.Font = new System.Drawing.Font("Microsoft Sans Serif", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
this.labelName.Font = new System.Drawing.Font("Segoe UI Semibold", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.labelName.Location = new System.Drawing.Point(24, 7);
|
this.labelName.Location = new System.Drawing.Point(0, 0);
|
||||||
|
this.labelName.Margin = new System.Windows.Forms.Padding(0);
|
||||||
this.labelName.Name = "labelName";
|
this.labelName.Name = "labelName";
|
||||||
this.labelName.Size = new System.Drawing.Size(61, 24);
|
this.labelName.Size = new System.Drawing.Size(53, 21);
|
||||||
this.labelName.TabIndex = 0;
|
this.labelName.TabIndex = 0;
|
||||||
this.labelName.Text = "Name";
|
this.labelName.Text = "Name";
|
||||||
this.labelName.UseMnemonic = false;
|
this.labelName.UseMnemonic = false;
|
||||||
@@ -66,10 +72,11 @@
|
|||||||
| System.Windows.Forms.AnchorStyles.Right)));
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
this.panelDescription.AutoScroll = true;
|
this.panelDescription.AutoScroll = true;
|
||||||
this.panelDescription.Controls.Add(this.labelDescription);
|
this.panelDescription.Controls.Add(this.labelDescription);
|
||||||
this.panelDescription.Location = new System.Drawing.Point(28, 35);
|
this.panelDescription.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.panelDescription.Location = new System.Drawing.Point(28, 33);
|
||||||
this.panelDescription.Name = "panelDescription";
|
this.panelDescription.Name = "panelDescription";
|
||||||
this.panelDescription.Size = new System.Drawing.Size(493, 39);
|
this.panelDescription.Size = new System.Drawing.Size(410, 47);
|
||||||
this.panelDescription.TabIndex = 2;
|
this.panelDescription.TabIndex = 4;
|
||||||
this.panelDescription.Resize += new System.EventHandler(this.panelDescription_Resize);
|
this.panelDescription.Resize += new System.EventHandler(this.panelDescription_Resize);
|
||||||
//
|
//
|
||||||
// labelDescription
|
// labelDescription
|
||||||
@@ -80,44 +87,51 @@
|
|||||||
this.labelDescription.Location = new System.Drawing.Point(0, 0);
|
this.labelDescription.Location = new System.Drawing.Point(0, 0);
|
||||||
this.labelDescription.Margin = new System.Windows.Forms.Padding(0);
|
this.labelDescription.Margin = new System.Windows.Forms.Padding(0);
|
||||||
this.labelDescription.Name = "labelDescription";
|
this.labelDescription.Name = "labelDescription";
|
||||||
this.labelDescription.Size = new System.Drawing.Size(13, 39);
|
this.labelDescription.Size = new System.Drawing.Size(14, 45);
|
||||||
this.labelDescription.TabIndex = 0;
|
this.labelDescription.TabIndex = 0;
|
||||||
this.labelDescription.Text = "a\r\nb\r\nc";
|
this.labelDescription.Text = "a\r\nb\r\nc";
|
||||||
this.labelDescription.UseMnemonic = false;
|
this.labelDescription.UseMnemonic = false;
|
||||||
//
|
//
|
||||||
// labelAuthor
|
// labelAuthor
|
||||||
//
|
//
|
||||||
|
this.labelAuthor.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
|
||||||
this.labelAuthor.AutoSize = true;
|
this.labelAuthor.AutoSize = true;
|
||||||
this.labelAuthor.Location = new System.Drawing.Point(3, 0);
|
this.labelAuthor.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.labelAuthor.Margin = new System.Windows.Forms.Padding(3, 0, 32, 0);
|
this.labelAuthor.Location = new System.Drawing.Point(53, 5);
|
||||||
|
this.labelAuthor.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1);
|
||||||
this.labelAuthor.Name = "labelAuthor";
|
this.labelAuthor.Name = "labelAuthor";
|
||||||
this.labelAuthor.Size = new System.Drawing.Size(38, 13);
|
this.labelAuthor.Size = new System.Drawing.Size(44, 15);
|
||||||
this.labelAuthor.TabIndex = 0;
|
this.labelAuthor.TabIndex = 1;
|
||||||
this.labelAuthor.Text = "Author";
|
this.labelAuthor.Text = "Author";
|
||||||
this.labelAuthor.UseMnemonic = false;
|
this.labelAuthor.UseMnemonic = false;
|
||||||
//
|
//
|
||||||
// flowLayoutInfo
|
// flowLayoutInfo
|
||||||
//
|
//
|
||||||
this.flowLayoutInfo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
|
this.flowLayoutInfo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||||
| System.Windows.Forms.AnchorStyles.Right)));
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
|
this.flowLayoutInfo.Controls.Add(this.labelName);
|
||||||
this.flowLayoutInfo.Controls.Add(this.labelAuthor);
|
this.flowLayoutInfo.Controls.Add(this.labelAuthor);
|
||||||
this.flowLayoutInfo.Controls.Add(this.labelWebsite);
|
this.flowLayoutInfo.Controls.Add(this.labelWebsite);
|
||||||
this.flowLayoutInfo.Location = new System.Drawing.Point(28, 85);
|
this.flowLayoutInfo.Location = new System.Drawing.Point(24, 6);
|
||||||
|
this.flowLayoutInfo.Margin = new System.Windows.Forms.Padding(0);
|
||||||
this.flowLayoutInfo.Name = "flowLayoutInfo";
|
this.flowLayoutInfo.Name = "flowLayoutInfo";
|
||||||
this.flowLayoutInfo.Size = new System.Drawing.Size(348, 18);
|
this.flowLayoutInfo.Size = new System.Drawing.Size(414, 21);
|
||||||
this.flowLayoutInfo.TabIndex = 3;
|
this.flowLayoutInfo.TabIndex = 2;
|
||||||
this.flowLayoutInfo.WrapContents = false;
|
this.flowLayoutInfo.WrapContents = false;
|
||||||
//
|
//
|
||||||
// labelWebsite
|
// labelWebsite
|
||||||
//
|
//
|
||||||
|
this.labelWebsite.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
|
||||||
|
this.labelWebsite.AutoEllipsis = true;
|
||||||
this.labelWebsite.AutoSize = true;
|
this.labelWebsite.AutoSize = true;
|
||||||
this.labelWebsite.Cursor = System.Windows.Forms.Cursors.Hand;
|
this.labelWebsite.Cursor = System.Windows.Forms.Cursors.Hand;
|
||||||
this.labelWebsite.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
this.labelWebsite.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.labelWebsite.ForeColor = System.Drawing.Color.Blue;
|
this.labelWebsite.ForeColor = System.Drawing.Color.Blue;
|
||||||
this.labelWebsite.Location = new System.Drawing.Point(76, 0);
|
this.labelWebsite.Location = new System.Drawing.Point(100, 5);
|
||||||
|
this.labelWebsite.Margin = new System.Windows.Forms.Padding(3, 0, 0, 1);
|
||||||
this.labelWebsite.Name = "labelWebsite";
|
this.labelWebsite.Name = "labelWebsite";
|
||||||
this.labelWebsite.Size = new System.Drawing.Size(46, 13);
|
this.labelWebsite.Size = new System.Drawing.Size(49, 15);
|
||||||
this.labelWebsite.TabIndex = 1;
|
this.labelWebsite.TabIndex = 2;
|
||||||
this.labelWebsite.Text = "Website";
|
this.labelWebsite.Text = "Website";
|
||||||
this.labelWebsite.UseMnemonic = false;
|
this.labelWebsite.UseMnemonic = false;
|
||||||
this.labelWebsite.Click += new System.EventHandler(this.labelWebsite_Click);
|
this.labelWebsite.Click += new System.EventHandler(this.labelWebsite_Click);
|
||||||
@@ -126,25 +140,28 @@
|
|||||||
//
|
//
|
||||||
this.labelVersion.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
this.labelVersion.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||||
| System.Windows.Forms.AnchorStyles.Right)));
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
this.labelVersion.Location = new System.Drawing.Point(14, 12);
|
this.labelVersion.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.labelVersion.Margin = new System.Windows.Forms.Padding(3, 9, 3, 0);
|
this.labelVersion.Location = new System.Drawing.Point(88, 6);
|
||||||
|
this.labelVersion.Margin = new System.Windows.Forms.Padding(0, 0, 1, 0);
|
||||||
this.labelVersion.Name = "labelVersion";
|
this.labelVersion.Name = "labelVersion";
|
||||||
this.labelVersion.Size = new System.Drawing.Size(510, 13);
|
this.labelVersion.Padding = new System.Windows.Forms.Padding(0, 0, 0, 3);
|
||||||
this.labelVersion.TabIndex = 1;
|
this.labelVersion.Size = new System.Drawing.Size(436, 21);
|
||||||
|
this.labelVersion.TabIndex = 3;
|
||||||
this.labelVersion.Text = "Version";
|
this.labelVersion.Text = "Version";
|
||||||
this.labelVersion.TextAlign = System.Drawing.ContentAlignment.TopRight;
|
this.labelVersion.TextAlign = System.Drawing.ContentAlignment.BottomRight;
|
||||||
this.labelVersion.UseMnemonic = false;
|
this.labelVersion.UseMnemonic = false;
|
||||||
//
|
//
|
||||||
// btnOpenConfig
|
// btnConfigure
|
||||||
//
|
//
|
||||||
this.btnOpenConfig.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
this.btnConfigure.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||||
this.btnOpenConfig.Location = new System.Drawing.Point(382, 80);
|
this.btnConfigure.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
this.btnOpenConfig.Name = "btnOpenConfig";
|
this.btnConfigure.Location = new System.Drawing.Point(451, 30);
|
||||||
this.btnOpenConfig.Size = new System.Drawing.Size(68, 23);
|
this.btnConfigure.Name = "btnConfigure";
|
||||||
this.btnOpenConfig.TabIndex = 4;
|
this.btnConfigure.Size = new System.Drawing.Size(70, 23);
|
||||||
this.btnOpenConfig.Text = "Configure";
|
this.btnConfigure.TabIndex = 5;
|
||||||
this.btnOpenConfig.UseVisualStyleBackColor = true;
|
this.btnConfigure.Text = "Configure";
|
||||||
this.btnOpenConfig.Click += new System.EventHandler(this.btnOpenConfig_Click);
|
this.btnConfigure.UseVisualStyleBackColor = true;
|
||||||
|
this.btnConfigure.Click += new System.EventHandler(this.btnConfigure_Click);
|
||||||
//
|
//
|
||||||
// labelType
|
// labelType
|
||||||
//
|
//
|
||||||
@@ -152,35 +169,50 @@
|
|||||||
| System.Windows.Forms.AnchorStyles.Left)));
|
| System.Windows.Forms.AnchorStyles.Left)));
|
||||||
this.labelType.BackColor = System.Drawing.Color.DarkGray;
|
this.labelType.BackColor = System.Drawing.Color.DarkGray;
|
||||||
this.labelType.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
this.labelType.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
|
||||||
|
this.labelType.LineHeight = 0;
|
||||||
this.labelType.Location = new System.Drawing.Point(0, 0);
|
this.labelType.Location = new System.Drawing.Point(0, 0);
|
||||||
this.labelType.Name = "labelType";
|
this.labelType.Name = "labelType";
|
||||||
this.labelType.Size = new System.Drawing.Size(18, 109);
|
this.labelType.Size = new System.Drawing.Size(18, 88);
|
||||||
this.labelType.TabIndex = 6;
|
this.labelType.TabIndex = 0;
|
||||||
this.labelType.Text = "TYPE";
|
this.labelType.Text = "TYPE";
|
||||||
//
|
//
|
||||||
|
// timerLayout
|
||||||
|
//
|
||||||
|
this.timerLayout.Interval = 1;
|
||||||
|
this.timerLayout.Tick += new System.EventHandler(this.timerLayout_Tick);
|
||||||
|
//
|
||||||
|
// panelBorder
|
||||||
|
//
|
||||||
|
this.panelBorder.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||||
|
| System.Windows.Forms.AnchorStyles.Left)));
|
||||||
|
this.panelBorder.BackColor = System.Drawing.Color.DimGray;
|
||||||
|
this.panelBorder.Location = new System.Drawing.Point(18, 0);
|
||||||
|
this.panelBorder.Margin = new System.Windows.Forms.Padding(0);
|
||||||
|
this.panelBorder.Name = "panelBorder";
|
||||||
|
this.panelBorder.Size = new System.Drawing.Size(1, 88);
|
||||||
|
this.panelBorder.TabIndex = 1;
|
||||||
|
//
|
||||||
// PluginControl
|
// PluginControl
|
||||||
//
|
//
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
this.Controls.Add(this.labelType);
|
this.Controls.Add(this.labelType);
|
||||||
this.Controls.Add(this.btnOpenConfig);
|
this.Controls.Add(this.btnConfigure);
|
||||||
this.Controls.Add(this.flowLayoutInfo);
|
this.Controls.Add(this.flowLayoutInfo);
|
||||||
|
this.Controls.Add(this.panelBorder);
|
||||||
this.Controls.Add(this.panelDescription);
|
this.Controls.Add(this.panelDescription);
|
||||||
this.Controls.Add(this.labelName);
|
|
||||||
this.Controls.Add(this.btnToggleState);
|
this.Controls.Add(this.btnToggleState);
|
||||||
this.Controls.Add(this.labelVersion);
|
this.Controls.Add(this.labelVersion);
|
||||||
this.Margin = new System.Windows.Forms.Padding(0);
|
this.Margin = new System.Windows.Forms.Padding(0);
|
||||||
this.MaximumSize = new System.Drawing.Size(65535, 109);
|
this.MaximumSize = new System.Drawing.Size(65535, 88);
|
||||||
this.MinimumSize = new System.Drawing.Size(0, 61);
|
|
||||||
this.Name = "PluginControl";
|
this.Name = "PluginControl";
|
||||||
this.Padding = new System.Windows.Forms.Padding(3, 3, 6, 3);
|
this.Padding = new System.Windows.Forms.Padding(3, 3, 6, 3);
|
||||||
this.Size = new System.Drawing.Size(530, 109);
|
this.Size = new System.Drawing.Size(530, 88);
|
||||||
this.panelDescription.ResumeLayout(false);
|
this.panelDescription.ResumeLayout(false);
|
||||||
this.panelDescription.PerformLayout();
|
this.panelDescription.PerformLayout();
|
||||||
this.flowLayoutInfo.ResumeLayout(false);
|
this.flowLayoutInfo.ResumeLayout(false);
|
||||||
this.flowLayoutInfo.PerformLayout();
|
this.flowLayoutInfo.PerformLayout();
|
||||||
this.ResumeLayout(false);
|
this.ResumeLayout(false);
|
||||||
this.PerformLayout();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -194,7 +226,9 @@
|
|||||||
private System.Windows.Forms.FlowLayoutPanel flowLayoutInfo;
|
private System.Windows.Forms.FlowLayoutPanel flowLayoutInfo;
|
||||||
private System.Windows.Forms.Label labelWebsite;
|
private System.Windows.Forms.Label labelWebsite;
|
||||||
private System.Windows.Forms.Label labelVersion;
|
private System.Windows.Forms.Label labelVersion;
|
||||||
private System.Windows.Forms.Button btnOpenConfig;
|
private System.Windows.Forms.Button btnConfigure;
|
||||||
private Core.Controls.LabelVertical labelType;
|
private Core.Controls.LabelVertical labelType;
|
||||||
|
private System.Windows.Forms.Timer timerLayout;
|
||||||
|
private System.Windows.Forms.Panel panelBorder;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Diagnostics;
|
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.IO;
|
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using TweetDuck.Core.Controls;
|
using TweetDuck.Core.Controls;
|
||||||
using TweetDuck.Core.Utils;
|
using TweetDuck.Core.Utils;
|
||||||
@@ -11,8 +9,9 @@ namespace TweetDuck.Plugins.Controls{
|
|||||||
sealed partial class PluginControl : UserControl{
|
sealed partial class PluginControl : UserControl{
|
||||||
private readonly PluginManager pluginManager;
|
private readonly PluginManager pluginManager;
|
||||||
private readonly Plugin plugin;
|
private readonly Plugin plugin;
|
||||||
|
private readonly bool isConfigurable;
|
||||||
|
|
||||||
private readonly float dpiScale;
|
private int nextHeight;
|
||||||
|
|
||||||
public PluginControl(){
|
public PluginControl(){
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
@@ -22,15 +21,21 @@ namespace TweetDuck.Plugins.Controls{
|
|||||||
this.pluginManager = pluginManager;
|
this.pluginManager = pluginManager;
|
||||||
this.plugin = plugin;
|
this.plugin = plugin;
|
||||||
|
|
||||||
this.dpiScale = this.GetDPIScale();
|
this.isConfigurable = pluginManager.IsPluginConfigurable(plugin);
|
||||||
|
|
||||||
|
float dpiScale = this.GetDPIScale();
|
||||||
|
|
||||||
|
if (dpiScale > 1F){
|
||||||
|
Size = MaximumSize = new Size(MaximumSize.Width, MaximumSize.Height+3);
|
||||||
|
}
|
||||||
|
|
||||||
this.labelName.Text = plugin.Name;
|
this.labelName.Text = plugin.Name;
|
||||||
this.labelDescription.Text = plugin.CanRun ? plugin.Description : "This plugin requires TweetDuck "+plugin.RequiredVersion+" or newer.";
|
this.labelDescription.Text = plugin.CanRun ? plugin.Description : $"This plugin requires TweetDuck {plugin.RequiredVersion} or newer.";
|
||||||
this.labelVersion.Text = plugin.Version;
|
this.labelAuthor.Text = string.IsNullOrWhiteSpace(plugin.Author) ? string.Empty : $"by {plugin.Author}";
|
||||||
this.labelAuthor.Text = plugin.Author;
|
|
||||||
this.labelWebsite.Text = plugin.Website;
|
this.labelWebsite.Text = plugin.Website;
|
||||||
|
this.labelVersion.Text = plugin.Version;
|
||||||
|
|
||||||
this.labelType.LineHeight = BrowserUtils.Scale(9, dpiScale);
|
this.labelType.LineHeight = BrowserUtils.Scale(11, dpiScale);
|
||||||
|
|
||||||
UpdatePluginState();
|
UpdatePluginState();
|
||||||
|
|
||||||
@@ -38,16 +43,37 @@ namespace TweetDuck.Plugins.Controls{
|
|||||||
labelDescription.Visible = false;
|
labelDescription.Visible = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
panelDescription_Resize(panelDescription, null);
|
panelDescription_Resize(panelDescription, EventArgs.Empty);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void timerLayout_Tick(object sender, EventArgs e){
|
||||||
|
timerLayout.Stop();
|
||||||
|
Height = nextHeight;
|
||||||
|
ResumeLayout();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void panelDescription_Resize(object sender, EventArgs e){
|
private void panelDescription_Resize(object sender, EventArgs e){
|
||||||
if (labelDescription.Text.Length == 0){
|
SuspendLayout();
|
||||||
Height = MinimumSize.Height;
|
|
||||||
|
int maxWidth = panelDescription.Width-(panelDescription.VerticalScroll.Visible ? SystemInformation.VerticalScrollBarWidth : 0);
|
||||||
|
labelDescription.MaximumSize = new Size(maxWidth, int.MaxValue);
|
||||||
|
|
||||||
|
Font font = labelDescription.Font;
|
||||||
|
int descriptionLines = TextRenderer.MeasureText(labelDescription.Text, font, new Size(maxWidth, int.MaxValue), TextFormatFlags.WordBreak).Height/(font.Height-1);
|
||||||
|
|
||||||
|
int requiredLines = Math.Max(descriptionLines, 1+(string.IsNullOrEmpty(labelVersion.Text) ? 0 : 1)+(isConfigurable ? 1 : 0));
|
||||||
|
|
||||||
|
switch(requiredLines){
|
||||||
|
case 1: nextHeight = MaximumSize.Height-2*(font.Height-1); break;
|
||||||
|
case 2: nextHeight = MaximumSize.Height-(font.Height-1); break;
|
||||||
|
default: nextHeight = MaximumSize.Height; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nextHeight != Height){
|
||||||
|
timerLayout.Start();
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
labelDescription.MaximumSize = new Size(panelDescription.Width-SystemInformation.VerticalScrollBarWidth, 0);
|
ResumeLayout();
|
||||||
Height = Math.Min(MinimumSize.Height+BrowserUtils.Scale(9, dpiScale)+labelDescription.Height, MaximumSize.Height);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -57,8 +83,9 @@ namespace TweetDuck.Plugins.Controls{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnOpenConfig_Click(object sender, EventArgs e){
|
private void btnConfigure_Click(object sender, EventArgs e){
|
||||||
using(Process.Start("explorer.exe", "/select,\""+plugin.ConfigPath.Replace('/', '\\')+"\"")){}
|
pluginManager.ConfigurePlugin(plugin);
|
||||||
|
ParentForm?.Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnToggleState_Click(object sender, EventArgs e){
|
private void btnToggleState_Click(object sender, EventArgs e){
|
||||||
@@ -75,11 +102,11 @@ namespace TweetDuck.Plugins.Controls{
|
|||||||
labelWebsite.ForeColor = isEnabled ? Color.Blue : Color.FromArgb(90, 90, 249);
|
labelWebsite.ForeColor = isEnabled ? Color.Blue : Color.FromArgb(90, 90, 249);
|
||||||
|
|
||||||
if (plugin.Group == PluginGroup.Official){
|
if (plugin.Group == PluginGroup.Official){
|
||||||
labelType.Text = "OFFICIAL";
|
labelType.Text = "CORE";
|
||||||
labelType.BackColor = isEnabled ? Color.FromArgb(154, 195, 217) : Color.FromArgb(185, 185, 185);
|
labelType.BackColor = isEnabled ? Color.FromArgb(154, 195, 217) : Color.FromArgb(185, 185, 185);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
labelType.Text = "CUSTOM";
|
labelType.Text = "USER";
|
||||||
labelType.BackColor = isEnabled ? Color.FromArgb(208, 154, 217) : Color.FromArgb(185, 185, 185);
|
labelType.BackColor = isEnabled ? Color.FromArgb(208, 154, 217) : Color.FromArgb(185, 185, 185);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -87,14 +114,14 @@ namespace TweetDuck.Plugins.Controls{
|
|||||||
labelName.ForeColor = textColor;
|
labelName.ForeColor = textColor;
|
||||||
labelDescription.ForeColor = textColor;
|
labelDescription.ForeColor = textColor;
|
||||||
btnToggleState.Text = isEnabled ? "Disable" : "Enable";
|
btnToggleState.Text = isEnabled ? "Disable" : "Enable";
|
||||||
btnOpenConfig.Visible = plugin.HasConfig;
|
btnConfigure.Visible = isConfigurable;
|
||||||
btnOpenConfig.Enabled = btnOpenConfig.Visible && File.Exists(plugin.ConfigPath);
|
btnConfigure.Enabled = isEnabled;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
labelName.ForeColor = Color.DarkRed;
|
labelName.ForeColor = Color.DarkRed;
|
||||||
labelDescription.ForeColor = Color.DarkRed;
|
labelDescription.ForeColor = Color.DarkRed;
|
||||||
btnToggleState.Visible = false;
|
btnToggleState.Visible = false;
|
||||||
btnOpenConfig.Visible = false;
|
btnConfigure.Visible = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,10 @@ namespace TweetDuck.Plugins.Controls{
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected override void WndProc(ref Message m){
|
protected override void WndProc(ref Message m){
|
||||||
|
if (m.Msg == 0x85){ // WM_NCPAINT
|
||||||
NativeMethods.ShowScrollBar(Handle, NativeMethods.SB_HORZ, false); // basically fuck the horizontal scrollbar very much
|
NativeMethods.ShowScrollBar(Handle, NativeMethods.SB_HORZ, false); // basically fuck the horizontal scrollbar very much
|
||||||
|
}
|
||||||
|
|
||||||
base.WndProc(ref m);
|
base.WndProc(ref m);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics.CodeAnalysis;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
namespace TweetDuck.Plugins.Enums{
|
namespace TweetDuck.Plugins.Enums{
|
||||||
[Flags]
|
[Flags]
|
||||||
@@ -45,5 +48,50 @@ namespace TweetDuck.Plugins.Enums{
|
|||||||
default: return string.Empty;
|
default: return string.Empty;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static IReadOnlyDictionary<PluginEnvironment, T> Map<T>(T forNone, T forBrowser, T forNotification){
|
||||||
|
return new PluginEnvironmentDictionary<T>(forNone, forBrowser, forNotification);
|
||||||
|
}
|
||||||
|
|
||||||
|
[SuppressMessage("ReSharper", "MemberHidesStaticFromOuterClass")]
|
||||||
|
private sealed class PluginEnvironmentDictionary<T> : IReadOnlyDictionary<PluginEnvironment, T>{
|
||||||
|
private const int TotalKeys = 3;
|
||||||
|
|
||||||
|
public IEnumerable<PluginEnvironment> Keys => Enum.GetValues(typeof(PluginEnvironment)).Cast<PluginEnvironment>();
|
||||||
|
public IEnumerable<T> Values => data;
|
||||||
|
public int Count => TotalKeys;
|
||||||
|
|
||||||
|
public T this[PluginEnvironment key] => data[(int)key];
|
||||||
|
|
||||||
|
private readonly T[] data;
|
||||||
|
|
||||||
|
public PluginEnvironmentDictionary(T forNone, T forBrowser, T forNotification){
|
||||||
|
this.data = new T[TotalKeys];
|
||||||
|
this.data[(int)PluginEnvironment.None] = forNone;
|
||||||
|
this.data[(int)PluginEnvironment.Browser] = forBrowser;
|
||||||
|
this.data[(int)PluginEnvironment.Notification] = forNotification;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool ContainsKey(PluginEnvironment key){
|
||||||
|
return key >= 0 && (int)key < TotalKeys;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool TryGetValue(PluginEnvironment key, out T value){
|
||||||
|
if (ContainsKey(key)){
|
||||||
|
value = this[key];
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
value = default(T);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public IEnumerator<KeyValuePair<PluginEnvironment, T>> GetEnumerator(){
|
||||||
|
return Keys.Select(key => new KeyValuePair<PluginEnvironment, T>(key, this[key])).GetEnumerator();
|
||||||
|
}
|
||||||
|
|
||||||
|
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,5 +11,13 @@
|
|||||||
default: return "unknown/";
|
default: return "unknown/";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static string GetIdentifierPrefixShort(this PluginGroup group){
|
||||||
|
switch(group){
|
||||||
|
case PluginGroup.Official: return "o/";
|
||||||
|
case PluginGroup.Custom: return "c/";
|
||||||
|
default: return "?/";
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,28 +1,25 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using TweetDuck.Plugins.Enums;
|
using TweetDuck.Plugins.Enums;
|
||||||
|
|
||||||
namespace TweetDuck.Plugins{
|
namespace TweetDuck.Plugins{
|
||||||
sealed class Plugin{
|
sealed class Plugin{
|
||||||
private const string VersionWildcard = "*";
|
private static readonly Version AppVersion = new Version(Program.VersionTag);
|
||||||
|
|
||||||
public string Identifier { get; }
|
public string Identifier { get; }
|
||||||
public PluginGroup Group { get; }
|
public PluginGroup Group { get; }
|
||||||
public PluginEnvironment Environments { get; }
|
public PluginEnvironment Environments { get; }
|
||||||
|
|
||||||
public string Name => metadata["NAME"];
|
public string Name { get; }
|
||||||
public string Description => metadata["DESCRIPTION"];
|
public string Description { get; }
|
||||||
public string Author => metadata["AUTHOR"];
|
public string Author { get; }
|
||||||
public string Version => metadata["VERSION"];
|
public string Version { get; }
|
||||||
public string Website => metadata["WEBSITE"];
|
public string Website { get; }
|
||||||
public string ConfigFile => metadata["CONFIGFILE"];
|
public string ConfigFile { get; }
|
||||||
public string ConfigDefault => metadata["CONFIGDEFAULT"];
|
public string ConfigDefault { get; }
|
||||||
public string RequiredVersion => metadata["REQUIRES"];
|
public Version RequiredVersion { get; }
|
||||||
|
|
||||||
public bool CanRun { get; private set; }
|
public bool CanRun { get; }
|
||||||
|
|
||||||
public bool HasConfig{
|
public bool HasConfig{
|
||||||
get => ConfigFile.Length > 0 && GetFullPathIfSafe(PluginFolder.Data, ConfigFile).Length > 0;
|
get => ConfigFile.Length > 0 && GetFullPathIfSafe(PluginFolder.Data, ConfigFile).Length > 0;
|
||||||
@@ -42,41 +39,25 @@ namespace TweetDuck.Plugins{
|
|||||||
|
|
||||||
private readonly string pathRoot;
|
private readonly string pathRoot;
|
||||||
private readonly string pathData;
|
private readonly string pathData;
|
||||||
private readonly Dictionary<string, string> metadata = new Dictionary<string, string>(8){
|
|
||||||
{ "NAME", "" },
|
|
||||||
{ "DESCRIPTION", "" },
|
|
||||||
{ "AUTHOR", "(anonymous)" },
|
|
||||||
{ "VERSION", "(unknown)" },
|
|
||||||
{ "WEBSITE", "" },
|
|
||||||
{ "CONFIGFILE", "" },
|
|
||||||
{ "CONFIGDEFAULT", "" },
|
|
||||||
{ "REQUIRES", VersionWildcard }
|
|
||||||
};
|
|
||||||
|
|
||||||
private Plugin(string path, string name, PluginGroup group, PluginEnvironment environments){
|
private Plugin(PluginGroup group, string identifier, string pathRoot, string pathData, Builder builder){
|
||||||
this.pathRoot = path;
|
this.pathRoot = pathRoot;
|
||||||
this.pathData = Path.Combine(Program.PluginDataPath, group.GetIdentifierPrefix(), name);
|
this.pathData = pathData;
|
||||||
|
|
||||||
this.Identifier = group.GetIdentifierPrefix()+name;
|
|
||||||
this.Group = group;
|
this.Group = group;
|
||||||
this.Environments = environments;
|
this.Identifier = identifier;
|
||||||
}
|
this.Environments = builder.Environments;
|
||||||
|
|
||||||
private void OnMetadataLoaded(){
|
this.Name = builder.Name;
|
||||||
CanRun = CheckRequiredVersion(RequiredVersion);
|
this.Description = builder.Description;
|
||||||
|
this.Author = builder.Author;
|
||||||
|
this.Version = builder.Version;
|
||||||
|
this.Website = builder.Website;
|
||||||
|
this.ConfigFile = builder.ConfigFile;
|
||||||
|
this.ConfigDefault = builder.ConfigDefault;
|
||||||
|
this.RequiredVersion = builder.RequiredVersion;
|
||||||
|
|
||||||
string configPath = ConfigPath, defaultConfigPath = DefaultConfigPath;
|
this.CanRun = AppVersion >= RequiredVersion;
|
||||||
|
|
||||||
if (configPath.Length > 0 && defaultConfigPath.Length > 0 && !File.Exists(configPath) && File.Exists(defaultConfigPath)){
|
|
||||||
string dataFolder = GetPluginFolder(PluginFolder.Data);
|
|
||||||
|
|
||||||
try{
|
|
||||||
Directory.CreateDirectory(dataFolder);
|
|
||||||
File.Copy(defaultConfigPath, configPath, false);
|
|
||||||
}catch(Exception e){
|
|
||||||
throw new IOException("Could not generate a configuration file for '"+Identifier+"' plugin: "+e.Message, e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public string GetScriptPath(PluginEnvironment environment){
|
public string GetScriptPath(PluginEnvironment environment){
|
||||||
@@ -132,78 +113,77 @@ namespace TweetDuck.Plugins{
|
|||||||
return obj is Plugin plugin && plugin.Identifier.Equals(Identifier);
|
return obj is Plugin plugin && plugin.Identifier.Equals(Identifier);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Static
|
// Builder
|
||||||
|
|
||||||
private static readonly Version AppVersion = new Version(Program.VersionTag);
|
public sealed class Builder{
|
||||||
private static readonly string[] EndTag = { "[END]" };
|
private static readonly Version DefaultRequiredVersion = new Version(0, 0, 0, 0);
|
||||||
|
|
||||||
public static Plugin CreateFromFolder(string path, PluginGroup group){
|
public string Name { get; set; }
|
||||||
Plugin plugin = new Plugin(path, Path.GetFileName(path), group, LoadEnvironments(path));
|
public string Description { get; set; } = string.Empty;
|
||||||
LoadMetadata(path, plugin);
|
public string Author { get; set; } = "(anonymous)";
|
||||||
return plugin;
|
public string Version { get; set; } = string.Empty;
|
||||||
|
public string Website { get; set; } = string.Empty;
|
||||||
|
public string ConfigFile { get; set; } = string.Empty;
|
||||||
|
public string ConfigDefault { get; set; } = string.Empty;
|
||||||
|
public Version RequiredVersion { get; set; } = DefaultRequiredVersion;
|
||||||
|
|
||||||
|
public PluginEnvironment Environments { get; private set; } = PluginEnvironment.None;
|
||||||
|
|
||||||
|
private readonly PluginGroup group;
|
||||||
|
private readonly string pathRoot;
|
||||||
|
private readonly string pathData;
|
||||||
|
private readonly string identifier;
|
||||||
|
|
||||||
|
public Builder(PluginGroup group, string name, string pathRoot, string pathData){
|
||||||
|
this.group = group;
|
||||||
|
this.pathRoot = pathRoot;
|
||||||
|
this.pathData = pathData;
|
||||||
|
this.identifier = group.GetIdentifierPrefix()+name;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static PluginEnvironment LoadEnvironments(string path){
|
public void AddEnvironment(PluginEnvironment environment){
|
||||||
PluginEnvironment environments = PluginEnvironment.None;
|
this.Environments |= environment;
|
||||||
|
|
||||||
foreach(string file in Directory.EnumerateFiles(path, "*.js", SearchOption.TopDirectoryOnly).Select(Path.GetFileName)){
|
|
||||||
environments |= PluginEnvironmentExtensions.Values.FirstOrDefault(env => file.Equals(env.GetPluginScriptFile(), StringComparison.Ordinal));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (environments == PluginEnvironment.None){
|
public Plugin BuildAndSetup(){
|
||||||
throw new ArgumentException("Plugin has no script files");
|
Plugin plugin = new Plugin(group, identifier, pathRoot, pathData, this);
|
||||||
}
|
|
||||||
|
|
||||||
return environments;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void LoadMetadata(string path, Plugin plugin){
|
|
||||||
string metaFile = Path.Combine(path, ".meta");
|
|
||||||
|
|
||||||
if (!File.Exists(metaFile)){
|
|
||||||
throw new ArgumentException("Missing .meta file");
|
|
||||||
}
|
|
||||||
|
|
||||||
string currentTag = null, currentContents = string.Empty;
|
|
||||||
|
|
||||||
foreach(string line in File.ReadAllLines(metaFile, Encoding.UTF8).Concat(EndTag).Select(line => line.TrimEnd()).Where(line => line.Length > 0)){
|
|
||||||
if (line[0] == '[' && line[line.Length-1] == ']'){
|
|
||||||
if (currentTag != null){
|
|
||||||
plugin.metadata[currentTag] = currentContents;
|
|
||||||
}
|
|
||||||
|
|
||||||
currentTag = line.Substring(1, line.Length-2).ToUpper();
|
|
||||||
currentContents = string.Empty;
|
|
||||||
|
|
||||||
if (line.Equals(EndTag[0])){
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!plugin.metadata.ContainsKey(currentTag)){
|
|
||||||
throw new FormatException("Invalid metadata tag: "+currentTag);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (currentTag != null){
|
|
||||||
currentContents = currentContents.Length == 0 ? line : currentContents+Environment.NewLine+line;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
throw new FormatException("Missing metadata tag before value: "+line);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (plugin.Name.Length == 0){
|
if (plugin.Name.Length == 0){
|
||||||
throw new FormatException("Plugin is missing a name in the .meta file");
|
throw new InvalidOperationException("Plugin is missing a name in the .meta file");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (plugin.RequiredVersion.Length == 0 || !(plugin.RequiredVersion == VersionWildcard || System.Version.TryParse(plugin.RequiredVersion, out Version _))){
|
if (plugin.Environments == PluginEnvironment.None){
|
||||||
throw new FormatException("Plugin contains invalid version: "+plugin.RequiredVersion);
|
throw new InvalidOperationException("Plugin has no script files");
|
||||||
}
|
}
|
||||||
|
|
||||||
plugin.OnMetadataLoaded();
|
if (plugin.Group == PluginGroup.Official){
|
||||||
|
if (plugin.RequiredVersion != AppVersion){
|
||||||
|
throw new InvalidOperationException("Plugin is not supported in this version of TweetDuck, this may indicate a failed update or an unsupported plugin that was not removed automatically");
|
||||||
|
}
|
||||||
|
else if (!string.IsNullOrEmpty(plugin.Version)){
|
||||||
|
throw new InvalidOperationException("Official plugins cannot have a version identifier");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static bool CheckRequiredVersion(string requires){
|
// setup
|
||||||
return requires == VersionWildcard || AppVersion >= new Version(requires);
|
|
||||||
|
string configPath = plugin.ConfigPath, defaultConfigPath = plugin.DefaultConfigPath;
|
||||||
|
|
||||||
|
if (configPath.Length > 0 && defaultConfigPath.Length > 0 && !File.Exists(configPath) && File.Exists(defaultConfigPath)){
|
||||||
|
string dataFolder = plugin.GetPluginFolder(PluginFolder.Data);
|
||||||
|
|
||||||
|
try{
|
||||||
|
Directory.CreateDirectory(dataFolder);
|
||||||
|
File.Copy(defaultConfigPath, configPath, false);
|
||||||
|
}catch(Exception e){
|
||||||
|
throw new IOException($"Could not generate a configuration file for '{plugin.Identifier}' plugin: {e.Message}", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// done
|
||||||
|
|
||||||
|
return plugin;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,14 +15,15 @@ namespace TweetDuck.Plugins{
|
|||||||
|
|
||||||
private readonly PluginManager manager;
|
private readonly PluginManager manager;
|
||||||
private readonly TwoKeyDictionary<int, string, string> fileCache = new TwoKeyDictionary<int, string, string>(4, 2);
|
private readonly TwoKeyDictionary<int, string, string> fileCache = new TwoKeyDictionary<int, string, string>(4, 2);
|
||||||
private readonly TwoKeyDictionary<int, string, InjectedHTML> notificationInjections = new TwoKeyDictionary<int,string,InjectedHTML>(4, 1);
|
private readonly TwoKeyDictionary<int, string, InjectedHTML> notificationInjections = new TwoKeyDictionary<int, string, InjectedHTML>(4, 1);
|
||||||
|
|
||||||
public IEnumerable<InjectedHTML> NotificationInjections => notificationInjections.InnerValues;
|
public IEnumerable<InjectedHTML> NotificationInjections => notificationInjections.InnerValues;
|
||||||
|
public HashSet<Plugin> WithConfigureFunction { get; } = new HashSet<Plugin>();
|
||||||
|
|
||||||
public PluginBridge(PluginManager manager){
|
public PluginBridge(PluginManager manager){
|
||||||
this.manager = manager;
|
this.manager = manager;
|
||||||
this.manager.Reloaded += manager_Reloaded;
|
this.manager.Reloaded += manager_Reloaded;
|
||||||
this.manager.PluginChangedState += manager_PluginChangedState;
|
this.manager.Config.PluginChangedState += Config_PluginChangedState;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Event handlers
|
// Event handlers
|
||||||
@@ -31,7 +32,7 @@ namespace TweetDuck.Plugins{
|
|||||||
fileCache.Clear();
|
fileCache.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void manager_PluginChangedState(object sender, PluginChangedStateEventArgs e){
|
private void Config_PluginChangedState(object sender, PluginChangedStateEventArgs e){
|
||||||
if (!e.IsEnabled){
|
if (!e.IsEnabled){
|
||||||
int token = manager.GetTokenFromPlugin(e.Plugin);
|
int token = manager.GetTokenFromPlugin(e.Plugin);
|
||||||
|
|
||||||
@@ -114,5 +115,13 @@ namespace TweetDuck.Plugins{
|
|||||||
public void InjectIntoNotificationsAfter(int token, string key, string search, string html){
|
public void InjectIntoNotificationsAfter(int token, string key, string search, string html){
|
||||||
notificationInjections[token, key] = new InjectedHTML(InjectedHTML.Position.After, search, html);
|
notificationInjections[token, key] = new InjectedHTML(InjectedHTML.Position.After, search, html);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void SetConfigurable(int token){
|
||||||
|
Plugin plugin = manager.GetPluginFromToken(token);
|
||||||
|
|
||||||
|
if (plugin != null){
|
||||||
|
WithConfigureFunction.Add(plugin);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ using TweetDuck.Plugins.Events;
|
|||||||
|
|
||||||
namespace TweetDuck.Plugins{
|
namespace TweetDuck.Plugins{
|
||||||
sealed class PluginConfig{
|
sealed class PluginConfig{
|
||||||
public event EventHandler<PluginChangedStateEventArgs> InternalPluginChangedState; // should only be accessed from PluginManager
|
public event EventHandler<PluginChangedStateEventArgs> PluginChangedState;
|
||||||
|
|
||||||
public IEnumerable<string> DisabledPlugins => disabled;
|
public IEnumerable<string> DisabledPlugins => disabled;
|
||||||
public bool AnyDisabled => disabled.Count > 0;
|
public bool AnyDisabled => disabled.Count > 0;
|
||||||
@@ -20,7 +20,7 @@ namespace TweetDuck.Plugins{
|
|||||||
|
|
||||||
public void SetEnabled(Plugin plugin, bool enabled){
|
public void SetEnabled(Plugin plugin, bool enabled){
|
||||||
if ((enabled && disabled.Remove(plugin.Identifier)) || (!enabled && disabled.Add(plugin.Identifier))){
|
if ((enabled && disabled.Remove(plugin.Identifier)) || (!enabled && disabled.Add(plugin.Identifier))){
|
||||||
InternalPluginChangedState?.Invoke(this, new PluginChangedStateEventArgs(plugin, enabled));
|
PluginChangedState?.Invoke(this, new PluginChangedStateEventArgs(plugin, enabled));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
70
Plugins/PluginLoader.cs
Normal file
70
Plugins/PluginLoader.cs
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using TweetDuck.Plugins.Enums;
|
||||||
|
|
||||||
|
namespace TweetDuck.Plugins{
|
||||||
|
static class PluginLoader{
|
||||||
|
private static readonly string[] EndTag = { "[END]" };
|
||||||
|
|
||||||
|
public static Plugin FromFolder(string path, PluginGroup group){
|
||||||
|
string name = Path.GetFileName(path);
|
||||||
|
|
||||||
|
if (string.IsNullOrEmpty(name)){
|
||||||
|
throw new ArgumentException("Could not extract directory name from path: "+path);
|
||||||
|
}
|
||||||
|
|
||||||
|
Plugin.Builder builder = new Plugin.Builder(group, name, path, Path.Combine(Program.PluginDataPath, group.GetIdentifierPrefix(), name));
|
||||||
|
|
||||||
|
foreach(string file in Directory.EnumerateFiles(path, "*.js", SearchOption.TopDirectoryOnly).Select(Path.GetFileName)){
|
||||||
|
builder.AddEnvironment(PluginEnvironmentExtensions.Values.FirstOrDefault(env => file.Equals(env.GetPluginScriptFile(), StringComparison.Ordinal)));
|
||||||
|
}
|
||||||
|
|
||||||
|
string metaFile = Path.Combine(path, ".meta");
|
||||||
|
|
||||||
|
if (!File.Exists(metaFile)){
|
||||||
|
throw new ArgumentException("Plugin is missing a .meta file");
|
||||||
|
}
|
||||||
|
|
||||||
|
string currentTag = null, currentContents = string.Empty;
|
||||||
|
|
||||||
|
foreach(string line in File.ReadAllLines(metaFile, Encoding.UTF8).Concat(EndTag).Select(line => line.TrimEnd()).Where(line => line.Length > 0)){
|
||||||
|
if (line[0] == '[' && line[line.Length-1] == ']'){
|
||||||
|
if (currentTag != null){
|
||||||
|
SetProperty(builder, currentTag, currentContents);
|
||||||
|
}
|
||||||
|
|
||||||
|
currentTag = line.Substring(1, line.Length-2).ToUpper();
|
||||||
|
currentContents = string.Empty;
|
||||||
|
|
||||||
|
if (line.Equals(EndTag[0])){
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (currentTag != null){
|
||||||
|
currentContents = currentContents.Length == 0 ? line : currentContents+Environment.NewLine+line;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
throw new FormatException("Missing metadata tag before value: "+line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return builder.BuildAndSetup();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void SetProperty(Plugin.Builder builder, string tag, string value){
|
||||||
|
switch(tag){
|
||||||
|
case "NAME": builder.Name = value; break;
|
||||||
|
case "DESCRIPTION": builder.Description = value; break;
|
||||||
|
case "AUTHOR": builder.Author = value; break;
|
||||||
|
case "VERSION": builder.Version = value; break;
|
||||||
|
case "WEBSITE": builder.Website = value; break;
|
||||||
|
case "CONFIGFILE": builder.ConfigFile = value; break;
|
||||||
|
case "CONFIGDEFAULT": builder.ConfigDefault = value; break;
|
||||||
|
case "REQUIRES": builder.RequiredVersion = Version.TryParse(value, out Version version) ? version : throw new FormatException("Invalid required minimum version: "+value); break;
|
||||||
|
default: throw new FormatException("Invalid metadata tag: "+tag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,51 +1,70 @@
|
|||||||
using CefSharp;
|
using CefSharp;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using TweetDuck.Core.Other.Interfaces;
|
||||||
|
using TweetDuck.Data;
|
||||||
using TweetDuck.Plugins.Enums;
|
using TweetDuck.Plugins.Enums;
|
||||||
using TweetDuck.Plugins.Events;
|
using TweetDuck.Plugins.Events;
|
||||||
using TweetDuck.Resources;
|
using TweetDuck.Resources;
|
||||||
|
|
||||||
namespace TweetDuck.Plugins{
|
namespace TweetDuck.Plugins{
|
||||||
sealed class PluginManager{
|
sealed class PluginManager{
|
||||||
private static readonly Dictionary<PluginEnvironment, string> PluginSetupScripts = new Dictionary<PluginEnvironment, string>(4){
|
private static IReadOnlyDictionary<PluginEnvironment, string> LoadSetupScripts(){
|
||||||
{ PluginEnvironment.None, ScriptLoader.LoadResource("plugins.js") },
|
return PluginEnvironmentExtensions.Map(
|
||||||
{ PluginEnvironment.Browser, ScriptLoader.LoadResource("plugins.browser.js") },
|
ScriptLoader.LoadResource("plugins.js"),
|
||||||
{ PluginEnvironment.Notification, ScriptLoader.LoadResource("plugins.notification.js") }
|
ScriptLoader.LoadResource("plugins.browser.js"),
|
||||||
};
|
ScriptLoader.LoadResource("plugins.notification.js")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static readonly IReadOnlyDictionary<PluginEnvironment, string> PluginSetupScripts = LoadSetupScripts();
|
||||||
|
|
||||||
public string PathOfficialPlugins => Path.Combine(rootPath, "official");
|
public string PathOfficialPlugins => Path.Combine(rootPath, "official");
|
||||||
public string PathCustomPlugins => Path.Combine(rootPath, "user");
|
public string PathCustomPlugins => Path.Combine(rootPath, "user");
|
||||||
|
|
||||||
public IEnumerable<Plugin> Plugins => plugins;
|
public IEnumerable<Plugin> Plugins => plugins;
|
||||||
|
public IEnumerable<InjectedHTML> NotificationInjections => bridge.NotificationInjections;
|
||||||
|
|
||||||
public PluginConfig Config { get; }
|
public PluginConfig Config { get; }
|
||||||
public PluginBridge Bridge { get; }
|
|
||||||
|
|
||||||
public event EventHandler<PluginErrorEventArgs> Reloaded;
|
public event EventHandler<PluginErrorEventArgs> Reloaded;
|
||||||
public event EventHandler<PluginErrorEventArgs> Executed;
|
public event EventHandler<PluginErrorEventArgs> Executed;
|
||||||
public event EventHandler<PluginChangedStateEventArgs> PluginChangedState;
|
|
||||||
|
|
||||||
private readonly string rootPath;
|
private readonly string rootPath;
|
||||||
private readonly string configPath;
|
private readonly string configPath;
|
||||||
|
private readonly PluginBridge bridge;
|
||||||
|
|
||||||
private readonly HashSet<Plugin> plugins = new HashSet<Plugin>();
|
private readonly HashSet<Plugin> plugins = new HashSet<Plugin>();
|
||||||
private readonly Dictionary<int, Plugin> tokens = new Dictionary<int, Plugin>();
|
private readonly Dictionary<int, Plugin> tokens = new Dictionary<int, Plugin>();
|
||||||
private readonly Random rand = new Random();
|
private readonly Random rand = new Random();
|
||||||
|
|
||||||
|
private ITweetDeckBrowser mainBrowser;
|
||||||
|
|
||||||
public PluginManager(string rootPath, string configPath){
|
public PluginManager(string rootPath, string configPath){
|
||||||
this.rootPath = rootPath;
|
this.rootPath = rootPath;
|
||||||
this.configPath = configPath;
|
this.configPath = configPath;
|
||||||
|
|
||||||
this.Config = new PluginConfig();
|
this.Config = new PluginConfig();
|
||||||
this.Bridge = new PluginBridge(this);
|
this.bridge = new PluginBridge(this);
|
||||||
|
|
||||||
Config.Load(configPath);
|
Config.Load(configPath);
|
||||||
Config.InternalPluginChangedState += Config_InternalPluginChangedState;
|
Config.PluginChangedState += Config_PluginChangedState;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Config_InternalPluginChangedState(object sender, PluginChangedStateEventArgs e){
|
public void Register(ITweetDeckBrowser browser, PluginEnvironment environment, bool asMainBrowser = false){
|
||||||
PluginChangedState?.Invoke(this, e);
|
browser.OnFrameLoaded(frame => ExecutePlugins(frame, environment));
|
||||||
|
browser.RegisterBridge("$TDP", bridge);
|
||||||
|
|
||||||
|
if (asMainBrowser){
|
||||||
|
mainBrowser = browser;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Config_PluginChangedState(object sender, PluginChangedStateEventArgs e){
|
||||||
|
mainBrowser?.ExecuteFunction("TDPF_setPluginState", e.Plugin, e.IsEnabled);
|
||||||
Config.Save(configPath);
|
Config.Save(configPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -57,6 +76,24 @@ namespace TweetDuck.Plugins{
|
|||||||
return plugins.Any(plugin => plugin.Environments.HasFlag(environment));
|
return plugins.Any(plugin => plugin.Environments.HasFlag(environment));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool IsPluginConfigurable(Plugin plugin){
|
||||||
|
return plugin.HasConfig || bridge.WithConfigureFunction.Contains(plugin);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ConfigurePlugin(Plugin plugin){
|
||||||
|
if (bridge.WithConfigureFunction.Contains(plugin)){
|
||||||
|
mainBrowser?.ExecuteFunction("TDPF_configurePlugin", plugin);
|
||||||
|
}
|
||||||
|
else if (plugin.HasConfig){
|
||||||
|
if (File.Exists(plugin.ConfigPath)){
|
||||||
|
using(Process.Start("explorer.exe", "/select,\""+plugin.ConfigPath.Replace('/', '\\')+"\"")){}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
using(Process.Start("explorer.exe", '"'+plugin.GetPluginFolder(PluginFolder.Data).Replace('/', '\\')+'"')){}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public int GetTokenFromPlugin(Plugin plugin){
|
public int GetTokenFromPlugin(Plugin plugin){
|
||||||
foreach(KeyValuePair<int, Plugin> kvp in tokens){
|
foreach(KeyValuePair<int, Plugin> kvp in tokens){
|
||||||
if (kvp.Value.Equals(plugin)){
|
if (kvp.Value.Equals(plugin)){
|
||||||
@@ -99,7 +136,7 @@ namespace TweetDuck.Plugins{
|
|||||||
Plugin plugin;
|
Plugin plugin;
|
||||||
|
|
||||||
try{
|
try{
|
||||||
plugin = Plugin.CreateFromFolder(fullDir, group);
|
plugin = PluginLoader.FromFolder(fullDir, group);
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
loadErrors.Add(group.GetIdentifierPrefix()+Path.GetFileName(fullDir)+": "+e.Message);
|
loadErrors.Add(group.GetIdentifierPrefix()+Path.GetFileName(fullDir)+": "+e.Message);
|
||||||
continue;
|
continue;
|
||||||
@@ -115,7 +152,7 @@ namespace TweetDuck.Plugins{
|
|||||||
Reloaded?.Invoke(this, new PluginErrorEventArgs(loadErrors));
|
Reloaded?.Invoke(this, new PluginErrorEventArgs(loadErrors));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ExecutePlugins(IFrame frame, PluginEnvironment environment){
|
private void ExecutePlugins(IFrame frame, PluginEnvironment environment){
|
||||||
if (!HasAnyPlugin(environment)){
|
if (!HasAnyPlugin(environment)){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
55
Program.cs
55
Program.cs
@@ -10,28 +10,28 @@ using TweetDuck.Configuration;
|
|||||||
using TweetDuck.Core;
|
using TweetDuck.Core;
|
||||||
using TweetDuck.Core.Handling.General;
|
using TweetDuck.Core.Handling.General;
|
||||||
using TweetDuck.Core.Other;
|
using TweetDuck.Core.Other;
|
||||||
using TweetDuck.Core.Other.Settings.Export;
|
using TweetDuck.Core.Management;
|
||||||
using TweetDuck.Core.Utils;
|
using TweetDuck.Core.Utils;
|
||||||
using TweetDuck.Data;
|
using TweetDuck.Data;
|
||||||
using TweetDuck.Updates;
|
|
||||||
|
|
||||||
namespace TweetDuck{
|
namespace TweetDuck{
|
||||||
static class Program{
|
static class Program{
|
||||||
public const string BrandName = "TweetDuck";
|
public const string BrandName = "TweetDuck";
|
||||||
public const string Website = "https://tweetduck.chylex.com";
|
public const string Website = "https://tweetduck.chylex.com";
|
||||||
|
|
||||||
public const string VersionTag = "1.11.1";
|
public const string VersionTag = "1.14.3";
|
||||||
|
|
||||||
public static readonly bool IsPortable = File.Exists("makeportable");
|
|
||||||
|
|
||||||
public static readonly string ProgramPath = AppDomain.CurrentDomain.BaseDirectory;
|
public static readonly string ProgramPath = AppDomain.CurrentDomain.BaseDirectory;
|
||||||
public static readonly string StoragePath = IsPortable ? Path.Combine(ProgramPath, "portable", "storage") : GetDataStoragePath();
|
public static readonly bool IsPortable = File.Exists(Path.Combine(ProgramPath, "makeportable"));
|
||||||
|
|
||||||
public static readonly string ScriptPath = Path.Combine(ProgramPath, "scripts");
|
public static readonly string ScriptPath = Path.Combine(ProgramPath, "scripts");
|
||||||
public static readonly string PluginPath = Path.Combine(ProgramPath, "plugins");
|
public static readonly string PluginPath = Path.Combine(ProgramPath, "plugins");
|
||||||
|
|
||||||
|
public static readonly string StoragePath = IsPortable ? Path.Combine(ProgramPath, "portable", "storage") : GetDataStoragePath();
|
||||||
|
|
||||||
public static readonly string PluginDataPath = Path.Combine(StoragePath, "TD_Plugins");
|
public static readonly string PluginDataPath = Path.Combine(StoragePath, "TD_Plugins");
|
||||||
private static readonly string InstallerPath = Path.Combine(StoragePath, "TD_Updates");
|
public static readonly string InstallerPath = Path.Combine(StoragePath, "TD_Updates");
|
||||||
|
private static readonly string CefDataPath = Path.Combine(StoragePath, "TD_Chromium");
|
||||||
|
|
||||||
public static string UserConfigFilePath => Path.Combine(StoragePath, "TD_UserConfig.cfg");
|
public static string UserConfigFilePath => Path.Combine(StoragePath, "TD_UserConfig.cfg");
|
||||||
public static string SystemConfigFilePath => Path.Combine(StoragePath, "TD_SystemConfig.cfg");
|
public static string SystemConfigFilePath => Path.Combine(StoragePath, "TD_SystemConfig.cfg");
|
||||||
@@ -42,7 +42,6 @@ namespace TweetDuck{
|
|||||||
private static string ConsoleLogFilePath => Path.Combine(StoragePath, "TD_Console.txt");
|
private static string ConsoleLogFilePath => Path.Combine(StoragePath, "TD_Console.txt");
|
||||||
|
|
||||||
public static uint WindowRestoreMessage;
|
public static uint WindowRestoreMessage;
|
||||||
public static uint SubProcessMessage;
|
|
||||||
|
|
||||||
private static readonly LockManager LockManager = new LockManager(Path.Combine(StoragePath, ".lock"));
|
private static readonly LockManager LockManager = new LockManager(Path.Combine(StoragePath, ".lock"));
|
||||||
private static bool HasCleanedUp;
|
private static bool HasCleanedUp;
|
||||||
@@ -72,7 +71,6 @@ namespace TweetDuck{
|
|||||||
Cef.EnableHighDPISupport();
|
Cef.EnableHighDPISupport();
|
||||||
|
|
||||||
WindowRestoreMessage = NativeMethods.RegisterWindowMessage("TweetDuckRestore");
|
WindowRestoreMessage = NativeMethods.RegisterWindowMessage("TweetDuckRestore");
|
||||||
SubProcessMessage = NativeMethods.RegisterWindowMessage("TweetDuckSubProcess");
|
|
||||||
|
|
||||||
if (!WindowsUtils.CheckFolderWritePermission(StoragePath)){
|
if (!WindowsUtils.CheckFolderWritePermission(StoragePath)){
|
||||||
FormMessage.Warning("Permission Error", "TweetDuck does not have write permissions to the storage folder: "+StoragePath, FormMessage.OK);
|
FormMessage.Warning("Permission Error", "TweetDuck does not have write permissions to the storage folder: "+StoragePath, FormMessage.OK);
|
||||||
@@ -119,24 +117,26 @@ namespace TweetDuck{
|
|||||||
SystemConfig = SystemConfig.Load(SystemConfigFilePath);
|
SystemConfig = SystemConfig.Load(SystemConfigFilePath);
|
||||||
|
|
||||||
if (Arguments.HasFlag(Arguments.ArgImportCookies)){
|
if (Arguments.HasFlag(Arguments.ArgImportCookies)){
|
||||||
ExportManager.ImportCookies();
|
ProfileManager.ImportCookies();
|
||||||
}
|
}
|
||||||
else if (Arguments.HasFlag(Arguments.ArgDeleteCookies)){
|
else if (Arguments.HasFlag(Arguments.ArgDeleteCookies)){
|
||||||
ExportManager.DeleteCookies();
|
ProfileManager.DeleteCookies();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Arguments.HasFlag(Arguments.ArgUpdated)){
|
if (Arguments.HasFlag(Arguments.ArgUpdated)){
|
||||||
WindowsUtils.TryDeleteFolderWhenAble(InstallerPath, 8000);
|
WindowsUtils.TryDeleteFolderWhenAble(InstallerPath, 8000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BrowserCache.RefreshTimer();
|
||||||
|
|
||||||
CefSharpSettings.WcfEnabled = false;
|
CefSharpSettings.WcfEnabled = false;
|
||||||
|
CefSharpSettings.LegacyJavascriptBindingEnabled = true;
|
||||||
|
|
||||||
CefSettings settings = new CefSettings{
|
CefSettings settings = new CefSettings{
|
||||||
AcceptLanguageList = BrowserUtils.HeaderAcceptLanguage,
|
UserAgent = BrowserUtils.UserAgentChrome,
|
||||||
UserAgent = BrowserUtils.HeaderUserAgent,
|
|
||||||
Locale = Arguments.GetValue(Arguments.ArgLocale, string.Empty),
|
|
||||||
BrowserSubprocessPath = BrandName+".Browser.exe",
|
BrowserSubprocessPath = BrandName+".Browser.exe",
|
||||||
CachePath = StoragePath,
|
CachePath = StoragePath,
|
||||||
|
UserDataPath = CefDataPath,
|
||||||
LogFile = ConsoleLogFilePath,
|
LogFile = ConsoleLogFilePath,
|
||||||
#if !DEBUG
|
#if !DEBUG
|
||||||
LogSeverity = Arguments.HasFlag(Arguments.ArgLogging) ? LogSeverity.Info : LogSeverity.Disable
|
LogSeverity = Arguments.HasFlag(Arguments.ArgLogging) ? LogSeverity.Info : LogSeverity.Disable
|
||||||
@@ -150,20 +150,14 @@ namespace TweetDuck{
|
|||||||
|
|
||||||
Application.ApplicationExit += (sender, args) => ExitCleanup();
|
Application.ApplicationExit += (sender, args) => ExitCleanup();
|
||||||
|
|
||||||
UpdaterSettings updaterSettings = new UpdaterSettings{
|
FormBrowser mainForm = new FormBrowser();
|
||||||
AllowPreReleases = Arguments.HasFlag(Arguments.ArgDebugUpdates),
|
|
||||||
DismissedUpdate = UserConfig.DismissedUpdate,
|
|
||||||
InstallerDownloadFolder = InstallerPath
|
|
||||||
};
|
|
||||||
|
|
||||||
FormBrowser mainForm = new FormBrowser(updaterSettings);
|
|
||||||
Application.Run(mainForm);
|
Application.Run(mainForm);
|
||||||
|
|
||||||
if (mainForm.UpdateInstallerPath != null){
|
if (mainForm.UpdateInstallerPath != null){
|
||||||
ExitCleanup();
|
ExitCleanup();
|
||||||
|
|
||||||
// ProgramPath has a trailing backslash
|
// ProgramPath has a trailing backslash
|
||||||
string updaterArgs = "/SP- /SILENT /CLOSEAPPLICATIONS /UPDATEPATH=\""+ProgramPath+"\" /RUNARGS=\""+Arguments.GetCurrentForInstallerCmd()+"\""+(IsPortable ? " /PORTABLE=1" : "");
|
string updaterArgs = "/SP- /SILENT /FORCECLOSEAPPLICATIONS /UPDATEPATH=\""+ProgramPath+"\" /RUNARGS=\""+Arguments.GetCurrentForInstallerCmd()+"\""+(IsPortable ? " /PORTABLE=1" : "");
|
||||||
bool runElevated = !IsPortable || !WindowsUtils.CheckFolderWritePermission(ProgramPath);
|
bool runElevated = !IsPortable || !WindowsUtils.CheckFolderWritePermission(ProgramPath);
|
||||||
|
|
||||||
if (WindowsUtils.OpenAssociatedProgram(mainForm.UpdateInstallerPath, updaterArgs, runElevated)){
|
if (WindowsUtils.OpenAssociatedProgram(mainForm.UpdateInstallerPath, updaterArgs, runElevated)){
|
||||||
@@ -193,18 +187,6 @@ namespace TweetDuck{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void ResetConfig(){
|
|
||||||
try{
|
|
||||||
File.Delete(UserConfigFilePath);
|
|
||||||
File.Delete(UserConfig.GetBackupFile(UserConfigFilePath));
|
|
||||||
}catch(Exception e){
|
|
||||||
Reporter.HandleException("Configuration Reset Error", "Could not delete configuration files to reset the options.", true, e);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
UserConfig.Reload();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void Restart(params string[] extraArgs){
|
public static void Restart(params string[] extraArgs){
|
||||||
CommandLineArgs args = Arguments.GetCurrentClean();
|
CommandLineArgs args = Arguments.GetCurrentClean();
|
||||||
CommandLineArgs.ReadStringArray('-', extraArgs, args);
|
CommandLineArgs.ReadStringArray('-', extraArgs, args);
|
||||||
@@ -212,14 +194,15 @@ namespace TweetDuck{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void RestartWithArgs(CommandLineArgs args){
|
public static void RestartWithArgs(CommandLineArgs args){
|
||||||
FormBrowser browserForm = Application.OpenForms.OfType<FormBrowser>().FirstOrDefault();
|
FormBrowser browserForm = FormManager.TryFind<FormBrowser>();
|
||||||
if (browserForm == null)return;
|
|
||||||
|
|
||||||
|
if (browserForm != null){
|
||||||
browserForm.ForceClose();
|
browserForm.ForceClose();
|
||||||
|
|
||||||
ExitCleanup();
|
ExitCleanup();
|
||||||
RestartWithArgsInternal(args);
|
RestartWithArgsInternal(args);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static void RestartWithArgsInternal(CommandLineArgs args){
|
private static void RestartWithArgsInternal(CommandLineArgs args){
|
||||||
args.AddFlag(Arguments.ArgRestart);
|
args.AddFlag(Arguments.ArgRestart);
|
||||||
|
|||||||
22
Properties/Resources.Designer.cs
generated
22
Properties/Resources.Designer.cs
generated
@@ -19,7 +19,7 @@ namespace TweetDuck.Properties {
|
|||||||
// class via a tool like ResGen or Visual Studio.
|
// class via a tool like ResGen or Visual Studio.
|
||||||
// To add or remove a member, edit your .ResX file then rerun ResGen
|
// To add or remove a member, edit your .ResX file then rerun ResGen
|
||||||
// with the /str option, or rebuild your VS project.
|
// with the /str option, or rebuild your VS project.
|
||||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
|
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")]
|
||||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||||
internal class Resources {
|
internal class Resources {
|
||||||
@@ -60,6 +60,16 @@ namespace TweetDuck.Properties {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized resource of type System.Byte[].
|
||||||
|
/// </summary>
|
||||||
|
internal static byte[] avatar {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("avatar", resourceCulture);
|
||||||
|
return ((byte[])(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
|
/// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -89,5 +99,15 @@ namespace TweetDuck.Properties {
|
|||||||
return ((System.Drawing.Icon)(obj));
|
return ((System.Drawing.Icon)(obj));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized resource of type System.Byte[].
|
||||||
|
/// </summary>
|
||||||
|
internal static byte[] spinner {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("spinner", resourceCulture);
|
||||||
|
return ((byte[])(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -118,6 +118,9 @@
|
|||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||||
|
<data name="avatar" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\avatar.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
<data name="icon" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<data name="icon" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
<value>..\Resources\icon.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
<value>..\Resources\icon.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -127,4 +130,7 @@
|
|||||||
<data name="icon_tray_new" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<data name="icon_tray_new" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
<value>..\Resources\icon-tray-new.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
<value>..\Resources\icon-tray-new.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="spinner" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\spinner.apng;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
47
README.md
47
README.md
@@ -1,6 +1,6 @@
|
|||||||
# Support
|
# Support
|
||||||
|
|
||||||
[Follow TweetDuck on Twitter](https://twitter.com/TryTweetDuck) | [Support via PayPal](https://paypal.me/chylex) | [Support via Patreon](https://www.patreon.com/chylex)
|
[Follow TweetDuck on Twitter](https://twitter.com/TryMyAwesomeApp) | [Support via PayPal](https://paypal.me/chylex) | [Support via Patreon](https://www.patreon.com/chylex)
|
||||||
|
|
||||||
# Build Instructions
|
# Build Instructions
|
||||||
|
|
||||||
@@ -12,49 +12,44 @@ The program was built using Visual Studio 2017. Before opening the solution, ple
|
|||||||
* **Desktop development with C++**
|
* **Desktop development with C++**
|
||||||
* VC++ 2017 v141 toolset
|
* VC++ 2017 v141 toolset
|
||||||
|
|
||||||
After opening the solution, download the following NuGet packages by right-clicking on the solution and selecting **Restore NuGet Packages**, or manually running these commands in the **Package Manager Console**:
|
After opening the solution, right-click the solution and select **Restore NuGet Packages**, or manually run this command in the **Package Manager Console**:
|
||||||
```
|
```
|
||||||
PM> Install-Package CefSharp.WinForms -Version 57.0.0
|
PM> Install-Package CefSharp.WinForms -Version 66.0.0-CI2629 -Source https://www.myget.org/F/cefsharp/api/v3/index.json
|
||||||
PM> Install-Package Microsoft.VC120.CRT.JetBrains
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Note that some pre-release builds of CefSharp are not available on NuGet. To correctly restore packages in that case, open **Package Manager Settings**, and add `https://www.myget.org/F/cefsharp/api/v3/index.json` to the list of package sources.
|
||||||
|
|
||||||
### Debug
|
### Debug
|
||||||
|
|
||||||
It is recommended to create a separate data folder for debugging, otherwise you will not be able to run TweetDuck while debugging the solution.
|
The `Debug` configuration uses a separate data folder by default (`%LOCALAPPDATA%\TweetDuckDebug`) to avoid affecting an existing installation of TweetDuck. You can modify this by opening **TweetDuck Properties** in Visual Studio, clicking the **Debug** tab, and changing the **Command line arguments** field.
|
||||||
|
|
||||||
To do that, open **TweetDuck Properties**, click the **Debug** tab, make sure your **Configuration** is set to `Active (Debug)` (or just `Debug`), and insert this into the **Command line arguments** field:
|
While debugging, opening the main menu and clicking **Reload browser** automatically rebuilds all resources in the `Resources/Scripts` and `Resources/Plugins` folders. This allows editing HTML/CSS/JS files and applying the changes without restarting the program, but it will cause a short delay between browser reloads.
|
||||||
```
|
|
||||||
-datafolder TweetDuckDebug
|
|
||||||
```
|
|
||||||
|
|
||||||
### Build
|
### Release
|
||||||
|
|
||||||
To make a release build of TweetDuck, open **Batch Build**, tick all `Release` configurations except for the `UnitTest` project (otherwise the build will fail), and click **Rebuild**. Check the status bar to make sure it says **Rebuild All succeeded**; if not, see the [Troubleshooting](#troubleshooting) section.
|
Open **Batch Build**, tick all `Release` configurations with `x86` platform except for the `UnitTest` project, and click **Rebuild**. Check the status bar to make sure it says **Rebuild All succeeded**; if not, see the [Troubleshooting](#troubleshooting) section.
|
||||||
|
|
||||||
After the build succeeds, the `bin/x86/Release` folder will contain files intended for distribution (no debug symbols or other unnecessary files). You may package these files yourself, or see the [Installers](#installers) section for automated installer generation.
|
After the build succeeds, the `bin/x86/Release` folder will contain files intended for distribution (no debug symbols or other unnecessary files). You may package these files yourself, or see the [Installers](#installers) section for automated installer generation.
|
||||||
|
|
||||||
If you decide to release a custom version publicly, please make it clear that it is not an official release of TweetDuck.
|
The `Release` configuration omits debug symbols and other unnecessary files. You can modify this behavior by opening `TweetDuck.csproj`, and editing the `<Target Name="AfterBuild" Condition="$(ConfigurationName) == Release">` section.
|
||||||
|
|
||||||
|
If you decide to publicly release a custom version, please make it clear that it is not an official release of TweetDuck. There are many references to the official website and this repository, especially in the update system, so search for `chylex.com` and `github.com` in all files and replace them appropriately.
|
||||||
|
|
||||||
### Troubleshooting
|
### Troubleshooting
|
||||||
|
|
||||||
There are a few quirks in the build process that may catch you off guard:
|
#### Error: The command (...) exited with code 1
|
||||||
|
- This indicates a failed post-build event, open the **Output** tab for logs
|
||||||
- **Plugin files are not updated automatically**
|
- Determine if there was an IO error from the `rmdir` commands, or whether the error was in the **PostBuild.ps1** script (`Encountered an error while running PostBuild.ps1 on line <xyz>`)
|
||||||
- Since official plugins (`Resources/Plugins`) are not included in the project, Visual Studio will not automatically detect changes in the files
|
- Some files are checked for invalid characters:
|
||||||
- To ensure plugins are updated when testing the app, click **Rebuild Solution** before clicking **Start**
|
|
||||||
- **Error: The command (...) exited with code 1**
|
|
||||||
- If the post-build event fails, open the **Output** tab and look for the cause
|
|
||||||
- Determine if there was an IO error while copying files or modifying folders, or whether the final .ps1 script failed (`Encountered an error while running PostBuild.ps1 on line xyz`)
|
|
||||||
- Some files are checked for invalid characters:
|
|
||||||
- `Resources/Plugins/emoji-keyboard/emoji-ordering.txt` line endings must be LF (line feed); any CR (carriage return) in the file will cause a failed build, and you will need to ensure correct line endings in your text editor
|
- `Resources/Plugins/emoji-keyboard/emoji-ordering.txt` line endings must be LF (line feed); any CR (carriage return) in the file will cause a failed build, and you will need to ensure correct line endings in your text editor
|
||||||
|
|
||||||
### Installers
|
### Installers
|
||||||
|
|
||||||
TweetDuck uses **Inno Setup** to automate the creation of installers. First, download and install [InnoSetup QuickStart Pack](http://www.jrsoftware.org/isdl.php) (non-unicode; editor and encryption support not required) and the [Inno Download Plugin](https://code.google.com/archive/p/inno-download-plugin).
|
TweetDuck uses **Inno Setup** for installers and updates. First, download and install [InnoSetup QuickStart Pack](http://www.jrsoftware.org/isdl.php) (non-unicode; editor and encryption support not required) and the [Inno Download Plugin](https://code.google.com/archive/p/inno-download-plugin).
|
||||||
|
|
||||||
Next, add the Inno Setup installation folder (usually `C:\Program Files (x86)\Inno Setup 5`) into your **PATH** environment variable. You may need to restart File Explorer for the change to take place.
|
Next, add the Inno Setup installation folder (usually `C:\Program Files (x86)\Inno Setup 5`) into your **PATH** environment variable. You may need to restart File Explorer for the change to take place.
|
||||||
|
|
||||||
Now you can generate installers after a build by running `bld/RUN BUILD.bat`. Note that despite the name, this will only package the files, you still need to run the [build](#build) in Visual Studio!
|
Now you can generate installers after a build by running `bld/RUN BUILD.bat`. Note that this will only package the files, you still need to run the [release build](#release) in Visual Studio!
|
||||||
|
|
||||||
After the window closes, three installers will be generated inside the `bld/Output` folder:
|
After the window closes, three installers will be generated inside the `bld/Output` folder:
|
||||||
* **TweetDuck.exe**
|
* **TweetDuck.exe**
|
||||||
@@ -66,8 +61,8 @@ After the window closes, three installers will be generated inside the `bld/Outp
|
|||||||
* This is a portable installer that does not need administrator privileges
|
* This is a portable installer that does not need administrator privileges
|
||||||
* It automatically creates a `makeportable` file in the program folder, which forces TweetDuck to run in portable mode
|
* It automatically creates a `makeportable` file in the program folder, which forces TweetDuck to run in portable mode
|
||||||
|
|
||||||
Note: There is a small chance you will see a resource error when running `RUN BUILD.bat`. If that happens, close the console window (which will terminate all Inno Setup processes and leave corrupted installer files in the output folder), and run it again.
|
#### Notes
|
||||||
|
|
||||||
### Code Notes
|
> There is a small chance running `RUN BUILD.bat` immediately shows a resource error. If that happens, close the console window (which terminates all Inno Setup processes and leaves corrupted installers in the output folder), and run it again.
|
||||||
|
|
||||||
There are many references to the official TweetDuck website and this repository in the code and installers, so if you plan to release your own version, make sure to search for `tweetduck.chylex.com` and `github.com` in the whole repository and replace them appropriately.
|
> Running `RUN BUILD.bat` uses about 400 MB of RAM due to high compression. You can lower this to about 140 MB by opening `gen_full.iss` and `gen_port.iss`, and changing `LZMADictionarySize=15360` to `LZMADictionarySize=4096`.
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user