mirror of
https://github.com/chylex/TweetDuck.git
synced 2025-08-30 02:53:11 +02:00
Fix compiler and IDE warnings for .NET 6
This commit is contained in:
lib
TweetLib.Browser.CEF
Data
Logic
Utils
TweetLib.Browser
Contexts
TweetLib.Communication
Pipe
TweetLib.Core
Features
Systems
TweetLib.Utils
Collections
Dialogs
Globalization
IO
Serialization
Startup
Static
TweetTest.Core
Features
Twitter
TweetTest.Utils
windows
TweetDuck.Browser
TweetDuck.Video
TweetDuck
Application
Browser
Base
CefBrowserComponent.csContextMenuBase.csContextMenuBrowser.csContextMenuNotification.csCustomKeyboardHandler.cs
FormBrowser.csNotification
FormNotificationBase.csFormNotificationExample.csFormNotificationMain.csFormNotificationTweet.cs
TrayIcon.csScreenshot
SoundNotification.csConfiguration
Controls
Dialogs
Management
Plugins
Program.csReporter.csUpdates
Utils
TweetImpl.CefSharp
Adapters
Component
Handlers
@@ -2,7 +2,7 @@ using System;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
|
||||||
namespace TweetLib.Browser.CEF.Data {
|
namespace TweetLib.Browser.CEF.Data {
|
||||||
abstract class ContextMenuActionRegistry<T> {
|
abstract class ContextMenuActionRegistry<T> where T : notnull {
|
||||||
private readonly Dictionary<T, Action> actions = new ();
|
private readonly Dictionary<T, Action> actions = new ();
|
||||||
|
|
||||||
protected abstract T NextId(int n);
|
protected abstract T NextId(int n);
|
||||||
|
@@ -21,7 +21,7 @@ namespace TweetLib.Browser.CEF.Data {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void Register(string url, Func<TResourceHandler> factory) {
|
private void Register(string url, Func<TResourceHandler> factory) {
|
||||||
if (!Uri.TryCreate(url, UriKind.Absolute, out Uri uri)) {
|
if (!Uri.TryCreate(url, UriKind.Absolute, out var uri)) {
|
||||||
throw new ArgumentException("Resource handler URL must be absolute!");
|
throw new ArgumentException("Resource handler URL must be absolute!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -9,7 +9,7 @@ namespace TweetLib.Browser.CEF.Logic {
|
|||||||
|
|
||||||
int pipe = text.IndexOf('|');
|
int pipe = text.IndexOf('|');
|
||||||
if (pipe != -1) {
|
if (pipe != -1) {
|
||||||
type = text.Substring(0, pipe) switch {
|
type = text[..pipe] switch {
|
||||||
"error" => MessageDialogType.Error,
|
"error" => MessageDialogType.Error,
|
||||||
"warning" => MessageDialogType.Warning,
|
"warning" => MessageDialogType.Warning,
|
||||||
"info" => MessageDialogType.Information,
|
"info" => MessageDialogType.Information,
|
||||||
@@ -18,7 +18,7 @@ namespace TweetLib.Browser.CEF.Logic {
|
|||||||
};
|
};
|
||||||
|
|
||||||
if (type != MessageDialogType.None) {
|
if (type != MessageDialogType.None) {
|
||||||
text = text.Substring(pipe + 1);
|
text = text[(pipe + 1)..];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -8,7 +8,7 @@ namespace TweetLib.Browser.CEF.Utils {
|
|||||||
return Path.Combine(storagePath, "Cache");
|
return Path.Combine(storagePath, "Cache");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static CommandLineArgs ParseCommandLineArguments(string argumentString) {
|
public static CommandLineArgs ParseCommandLineArguments(string? argumentString) {
|
||||||
CommandLineArgs args = new CommandLineArgs();
|
CommandLineArgs args = new CommandLineArgs();
|
||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(argumentString)) {
|
if (string.IsNullOrWhiteSpace(argumentString)) {
|
||||||
@@ -26,8 +26,8 @@ namespace TweetLib.Browser.CEF.Utils {
|
|||||||
value = "1";
|
value = "1";
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
key = matchValue.Substring(0, indexEquals).TrimStart('-');
|
key = matchValue[..indexEquals].TrimStart('-');
|
||||||
value = matchValue.Substring(indexEquals + 1).Trim('"');
|
value = matchValue[(indexEquals + 1)..].Trim('"');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (key.Length != 0) {
|
if (key.Length != 0) {
|
||||||
|
@@ -1,9 +1,9 @@
|
|||||||
namespace TweetLib.Browser.Contexts {
|
namespace TweetLib.Browser.Contexts {
|
||||||
public struct Notification {
|
public struct Notification {
|
||||||
public string TweetUrl { get; }
|
public string? TweetUrl { get; }
|
||||||
public string? QuoteUrl { get; }
|
public string? QuoteUrl { get; }
|
||||||
|
|
||||||
public Notification(string tweetUrl, string? quoteUrl) {
|
public Notification(string? tweetUrl, string? quoteUrl) {
|
||||||
TweetUrl = tweetUrl;
|
TweetUrl = tweetUrl;
|
||||||
QuoteUrl = quoteUrl;
|
QuoteUrl = quoteUrl;
|
||||||
}
|
}
|
||||||
|
@@ -13,13 +13,11 @@ namespace TweetLib.Communication.Pipe {
|
|||||||
|
|
||||||
public static Client CreateClient(string token) {
|
public static Client CreateClient(string token) {
|
||||||
int space = token.IndexOf(' ');
|
int space = token.IndexOf(' ');
|
||||||
return new Client(token.Substring(0, space), token.Substring(space + 1));
|
return new Client(token[..space], token[(space + 1)..]);
|
||||||
}
|
}
|
||||||
|
|
||||||
private readonly PipeStream pipeIn;
|
private readonly PipeStream pipeIn;
|
||||||
private readonly PipeStream pipeOut;
|
private readonly PipeStream pipeOut;
|
||||||
|
|
||||||
private readonly Thread readerThread;
|
|
||||||
private readonly StreamWriter writerStream;
|
private readonly StreamWriter writerStream;
|
||||||
|
|
||||||
public event EventHandler<PipeReadEventArgs>? DataIn;
|
public event EventHandler<PipeReadEventArgs>? DataIn;
|
||||||
@@ -27,13 +25,9 @@ namespace TweetLib.Communication.Pipe {
|
|||||||
private DuplexPipe(PipeStream pipeIn, PipeStream pipeOut) {
|
private DuplexPipe(PipeStream pipeIn, PipeStream pipeOut) {
|
||||||
this.pipeIn = pipeIn;
|
this.pipeIn = pipeIn;
|
||||||
this.pipeOut = pipeOut;
|
this.pipeOut = pipeOut;
|
||||||
|
|
||||||
this.readerThread = new Thread(ReaderThread) {
|
|
||||||
IsBackground = true
|
|
||||||
};
|
|
||||||
|
|
||||||
this.readerThread.Start();
|
|
||||||
this.writerStream = new StreamWriter(this.pipeOut);
|
this.writerStream = new StreamWriter(this.pipeOut);
|
||||||
|
|
||||||
|
new Thread(ReaderThread) { IsBackground = true }.Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ReaderThread() {
|
private void ReaderThread() {
|
||||||
@@ -95,8 +89,8 @@ namespace TweetLib.Communication.Pipe {
|
|||||||
Data = string.Empty;
|
Data = string.Empty;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Key = line.Substring(0, separatorIndex);
|
Key = line[..separatorIndex];
|
||||||
Data = line.Substring(separatorIndex + 1);
|
Data = line[(separatorIndex + 1)..];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -34,7 +34,7 @@ namespace TweetLib.Core.Features {
|
|||||||
if (resourceType is ResourceType.Script or ResourceType.Stylesheet && TweetDeckHashes.Count > 0) {
|
if (resourceType is ResourceType.Script or ResourceType.Stylesheet && TweetDeckHashes.Count > 0) {
|
||||||
Match match = TweetDeckResourceUrl.Match(url);
|
Match match = TweetDeckResourceUrl.Match(url);
|
||||||
|
|
||||||
if (match.Success && TweetDeckHashes.TryGetValue($"{match.Groups[1]}.{match.Groups[3]}", out string hash)) {
|
if (match.Success && TweetDeckHashes.TryGetValue($"{match.Groups[1]}.{match.Groups[3]}", out var hash)) {
|
||||||
if (match.Groups[2].Value == hash) {
|
if (match.Groups[2].Value == hash) {
|
||||||
App.Logger.Debug("[RequestHandlerBase] Accepting " + url);
|
App.Logger.Debug("[RequestHandlerBase] Accepting " + url);
|
||||||
}
|
}
|
||||||
|
@@ -84,7 +84,7 @@ namespace TweetLib.Core.Features {
|
|||||||
var settings = new SaveFileDialogSettings {
|
var settings = new SaveFileDialogSettings {
|
||||||
DialogTitle = oneImage ? "Save Image" : "Save Images",
|
DialogTitle = oneImage ? "Save Image" : "Save Images",
|
||||||
OverwritePrompt = oneImage,
|
OverwritePrompt = oneImage,
|
||||||
FileName = qualityIndex == -1 ? filename : $"{author} {Path.ChangeExtension(filename, null)} {firstImageLink.Substring(qualityIndex + 1)}".Trim() + ext,
|
FileName = qualityIndex == -1 ? filename : $"{author} {Path.ChangeExtension(filename, null)} {firstImageLink[(qualityIndex + 1)..]}".Trim() + ext,
|
||||||
Filters = new [] { new FileDialogFilter(oneImage ? "Image" : "Images", string.IsNullOrEmpty(ext) ? Array.Empty<string>() : new [] { ext }) }
|
Filters = new [] { new FileDialogFilter(oneImage ? "Image" : "Images", string.IsNullOrEmpty(ext) ? Array.Empty<string>() : new [] { ext }) }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -56,7 +56,9 @@ namespace TweetLib.Core.Features.Notifications {
|
|||||||
menu.AddSeparator();
|
menu.AddSeparator();
|
||||||
|
|
||||||
if (context.Notification is {} notification) {
|
if (context.Notification is {} notification) {
|
||||||
AddCopyAction(menu, "Copy tweet address", notification.TweetUrl);
|
if (!string.IsNullOrEmpty(notification.TweetUrl)) {
|
||||||
|
AddCopyAction(menu, "Copy tweet address", notification.TweetUrl);
|
||||||
|
}
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(notification.QuoteUrl)) {
|
if (!string.IsNullOrEmpty(notification.QuoteUrl)) {
|
||||||
AddCopyAction(menu, "Copy quoted tweet address", notification.QuoteUrl!);
|
AddCopyAction(menu, "Copy quoted tweet address", notification.QuoteUrl!);
|
||||||
@@ -72,7 +74,7 @@ namespace TweetLib.Core.Features.Notifications {
|
|||||||
this.browserComponent.PageLoadEnd -= BrowserComponentOnPageLoadEnd;
|
this.browserComponent.PageLoadEnd -= BrowserComponentOnPageLoadEnd;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void BrowserComponentOnPageLoadEnd(object sender, PageLoadEventArgs e) {
|
private void BrowserComponentOnPageLoadEnd(object? sender, PageLoadEventArgs e) {
|
||||||
string url = e.Url;
|
string url = e.Url;
|
||||||
|
|
||||||
if (TwitterUrls.IsTweetDeck(url) && url != BlankURL) {
|
if (TwitterUrls.IsTweetDeck(url) && url != BlankURL) {
|
||||||
|
@@ -93,7 +93,7 @@ namespace TweetLib.Core.Features.Plugins {
|
|||||||
return Identifier.GetHashCode();
|
return Identifier.GetHashCode();
|
||||||
}
|
}
|
||||||
|
|
||||||
public override bool Equals(object obj) {
|
public override bool Equals(object? obj) {
|
||||||
return obj is Plugin plugin && plugin.Identifier.Equals(Identifier);
|
return obj is Plugin plugin && plugin.Identifier.Equals(Identifier);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -48,17 +48,17 @@ namespace TweetLib.Core.Features.Plugins {
|
|||||||
}
|
}
|
||||||
|
|
||||||
internal Plugin? GetPluginFromToken(int token) {
|
internal Plugin? GetPluginFromToken(int token) {
|
||||||
return tokens.TryGetValue(token, out Plugin plugin) ? plugin : null;
|
return tokens.TryGetValue(token, out var plugin) ? plugin : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Event handlers
|
// Event handlers
|
||||||
|
|
||||||
private void manager_Reloaded(object sender, PluginErrorEventArgs e) {
|
private void manager_Reloaded(object? sender, PluginErrorEventArgs e) {
|
||||||
tokens.Clear();
|
tokens.Clear();
|
||||||
fileCache.Clear();
|
fileCache.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Config_PluginChangedState(object sender, PluginChangedStateEventArgs e) {
|
private void Config_PluginChangedState(object? sender, PluginChangedStateEventArgs e) {
|
||||||
if (!e.IsEnabled) {
|
if (!e.IsEnabled) {
|
||||||
int token = GetTokenFromPlugin(e.Plugin);
|
int token = GetTokenFromPlugin(e.Plugin);
|
||||||
|
|
||||||
@@ -88,7 +88,7 @@ namespace TweetLib.Core.Features.Plugins {
|
|||||||
private string ReadFileUnsafe(int token, PluginFolder folder, string path, bool readCached) {
|
private string ReadFileUnsafe(int token, PluginFolder folder, string path, bool readCached) {
|
||||||
string fullPath = GetFullPathOrThrow(token, folder, path);
|
string fullPath = GetFullPathOrThrow(token, folder, path);
|
||||||
|
|
||||||
if (readCached && fileCache.TryGetValue(token, folder, path, out string cachedContents)) {
|
if (readCached && fileCache.TryGetValue(token, folder, path, out var cachedContents)) {
|
||||||
return cachedContents;
|
return cachedContents;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -161,7 +161,7 @@ namespace TweetLib.Core.Features.Plugins {
|
|||||||
cache.Clear();
|
cache.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool TryGetValue(int token, PluginFolder folder, string path, out string contents) {
|
public bool TryGetValue(int token, PluginFolder folder, string path, [MaybeNullWhen(false)] out string contents) {
|
||||||
return cache.TryGetValue(token, Key(folder, path), out contents);
|
return cache.TryGetValue(token, Key(folder, path), out contents);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -41,7 +41,7 @@ namespace TweetLib.Core.Features.Plugins {
|
|||||||
private static Plugin FromFolder(string name, string pathRoot, string pathData, PluginGroup group) {
|
private static Plugin FromFolder(string name, string pathRoot, string pathData, PluginGroup group) {
|
||||||
Plugin.Builder builder = new Plugin.Builder(group, name, pathRoot, pathData);
|
Plugin.Builder builder = new Plugin.Builder(group, name, pathRoot, pathData);
|
||||||
|
|
||||||
foreach (var environment in Directory.EnumerateFiles(pathRoot, "*.js", SearchOption.TopDirectoryOnly).Select(Path.GetFileName).Select(EnvironmentFromFileName)) {
|
foreach (var environment in Directory.EnumerateFiles(pathRoot, "*.js", SearchOption.TopDirectoryOnly).Select(Path.GetFileName).Select(EnvironmentFromFileName!)) {
|
||||||
builder.AddEnvironment(environment);
|
builder.AddEnvironment(environment);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -55,7 +55,7 @@ namespace TweetLib.Core.Features.Plugins {
|
|||||||
string currentContents = string.Empty;
|
string currentContents = string.Empty;
|
||||||
|
|
||||||
foreach (string line in File.ReadAllLines(metaFile, Encoding.UTF8).Concat(EndTag).Select(static line => line.TrimEnd()).Where(static line => line.Length > 0)) {
|
foreach (string line in File.ReadAllLines(metaFile, Encoding.UTF8).Concat(EndTag).Select(static line => line.TrimEnd()).Where(static line => line.Length > 0)) {
|
||||||
if (line[0] == '[' && line[line.Length - 1] == ']') {
|
if (line[0] == '[' && line[^1] == ']') {
|
||||||
if (currentTag != null) {
|
if (currentTag != null) {
|
||||||
SetProperty(builder, currentTag, currentContents);
|
SetProperty(builder, currentTag, currentContents);
|
||||||
}
|
}
|
||||||
@@ -106,7 +106,7 @@ namespace TweetLib.Core.Features.Plugins {
|
|||||||
builder.ConfigDefault = value;
|
builder.ConfigDefault = value;
|
||||||
break;
|
break;
|
||||||
case "REQUIRES":
|
case "REQUIRES":
|
||||||
builder.RequiredVersion = Version.TryParse(value, out Version version) ? version : throw new FormatException($"Invalid required minimum version: {value}");
|
builder.RequiredVersion = Version.TryParse(value, out var version) ? version : throw new FormatException($"Invalid required minimum version: {value}");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw new FormatException($"Invalid metadata tag: {tag}");
|
throw new FormatException($"Invalid metadata tag: {tag}");
|
||||||
|
@@ -102,7 +102,7 @@ namespace TweetLib.Core.Features.Plugins {
|
|||||||
Executed?.Invoke(this, new PluginErrorEventArgs(errors));
|
Executed?.Invoke(this, new PluginErrorEventArgs(errors));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Config_PluginChangedState(object sender, PluginChangedStateEventArgs e) {
|
private void Config_PluginChangedState(object? sender, PluginChangedStateEventArgs e) {
|
||||||
browserExecutor?.RunFunction("TDPF_setPluginState", e.Plugin, e.IsEnabled);
|
browserExecutor?.RunFunction("TDPF_setPluginState", e.Plugin, e.IsEnabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -71,12 +71,12 @@ namespace TweetLib.Core.Features.TweetDeck {
|
|||||||
App.UserConfiguration.SoundNotificationChanged -= UserConfiguration_SoundNotificationChanged;
|
App.UserConfiguration.SoundNotificationChanged -= UserConfiguration_SoundNotificationChanged;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void browserComponent_BrowserLoaded(object sender, BrowserLoadedEventArgs e) {
|
private void browserComponent_BrowserLoaded(object? sender, BrowserLoadedEventArgs e) {
|
||||||
e.AddDictionaryWords("tweetdeck", "TweetDeck", "tweetduck", "TweetDuck", "TD");
|
e.AddDictionaryWords("tweetdeck", "TweetDeck", "tweetduck", "TweetDuck", "TD");
|
||||||
isBrowserReady = true;
|
isBrowserReady = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void browserComponent_PageLoadStart(object sender, PageLoadEventArgs e) {
|
private void browserComponent_PageLoadStart(object? sender, PageLoadEventArgs e) {
|
||||||
string url = e.Url;
|
string url = e.Url;
|
||||||
|
|
||||||
if (TwitterUrls.IsTweetDeck(url) || (TwitterUrls.IsTwitter(url) && !TwitterUrls.IsTwitterLogin2Factor(url))) {
|
if (TwitterUrls.IsTweetDeck(url) || (TwitterUrls.IsTwitter(url) && !TwitterUrls.IsTwitterLogin2Factor(url))) {
|
||||||
@@ -84,7 +84,7 @@ namespace TweetLib.Core.Features.TweetDeck {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void browserComponent_PageLoadEnd(object sender, PageLoadEventArgs e) {
|
private void browserComponent_PageLoadEnd(object? sender, PageLoadEventArgs e) {
|
||||||
string url = e.Url;
|
string url = e.Url;
|
||||||
|
|
||||||
if (TwitterUrls.IsTweetDeck(url)) {
|
if (TwitterUrls.IsTweetDeck(url)) {
|
||||||
@@ -105,7 +105,7 @@ namespace TweetLib.Core.Features.TweetDeck {
|
|||||||
browserComponent.RunBootstrap("update");
|
browserComponent.RunBootstrap("update");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void pluginManager_Reloaded(object sender, PluginErrorEventArgs e) {
|
private void pluginManager_Reloaded(object? sender, PluginErrorEventArgs e) {
|
||||||
if (e.HasErrors) {
|
if (e.HasErrors) {
|
||||||
App.MessageDialogs.Error("Error Loading Plugins", "The following plugins will not be available until the issues are resolved:\n\n" + string.Join("\n\n", e.Errors));
|
App.MessageDialogs.Error("Error Loading Plugins", "The following plugins will not be available until the issues are resolved:\n\n" + string.Join("\n\n", e.Errors));
|
||||||
}
|
}
|
||||||
@@ -115,14 +115,14 @@ namespace TweetLib.Core.Features.TweetDeck {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void pluginManager_Executed(object sender, PluginErrorEventArgs e) {
|
private void pluginManager_Executed(object? sender, PluginErrorEventArgs e) {
|
||||||
if (e.HasErrors) {
|
if (e.HasErrors) {
|
||||||
App.MessageDialogs.Error("Error Executing Plugins", "Failed to execute the following plugins:\n\n" + string.Join("\n\n", e.Errors));
|
App.MessageDialogs.Error("Error Executing Plugins", "Failed to execute the following plugins:\n\n" + string.Join("\n\n", e.Errors));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateChecker_CheckFinished(object sender, UpdateCheckEventArgs e) {
|
private void updateChecker_CheckFinished(object? sender, UpdateCheckEventArgs e) {
|
||||||
var updateChecker = (UpdateChecker) sender;
|
var updateChecker = (UpdateChecker) sender!;
|
||||||
|
|
||||||
e.Result.Handle(update => {
|
e.Result.Handle(update => {
|
||||||
string tag = update.VersionTag;
|
string tag = update.VersionTag;
|
||||||
@@ -144,7 +144,7 @@ namespace TweetLib.Core.Features.TweetDeck {
|
|||||||
ignoreUpdateCheckError = true;
|
ignoreUpdateCheckError = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UserConfiguration_GeneralEventHandler(object sender, EventArgs e) {
|
private void UserConfiguration_GeneralEventHandler(object? sender, EventArgs e) {
|
||||||
UpdatePropertyObject();
|
UpdatePropertyObject();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -24,15 +24,15 @@ namespace TweetLib.Core.Features.TweetDeck {
|
|||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case "link":
|
case "link":
|
||||||
Link = new Link(url!, url!);
|
Link = new Link(url, url);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "image":
|
case "image":
|
||||||
Media = new Media(Type.Image, TwitterUrls.GetMediaLink(url!, App.UserConfiguration.TwitterImageQuality));
|
Media = new Media(Type.Image, TwitterUrls.GetMediaLink(url, App.UserConfiguration.TwitterImageQuality));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "video":
|
case "video":
|
||||||
Media = new Media(Type.Video, url!);
|
Media = new Media(Type.Video, url);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -57,7 +57,7 @@ namespace TweetLib.Core.Features.Twitter {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
string originalUrl = url.Substring(0, question);
|
string originalUrl = url[..question];
|
||||||
|
|
||||||
obj = new ImageUrl(Path.HasExtension(originalUrl) ? originalUrl : originalUrl + imageExtension, imageQuality);
|
obj = new ImageUrl(Path.HasExtension(originalUrl) ? originalUrl : originalUrl + imageExtension, imageQuality);
|
||||||
return true;
|
return true;
|
||||||
|
@@ -49,11 +49,11 @@ namespace TweetLib.Core.Features.Twitter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static UrlType Check(string url) {
|
public static UrlType Check(string url) {
|
||||||
if (url.Contains("\"")) {
|
if (url.Contains('"')) {
|
||||||
return UrlType.Invalid;
|
return UrlType.Invalid;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Uri.TryCreate(url, UriKind.Absolute, out Uri uri)) {
|
if (Uri.TryCreate(url, UriKind.Absolute, out var uri)) {
|
||||||
string scheme = uri.Scheme;
|
string scheme = uri.Scheme;
|
||||||
|
|
||||||
if (scheme == Uri.UriSchemeHttps || scheme == Uri.UriSchemeHttp || scheme == Uri.UriSchemeFtp || scheme == Uri.UriSchemeMailto) {
|
if (scheme == Uri.UriSchemeHttps || scheme == Uri.UriSchemeHttp || scheme == Uri.UriSchemeFtp || scheme == Uri.UriSchemeMailto) {
|
||||||
|
@@ -16,7 +16,7 @@ namespace TweetLib.Core.Systems.Configuration {
|
|||||||
ConverterRegistry.Register(typeof(WindowState), new BasicTypeConverter<WindowState> {
|
ConverterRegistry.Register(typeof(WindowState), new BasicTypeConverter<WindowState> {
|
||||||
ConvertToString = static value => $"{(value.IsMaximized ? 'M' : '_')}{value.Bounds.X} {value.Bounds.Y} {value.Bounds.Width} {value.Bounds.Height}",
|
ConvertToString = static value => $"{(value.IsMaximized ? 'M' : '_')}{value.Bounds.X} {value.Bounds.Y} {value.Bounds.Width} {value.Bounds.Height}",
|
||||||
ConvertToObject = static value => {
|
ConvertToObject = static value => {
|
||||||
int[] elements = StringUtils.ParseInts(value.Substring(1), ' ');
|
int[] elements = StringUtils.ParseInts(value[1..], ' ');
|
||||||
|
|
||||||
return new WindowState {
|
return new WindowState {
|
||||||
Bounds = new Rectangle(elements[0], elements[1], elements[2], elements[3]),
|
Bounds = new Rectangle(elements[0], elements[1], elements[2], elements[3]),
|
||||||
|
@@ -43,7 +43,7 @@ namespace TweetLib.Core.Systems.Logging {
|
|||||||
build.Append("Please, report all issues to: ").Append(Lib.IssueTrackerUrl).Append("\r\n\r\n");
|
build.Append("Please, report all issues to: ").Append(Lib.IssueTrackerUrl).Append("\r\n\r\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
build.Append("[").Append(DateTime.Now.ToString("G", Lib.Culture)).Append("] ").Append(level).Append("\r\n");
|
build.Append('[').Append(DateTime.Now.ToString("G", Lib.Culture)).Append("] ").Append(level).Append("\r\n");
|
||||||
build.Append(message).Append("\r\n\r\n");
|
build.Append(message).Append("\r\n\r\n");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
@@ -37,7 +37,7 @@ namespace TweetLib.Core.Systems.Updates {
|
|||||||
InteractionManager.Dispose();
|
InteractionManager.Dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void timer_Elapsed(object sender, ElapsedEventArgs e) {
|
private void timer_Elapsed(object? sender, ElapsedEventArgs e) {
|
||||||
Check(false);
|
Check(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -26,7 +26,7 @@ namespace TweetLib.Core.Systems.Updates {
|
|||||||
nextUpdate = null;
|
nextUpdate = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updates_CheckFinished(object sender, UpdateCheckEventArgs e) {
|
private void updates_CheckFinished(object? sender, UpdateCheckEventArgs e) {
|
||||||
UpdateInfo? foundUpdate = e.Result.HasValue ? e.Result.Value : null;
|
UpdateInfo? foundUpdate = e.Result.HasValue ? e.Result.Value : null;
|
||||||
|
|
||||||
if (nextUpdate != null && !nextUpdate.Equals(foundUpdate)) {
|
if (nextUpdate != null && !nextUpdate.Equals(foundUpdate)) {
|
||||||
|
@@ -57,7 +57,7 @@ namespace TweetLib.Utils.Collections {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public string? GetValue(string key) {
|
public string? GetValue(string key) {
|
||||||
return values.TryGetValue(key.ToLower(), out string val) ? val : null;
|
return values.TryGetValue(key.ToLower(), out var val) ? val : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RemoveValue(string key) {
|
public void RemoveValue(string key) {
|
||||||
|
@@ -11,7 +11,7 @@ namespace TweetLib.Utils.Collections {
|
|||||||
/// <typeparam name="V">The type of the values.</typeparam>
|
/// <typeparam name="V">The type of the values.</typeparam>
|
||||||
[SuppressMessage("ReSharper", "UnusedMethodReturnValue.Global")]
|
[SuppressMessage("ReSharper", "UnusedMethodReturnValue.Global")]
|
||||||
[SuppressMessage("ReSharper", "UnusedMember.Global")]
|
[SuppressMessage("ReSharper", "UnusedMember.Global")]
|
||||||
public sealed class TwoKeyDictionary<K1, K2, V> {
|
public sealed class TwoKeyDictionary<K1, K2, V> where K1 : notnull where K2 : notnull {
|
||||||
private readonly Dictionary<K1, Dictionary<K2, V>> dict;
|
private readonly Dictionary<K1, Dictionary<K2, V>> dict;
|
||||||
private readonly int innerCapacity;
|
private readonly int innerCapacity;
|
||||||
|
|
||||||
@@ -41,7 +41,7 @@ namespace TweetLib.Utils.Collections {
|
|||||||
}
|
}
|
||||||
|
|
||||||
set {
|
set {
|
||||||
if (!dict.TryGetValue(outerKey, out Dictionary<K2, V> innerDict)) {
|
if (!dict.TryGetValue(outerKey, out Dictionary<K2, V>? innerDict)) {
|
||||||
dict.Add(outerKey, innerDict = new Dictionary<K2, V>(innerCapacity));
|
dict.Add(outerKey, innerDict = new Dictionary<K2, V>(innerCapacity));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -67,7 +67,7 @@ namespace TweetLib.Utils.Collections {
|
|||||||
/// Throws if the key pair already exists.
|
/// Throws if the key pair already exists.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void Add(K1 outerKey, K2 innerKey, V value) {
|
public void Add(K1 outerKey, K2 innerKey, V value) {
|
||||||
if (!dict.TryGetValue(outerKey, out Dictionary<K2, V> innerDict)) {
|
if (!dict.TryGetValue(outerKey, out Dictionary<K2, V>? innerDict)) {
|
||||||
dict.Add(outerKey, innerDict = new Dictionary<K2, V>(innerCapacity));
|
dict.Add(outerKey, innerDict = new Dictionary<K2, V>(innerCapacity));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -100,7 +100,7 @@ namespace TweetLib.Utils.Collections {
|
|||||||
/// Determines whether the dictionary contains the key pair.
|
/// Determines whether the dictionary contains the key pair.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool Contains(K1 outerKey, K2 innerKey) {
|
public bool Contains(K1 outerKey, K2 innerKey) {
|
||||||
return dict.TryGetValue(outerKey, out Dictionary<K2, V> innerDict) && innerDict.ContainsKey(innerKey);
|
return dict.TryGetValue(outerKey, out Dictionary<K2, V>? innerDict) && innerDict.ContainsKey(innerKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -122,8 +122,8 @@ namespace TweetLib.Utils.Collections {
|
|||||||
/// Gets the value associated with the key pair.
|
/// Gets the value associated with the key pair.
|
||||||
/// Returns true if the key pair was present.
|
/// Returns true if the key pair was present.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool TryGetValue(K1 outerKey, K2 innerKey, out V value) {
|
public bool TryGetValue(K1 outerKey, K2 innerKey, [MaybeNullWhen(false)] out V value) {
|
||||||
if (dict.TryGetValue(outerKey, out Dictionary<K2, V> innerDict)) {
|
if (dict.TryGetValue(outerKey, out Dictionary<K2, V>? innerDict)) {
|
||||||
return innerDict.TryGetValue(innerKey, out value);
|
return innerDict.TryGetValue(innerKey, out value);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -145,7 +145,7 @@ namespace TweetLib.Utils.Collections {
|
|||||||
/// Returns true if the key pair was present.
|
/// Returns true if the key pair was present.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool Remove(K1 outerKey, K2 innerKey) {
|
public bool Remove(K1 outerKey, K2 innerKey) {
|
||||||
if (dict.TryGetValue(outerKey, out Dictionary<K2, V> innerDict) && innerDict.Remove(innerKey)) {
|
if (dict.TryGetValue(outerKey, out Dictionary<K2, V>? innerDict) && innerDict.Remove(innerKey)) {
|
||||||
if (innerDict.Count == 0) {
|
if (innerDict.Count == 0) {
|
||||||
dict.Remove(outerKey);
|
dict.Remove(outerKey);
|
||||||
}
|
}
|
||||||
|
@@ -2,9 +2,9 @@ using System.Collections.Generic;
|
|||||||
|
|
||||||
namespace TweetLib.Utils.Dialogs {
|
namespace TweetLib.Utils.Dialogs {
|
||||||
public sealed class SaveFileDialogSettings {
|
public sealed class SaveFileDialogSettings {
|
||||||
public string DialogTitle { get; set; } = "Save File";
|
public string DialogTitle { get; init; } = "Save File";
|
||||||
public bool OverwritePrompt { get; set; } = true;
|
public bool OverwritePrompt { get; init; } = true;
|
||||||
public string? FileName { get; set; }
|
public string? FileName { get; init; }
|
||||||
public IReadOnlyList<FileDialogFilter>? Filters { get; set; }
|
public IReadOnlyList<FileDialogFilter>? Filters { get; init; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -21,7 +21,7 @@ namespace TweetLib.Utils.Globalization {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override bool Equals(object obj) {
|
public override bool Equals(object? obj) {
|
||||||
return obj is Language other && Code.Equals(other.Code, StringComparison.OrdinalIgnoreCase);
|
return obj is Language other && Code.Equals(other.Code, StringComparison.OrdinalIgnoreCase);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -38,8 +38,8 @@ namespace TweetLib.Utils.Globalization {
|
|||||||
return cultureInfo.DisplayName == cultureInfo.NativeName ? capitalizedName : $"{capitalizedName}, {cultureInfo.DisplayName}";
|
return cultureInfo.DisplayName == cultureInfo.NativeName ? capitalizedName : $"{capitalizedName}, {cultureInfo.DisplayName}";
|
||||||
}
|
}
|
||||||
|
|
||||||
public int CompareTo(Language other) {
|
public int CompareTo(Language? other) {
|
||||||
return string.Compare(Name, other.Name, false, CultureInfo.InvariantCulture);
|
return string.Compare(Name, other?.Name, false, CultureInfo.InvariantCulture);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -134,7 +134,7 @@ namespace TweetLib.Utils.IO {
|
|||||||
public string[] KeyValue {
|
public string[] KeyValue {
|
||||||
get {
|
get {
|
||||||
int index = Identifier.IndexOf(KeySeparator);
|
int index = Identifier.IndexOf(KeySeparator);
|
||||||
return index == -1 ? StringUtils.EmptyArray : Identifier.Substring(index + 1).Split(KeySeparator);
|
return index == -1 ? StringUtils.EmptyArray : Identifier[(index + 1)..].Split(KeySeparator);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -2,12 +2,12 @@
|
|||||||
|
|
||||||
namespace TweetLib.Utils.Serialization.Converters {
|
namespace TweetLib.Utils.Serialization.Converters {
|
||||||
public sealed class BasicTypeConverter<T> : ITypeConverter {
|
public sealed class BasicTypeConverter<T> : ITypeConverter {
|
||||||
public Func<T, string>? ConvertToString { get; set; }
|
public Func<T, string>? ConvertToString { get; init; }
|
||||||
public Func<string, T>? ConvertToObject { get; set; }
|
public Func<string, T>? ConvertToObject { get; init; }
|
||||||
|
|
||||||
bool ITypeConverter.TryWriteType(Type type, object value, out string? converted) {
|
bool ITypeConverter.TryWriteType(Type type, object? value, out string? converted) {
|
||||||
try {
|
try {
|
||||||
converted = ConvertToString!((T) value);
|
converted = ConvertToString!((T) value!);
|
||||||
return true;
|
return true;
|
||||||
} catch {
|
} catch {
|
||||||
converted = null;
|
converted = null;
|
||||||
|
@@ -6,18 +6,17 @@ namespace TweetLib.Utils.Serialization.Converters {
|
|||||||
|
|
||||||
private ClrTypeConverter() {}
|
private ClrTypeConverter() {}
|
||||||
|
|
||||||
bool ITypeConverter.TryWriteType(Type type, object value, out string? converted) {
|
bool ITypeConverter.TryWriteType(Type type, object? value, out string? converted) {
|
||||||
switch (Type.GetTypeCode(type)) {
|
switch (Type.GetTypeCode(type)) {
|
||||||
case TypeCode.Boolean:
|
case TypeCode.Boolean:
|
||||||
converted = value.ToString();
|
converted = value!.ToString();
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
case TypeCode.Int32:
|
case TypeCode.Int32:
|
||||||
converted = ((int) value).ToString(); // cast required for enums
|
converted = ((int) value!).ToString(); // cast required for enums
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
case TypeCode.String:
|
case TypeCode.String:
|
||||||
// ReSharper disable once ConstantConditionalAccessQualifier
|
|
||||||
converted = value?.ToString();
|
converted = value?.ToString();
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
namespace TweetLib.Utils.Serialization {
|
namespace TweetLib.Utils.Serialization {
|
||||||
public interface ITypeConverter {
|
public interface ITypeConverter {
|
||||||
bool TryWriteType(Type type, object value, out string? converted);
|
bool TryWriteType(Type type, object? value, out string? converted);
|
||||||
bool TryReadType(Type type, string value, out object? converted);
|
bool TryReadType(Type type, string value, out object? converted);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -28,7 +28,7 @@ namespace TweetLib.Utils.Serialization {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
build.Append(data.Substring(index, nextIndex - index));
|
build.Append(data[index..nextIndex]);
|
||||||
|
|
||||||
char next = data[nextIndex + 1];
|
char next = data[nextIndex + 1];
|
||||||
|
|
||||||
@@ -47,7 +47,7 @@ namespace TweetLib.Utils.Serialization {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return build.Append(data.Substring(index)).ToString();
|
return build.Append(data[index..]).ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
private readonly TypeConverterRegistry converterRegistry;
|
private readonly TypeConverterRegistry converterRegistry;
|
||||||
@@ -114,7 +114,7 @@ namespace TweetLib.Utils.Serialization {
|
|||||||
int nextPos = contents.IndexOf(NewLineReal, currentPos);
|
int nextPos = contents.IndexOf(NewLineReal, currentPos);
|
||||||
|
|
||||||
if (nextPos == -1) {
|
if (nextPos == -1) {
|
||||||
line = contents.Substring(currentPos);
|
line = contents[currentPos..];
|
||||||
currentPos = -1;
|
currentPos = -1;
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(line)) {
|
if (string.IsNullOrEmpty(line)) {
|
||||||
@@ -133,10 +133,10 @@ namespace TweetLib.Utils.Serialization {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
string property = line.Substring(0, space);
|
string property = line[..space];
|
||||||
string value = UnescapeLine(line.Substring(space + 1));
|
string value = UnescapeLine(line[(space + 1)..]);
|
||||||
|
|
||||||
if (props.TryGetValue(property, out PropertyInfo info)) {
|
if (props.TryGetValue(property, out var info)) {
|
||||||
var type = info.PropertyType;
|
var type = info.PropertyType;
|
||||||
var converter = converterRegistry.TryGet(type) ?? ClrTypeConverter.Instance;
|
var converter = converterRegistry.TryGet(type) ?? ClrTypeConverter.Instance;
|
||||||
|
|
||||||
|
@@ -1,6 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Diagnostics.CodeAnalysis;
|
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using TweetLib.Utils.Static;
|
using TweetLib.Utils.Static;
|
||||||
@@ -91,7 +90,6 @@ namespace TweetLib.Utils.Startup {
|
|||||||
return UnlockResult.Success;
|
return UnlockResult.Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
[SuppressMessage("ReSharper", "PossibleNullReferenceException")]
|
|
||||||
private LockResult DetermineLockingProcessOrFail(Exception originalException) {
|
private LockResult DetermineLockingProcessOrFail(Exception originalException) {
|
||||||
try {
|
try {
|
||||||
int pid;
|
int pid;
|
||||||
@@ -110,7 +108,7 @@ namespace TweetLib.Utils.Startup {
|
|||||||
var foundProcess = Process.GetProcessById(pid);
|
var foundProcess = Process.GetProcessById(pid);
|
||||||
using var currentProcess = Process.GetCurrentProcess();
|
using var currentProcess = Process.GetCurrentProcess();
|
||||||
|
|
||||||
if (currentProcess.MainModule.FileVersionInfo.InternalName == foundProcess.MainModule.FileVersionInfo.InternalName) {
|
if (currentProcess.MainModule!.FileVersionInfo.InternalName == foundProcess.MainModule!.FileVersionInfo.InternalName) {
|
||||||
return new LockResult.HasProcess(foundProcess);
|
return new LockResult.HasProcess(foundProcess);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@@ -40,7 +40,7 @@ namespace TweetLib.Utils.Static {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (str.Substring(0, index), str.Substring(index + 1));
|
return (str[..index], str[(index + 1)..]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -49,7 +49,7 @@ namespace TweetLib.Utils.Static {
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public static string ExtractBefore(string str, char search, int startIndex = 0) {
|
public static string ExtractBefore(string str, char search, int startIndex = 0) {
|
||||||
int index = str.IndexOf(search, startIndex);
|
int index = str.IndexOf(search, startIndex);
|
||||||
return index == -1 ? str : str.Substring(0, index);
|
return index == -1 ? str : str[..index];
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@@ -12,8 +12,10 @@ namespace TweetLib.Utils.Static {
|
|||||||
|
|
||||||
private static void EnsureTLS12() {
|
private static void EnsureTLS12() {
|
||||||
if (!hasMicrosoftBeenBroughtTo2008Yet) {
|
if (!hasMicrosoftBeenBroughtTo2008Yet) {
|
||||||
|
#pragma warning disable CS0618
|
||||||
ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12;
|
ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12;
|
||||||
ServicePointManager.SecurityProtocol &= ~(SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11);
|
ServicePointManager.SecurityProtocol &= ~(SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11);
|
||||||
|
#pragma warning restore CS0618
|
||||||
hasMicrosoftBeenBroughtTo2008Yet = true;
|
hasMicrosoftBeenBroughtTo2008Yet = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -47,7 +47,7 @@ module RegexAccount =
|
|||||||
Assert.True(isMatch("https://twitter.com/" + name))
|
Assert.True(isMatch("https://twitter.com/" + name))
|
||||||
|
|
||||||
module Match =
|
module Match =
|
||||||
let extract str = TwitterUrls.RegexAccount.Match(str).Groups.[1].Value
|
let extract str = TwitterUrls.RegexAccount.Match(str).Groups[1].Value
|
||||||
|
|
||||||
[<Fact>]
|
[<Fact>]
|
||||||
let ``extracts account name from simple URL`` () =
|
let ``extracts account name from simple URL`` () =
|
||||||
|
@@ -276,11 +276,11 @@ module ToDictionary =
|
|||||||
TestData.mixed.ToDictionary(dict)
|
TestData.mixed.ToDictionary(dict)
|
||||||
|
|
||||||
Assert.Equal(5, dict.Count)
|
Assert.Equal(5, dict.Count)
|
||||||
Assert.Equal("1", dict.["flag1"])
|
Assert.Equal("1", dict["flag1"])
|
||||||
Assert.Equal("1", dict.["flag2"])
|
Assert.Equal("1", dict["flag2"])
|
||||||
Assert.Equal("1", dict.["flag3"])
|
Assert.Equal("1", dict["flag3"])
|
||||||
Assert.Equal("hello", dict.["val1"])
|
Assert.Equal("hello", dict["val1"])
|
||||||
Assert.Equal("world", dict.["val2"])
|
Assert.Equal("world", dict["val2"])
|
||||||
|
|
||||||
[<Fact>]
|
[<Fact>]
|
||||||
let ``prefers value if the same name is used for a flag and value`` () =
|
let ``prefers value if the same name is used for a flag and value`` () =
|
||||||
@@ -288,7 +288,7 @@ module ToDictionary =
|
|||||||
TestData.duplicate.ToDictionary(dict)
|
TestData.duplicate.ToDictionary(dict)
|
||||||
|
|
||||||
Assert.Equal(1, dict.Count)
|
Assert.Equal(1, dict.Count)
|
||||||
Assert.Equal("value", dict.["duplicate"])
|
Assert.Equal("value", dict["duplicate"])
|
||||||
|
|
||||||
|
|
||||||
module ToString =
|
module ToString =
|
||||||
|
@@ -38,36 +38,36 @@ module Indexer =
|
|||||||
[<InlineData("second", 2, 200.0)>]
|
[<InlineData("second", 2, 200.0)>]
|
||||||
[<InlineData("third", 1, 1000.0)>]
|
[<InlineData("third", 1, 1000.0)>]
|
||||||
let ``get returns correct value`` (outerKey: string, innerKey: int, value: float) =
|
let ``get returns correct value`` (outerKey: string, innerKey: int, value: float) =
|
||||||
Assert.Equal(value, TestData.uniquevals.[outerKey, innerKey])
|
Assert.Equal(value, TestData.uniquevals[outerKey, innerKey])
|
||||||
|
|
||||||
[<Fact>]
|
[<Fact>]
|
||||||
let ``get throws if outer key is missing`` () =
|
let ``get throws if outer key is missing`` () =
|
||||||
Assert.Throws<KeyNotFoundException>(fun () -> TestData.uniquevals.["missing", 1] |> ignore)
|
Assert.Throws<KeyNotFoundException>(fun () -> TestData.uniquevals["missing", 1] |> ignore)
|
||||||
|
|
||||||
[<Fact>]
|
[<Fact>]
|
||||||
let ``get throws if inner key is missing`` () =
|
let ``get throws if inner key is missing`` () =
|
||||||
Assert.Throws<KeyNotFoundException>(fun () -> TestData.uniquevals.["first", 0] |> ignore)
|
Assert.Throws<KeyNotFoundException>(fun () -> TestData.uniquevals["first", 0] |> ignore)
|
||||||
|
|
||||||
[<Fact>]
|
[<Fact>]
|
||||||
let ``set modifies existing value`` () =
|
let ``set modifies existing value`` () =
|
||||||
let copy = TestData.uniquevals
|
let copy = TestData.uniquevals
|
||||||
copy.["first", 1] <- 50.0
|
copy["first", 1] <- 50.0
|
||||||
|
|
||||||
Assert.Equal(50.0, copy.["first", 1])
|
Assert.Equal(50.0, copy["first", 1])
|
||||||
|
|
||||||
[<Fact>]
|
[<Fact>]
|
||||||
let ``set creates new inner key`` () =
|
let ``set creates new inner key`` () =
|
||||||
let copy = TestData.uniquevals
|
let copy = TestData.uniquevals
|
||||||
copy.["second", 3] <- 300.0
|
copy["second", 3] <- 300.0
|
||||||
|
|
||||||
Assert.Equal(300.0, copy.["second", 3])
|
Assert.Equal(300.0, copy["second", 3])
|
||||||
|
|
||||||
[<Fact>]
|
[<Fact>]
|
||||||
let ``set creates new outer key`` () =
|
let ``set creates new outer key`` () =
|
||||||
let copy = TestData.uniquevals
|
let copy = TestData.uniquevals
|
||||||
copy.["fourth", 1] <- 10000.0
|
copy["fourth", 1] <- 10000.0
|
||||||
|
|
||||||
Assert.Equal(10000.0, copy.["fourth", 1])
|
Assert.Equal(10000.0, copy["fourth", 1])
|
||||||
|
|
||||||
|
|
||||||
module InnerValues =
|
module InnerValues =
|
||||||
@@ -93,14 +93,14 @@ module Add =
|
|||||||
let copy = TestData.uniquevals
|
let copy = TestData.uniquevals
|
||||||
copy.Add("first", 4, 40.0)
|
copy.Add("first", 4, 40.0)
|
||||||
|
|
||||||
Assert.Equal(40.0, copy.["first", 4])
|
Assert.Equal(40.0, copy["first", 4])
|
||||||
|
|
||||||
[<Fact>]
|
[<Fact>]
|
||||||
let ``creates new outer key`` () =
|
let ``creates new outer key`` () =
|
||||||
let copy = TestData.uniquevals
|
let copy = TestData.uniquevals
|
||||||
copy.Add("fourth", 1, 10000.0)
|
copy.Add("fourth", 1, 10000.0)
|
||||||
|
|
||||||
Assert.Equal(10000.0, copy.["fourth", 1])
|
Assert.Equal(10000.0, copy["fourth", 1])
|
||||||
|
|
||||||
[<Fact>]
|
[<Fact>]
|
||||||
let ``throw on duplicate key`` () =
|
let ``throw on duplicate key`` () =
|
||||||
|
@@ -83,7 +83,7 @@ module ReadFile =
|
|||||||
[<InlineData("singleFile")>]
|
[<InlineData("singleFile")>]
|
||||||
[<InlineData("singleFileWithMultiIdentifier")>]
|
[<InlineData("singleFileWithMultiIdentifier")>]
|
||||||
let ``reading first file from single file stream returns an entry`` (stream: string) =
|
let ``reading first file from single file stream returns an entry`` (stream: string) =
|
||||||
using TestData.singleFileStreams.[stream] (fun f ->
|
using TestData.singleFileStreams[stream] (fun f ->
|
||||||
Assert.NotNull(f.ReadFile())
|
Assert.NotNull(f.ReadFile())
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -91,7 +91,7 @@ module ReadFile =
|
|||||||
[<InlineData("singleFile")>]
|
[<InlineData("singleFile")>]
|
||||||
[<InlineData("singleFileWithMultiIdentifier")>]
|
[<InlineData("singleFileWithMultiIdentifier")>]
|
||||||
let ``reading second file from single file stream returns null`` (stream: string) =
|
let ``reading second file from single file stream returns null`` (stream: string) =
|
||||||
using TestData.singleFileStreams.[stream] (fun f ->
|
using TestData.singleFileStreams[stream] (fun f ->
|
||||||
f.ReadFile() |> ignore
|
f.ReadFile() |> ignore
|
||||||
Assert.Null(f.ReadFile())
|
Assert.Null(f.ReadFile())
|
||||||
)
|
)
|
||||||
@@ -197,7 +197,7 @@ module Entry =
|
|||||||
[<InlineData("singleFile")>]
|
[<InlineData("singleFile")>]
|
||||||
[<InlineData("singleFileWithMultiIdentifier")>]
|
[<InlineData("singleFileWithMultiIdentifier")>]
|
||||||
let ``contents of single file stream with are correct`` (stream: string) =
|
let ``contents of single file stream with are correct`` (stream: string) =
|
||||||
using TestData.singleFileStreams.[stream] (fun f ->
|
using TestData.singleFileStreams[stream] (fun f ->
|
||||||
Assert.Equal("test file\n123", Encoding.UTF8.GetString(f.ReadFile().Contents))
|
Assert.Equal("test file\n123", Encoding.UTF8.GetString(f.ReadFile().Contents))
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@@ -25,7 +25,7 @@ namespace TweetDuck.Browser {
|
|||||||
private static async void KillWhenHung(int parentId) {
|
private static async void KillWhenHung(int parentId) {
|
||||||
try {
|
try {
|
||||||
using Process process = Process.GetProcessById(parentId);
|
using Process process = Process.GetProcessById(parentId);
|
||||||
process.WaitForExit();
|
await process.WaitForExitAsync();
|
||||||
} catch {
|
} catch {
|
||||||
// ded
|
// ded
|
||||||
}
|
}
|
||||||
|
@@ -30,7 +30,7 @@ namespace TweetDuck.Video.Controls {
|
|||||||
|
|
||||||
Text = text;
|
Text = text;
|
||||||
|
|
||||||
Point loc = form!.PointToClient(control.Parent.PointToScreen(new Point(control.Location.X + (followCursor ? args.X : control.Width / 2), 0)));
|
Point loc = form.PointToClient(control.Parent.PointToScreen(new Point(control.Location.X + (followCursor ? args.X : control.Width / 2), 0)));
|
||||||
loc.X = Math.Max(0, Math.Min(form.Width - Width, loc.X - Width / 2));
|
loc.X = Math.Max(0, Math.Min(form.Width - Width, loc.X - Width / 2));
|
||||||
loc.Y -= Height - Margin.Top + Margin.Bottom;
|
loc.Y -= Height - Margin.Top + Margin.Bottom;
|
||||||
Location = loc;
|
Location = loc;
|
||||||
@@ -42,7 +42,7 @@ namespace TweetDuck.Video.Controls {
|
|||||||
control.MouseLeave += control_MouseLeave;
|
control.MouseLeave += control_MouseLeave;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void control_MouseLeave(object sender, EventArgs e) {
|
private void control_MouseLeave(object? sender, EventArgs e) {
|
||||||
Visible = false;
|
Visible = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -153,12 +153,12 @@ namespace TweetDuck.Video {
|
|||||||
|
|
||||||
// Events
|
// Events
|
||||||
|
|
||||||
private void FormPlayer_Load(object sender, EventArgs e) {
|
private void FormPlayer_Load(object? sender, EventArgs e) {
|
||||||
Player.URL = videoUrl;
|
Player.URL = videoUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void pipe_DataIn(object sender, DuplexPipe.PipeReadEventArgs e) {
|
private void pipe_DataIn(object? sender, DuplexPipe.PipeReadEventArgs e) {
|
||||||
Invoke(new Action(() => {
|
Invoke(() => {
|
||||||
switch (e.Key) {
|
switch (e.Key) {
|
||||||
case "key":
|
case "key":
|
||||||
HandleKey((Keys) int.Parse(e.Data, NumberStyles.Integer));
|
HandleKey((Keys) int.Parse(e.Data, NumberStyles.Integer));
|
||||||
@@ -168,7 +168,7 @@ namespace TweetDuck.Video {
|
|||||||
StopVideo();
|
StopVideo();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}));
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void player_PlayStateChange(int newState) {
|
private void player_PlayStateChange(int newState) {
|
||||||
@@ -215,7 +215,7 @@ namespace TweetDuck.Video {
|
|||||||
Marshal.ReleaseComObject(controls);
|
Marshal.ReleaseComObject(controls);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void timerSync_Tick(object sender, EventArgs e) {
|
private void timerSync_Tick(object? sender, EventArgs e) {
|
||||||
if (NativeMethods.GetWindowRect(ownerHandle, out NativeMethods.RECT rect)) {
|
if (NativeMethods.GetWindowRect(ownerHandle, out NativeMethods.RECT rect)) {
|
||||||
IWMPMedia media = Player.currentMedia;
|
IWMPMedia media = Player.currentMedia;
|
||||||
IWMPControls controls = Player.controls;
|
IWMPControls controls = Player.controls;
|
||||||
@@ -312,12 +312,12 @@ namespace TweetDuck.Video {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void timerData_Tick(object sender, EventArgs e) {
|
private void timerData_Tick(object? sender, EventArgs e) {
|
||||||
timerData.Stop();
|
timerData.Stop();
|
||||||
pipe.Write("vol", trackBarVolume.Value.ToString());
|
pipe.Write("vol", trackBarVolume.Value.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void progressSeek_MouseDown(object sender, MouseEventArgs e) {
|
private void progressSeek_MouseDown(object? sender, MouseEventArgs e) {
|
||||||
if (e.Button == MouseButtons.Left) {
|
if (e.Button == MouseButtons.Left) {
|
||||||
IWMPMedia media = Player.currentMedia;
|
IWMPMedia media = Player.currentMedia;
|
||||||
IWMPControls controls = Player.controls;
|
IWMPControls controls = Player.controls;
|
||||||
@@ -329,7 +329,7 @@ namespace TweetDuck.Video {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void trackBarVolume_ValueChanged(object sender, EventArgs e) {
|
private void trackBarVolume_ValueChanged(object? sender, EventArgs e) {
|
||||||
IWMPSettings settings = Player.settings;
|
IWMPSettings settings = Player.settings;
|
||||||
settings.volume = trackBarVolume.Value;
|
settings.volume = trackBarVolume.Value;
|
||||||
|
|
||||||
@@ -341,23 +341,23 @@ namespace TweetDuck.Video {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void trackBarVolume_MouseDown(object sender, MouseEventArgs e) {
|
private void trackBarVolume_MouseDown(object? sender, MouseEventArgs e) {
|
||||||
isDragging = true;
|
isDragging = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void trackBarVolume_MouseUp(object sender, MouseEventArgs e) {
|
private void trackBarVolume_MouseUp(object? sender, MouseEventArgs e) {
|
||||||
isDragging = false;
|
isDragging = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void imageClose_Click(object sender, EventArgs e) {
|
private void imageClose_Click(object? sender, EventArgs e) {
|
||||||
StopVideo();
|
StopVideo();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void imageDownload_Click(object sender, EventArgs e) {
|
private void imageDownload_Click(object? sender, EventArgs e) {
|
||||||
pipe.Write("download");
|
pipe.Write("download");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void imageResize_Click(object sender, EventArgs e) {
|
private void imageResize_Click(object? sender, EventArgs e) {
|
||||||
Player.fullScreen = true;
|
Player.fullScreen = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -18,7 +18,7 @@ namespace TweetDuck.Application {
|
|||||||
};
|
};
|
||||||
|
|
||||||
if (dialog.ShowDialog() == DialogResult.OK) {
|
if (dialog.ShowDialog() == DialogResult.OK) {
|
||||||
onAccepted(dialog.FileName);
|
onAccepted(dialog.FileName!);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@@ -13,7 +13,7 @@ using TweetLib.Core.Systems.Configuration;
|
|||||||
|
|
||||||
namespace TweetDuck.Application {
|
namespace TweetDuck.Application {
|
||||||
sealed class SystemHandler : IAppSystemHandler {
|
sealed class SystemHandler : IAppSystemHandler {
|
||||||
public void OpenBrowser(string url) {
|
public void OpenBrowser(string? url) {
|
||||||
if (string.IsNullOrWhiteSpace(url)) {
|
if (string.IsNullOrWhiteSpace(url)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -23,7 +23,7 @@ namespace TweetDuck.Application {
|
|||||||
|
|
||||||
switch (TwitterUrls.Check(url)) {
|
switch (TwitterUrls.Check(url)) {
|
||||||
case TwitterUrls.UrlType.Fine:
|
case TwitterUrls.UrlType.Fine:
|
||||||
string browserPath = config.BrowserPath;
|
string? browserPath = config.BrowserPath;
|
||||||
|
|
||||||
if (browserPath == null || !File.Exists(browserPath)) {
|
if (browserPath == null || !File.Exists(browserPath)) {
|
||||||
OpenAssociatedProgram(url);
|
OpenAssociatedProgram(url);
|
||||||
@@ -120,7 +120,7 @@ namespace TweetDuck.Application {
|
|||||||
|
|
||||||
void PerformSearch() {
|
void PerformSearch() {
|
||||||
var config = Program.Config.User;
|
var config = Program.Config.User;
|
||||||
string searchUrl = config.SearchEngineUrl;
|
string? searchUrl = config.SearchEngineUrl;
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(searchUrl)) {
|
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)) {
|
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)) {
|
||||||
@@ -132,7 +132,7 @@ namespace TweetDuck.Application {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
FormSettings settings = FormManager.TryFind<FormSettings>();
|
FormSettings? settings = FormManager.TryFind<FormSettings>();
|
||||||
|
|
||||||
if (settings == null) {
|
if (settings == null) {
|
||||||
return;
|
return;
|
||||||
@@ -146,7 +146,7 @@ namespace TweetDuck.Application {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
App.SystemHandler.OpenBrowser(searchUrl + Uri.EscapeUriString(text));
|
App.SystemHandler.OpenBrowser(searchUrl + Uri.EscapeDataString(text));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -10,7 +10,7 @@ namespace TweetDuck.Browser.Base {
|
|||||||
|
|
||||||
public override string CacheFolder => CefUtils.GetCacheFolder(App.StoragePath);
|
public override string CacheFolder => CefUtils.GetCacheFolder(App.StoragePath);
|
||||||
|
|
||||||
public CefBrowserComponent(ChromiumWebBrowser browser, CreateContextMenu createContextMenu = null, bool autoReload = true) : base(browser, createContextMenu ?? DefaultContextMenuFactory, new JsDialogOpener(browser), PopupHandler.Instance, autoReload) {
|
public CefBrowserComponent(ChromiumWebBrowser browser, CreateContextMenu? createContextMenu = null, bool autoReload = true) : base(browser, createContextMenu ?? DefaultContextMenuFactory, new JsDialogOpener(browser), PopupHandler.Instance, autoReload) {
|
||||||
browser.SetupZoomEvents();
|
browser.SetupZoomEvents();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -14,7 +14,7 @@ namespace TweetDuck.Browser.Base {
|
|||||||
|
|
||||||
protected static UserConfig Config => Program.Config.User;
|
protected static UserConfig Config => Program.Config.User;
|
||||||
|
|
||||||
public ContextMenuBase(IContextMenuHandler handler) : base(handler) {}
|
public ContextMenuBase(IContextMenuHandler? handler) : base(handler) {}
|
||||||
|
|
||||||
protected override Context CreateContext(IContextMenuParams parameters) {
|
protected override Context CreateContext(IContextMenuParams parameters) {
|
||||||
return CreateContext(parameters, null, Config.TwitterImageQuality);
|
return CreateContext(parameters, null, Config.TwitterImageQuality);
|
||||||
@@ -55,7 +55,7 @@ namespace TweetDuck.Browser.Base {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static Context CreateContext(IContextMenuParams parameters, TweetDeckExtraContext extraContext, ImageQuality imageQuality) {
|
protected static Context CreateContext(IContextMenuParams parameters, TweetDeckExtraContext? extraContext, ImageQuality imageQuality) {
|
||||||
var context = new Context();
|
var context = new Context();
|
||||||
var flags = parameters.TypeFlags;
|
var flags = parameters.TypeFlags;
|
||||||
|
|
||||||
@@ -74,7 +74,7 @@ namespace TweetDuck.Browser.Base {
|
|||||||
return context;
|
return context;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Link? GetLink(IContextMenuParams parameters, TweetDeckExtraContext extraContext) {
|
private static Link? GetLink(IContextMenuParams parameters, TweetDeckExtraContext? extraContext) {
|
||||||
var link = extraContext?.Link;
|
var link = extraContext?.Link;
|
||||||
if (link != null) {
|
if (link != null) {
|
||||||
return link;
|
return link;
|
||||||
@@ -87,7 +87,7 @@ namespace TweetDuck.Browser.Base {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Media? GetMedia(IContextMenuParams parameters, TweetDeckExtraContext extraContext, ImageQuality imageQuality) {
|
private static Media? GetMedia(IContextMenuParams parameters, TweetDeckExtraContext? extraContext, ImageQuality imageQuality) {
|
||||||
var media = extraContext?.Media;
|
var media = extraContext?.Media;
|
||||||
if (media != null) {
|
if (media != null) {
|
||||||
return media;
|
return media;
|
||||||
|
@@ -24,7 +24,7 @@ namespace TweetDuck.Browser.Base {
|
|||||||
private readonly FormBrowser form;
|
private readonly FormBrowser form;
|
||||||
private readonly TweetDeckExtraContext extraContext;
|
private readonly TweetDeckExtraContext extraContext;
|
||||||
|
|
||||||
public ContextMenuBrowser(FormBrowser form, IContextMenuHandler handler, TweetDeckExtraContext extraContext) : base(handler) {
|
public ContextMenuBrowser(FormBrowser form, IContextMenuHandler? handler, TweetDeckExtraContext extraContext) : base(handler) {
|
||||||
this.form = form;
|
this.form = form;
|
||||||
this.extraContext = extraContext;
|
this.extraContext = extraContext;
|
||||||
}
|
}
|
||||||
|
@@ -8,7 +8,7 @@ namespace TweetDuck.Browser.Base {
|
|||||||
sealed class ContextMenuNotification : ContextMenuBase {
|
sealed class ContextMenuNotification : ContextMenuBase {
|
||||||
private readonly FormNotificationBase form;
|
private readonly FormNotificationBase form;
|
||||||
|
|
||||||
public ContextMenuNotification(FormNotificationBase form, IContextMenuHandler handler) : base(handler) {
|
public ContextMenuNotification(FormNotificationBase form, IContextMenuHandler? handler) : base(handler) {
|
||||||
this.form = form;
|
this.form = form;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -5,9 +5,9 @@ using TweetLib.Utils.Static;
|
|||||||
|
|
||||||
namespace TweetDuck.Browser.Base {
|
namespace TweetDuck.Browser.Base {
|
||||||
sealed class CustomKeyboardHandler : IKeyboardHandler {
|
sealed class CustomKeyboardHandler : IKeyboardHandler {
|
||||||
private readonly IBrowserKeyHandler handler;
|
private readonly IBrowserKeyHandler? handler;
|
||||||
|
|
||||||
public CustomKeyboardHandler(IBrowserKeyHandler handler) {
|
public CustomKeyboardHandler(IBrowserKeyHandler? handler) {
|
||||||
this.handler = handler;
|
this.handler = handler;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -49,7 +49,7 @@ namespace TweetDuck.Browser {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public UpdateInstaller UpdateInstaller { get; private set; }
|
public UpdateInstaller? UpdateInstaller { get; private set; }
|
||||||
|
|
||||||
private readonly ResourceCache resourceCache;
|
private readonly ResourceCache resourceCache;
|
||||||
private readonly TweetDeckBrowser browser;
|
private readonly TweetDeckBrowser browser;
|
||||||
@@ -63,8 +63,8 @@ namespace TweetDuck.Browser {
|
|||||||
private bool isLoaded;
|
private bool isLoaded;
|
||||||
private FormWindowState prevState;
|
private FormWindowState prevState;
|
||||||
|
|
||||||
private TweetScreenshotManager notificationScreenshotManager;
|
private TweetScreenshotManager? notificationScreenshotManager;
|
||||||
private VideoPlayer videoPlayer;
|
private VideoPlayer? videoPlayer;
|
||||||
|
|
||||||
public FormBrowser(ResourceCache resourceCache, PluginManager pluginManager, IUpdateCheckClient updateCheckClient, uint windowRestoreMessage) {
|
public FormBrowser(ResourceCache resourceCache, PluginManager pluginManager, IUpdateCheckClient updateCheckClient, uint windowRestoreMessage) {
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
@@ -156,11 +156,11 @@ namespace TweetDuck.Browser {
|
|||||||
|
|
||||||
// event handlers
|
// event handlers
|
||||||
|
|
||||||
private void timerResize_Tick(object sender, EventArgs e) {
|
private void timerResize_Tick(object? sender, EventArgs e) {
|
||||||
FormBrowser_ResizeEnd(this, e); // also stops timer
|
FormBrowser_ResizeEnd(this, e); // also stops timer
|
||||||
}
|
}
|
||||||
|
|
||||||
private void FormBrowser_Activated(object sender, EventArgs e) {
|
private void FormBrowser_Activated(object? sender, EventArgs e) {
|
||||||
if (!isLoaded) {
|
if (!isLoaded) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -172,7 +172,7 @@ namespace TweetDuck.Browser {
|
|||||||
} // the window, enable the browser again
|
} // the window, enable the browser again
|
||||||
}
|
}
|
||||||
|
|
||||||
private void FormBrowser_LocationChanged(object sender, EventArgs e) {
|
private void FormBrowser_LocationChanged(object? sender, EventArgs e) {
|
||||||
if (!isLoaded) {
|
if (!isLoaded) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -181,7 +181,7 @@ namespace TweetDuck.Browser {
|
|||||||
timerResize.Start();
|
timerResize.Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void FormBrowser_Resize(object sender, EventArgs e) {
|
private void FormBrowser_Resize(object? sender, EventArgs e) {
|
||||||
if (!isLoaded) {
|
if (!isLoaded) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -204,7 +204,7 @@ namespace TweetDuck.Browser {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void FormBrowser_ResizeEnd(object sender, EventArgs e) { // also triggers when the window moves
|
private void FormBrowser_ResizeEnd(object? sender, EventArgs e) { // also triggers when the window moves
|
||||||
if (!isLoaded) {
|
if (!isLoaded) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -218,7 +218,7 @@ namespace TweetDuck.Browser {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void FormBrowser_FormClosing(object sender, FormClosingEventArgs e) {
|
private void FormBrowser_FormClosing(object? sender, FormClosingEventArgs e) {
|
||||||
if (!isLoaded) {
|
if (!isLoaded) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -229,33 +229,33 @@ namespace TweetDuck.Browser {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void FormBrowser_FormClosed(object sender, FormClosedEventArgs e) {
|
private void FormBrowser_FormClosed(object? sender, FormClosedEventArgs e) {
|
||||||
if (isLoaded && UpdateInstaller == null) {
|
if (isLoaded && UpdateInstaller == null) {
|
||||||
updates.InteractionManager.ClearUpdate();
|
updates.InteractionManager.ClearUpdate();
|
||||||
updates.InteractionManager.Dispose();
|
updates.InteractionManager.Dispose();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Config_MuteToggled(object sender, EventArgs e) {
|
private void Config_MuteToggled(object? sender, EventArgs e) {
|
||||||
UpdateFormIcon();
|
UpdateFormIcon();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Config_TrayBehaviorChanged(object sender, EventArgs e) {
|
private void Config_TrayBehaviorChanged(object? sender, EventArgs e) {
|
||||||
UpdateTray();
|
UpdateTray();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void trayIcon_ClickRestore(object sender, EventArgs e) {
|
private void trayIcon_ClickRestore(object? sender, EventArgs e) {
|
||||||
Show();
|
Show();
|
||||||
RestoreWindow();
|
RestoreWindow();
|
||||||
Activate();
|
Activate();
|
||||||
UpdateTray();
|
UpdateTray();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void trayIcon_ClickClose(object sender, EventArgs e) {
|
private void trayIcon_ClickClose(object? sender, EventArgs e) {
|
||||||
ForceClose();
|
ForceClose();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateInteractionManager_UpdateAccepted(object sender, UpdateInfo update) {
|
private void updateInteractionManager_UpdateAccepted(object? sender, UpdateInfo update) {
|
||||||
this.InvokeAsyncSafe(() => {
|
this.InvokeAsyncSafe(() => {
|
||||||
FormManager.CloseAllDialogs();
|
FormManager.CloseAllDialogs();
|
||||||
|
|
||||||
@@ -305,7 +305,7 @@ namespace TweetDuck.Browser {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateInteractionManager_UpdateDismissed(object sender, UpdateInfo update) {
|
private void updateInteractionManager_UpdateDismissed(object? sender, UpdateInfo update) {
|
||||||
this.InvokeAsyncSafe(() => {
|
this.InvokeAsyncSafe(() => {
|
||||||
Config.DismissedUpdate = update.VersionTag;
|
Config.DismissedUpdate = update.VersionTag;
|
||||||
Config.Save();
|
Config.Save();
|
||||||
@@ -385,7 +385,7 @@ namespace TweetDuck.Browser {
|
|||||||
OpenSettings(null);
|
OpenSettings(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OpenSettings(Type startTab) {
|
public void OpenSettings(Type? startTab) {
|
||||||
if (!FormManager.TryBringToFront<FormSettings>()) {
|
if (!FormManager.TryBringToFront<FormSettings>()) {
|
||||||
bool prevEnableUpdateCheck = Config.EnableUpdateCheck;
|
bool prevEnableUpdateCheck = Config.EnableUpdateCheck;
|
||||||
|
|
||||||
@@ -464,7 +464,7 @@ namespace TweetDuck.Browser {
|
|||||||
videoUrl = Regex.Replace(videoUrl, "^https://", "http://");
|
videoUrl = Regex.Replace(videoUrl, "^https://", "http://");
|
||||||
}
|
}
|
||||||
|
|
||||||
string playerPath = Config.VideoPlayerPath;
|
string? playerPath = Config.VideoPlayerPath;
|
||||||
|
|
||||||
if (playerPath == null || !File.Exists(playerPath)) {
|
if (playerPath == null || !File.Exists(playerPath)) {
|
||||||
if (videoPlayer == null) {
|
if (videoPlayer == null) {
|
||||||
@@ -512,7 +512,7 @@ namespace TweetDuck.Browser {
|
|||||||
notificationScreenshotManager.Trigger(html, width);
|
notificationScreenshotManager.Trigger(html, width);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DisplayTooltip(string text) {
|
private void DisplayTooltip(string? text) {
|
||||||
if (string.IsNullOrEmpty(text)) {
|
if (string.IsNullOrEmpty(text)) {
|
||||||
toolTip.Hide(this);
|
toolTip.Hide(this);
|
||||||
}
|
}
|
||||||
@@ -554,7 +554,7 @@ namespace TweetDuck.Browser {
|
|||||||
FormMessage.Show("TweetDuck Browser Message", contents, icon, FormMessage.OK);
|
FormMessage.Show("TweetDuck Browser Message", contents, icon, FormMessage.OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void DisplayTooltip(string text) {
|
public void DisplayTooltip(string? text) {
|
||||||
form.InvokeAsyncSafe(() => form.DisplayTooltip(text));
|
form.InvokeAsyncSafe(() => form.DisplayTooltip(text));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -97,11 +97,11 @@ namespace TweetDuck.Browser.Notification {
|
|||||||
|
|
||||||
private readonly CefByteArrayResourceHandler resourceHandler = new CefByteArrayResourceHandler();
|
private readonly CefByteArrayResourceHandler resourceHandler = new CefByteArrayResourceHandler();
|
||||||
|
|
||||||
private DesktopNotification currentNotification;
|
private DesktopNotification? currentNotification;
|
||||||
private readonly HashSet<NotificationPauseReason> pauseReasons = new HashSet<NotificationPauseReason>();
|
private readonly HashSet<NotificationPauseReason> pauseReasons = new HashSet<NotificationPauseReason>();
|
||||||
|
|
||||||
public string CurrentTweetUrl => currentNotification?.TweetUrl;
|
public string? CurrentTweetUrl => currentNotification?.TweetUrl;
|
||||||
public string CurrentQuoteUrl => currentNotification?.QuoteUrl;
|
public string? CurrentQuoteUrl => currentNotification?.QuoteUrl;
|
||||||
|
|
||||||
protected bool IsPaused => pauseReasons.Count > 0;
|
protected bool IsPaused => pauseReasons.Count > 0;
|
||||||
protected internal bool IsCursorOverBrowser => browser.Bounds.Contains(PointToClient(Cursor.Position));
|
protected internal bool IsCursorOverBrowser => browser.Bounds.Contains(PointToClient(Cursor.Position));
|
||||||
@@ -156,7 +156,7 @@ namespace TweetDuck.Browser.Notification {
|
|||||||
|
|
||||||
// event handlers
|
// event handlers
|
||||||
|
|
||||||
private void owner_FormClosed(object sender, FormClosedEventArgs e) {
|
private void owner_FormClosed(object? sender, FormClosedEventArgs e) {
|
||||||
Close();
|
Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -195,7 +195,7 @@ namespace TweetDuck.Browser.Notification {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected virtual void UpdateTitle() {
|
protected virtual void UpdateTitle() {
|
||||||
string title = currentNotification?.ColumnTitle;
|
string? title = currentNotification?.ColumnTitle;
|
||||||
Text = string.IsNullOrEmpty(title) || !Config.DisplayNotificationColumn ? Program.BrandName : $"{Program.BrandName} - {title}";
|
Text = string.IsNullOrEmpty(title) || !Config.DisplayNotificationColumn ? Program.BrandName : $"{Program.BrandName} - {title}";
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -214,7 +214,7 @@ namespace TweetDuck.Browser.Notification {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void DisplayTooltip(string text) {
|
public void DisplayTooltip(string? text) {
|
||||||
if (string.IsNullOrEmpty(text)) {
|
if (string.IsNullOrEmpty(text)) {
|
||||||
toolTip.Hide(this);
|
toolTip.Hide(this);
|
||||||
}
|
}
|
||||||
|
@@ -32,7 +32,7 @@ namespace TweetDuck.Browser.Notification {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public event EventHandler Ready;
|
public event EventHandler? Ready;
|
||||||
|
|
||||||
private readonly DesktopNotification exampleNotification;
|
private readonly DesktopNotification exampleNotification;
|
||||||
|
|
||||||
|
@@ -23,7 +23,7 @@ namespace TweetDuck.Browser.Notification {
|
|||||||
this.notification = notification;
|
this.notification = notification;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void DisplayTooltip(string text) {
|
public void DisplayTooltip(string? text) {
|
||||||
notification.InvokeAsyncSafe(() => notification.DisplayTooltip(text));
|
notification.InvokeAsyncSafe(() => notification.DisplayTooltip(text));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -175,14 +175,14 @@ namespace TweetDuck.Browser.Notification {
|
|||||||
|
|
||||||
// event handlers
|
// event handlers
|
||||||
|
|
||||||
private void FormNotification_FormClosing(object sender, FormClosingEventArgs e) {
|
private void FormNotification_FormClosing(object? sender, FormClosingEventArgs e) {
|
||||||
if (e.CloseReason == CloseReason.UserClosing) {
|
if (e.CloseReason == CloseReason.UserClosing) {
|
||||||
HideNotification();
|
HideNotification();
|
||||||
e.Cancel = true;
|
e.Cancel = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Browser_LoadingStateChanged(object sender, LoadingStateChangedEventArgs e) {
|
private void Browser_LoadingStateChanged(object? sender, LoadingStateChangedEventArgs e) {
|
||||||
if (!e.IsLoading && browser.Address != NotificationBrowser.BlankURL) {
|
if (!e.IsLoading && browser.Address != NotificationBrowser.BlankURL) {
|
||||||
this.InvokeSafe(() => {
|
this.InvokeSafe(() => {
|
||||||
Visible = true; // ensures repaint before moving the window to a visible location
|
Visible = true; // ensures repaint before moving the window to a visible location
|
||||||
@@ -191,12 +191,12 @@ namespace TweetDuck.Browser.Notification {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void timerDisplayDelay_Tick(object sender, EventArgs e) {
|
private void timerDisplayDelay_Tick(object? sender, EventArgs e) {
|
||||||
OnNotificationReady();
|
OnNotificationReady();
|
||||||
timerDisplayDelay.Stop();
|
timerDisplayDelay.Stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void timerHideProgress_Tick(object sender, EventArgs e) {
|
private void timerHideProgress_Tick(object? sender, EventArgs e) {
|
||||||
bool isCursorInside = Bounds.Contains(Cursor.Position);
|
bool isCursorInside = Bounds.Contains(Cursor.Position);
|
||||||
|
|
||||||
if (isCursorInside) {
|
if (isCursorInside) {
|
||||||
|
@@ -53,7 +53,7 @@ namespace TweetDuck.Browser.Notification {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void WindowsSessionManager_LockStateChanged(object sender, EventArgs e) {
|
private void WindowsSessionManager_LockStateChanged(object? sender, EventArgs e) {
|
||||||
if (WindowsSessionManager.IsLocked) {
|
if (WindowsSessionManager.IsLocked) {
|
||||||
PauseNotification(NotificationPauseReason.WindowsSessionLocked);
|
PauseNotification(NotificationPauseReason.WindowsSessionLocked);
|
||||||
}
|
}
|
||||||
@@ -78,7 +78,7 @@ namespace TweetDuck.Browser.Notification {
|
|||||||
|
|
||||||
// event handlers
|
// event handlers
|
||||||
|
|
||||||
private void Config_MuteToggled(object sender, EventArgs e) {
|
private void Config_MuteToggled(object? sender, EventArgs e) {
|
||||||
if (Config.MuteNotifications) {
|
if (Config.MuteNotifications) {
|
||||||
PauseNotification(NotificationPauseReason.UserConfiguration);
|
PauseNotification(NotificationPauseReason.UserConfiguration);
|
||||||
}
|
}
|
||||||
@@ -87,14 +87,14 @@ namespace TweetDuck.Browser.Notification {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void timerCursorCheck_Tick(object sender, EventArgs e) {
|
private void timerCursorCheck_Tick(object? sender, EventArgs e) {
|
||||||
if (!IsCursorOverNotificationArea) {
|
if (!IsCursorOverNotificationArea) {
|
||||||
ResumeNotification(NotificationPauseReason.CursorOverNotificationArea);
|
ResumeNotification(NotificationPauseReason.CursorOverNotificationArea);
|
||||||
timerCursorCheck.Stop();
|
timerCursorCheck.Stop();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void timerIdlePauseCheck_Tick(object sender, EventArgs e) {
|
private void timerIdlePauseCheck_Tick(object? sender, EventArgs e) {
|
||||||
if (NativeMethods.GetIdleSeconds() < Config.NotificationIdlePauseSeconds) {
|
if (NativeMethods.GetIdleSeconds() < Config.NotificationIdlePauseSeconds) {
|
||||||
ResumeNotification(NotificationPauseReason.SystemIdle);
|
ResumeNotification(NotificationPauseReason.SystemIdle);
|
||||||
timerIdlePauseCheck.Stop();
|
timerIdlePauseCheck.Stop();
|
||||||
|
@@ -28,7 +28,7 @@ namespace TweetDuck.Browser.Notification.Screenshot {
|
|||||||
browserComponent.AttachBridgeObject("$TD_NotificationScreenshot", new ScreenshotBridge(this, SetScreenshotHeight, callback));
|
browserComponent.AttachBridgeObject("$TD_NotificationScreenshot", new ScreenshotBridge(this, SetScreenshotHeight, callback));
|
||||||
|
|
||||||
browserComponent.BrowserLoaded += (sender, args) => {
|
browserComponent.BrowserLoaded += (sender, args) => {
|
||||||
string script = ResourceUtils.ReadFileOrNull("notification/screenshot/screenshot.js");
|
string? script = ResourceUtils.ReadFileOrNull("notification/screenshot/screenshot.js");
|
||||||
|
|
||||||
if (script == null) {
|
if (script == null) {
|
||||||
this.InvokeAsyncSafe(callback);
|
this.InvokeAsyncSafe(callback);
|
||||||
@@ -47,29 +47,27 @@ namespace TweetDuck.Browser.Notification.Screenshot {
|
|||||||
this.height = BrowserUtils.Scale(browserHeight, SizeScale);
|
this.height = BrowserUtils.Scale(browserHeight, SizeScale);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task<Image> TakeScreenshot(bool ignoreHeightError = false) {
|
public Task<Image>? TakeScreenshot() {
|
||||||
if (!ignoreHeightError) {
|
if (height == 0) {
|
||||||
if (height == 0) {
|
FormMessage.Error("Screenshot Failed", "Could not detect screenshot size.", FormMessage.OK);
|
||||||
FormMessage.Error("Screenshot Failed", "Could not detect screenshot size.", FormMessage.OK);
|
return null;
|
||||||
return null;
|
}
|
||||||
}
|
else if (height > ClientSize.Height) {
|
||||||
else if (height > ClientSize.Height) {
|
FormMessage.Error("Screenshot Failed", $"Screenshot is too large: {height}px > {ClientSize.Height}px", FormMessage.OK);
|
||||||
FormMessage.Error("Screenshot Failed", $"Screenshot is too large: {height}px > {ClientSize.Height}px", FormMessage.OK);
|
return null;
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return Task.Run(TakeScreenshotImpl);
|
return Task.Run(TakeScreenshotImpl);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<Image> TakeScreenshotImpl() {
|
private async Task<Image> TakeScreenshotImpl() {
|
||||||
if (this.height == 0) {
|
if (height == 0) {
|
||||||
return null;
|
throw new InvalidOperationException("Screenshot height must not be zero!");
|
||||||
}
|
}
|
||||||
|
|
||||||
Viewport viewport = new Viewport {
|
Viewport viewport = new Viewport {
|
||||||
Width = this.ClientSize.Width,
|
Width = ClientSize.Width,
|
||||||
Height = this.height,
|
Height = height,
|
||||||
Scale = 1
|
Scale = 1
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -35,7 +35,7 @@ namespace TweetDuck.Browser.Notification.Screenshot {
|
|||||||
public const int WaitFrames = 5;
|
public const int WaitFrames = 5;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
private FormNotificationScreenshotable screenshot;
|
private FormNotificationScreenshotable? screenshot;
|
||||||
|
|
||||||
public TweetScreenshotManager(FormBrowser owner, PluginManager pluginManager) {
|
public TweetScreenshotManager(FormBrowser owner, PluginManager pluginManager) {
|
||||||
this.owner = owner;
|
this.owner = owner;
|
||||||
@@ -53,14 +53,14 @@ namespace TweetDuck.Browser.Notification.Screenshot {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
private void timeout_Tick(object sender, EventArgs e) {
|
private void timeout_Tick(object? sender, EventArgs e) {
|
||||||
timeout.Stop();
|
timeout.Stop();
|
||||||
OnFinished();
|
OnFinished();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void disposer_Tick(object sender, EventArgs e) {
|
private void disposer_Tick(object? sender, EventArgs e) {
|
||||||
disposer.Stop();
|
disposer.Stop();
|
||||||
screenshot.Dispose();
|
screenshot?.Dispose();
|
||||||
screenshot = null;
|
screenshot = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -88,12 +88,12 @@ namespace TweetDuck.Browser.Notification.Screenshot {
|
|||||||
}
|
}
|
||||||
|
|
||||||
timeout.Stop();
|
timeout.Stop();
|
||||||
screenshot.TakeScreenshot().ContinueWith(HandleResult, TaskScheduler.FromCurrentSynchronizationContext());
|
screenshot?.TakeScreenshot()?.ContinueWith(HandleResult, TaskScheduler.FromCurrentSynchronizationContext());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void HandleResult(Task<Image> task) {
|
private void HandleResult(Task<Image> task) {
|
||||||
if (task.IsFaulted) {
|
if (task.IsFaulted) {
|
||||||
App.ErrorHandler.HandleException("Screenshot Failed", "An error occurred while taking a screenshot.", true, task.Exception!.InnerException);
|
App.ErrorHandler.HandleException("Screenshot Failed", "An error occurred while taking a screenshot.", true, task.Exception!.InnerException!);
|
||||||
}
|
}
|
||||||
else if (task.IsCompleted) {
|
else if (task.IsCompleted) {
|
||||||
Clipboard.SetImage(task.Result);
|
Clipboard.SetImage(task.Result);
|
||||||
@@ -111,7 +111,10 @@ namespace TweetDuck.Browser.Notification.Screenshot {
|
|||||||
debugger.Stop();
|
debugger.Stop();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
screenshot.Location = ControlExtensions.InvisibleLocation;
|
if (screenshot != null) {
|
||||||
|
screenshot.Location = ControlExtensions.InvisibleLocation;
|
||||||
|
}
|
||||||
|
|
||||||
owner.IsWaiting = false;
|
owner.IsWaiting = false;
|
||||||
disposer.Start();
|
disposer.Start();
|
||||||
}
|
}
|
||||||
@@ -141,7 +144,7 @@ namespace TweetDuck.Browser.Notification.Screenshot {
|
|||||||
debugger.Start();
|
debugger.Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void debugger_Tick(object sender, EventArgs e) {
|
private void debugger_Tick(object? sender, EventArgs e) {
|
||||||
if (frameCounter < 63) {
|
if (frameCounter < 63) {
|
||||||
int frame = ++frameCounter;
|
int frame = ++frameCounter;
|
||||||
screenshot.TakeScreenshot(true).ContinueWith(task => SaveDebugFrame(task, frame), TaskScheduler.FromCurrentSynchronizationContext());
|
screenshot.TakeScreenshot(true).ContinueWith(task => SaveDebugFrame(task, frame), TaskScheduler.FromCurrentSynchronizationContext());
|
||||||
|
@@ -40,13 +40,13 @@ namespace TweetDuck.Browser.Notification {
|
|||||||
".mp3" => "audio/mp3",
|
".mp3" => "audio/mp3",
|
||||||
".flac" => "audio/flac",
|
".flac" => "audio/flac",
|
||||||
".opus" => "audio/ogg; codecs=opus",
|
".opus" => "audio/ogg; codecs=opus",
|
||||||
_ => null
|
_ => "application/octet-stream"
|
||||||
};
|
};
|
||||||
|
|
||||||
try {
|
try {
|
||||||
return (File.ReadAllBytes(path), mimeType);
|
return (File.ReadAllBytes(path), mimeType);
|
||||||
} catch {
|
} catch {
|
||||||
FormBrowser browser = FormManager.TryFind<FormBrowser>();
|
FormBrowser? browser = FormManager.TryFind<FormBrowser>();
|
||||||
|
|
||||||
browser?.InvokeAsyncSafe(() => {
|
browser?.InvokeAsyncSafe(() => {
|
||||||
using FormMessage form = new FormMessage("Sound Notification Error", "Could not find custom notification sound file:\n" + path, MessageBoxIcon.Error);
|
using FormMessage form = new FormMessage("Sound Notification Error", "Could not find custom notification sound file:\n" + path, MessageBoxIcon.Error);
|
||||||
|
@@ -17,8 +17,8 @@ namespace TweetDuck.Browser {
|
|||||||
|
|
||||||
private static UserConfig Config => Program.Config.User;
|
private static UserConfig Config => Program.Config.User;
|
||||||
|
|
||||||
public event EventHandler ClickRestore;
|
public event EventHandler? ClickRestore;
|
||||||
public event EventHandler ClickClose;
|
public event EventHandler? ClickClose;
|
||||||
|
|
||||||
public bool Visible {
|
public bool Visible {
|
||||||
get {
|
get {
|
||||||
@@ -85,30 +85,30 @@ namespace TweetDuck.Browser {
|
|||||||
|
|
||||||
// event handlers
|
// event handlers
|
||||||
|
|
||||||
private void Config_MuteToggled(object sender, EventArgs e) {
|
private void Config_MuteToggled(object? sender, EventArgs e) {
|
||||||
UpdateIcon();
|
UpdateIcon();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void trayIcon_MouseClick(object sender, MouseEventArgs e) {
|
private void trayIcon_MouseClick(object? sender, MouseEventArgs e) {
|
||||||
if (e.Button == MouseButtons.Left) {
|
if (e.Button == MouseButtons.Left) {
|
||||||
menuItemRestore_Click(sender, e);
|
menuItemRestore_Click(sender, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void contextMenu_Popup(object sender, EventArgs e) {
|
private void contextMenu_Popup(object? sender, EventArgs e) {
|
||||||
((ToolStripMenuItem) contextMenu.Items[1]).Checked = Config.MuteNotifications;
|
((ToolStripMenuItem) contextMenu.Items[1]).Checked = Config.MuteNotifications;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void menuItemRestore_Click(object sender, EventArgs e) {
|
private void menuItemRestore_Click(object? sender, EventArgs e) {
|
||||||
ClickRestore?.Invoke(this, e);
|
ClickRestore?.Invoke(this, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void menuItemMuteNotifications_Click(object sender, EventArgs e) {
|
private void menuItemMuteNotifications_Click(object? sender, EventArgs e) {
|
||||||
Config.MuteNotifications = !((ToolStripMenuItem) contextMenu.Items[1]).Checked;
|
Config.MuteNotifications = !((ToolStripMenuItem) contextMenu.Items[1]).Checked;
|
||||||
Config.Save();
|
Config.Save();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void menuItemClose_Click(object sender, EventArgs e) {
|
private void menuItemClose_Click(object? sender, EventArgs e) {
|
||||||
ClickClose?.Invoke(this, e);
|
ClickClose?.Invoke(this, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -21,7 +21,7 @@ namespace TweetDuck.Configuration {
|
|||||||
return Current.HasFlag(flag);
|
return Current.HasFlag(flag);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static string GetValue(string key) {
|
public static string? GetValue(string key) {
|
||||||
return Current.GetValue(key);
|
return Current.GetValue(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -29,18 +29,18 @@ namespace TweetDuck.Configuration {
|
|||||||
public bool EnableAnimatedImages { get; set; } = true;
|
public bool EnableAnimatedImages { get; set; } = true;
|
||||||
public bool HideTweetsByNftUsers { get; set; } = false;
|
public bool HideTweetsByNftUsers { get; set; } = false;
|
||||||
|
|
||||||
private bool _enableSmoothScrolling = true;
|
private bool _enableSmoothScrolling = true;
|
||||||
private string _customCefArgs = null;
|
private string? _customCefArgs = null;
|
||||||
|
|
||||||
public string BrowserPath { get; set; } = null;
|
public string? BrowserPath { get; set; } = null;
|
||||||
public string BrowserPathArgs { get; set; } = null;
|
public string? BrowserPathArgs { get; set; } = null;
|
||||||
public bool IgnoreTrackingUrlWarning { get; set; } = false;
|
public bool IgnoreTrackingUrlWarning { get; set; } = false;
|
||||||
public string SearchEngineUrl { get; set; } = null;
|
public string? SearchEngineUrl { get; set; } = null;
|
||||||
private int _zoomLevel = 100;
|
private int _zoomLevel = 100;
|
||||||
|
|
||||||
public string VideoPlayerPath { get; set; } = null;
|
public string? VideoPlayerPath { get; set; } = null;
|
||||||
public string VideoPlayerPathArgs { get; set; } = null;
|
public string? VideoPlayerPathArgs { get; set; } = null;
|
||||||
public int VideoPlayerVolume { get; set; } = 50;
|
public int VideoPlayerVolume { get; set; } = 50;
|
||||||
|
|
||||||
public bool EnableSpellCheck { get; set; } = false;
|
public bool EnableSpellCheck { get; set; } = false;
|
||||||
private string _spellCheckLanguage = "en-US";
|
private string _spellCheckLanguage = "en-US";
|
||||||
@@ -51,8 +51,8 @@ namespace TweetDuck.Configuration {
|
|||||||
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;
|
||||||
|
|
||||||
public bool EnableUpdateCheck { get; set; } = true;
|
public bool EnableUpdateCheck { get; set; } = true;
|
||||||
public string DismissedUpdate { get; set; } = null;
|
public string? DismissedUpdate { get; set; } = null;
|
||||||
|
|
||||||
public bool DisplayNotificationColumn { get; set; } = false;
|
public bool DisplayNotificationColumn { get; set; } = false;
|
||||||
public bool NotificationMediaPreviews { get; set; } = true;
|
public bool NotificationMediaPreviews { get; set; } = true;
|
||||||
@@ -74,13 +74,13 @@ namespace TweetDuck.Configuration {
|
|||||||
public Size CustomNotificationSize { get; set; } = Size.Empty;
|
public Size CustomNotificationSize { get; set; } = Size.Empty;
|
||||||
public int NotificationScrollSpeed { get; set; } = 100;
|
public int NotificationScrollSpeed { get; set; } = 100;
|
||||||
|
|
||||||
private string _notificationSoundPath;
|
private string? _notificationSoundPath;
|
||||||
private int _notificationSoundVolume = 100;
|
private int _notificationSoundVolume = 100;
|
||||||
|
|
||||||
private bool _muteNotifications;
|
private bool _muteNotifications;
|
||||||
|
|
||||||
public string CustomBrowserCSS { get; set; } = null;
|
public string? CustomBrowserCSS { get; set; } = null;
|
||||||
public string CustomNotificationCSS { get; set; } = null;
|
public string? CustomNotificationCSS { get; set; } = null;
|
||||||
|
|
||||||
public bool DevToolsInContextMenu { get; set; } = false;
|
public bool DevToolsInContextMenu { get; set; } = false;
|
||||||
public bool DevToolsWindowOnTop { get; set; } = true;
|
public bool DevToolsWindowOnTop { get; set; } = true;
|
||||||
@@ -123,7 +123,7 @@ namespace TweetDuck.Configuration {
|
|||||||
set => UpdatePropertyWithCallback(ref _enableSmoothScrolling, value, App.ConfigManager.TriggerProgramRestartRequested);
|
set => UpdatePropertyWithCallback(ref _enableSmoothScrolling, value, App.ConfigManager.TriggerProgramRestartRequested);
|
||||||
}
|
}
|
||||||
|
|
||||||
public string CustomCefArgs {
|
public string? CustomCefArgs {
|
||||||
get => _customCefArgs;
|
get => _customCefArgs;
|
||||||
set => UpdatePropertyWithCallback(ref _customCefArgs, value, App.ConfigManager.TriggerProgramRestartRequested);
|
set => UpdatePropertyWithCallback(ref _customCefArgs, value, App.ConfigManager.TriggerProgramRestartRequested);
|
||||||
}
|
}
|
||||||
@@ -149,11 +149,11 @@ namespace TweetDuck.Configuration {
|
|||||||
|
|
||||||
// EVENTS
|
// EVENTS
|
||||||
|
|
||||||
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;
|
public event EventHandler? SoundNotificationChanged;
|
||||||
public event EventHandler OptionsDialogClosed;
|
public event EventHandler? OptionsDialogClosed;
|
||||||
|
|
||||||
public void TriggerOptionsDialogClosed() {
|
public void TriggerOptionsDialogClosed() {
|
||||||
OptionsDialogClosed?.Invoke(this, EventArgs.Empty);
|
OptionsDialogClosed?.Invoke(this, EventArgs.Empty);
|
||||||
|
@@ -74,8 +74,8 @@ namespace TweetDuck.Controls {
|
|||||||
|
|
||||||
public static void EnableMultilineShortcuts(this TextBox textBox) {
|
public static void EnableMultilineShortcuts(this TextBox textBox) {
|
||||||
textBox.KeyDown += (sender, args) => {
|
textBox.KeyDown += (sender, args) => {
|
||||||
if (args.Control && args.KeyCode == Keys.A) {
|
if (args.Control && args.KeyCode == Keys.A && sender is TextBox tb) {
|
||||||
((TextBox) sender).SelectAll();
|
tb.SelectAll();
|
||||||
args.SuppressKeyPress = true;
|
args.SuppressKeyPress = true;
|
||||||
args.Handled = true;
|
args.Handled = true;
|
||||||
}
|
}
|
||||||
|
@@ -9,7 +9,7 @@ namespace TweetDuck.Controls {
|
|||||||
GotFocus += FlatButton_GotFocus;
|
GotFocus += FlatButton_GotFocus;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void FlatButton_GotFocus(object sender, EventArgs e) { // removes extra border when focused
|
private void FlatButton_GotFocus(object? sender, EventArgs e) { // removes extra border when focused
|
||||||
NotifyDefault(false);
|
NotifyDefault(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -3,7 +3,7 @@ using System.Windows.Forms;
|
|||||||
|
|
||||||
namespace TweetDuck.Controls {
|
namespace TweetDuck.Controls {
|
||||||
sealed class NumericUpDownEx : NumericUpDown {
|
sealed class NumericUpDownEx : NumericUpDown {
|
||||||
public string TextSuffix { get; set ; }
|
public string? TextSuffix { get; set; }
|
||||||
|
|
||||||
protected override void UpdateEditText() {
|
protected override void UpdateEditText() {
|
||||||
base.UpdateEditText();
|
base.UpdateEditText();
|
||||||
|
@@ -27,15 +27,15 @@ namespace TweetDuck.Dialogs {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnLinkClicked(object sender, LinkLabelLinkClickedEventArgs e) {
|
private void OnLinkClicked(object? sender, LinkLabelLinkClickedEventArgs e) {
|
||||||
App.SystemHandler.OpenBrowser(e.Link.LinkData as string);
|
App.SystemHandler.OpenBrowser(e.Link.LinkData as string);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void FormAbout_HelpRequested(object sender, HelpEventArgs hlpevent) {
|
private void FormAbout_HelpRequested(object? sender, HelpEventArgs hlpevent) {
|
||||||
ShowGuide();
|
ShowGuide();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void FormAbout_HelpButtonClicked(object sender, CancelEventArgs e) {
|
private void FormAbout_HelpButtonClicked(object? sender, CancelEventArgs e) {
|
||||||
e.Cancel = true;
|
e.Cancel = true;
|
||||||
ShowGuide();
|
ShowGuide();
|
||||||
}
|
}
|
||||||
|
@@ -12,12 +12,12 @@ namespace TweetDuck.Dialogs {
|
|||||||
sealed partial class FormGuide : Form, FormManager.IAppDialog {
|
sealed partial class FormGuide : Form, FormManager.IAppDialog {
|
||||||
private const string GuideUrl = "td://guide/index.html";
|
private const string GuideUrl = "td://guide/index.html";
|
||||||
|
|
||||||
public static void Show(string hash = null) {
|
public static void Show(string? hash = null) {
|
||||||
string url = GuideUrl + (string.IsNullOrEmpty(hash) ? string.Empty : "#" + hash);
|
string url = GuideUrl + (string.IsNullOrEmpty(hash) ? string.Empty : "#" + hash);
|
||||||
FormGuide guide = FormManager.TryFind<FormGuide>();
|
FormGuide? guide = FormManager.TryFind<FormGuide>();
|
||||||
|
|
||||||
if (guide == null) {
|
if (guide == null) {
|
||||||
FormBrowser owner = FormManager.TryFind<FormBrowser>();
|
FormBrowser? owner = FormManager.TryFind<FormBrowser>();
|
||||||
|
|
||||||
if (owner != null) {
|
if (owner != null) {
|
||||||
new FormGuide(url, owner).Show(owner);
|
new FormGuide(url, owner).Show(owner);
|
||||||
|
@@ -22,23 +22,23 @@ namespace TweetDuck.Dialogs {
|
|||||||
public const string Ignore = "Ignore";
|
public const string Ignore = "Ignore";
|
||||||
public const string Exit = "Exit";
|
public const string Exit = "Exit";
|
||||||
|
|
||||||
public static bool Information(string caption, string text, string buttonAccept, string buttonCancel = null) {
|
public static bool Information(string caption, string text, string buttonAccept, string? buttonCancel = null) {
|
||||||
return Show(caption, text, MessageBoxIcon.Information, buttonAccept, buttonCancel);
|
return Show(caption, text, MessageBoxIcon.Information, buttonAccept, buttonCancel);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool Warning(string caption, string text, string buttonAccept, string buttonCancel = null) {
|
public static bool Warning(string caption, string text, string buttonAccept, string? buttonCancel = null) {
|
||||||
return Show(caption, text, MessageBoxIcon.Warning, buttonAccept, buttonCancel);
|
return Show(caption, text, MessageBoxIcon.Warning, buttonAccept, buttonCancel);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool Error(string caption, string text, string buttonAccept, string buttonCancel = null) {
|
public static bool Error(string caption, string text, string buttonAccept, string? buttonCancel = null) {
|
||||||
return Show(caption, text, MessageBoxIcon.Error, buttonAccept, buttonCancel);
|
return Show(caption, text, MessageBoxIcon.Error, buttonAccept, buttonCancel);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool Question(string caption, string text, string buttonAccept, string buttonCancel = null) {
|
public static bool Question(string caption, string text, string buttonAccept, string? buttonCancel = null) {
|
||||||
return Show(caption, text, MessageBoxIcon.Question, buttonAccept, buttonCancel);
|
return Show(caption, text, MessageBoxIcon.Question, buttonAccept, buttonCancel);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool Show(string caption, string text, MessageBoxIcon icon, string buttonAccept, string buttonCancel = null) {
|
public static bool Show(string caption, string text, MessageBoxIcon icon, string buttonAccept, string? buttonCancel = null) {
|
||||||
using FormMessage message = new FormMessage(caption, text, icon);
|
using FormMessage message = new FormMessage(caption, text, icon);
|
||||||
|
|
||||||
if (buttonCancel == null) {
|
if (buttonCancel == null) {
|
||||||
@@ -54,7 +54,7 @@ namespace TweetDuck.Dialogs {
|
|||||||
|
|
||||||
// Instance
|
// Instance
|
||||||
|
|
||||||
public Button ClickedButton { get; private set; }
|
public Button? ClickedButton { get; private set; }
|
||||||
|
|
||||||
public bool HasIcon => icon != null;
|
public bool HasIcon => icon != null;
|
||||||
public int ActionPanelY => panelActions.Location.Y;
|
public int ActionPanelY => panelActions.Location.Y;
|
||||||
@@ -68,7 +68,7 @@ namespace TweetDuck.Dialogs {
|
|||||||
get => BrowserUtils.Scale(96, dpiScale);
|
get => BrowserUtils.Scale(96, dpiScale);
|
||||||
}
|
}
|
||||||
|
|
||||||
private readonly Icon icon;
|
private readonly Icon? icon;
|
||||||
private readonly bool isReady;
|
private readonly bool isReady;
|
||||||
private readonly float dpiScale;
|
private readonly float dpiScale;
|
||||||
|
|
||||||
@@ -115,7 +115,7 @@ namespace TweetDuck.Dialogs {
|
|||||||
this.labelMessage.Text = text.Replace("\r", "").Replace("\n", Environment.NewLine);
|
this.labelMessage.Text = text.Replace("\r", "").Replace("\n", Environment.NewLine);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void FormMessage_SizeChanged(object sender, EventArgs e) {
|
private void FormMessage_SizeChanged(object? sender, EventArgs e) {
|
||||||
RecalculateButtonLocation();
|
RecalculateButtonLocation();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -135,7 +135,7 @@ namespace TweetDuck.Dialogs {
|
|||||||
};
|
};
|
||||||
|
|
||||||
button.Click += (sender, args) => {
|
button.Click += (sender, args) => {
|
||||||
ClickedButton = (Button) sender;
|
ClickedButton = button;
|
||||||
DialogResult = result;
|
DialogResult = result;
|
||||||
Close();
|
Close();
|
||||||
};
|
};
|
||||||
@@ -181,7 +181,7 @@ namespace TweetDuck.Dialogs {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void labelMessage_SizeChanged(object sender, EventArgs e) {
|
private void labelMessage_SizeChanged(object? sender, EventArgs e) {
|
||||||
if (!isReady) {
|
if (!isReady) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@@ -16,11 +16,12 @@ namespace TweetDuck.Dialogs {
|
|||||||
|
|
||||||
private readonly PluginManager pluginManager;
|
private readonly PluginManager pluginManager;
|
||||||
|
|
||||||
|
#pragma warning disable CS8618
|
||||||
private FormPlugins() {
|
private FormPlugins() {
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
Text = Program.BrandName + " Plugins";
|
Text = Program.BrandName + " Plugins";
|
||||||
}
|
}
|
||||||
|
#pragma warning restore CS8618
|
||||||
|
|
||||||
public FormPlugins(PluginManager pluginManager) : this() {
|
public FormPlugins(PluginManager pluginManager) : this() {
|
||||||
this.pluginManager = pluginManager;
|
this.pluginManager = pluginManager;
|
||||||
@@ -68,7 +69,7 @@ namespace TweetDuck.Dialogs {
|
|||||||
timerLayout.Start();
|
timerLayout.Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void timerLayout_Tick(object sender, EventArgs e) {
|
private void timerLayout_Tick(object? sender, EventArgs e) {
|
||||||
timerLayout.Stop();
|
timerLayout.Stop();
|
||||||
|
|
||||||
// stupid WinForms scrollbars and panels
|
// stupid WinForms scrollbars and panels
|
||||||
@@ -76,8 +77,8 @@ namespace TweetDuck.Dialogs {
|
|||||||
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void flowLayoutPlugins_Resize(object sender, EventArgs e) {
|
private void flowLayoutPlugins_Resize(object? sender, EventArgs e) {
|
||||||
Control lastPlugin = flowLayoutPlugins.Controls.OfType<PluginControl>().LastOrDefault();
|
Control? lastPlugin = flowLayoutPlugins.Controls.OfType<PluginControl>().LastOrDefault();
|
||||||
|
|
||||||
if (lastPlugin == null) {
|
if (lastPlugin == null) {
|
||||||
return;
|
return;
|
||||||
@@ -93,22 +94,22 @@ namespace TweetDuck.Dialogs {
|
|||||||
control.Width = flowLayoutPlugins.Width - control.Margin.Horizontal - horizontalOffset;
|
control.Width = flowLayoutPlugins.Width - control.Margin.Horizontal - horizontalOffset;
|
||||||
}
|
}
|
||||||
|
|
||||||
flowLayoutPlugins.Controls[flowLayoutPlugins.Controls.Count - 1].Visible = !showScrollBar;
|
flowLayoutPlugins.Controls[^1].Visible = !showScrollBar;
|
||||||
flowLayoutPlugins.Focus();
|
flowLayoutPlugins.Focus();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnOpenFolder_Click(object sender, EventArgs e) {
|
private void btnOpenFolder_Click(object? sender, EventArgs e) {
|
||||||
App.SystemHandler.OpenFileExplorer(pluginManager.GetPluginFolder(PluginGroup.Custom));
|
App.SystemHandler.OpenFileExplorer(pluginManager.GetPluginFolder(PluginGroup.Custom));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnReload_Click(object sender, EventArgs e) {
|
private void btnReload_Click(object? sender, EventArgs e) {
|
||||||
if (FormMessage.Warning("Reloading Plugins", "This will also reload the browser window. Do you want to proceed?", FormMessage.Yes, FormMessage.No)) {
|
if (FormMessage.Warning("Reloading Plugins", "This will also reload the browser window. Do you want to proceed?", FormMessage.Yes, FormMessage.No)) {
|
||||||
pluginManager.Reload();
|
pluginManager.Reload();
|
||||||
ReloadPluginList();
|
ReloadPluginList();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnClose_Click(object sender, EventArgs e) {
|
private void btnClose_Click(object? sender, EventArgs e) {
|
||||||
Close();
|
Close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -25,9 +25,9 @@ namespace TweetDuck.Dialogs {
|
|||||||
private readonly int buttonHeight;
|
private readonly int buttonHeight;
|
||||||
|
|
||||||
private readonly Dictionary<Type, SettingsTab> tabs = new Dictionary<Type, SettingsTab>(8);
|
private readonly Dictionary<Type, SettingsTab> tabs = new Dictionary<Type, SettingsTab>(8);
|
||||||
private SettingsTab currentTab;
|
private SettingsTab? currentTab;
|
||||||
|
|
||||||
public FormSettings(FormBrowser browser, PluginManager plugins, UpdateChecker updates, TweetDeckFunctions tweetDeckFunctions, Type startTab) {
|
public FormSettings(FormBrowser browser, PluginManager plugins, UpdateChecker updates, TweetDeckFunctions tweetDeckFunctions, Type? startTab) {
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
Text = Program.BrandName + " Options";
|
Text = Program.BrandName + " Options";
|
||||||
@@ -56,19 +56,19 @@ namespace TweetDuck.Dialogs {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void PrepareUnload() { // TODO refactor this further later
|
private void PrepareUnload() { // TODO refactor this further later
|
||||||
currentTab.Control.OnClosing();
|
currentTab?.Control.OnClosing();
|
||||||
|
|
||||||
App.ConfigManager.ProgramRestartRequested -= Config_ProgramRestartRequested;
|
App.ConfigManager.ProgramRestartRequested -= Config_ProgramRestartRequested;
|
||||||
App.ConfigManager.SaveAll();
|
App.ConfigManager.SaveAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Config_ProgramRestartRequested(object sender, EventArgs e) {
|
private void Config_ProgramRestartRequested(object? sender, EventArgs e) {
|
||||||
if (FormMessage.Information("TweetDuck Options", "The application must restart for the option to take place. Do you want to restart now?", FormMessage.Yes, FormMessage.No)) {
|
if (FormMessage.Information("TweetDuck Options", "The application must restart for the option to take place. Do you want to restart now?", FormMessage.Yes, FormMessage.No)) {
|
||||||
Program.Restart();
|
Program.Restart();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void FormSettings_FormClosing(object sender, FormClosingEventArgs e) {
|
private void FormSettings_FormClosing(object? sender, FormClosingEventArgs e) {
|
||||||
PrepareUnload();
|
PrepareUnload();
|
||||||
|
|
||||||
foreach (SettingsTab tab in tabs.Values) {
|
foreach (SettingsTab tab in tabs.Values) {
|
||||||
@@ -80,7 +80,7 @@ namespace TweetDuck.Dialogs {
|
|||||||
browser.ResumeNotification(NotificationPauseReason.SettingsDialogOpen);
|
browser.ResumeNotification(NotificationPauseReason.SettingsDialogOpen);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnManageOptions_Click(object sender, EventArgs e) {
|
private void btnManageOptions_Click(object? sender, EventArgs e) {
|
||||||
PrepareUnload();
|
PrepareUnload();
|
||||||
|
|
||||||
using DialogSettingsManage dialog = new DialogSettingsManage(plugins);
|
using DialogSettingsManage dialog = new DialogSettingsManage(plugins);
|
||||||
@@ -104,7 +104,7 @@ namespace TweetDuck.Dialogs {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnClose_Click(object sender, EventArgs e) {
|
private void btnClose_Click(object? sender, EventArgs e) {
|
||||||
Close();
|
Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -128,7 +128,7 @@ namespace TweetDuck.Dialogs {
|
|||||||
|
|
||||||
panelButtons.Controls.Add(new Panel {
|
panelButtons.Controls.Add(new Panel {
|
||||||
BackColor = Color.DimGray,
|
BackColor = Color.DimGray,
|
||||||
Location = new Point(0, panelButtons.Controls[panelButtons.Controls.Count - 1].Location.Y + buttonHeight),
|
Location = new Point(0, panelButtons.Controls[^1].Location.Y + buttonHeight),
|
||||||
Margin = new Padding(0),
|
Margin = new Padding(0),
|
||||||
Size = new Size(panelButtons.Width, 1)
|
Size = new Size(panelButtons.Width, 1)
|
||||||
});
|
});
|
||||||
@@ -182,7 +182,7 @@ namespace TweetDuck.Dialogs {
|
|||||||
currentTab = tab;
|
currentTab = tab;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void control_MouseLeave(object sender, EventArgs e) {
|
private void control_MouseLeave(object? sender, EventArgs e) {
|
||||||
if (sender is ComboBox { DroppedDown: true } ) {
|
if (sender is ComboBox { DroppedDown: true } ) {
|
||||||
return; // prevents comboboxes from closing when MouseLeave event triggers during opening animation
|
return; // prevents comboboxes from closing when MouseLeave event triggers during opening animation
|
||||||
}
|
}
|
||||||
@@ -190,7 +190,7 @@ namespace TweetDuck.Dialogs {
|
|||||||
panelContents.Focus();
|
panelContents.Focus();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void control_MouseWheel(object sender, MouseEventArgs e) {
|
private void control_MouseWheel(object? sender, MouseEventArgs e) {
|
||||||
((HandledMouseEventArgs) e).Handled = true;
|
((HandledMouseEventArgs) e).Handled = true;
|
||||||
panelContents.Focus();
|
panelContents.Focus();
|
||||||
}
|
}
|
||||||
@@ -202,7 +202,7 @@ namespace TweetDuck.Dialogs {
|
|||||||
public bool IsInitialized => control != null;
|
public bool IsInitialized => control != null;
|
||||||
|
|
||||||
private readonly Func<BaseTab> constructor;
|
private readonly Func<BaseTab> constructor;
|
||||||
private BaseTab control;
|
private BaseTab? control;
|
||||||
|
|
||||||
public SettingsTab(Button button, Func<BaseTab> constructor) {
|
public SettingsTab(Button button, Func<BaseTab> constructor) {
|
||||||
this.Button = button;
|
this.Button = button;
|
||||||
|
@@ -12,7 +12,7 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
private readonly Action<string> reinjectBrowserCSS;
|
private readonly Action<string> reinjectBrowserCSS;
|
||||||
private readonly Action openDevTools;
|
private readonly Action openDevTools;
|
||||||
|
|
||||||
public DialogSettingsCSS(string browserCSS, string notificationCSS, Action<string> reinjectBrowserCSS, Action openDevTools) {
|
public DialogSettingsCSS(string? browserCSS, string? notificationCSS, Action<string> reinjectBrowserCSS, Action openDevTools) {
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
Text = Program.BrandName + " Options - CSS";
|
Text = Program.BrandName + " Options - CSS";
|
||||||
@@ -30,8 +30,8 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
textBoxBrowserCSS.Select(textBoxBrowserCSS.TextLength, 0);
|
textBoxBrowserCSS.Select(textBoxBrowserCSS.TextLength, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void tabPanel_SelectedIndexChanged(object sender, EventArgs e) {
|
private void tabPanel_SelectedIndexChanged(object? sender, EventArgs e) {
|
||||||
TextBox tb = tabPanel.SelectedTab.Controls.OfType<TextBox>().FirstOrDefault();
|
TextBox? tb = tabPanel.SelectedTab.Controls.OfType<TextBox>().FirstOrDefault();
|
||||||
|
|
||||||
if (tb != null) {
|
if (tb != null) {
|
||||||
tb.Focus();
|
tb.Focus();
|
||||||
@@ -39,8 +39,8 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void textBoxCSS_KeyDown(object sender, KeyEventArgs e) {
|
private void textBoxCSS_KeyDown(object? sender, KeyEventArgs e) {
|
||||||
TextBox tb = (TextBox) sender;
|
TextBox tb = (TextBox) sender!;
|
||||||
string text = tb.Text;
|
string text = tb.Text;
|
||||||
|
|
||||||
if (e.KeyCode == Keys.Back && e.Modifiers == Keys.Control) {
|
if (e.KeyCode == Keys.Back && e.Modifiers == Keys.Control) {
|
||||||
@@ -79,7 +79,7 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
}
|
}
|
||||||
else if (e.KeyCode == Keys.Enter && e.Modifiers == Keys.None && tb.SelectionLength == 0) {
|
else if (e.KeyCode == Keys.Enter && e.Modifiers == Keys.None && tb.SelectionLength == 0) {
|
||||||
int insertAt = tb.SelectionStart, cursorOffset = 0;
|
int insertAt = tb.SelectionStart, cursorOffset = 0;
|
||||||
string insertText;
|
string? insertText;
|
||||||
|
|
||||||
if (insertAt == 0) {
|
if (insertAt == 0) {
|
||||||
return;
|
return;
|
||||||
@@ -97,8 +97,9 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
int lineStart = text.LastIndexOf('\n', tb.SelectionStart - 1);
|
int lineStart = text.LastIndexOf('\n', tb.SelectionStart - 1);
|
||||||
|
var firstIndex = (lineStart == -1 ? 0 : lineStart + 1);
|
||||||
Match match = Regex.Match(text.Substring(lineStart == -1 ? 0 : lineStart + 1), "^([ \t]+)");
|
|
||||||
|
Match match = Regex.Match(text[firstIndex..], "^([ \t]+)");
|
||||||
insertText = match.Success ? Environment.NewLine + match.Groups[1].Value : null;
|
insertText = match.Success ? Environment.NewLine + match.Groups[1].Value : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -110,26 +111,26 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void textBoxBrowserCSS_KeyUp(object sender, KeyEventArgs e) {
|
private void textBoxBrowserCSS_KeyUp(object? sender, KeyEventArgs e) {
|
||||||
timerTestBrowser.Stop();
|
timerTestBrowser.Stop();
|
||||||
timerTestBrowser.Start();
|
timerTestBrowser.Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void timerTestBrowser_Tick(object sender, EventArgs e) {
|
private void timerTestBrowser_Tick(object? sender, EventArgs e) {
|
||||||
reinjectBrowserCSS(textBoxBrowserCSS.Text);
|
reinjectBrowserCSS(textBoxBrowserCSS.Text);
|
||||||
timerTestBrowser.Stop();
|
timerTestBrowser.Stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnOpenDevTools_Click(object sender, EventArgs e) {
|
private void btnOpenDevTools_Click(object? sender, EventArgs e) {
|
||||||
openDevTools();
|
openDevTools();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnApply_Click(object sender, EventArgs e) {
|
private void btnApply_Click(object? sender, EventArgs e) {
|
||||||
DialogResult = DialogResult.OK;
|
DialogResult = DialogResult.OK;
|
||||||
Close();
|
Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnCancel_Click(object sender, EventArgs e) {
|
private void btnCancel_Click(object? sender, EventArgs e) {
|
||||||
DialogResult = DialogResult.Cancel;
|
DialogResult = DialogResult.Cancel;
|
||||||
Close();
|
Close();
|
||||||
}
|
}
|
||||||
|
@@ -10,7 +10,7 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
|
|
||||||
private readonly string initialArgs;
|
private readonly string initialArgs;
|
||||||
|
|
||||||
public DialogSettingsCefArgs(string args) {
|
public DialogSettingsCefArgs(string? args) {
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
Text = Program.BrandName + " Options - CEF Arguments";
|
Text = Program.BrandName + " Options - CEF Arguments";
|
||||||
@@ -20,11 +20,11 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
textBoxArgs.Select(textBoxArgs.Text.Length, 0);
|
textBoxArgs.Select(textBoxArgs.Text.Length, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnHelp_Click(object sender, EventArgs e) {
|
private void btnHelp_Click(object? sender, EventArgs e) {
|
||||||
App.SystemHandler.OpenBrowser("http://peter.sh/experiments/chromium-command-line-switches/");
|
App.SystemHandler.OpenBrowser("http://peter.sh/experiments/chromium-command-line-switches/");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnApply_Click(object sender, EventArgs e) {
|
private void btnApply_Click(object? sender, EventArgs e) {
|
||||||
if (CefArgs == initialArgs) {
|
if (CefArgs == initialArgs) {
|
||||||
DialogResult = DialogResult.Cancel;
|
DialogResult = DialogResult.Cancel;
|
||||||
Close();
|
Close();
|
||||||
@@ -40,7 +40,7 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnCancel_Click(object sender, EventArgs e) {
|
private void btnCancel_Click(object? sender, EventArgs e) {
|
||||||
DialogResult = DialogResult.Cancel;
|
DialogResult = DialogResult.Cancel;
|
||||||
Close();
|
Close();
|
||||||
}
|
}
|
||||||
|
@@ -5,12 +5,12 @@ using IOPath = System.IO.Path;
|
|||||||
|
|
||||||
namespace TweetDuck.Dialogs.Settings {
|
namespace TweetDuck.Dialogs.Settings {
|
||||||
sealed partial class DialogSettingsExternalProgram : Form {
|
sealed partial class DialogSettingsExternalProgram : Form {
|
||||||
public string Path {
|
public string? Path {
|
||||||
get => StringUtils.NullIfEmpty(textBoxPath.Text);
|
get => StringUtils.NullIfEmpty(textBoxPath.Text);
|
||||||
set => textBoxPath.Text = value ?? string.Empty;
|
set => textBoxPath.Text = value ?? string.Empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
public string Args {
|
public string? Args {
|
||||||
get => StringUtils.NullIfEmpty(textBoxArgs.Text);
|
get => StringUtils.NullIfEmpty(textBoxArgs.Text);
|
||||||
set => textBoxArgs.Text = value ?? string.Empty;
|
set => textBoxArgs.Text = value ?? string.Empty;
|
||||||
}
|
}
|
||||||
@@ -27,7 +27,7 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
this.fileDialogTitle = fileDialogTitle;
|
this.fileDialogTitle = fileDialogTitle;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnBrowse_Click(object sender, EventArgs e) {
|
private void btnBrowse_Click(object? sender, EventArgs e) {
|
||||||
using OpenFileDialog dialog = new OpenFileDialog {
|
using OpenFileDialog dialog = new OpenFileDialog {
|
||||||
AutoUpgradeEnabled = true,
|
AutoUpgradeEnabled = true,
|
||||||
DereferenceLinks = true,
|
DereferenceLinks = true,
|
||||||
@@ -42,12 +42,12 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnApply_Click(object sender, EventArgs e) {
|
private void btnApply_Click(object? sender, EventArgs e) {
|
||||||
DialogResult = DialogResult.OK;
|
DialogResult = DialogResult.OK;
|
||||||
Close();
|
Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnCancel_Click(object sender, EventArgs e) {
|
private void btnCancel_Click(object? sender, EventArgs e) {
|
||||||
DialogResult = DialogResult.Cancel;
|
DialogResult = DialogResult.Cancel;
|
||||||
Close();
|
Close();
|
||||||
}
|
}
|
||||||
|
@@ -35,7 +35,7 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
private readonly bool openImportImmediately;
|
private readonly bool openImportImmediately;
|
||||||
|
|
||||||
private State currentState;
|
private State currentState;
|
||||||
private ProfileManager importManager;
|
private ProfileManager? importManager;
|
||||||
private bool requestedRestartFromConfig;
|
private bool requestedRestartFromConfig;
|
||||||
|
|
||||||
private ProfileManager.Items _selectedItems = ProfileManager.Items.None;
|
private ProfileManager.Items _selectedItems = ProfileManager.Items.None;
|
||||||
@@ -59,16 +59,16 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void radioDecision_CheckedChanged(object sender, EventArgs e) {
|
private void radioDecision_CheckedChanged(object? sender, EventArgs e) {
|
||||||
btnContinue.Enabled = true;
|
btnContinue.Enabled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkBoxSelection_CheckedChanged(object sender, EventArgs e) {
|
private void checkBoxSelection_CheckedChanged(object? sender, EventArgs e) {
|
||||||
CheckBox cb = (CheckBox) sender;
|
CheckBox cb = (CheckBox) sender!;
|
||||||
SetFlag(checkBoxMap[cb], cb.Checked);
|
SetFlag(checkBoxMap[cb], cb.Checked);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnContinue_Click(object sender, EventArgs e) {
|
private void btnContinue_Click(object? sender, EventArgs e) {
|
||||||
string file;
|
string file;
|
||||||
|
|
||||||
switch (currentState) {
|
switch (currentState) {
|
||||||
@@ -167,7 +167,7 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case State.Import:
|
case State.Import:
|
||||||
if (importManager.Import(SelectedItems)) {
|
if (importManager!.Import(SelectedItems)) {
|
||||||
App.ConfigManager.ProgramRestartRequested += Config_ProgramRestartRequested;
|
App.ConfigManager.ProgramRestartRequested += Config_ProgramRestartRequested;
|
||||||
App.ConfigManager.ReloadAll();
|
App.ConfigManager.ReloadAll();
|
||||||
App.ConfigManager.SaveAll();
|
App.ConfigManager.SaveAll();
|
||||||
@@ -209,12 +209,12 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnCancel_Click(object sender, EventArgs e) {
|
private void btnCancel_Click(object? sender, EventArgs e) {
|
||||||
DialogResult = DialogResult.Cancel;
|
DialogResult = DialogResult.Cancel;
|
||||||
Close();
|
Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Config_ProgramRestartRequested(object sender, EventArgs e) {
|
private void Config_ProgramRestartRequested(object? sender, EventArgs e) {
|
||||||
requestedRestartFromConfig = true;
|
requestedRestartFromConfig = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -6,7 +6,7 @@ using TweetLib.Utils.Collections;
|
|||||||
|
|
||||||
namespace TweetDuck.Dialogs.Settings {
|
namespace TweetDuck.Dialogs.Settings {
|
||||||
sealed partial class DialogSettingsRestart : Form {
|
sealed partial class DialogSettingsRestart : Form {
|
||||||
public CommandLineArgs Args { get; private set; }
|
public CommandLineArgs Args { get; private set; } = null!;
|
||||||
|
|
||||||
public DialogSettingsRestart(CommandLineArgs currentArgs) {
|
public DialogSettingsRestart(CommandLineArgs currentArgs) {
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
@@ -28,7 +28,7 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
Text = Program.BrandName + " Arguments";
|
Text = Program.BrandName + " Arguments";
|
||||||
}
|
}
|
||||||
|
|
||||||
private void control_Change(object sender, EventArgs e) {
|
private void control_Change(object? sender, EventArgs e) {
|
||||||
Args = new CommandLineArgs();
|
Args = new CommandLineArgs();
|
||||||
|
|
||||||
if (cbLogging.Checked) {
|
if (cbLogging.Checked) {
|
||||||
@@ -43,18 +43,18 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
tbShortcutTarget.Select(tbShortcutTarget.Text.Length, 0);
|
tbShortcutTarget.Select(tbShortcutTarget.Text.Length, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void tbShortcutTarget_Click(object sender, EventArgs e) {
|
private void tbShortcutTarget_Click(object? sender, EventArgs e) {
|
||||||
if (tbShortcutTarget.SelectionLength == 0) {
|
if (tbShortcutTarget.SelectionLength == 0) {
|
||||||
tbShortcutTarget.SelectAll();
|
tbShortcutTarget.SelectAll();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnRestart_Click(object sender, EventArgs e) {
|
private void btnRestart_Click(object? sender, EventArgs e) {
|
||||||
DialogResult = DialogResult.OK;
|
DialogResult = DialogResult.OK;
|
||||||
Close();
|
Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnCancel_Click(object sender, EventArgs e) {
|
private void btnCancel_Click(object? sender, EventArgs e) {
|
||||||
DialogResult = DialogResult.Cancel;
|
DialogResult = DialogResult.Cancel;
|
||||||
Close();
|
Close();
|
||||||
}
|
}
|
||||||
|
@@ -14,12 +14,12 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
textBoxUrl.Select(textBoxUrl.Text.Length, 0);
|
textBoxUrl.Select(textBoxUrl.Text.Length, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnApply_Click(object sender, EventArgs e) {
|
private void btnApply_Click(object? sender, EventArgs e) {
|
||||||
DialogResult = DialogResult.OK;
|
DialogResult = DialogResult.OK;
|
||||||
Close();
|
Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnCancel_Click(object sender, EventArgs e) {
|
private void btnCancel_Click(object? sender, EventArgs e) {
|
||||||
DialogResult = DialogResult.Cancel;
|
DialogResult = DialogResult.Cancel;
|
||||||
Close();
|
Close();
|
||||||
}
|
}
|
||||||
|
@@ -9,10 +9,10 @@ using TweetLib.Core;
|
|||||||
|
|
||||||
namespace TweetDuck.Dialogs.Settings {
|
namespace TweetDuck.Dialogs.Settings {
|
||||||
sealed partial class TabSettingsAdvanced : FormSettings.BaseTab {
|
sealed partial class TabSettingsAdvanced : FormSettings.BaseTab {
|
||||||
private readonly Action<string> reinjectBrowserCSS;
|
private readonly Action<string?> reinjectBrowserCSS;
|
||||||
private readonly Action openDevTools;
|
private readonly Action openDevTools;
|
||||||
|
|
||||||
public TabSettingsAdvanced(Action<string> reinjectBrowserCSS, Action openDevTools) {
|
public TabSettingsAdvanced(Action<string?> reinjectBrowserCSS, Action openDevTools) {
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
this.reinjectBrowserCSS = reinjectBrowserCSS;
|
this.reinjectBrowserCSS = reinjectBrowserCSS;
|
||||||
@@ -98,19 +98,19 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
|
|
||||||
#region Application
|
#region Application
|
||||||
|
|
||||||
private void btnOpenAppFolder_Click(object sender, EventArgs e) {
|
private void btnOpenAppFolder_Click(object? sender, EventArgs e) {
|
||||||
App.SystemHandler.OpenFileExplorer(App.ProgramPath);
|
App.SystemHandler.OpenFileExplorer(App.ProgramPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnOpenDataFolder_Click(object sender, EventArgs e) {
|
private void btnOpenDataFolder_Click(object? sender, EventArgs e) {
|
||||||
App.SystemHandler.OpenFileExplorer(App.StoragePath);
|
App.SystemHandler.OpenFileExplorer(App.StoragePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnRestart_Click(object sender, EventArgs e) {
|
private void btnRestart_Click(object? sender, EventArgs e) {
|
||||||
Program.Restart();
|
Program.Restart();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnRestartArgs_Click(object sender, EventArgs e) {
|
private void btnRestartArgs_Click(object? sender, EventArgs e) {
|
||||||
using DialogSettingsRestart dialog = new DialogSettingsRestart(Arguments.GetCurrentClean());
|
using DialogSettingsRestart dialog = new DialogSettingsRestart(Arguments.GetCurrentClean());
|
||||||
|
|
||||||
if (dialog.ShowDialog() == DialogResult.OK) {
|
if (dialog.ShowDialog() == DialogResult.OK) {
|
||||||
@@ -122,15 +122,15 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
|
|
||||||
#region Browser Settings
|
#region Browser Settings
|
||||||
|
|
||||||
private void checkTouchAdjustment_CheckedChanged(object sender, EventArgs e) {
|
private void checkTouchAdjustment_CheckedChanged(object? sender, EventArgs e) {
|
||||||
SysConfig.EnableTouchAdjustment = checkTouchAdjustment.Checked;
|
SysConfig.EnableTouchAdjustment = checkTouchAdjustment.Checked;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkAutomaticallyDetectColorProfile_CheckedChanged(object sender, EventArgs e) {
|
private void checkAutomaticallyDetectColorProfile_CheckedChanged(object? sender, EventArgs e) {
|
||||||
SysConfig.EnableColorProfileDetection = checkAutomaticallyDetectColorProfile.Checked;
|
SysConfig.EnableColorProfileDetection = checkAutomaticallyDetectColorProfile.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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -138,13 +138,13 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
|
|
||||||
#region Browser Cache
|
#region Browser Cache
|
||||||
|
|
||||||
private void btnClearCache_Click(object sender, EventArgs e) {
|
private void btnClearCache_Click(object? sender, EventArgs e) {
|
||||||
btnClearCache.Enabled = false;
|
btnClearCache.Enabled = false;
|
||||||
BrowserCache.SetClearOnExit();
|
BrowserCache.SetClearOnExit();
|
||||||
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) {
|
private void checkClearCacheAuto_CheckedChanged(object? sender, EventArgs e) {
|
||||||
numClearCacheThreshold.Enabled = checkClearCacheAuto.Checked;
|
numClearCacheThreshold.Enabled = checkClearCacheAuto.Checked;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -152,11 +152,12 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
|
|
||||||
#region Configuration
|
#region Configuration
|
||||||
|
|
||||||
private void btnEditCefArgs_Click(object sender, EventArgs e) {
|
private void btnEditCefArgs_Click(object? sender, EventArgs e) {
|
||||||
DialogSettingsCefArgs form = new DialogSettingsCefArgs(Config.CustomCefArgs);
|
var parentForm = ParentForm ?? throw new InvalidOperationException("Dialog does not have a parent form!");
|
||||||
|
var form = new DialogSettingsCefArgs(Config.CustomCefArgs);
|
||||||
|
|
||||||
form.VisibleChanged += (sender2, args2) => {
|
form.VisibleChanged += (sender2, args2) => {
|
||||||
form.MoveToCenter(ParentForm);
|
form.MoveToCenter(parentForm);
|
||||||
};
|
};
|
||||||
|
|
||||||
form.FormClosed += (sender2, args2) => {
|
form.FormClosed += (sender2, args2) => {
|
||||||
@@ -169,15 +170,16 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
form.Dispose();
|
form.Dispose();
|
||||||
};
|
};
|
||||||
|
|
||||||
form.Show(ParentForm);
|
form.Show(parentForm);
|
||||||
NativeMethods.SetFormDisabled(ParentForm, true);
|
NativeMethods.SetFormDisabled(parentForm, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnEditCSS_Click(object sender, EventArgs e) {
|
private void btnEditCSS_Click(object? sender, EventArgs e) {
|
||||||
DialogSettingsCSS form = new DialogSettingsCSS(Config.CustomBrowserCSS, Config.CustomNotificationCSS, reinjectBrowserCSS, openDevTools);
|
var parentForm = ParentForm ?? throw new InvalidOperationException("Dialog does not have a parent form!");
|
||||||
|
var form = new DialogSettingsCSS(Config.CustomBrowserCSS, Config.CustomNotificationCSS, reinjectBrowserCSS, openDevTools);
|
||||||
|
|
||||||
form.VisibleChanged += (sender2, args2) => {
|
form.VisibleChanged += (sender2, args2) => {
|
||||||
form.MoveToCenter(ParentForm);
|
form.MoveToCenter(parentForm);
|
||||||
};
|
};
|
||||||
|
|
||||||
form.FormClosed += (sender2, args2) => {
|
form.FormClosed += (sender2, args2) => {
|
||||||
@@ -192,8 +194,8 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
form.Dispose();
|
form.Dispose();
|
||||||
};
|
};
|
||||||
|
|
||||||
form.Show(ParentForm);
|
form.Show(parentForm);
|
||||||
NativeMethods.SetFormDisabled(ParentForm, true);
|
NativeMethods.SetFormDisabled(parentForm, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void RestoreParentForm() {
|
private void RestoreParentForm() {
|
||||||
@@ -206,7 +208,7 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
|
|
||||||
#region Proxy
|
#region Proxy
|
||||||
|
|
||||||
private void checkUseSystemProxyForAllConnections_CheckedChanged(object sender, EventArgs e) {
|
private void checkUseSystemProxyForAllConnections_CheckedChanged(object? sender, EventArgs e) {
|
||||||
SysConfig.UseSystemProxyForAllConnections = checkUseSystemProxyForAllConnections.Checked;
|
SysConfig.UseSystemProxyForAllConnections = checkUseSystemProxyForAllConnections.Checked;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -214,11 +216,11 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
|
|
||||||
#region Development Tools
|
#region Development Tools
|
||||||
|
|
||||||
private void checkDevToolsInContextMenuOnCheckedChanged(object sender, EventArgs e) {
|
private void checkDevToolsInContextMenuOnCheckedChanged(object? sender, EventArgs e) {
|
||||||
Config.DevToolsInContextMenu = checkDevToolsInContextMenu.Checked;
|
Config.DevToolsInContextMenu = checkDevToolsInContextMenu.Checked;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkDevToolsWindowOnTop_CheckedChanged(object sender, EventArgs e) {
|
private void checkDevToolsWindowOnTop_CheckedChanged(object? sender, EventArgs e) {
|
||||||
Config.DevToolsWindowOnTop = checkDevToolsWindowOnTop.Checked;
|
Config.DevToolsWindowOnTop = checkDevToolsWindowOnTop.Checked;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -13,7 +13,7 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
|
|
||||||
#region Feedback
|
#region Feedback
|
||||||
|
|
||||||
private void btnSendFeedback_Click(object sender, EventArgs e) {
|
private void btnSendFeedback_Click(object? sender, EventArgs e) {
|
||||||
App.SystemHandler.OpenBrowser(Lib.IssueTrackerUrl + "/new");
|
App.SystemHandler.OpenBrowser(Lib.IssueTrackerUrl + "/new");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -171,27 +171,27 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
|
|
||||||
#region User Interface
|
#region User Interface
|
||||||
|
|
||||||
private void checkExpandLinks_CheckedChanged(object sender, EventArgs e) {
|
private void checkExpandLinks_CheckedChanged(object? sender, EventArgs e) {
|
||||||
Config.ExpandLinksOnHover = checkExpandLinks.Checked;
|
Config.ExpandLinksOnHover = checkExpandLinks.Checked;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkFocusDmInput_CheckedChanged(object sender, EventArgs e) {
|
private void checkFocusDmInput_CheckedChanged(object? sender, EventArgs e) {
|
||||||
Config.FocusDmInput = checkFocusDmInput.Checked;
|
Config.FocusDmInput = checkFocusDmInput.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) {
|
private void checkKeepLikeFollowDialogsOpen_CheckedChanged(object? sender, EventArgs e) {
|
||||||
Config.KeepLikeFollowDialogsOpen = checkKeepLikeFollowDialogsOpen.Checked;
|
Config.KeepLikeFollowDialogsOpen = checkKeepLikeFollowDialogsOpen.Checked;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkSmoothScrolling_CheckedChanged(object sender, EventArgs e) {
|
private void checkSmoothScrolling_CheckedChanged(object? sender, EventArgs e) {
|
||||||
Config.EnableSmoothScrolling = checkSmoothScrolling.Checked;
|
Config.EnableSmoothScrolling = checkSmoothScrolling.Checked;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void trackBarZoom_ValueChanged(object sender, EventArgs e) {
|
private void trackBarZoom_ValueChanged(object? sender, EventArgs e) {
|
||||||
if (trackBarZoom.AlignValueToTick()) {
|
if (trackBarZoom.AlignValueToTick()) {
|
||||||
zoomUpdateTimer.Stop();
|
zoomUpdateTimer.Stop();
|
||||||
zoomUpdateTimer.Start();
|
zoomUpdateTimer.Start();
|
||||||
@@ -199,7 +199,7 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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();
|
||||||
}
|
}
|
||||||
@@ -208,16 +208,16 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
|
|
||||||
#region Twitter
|
#region Twitter
|
||||||
|
|
||||||
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 checkHideTweetsByNftUsers_CheckedChanged(object sender, EventArgs e) {
|
private void checkHideTweetsByNftUsers_CheckedChanged(object? sender, EventArgs e) {
|
||||||
Config.HideTweetsByNftUsers = checkHideTweetsByNftUsers.Checked;
|
Config.HideTweetsByNftUsers = checkHideTweetsByNftUsers.Checked;
|
||||||
BeginInvoke(reloadTweetDeck);
|
BeginInvoke(reloadTweetDeck);
|
||||||
}
|
}
|
||||||
|
|
||||||
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 => reloadColumns());
|
BrowserProcessHandler.UpdatePrefs().ContinueWith(task => reloadColumns());
|
||||||
}
|
}
|
||||||
@@ -226,18 +226,18 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
|
|
||||||
#region Updates
|
#region Updates
|
||||||
|
|
||||||
private void checkUpdateNotifications_CheckedChanged(object sender, EventArgs e) {
|
private void checkUpdateNotifications_CheckedChanged(object? sender, EventArgs e) {
|
||||||
Config.EnableUpdateCheck = checkUpdateNotifications.Checked;
|
Config.EnableUpdateCheck = checkUpdateNotifications.Checked;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnCheckUpdates_Click(object sender, EventArgs e) {
|
private void btnCheckUpdates_Click(object? sender, EventArgs e) {
|
||||||
Config.DismissedUpdate = null;
|
Config.DismissedUpdate = null;
|
||||||
|
|
||||||
btnCheckUpdates.Enabled = false;
|
btnCheckUpdates.Enabled = false;
|
||||||
updateCheckEventId = updates.Check(true);
|
updateCheckEventId = updates.Check(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updates_CheckFinished(object sender, UpdateCheckEventArgs e) {
|
private void updates_CheckFinished(object? sender, UpdateCheckEventArgs e) {
|
||||||
if (e.EventId == updateCheckEventId) {
|
if (e.EventId == updateCheckEventId) {
|
||||||
btnCheckUpdates.Enabled = true;
|
btnCheckUpdates.Enabled = true;
|
||||||
|
|
||||||
@@ -264,7 +264,7 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
comboBoxCustomBrowser.SelectedIndex = browserListIndexDefault;
|
comboBoxCustomBrowser.SelectedIndex = browserListIndexDefault;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
WindowsUtils.Browser browserInfo = comboBoxCustomBrowser.Items.OfType<WindowsUtils.Browser>().FirstOrDefault(browser => browser.Path == Config.BrowserPath);
|
WindowsUtils.Browser? browserInfo = comboBoxCustomBrowser.Items.OfType<WindowsUtils.Browser>().FirstOrDefault(browser => browser.Path == Config.BrowserPath);
|
||||||
|
|
||||||
if (browserInfo == null || Config.BrowserPathArgs != null) {
|
if (browserInfo == null || Config.BrowserPathArgs != null) {
|
||||||
comboBoxCustomBrowser.SelectedIndex = browserListIndexCustom;
|
comboBoxCustomBrowser.SelectedIndex = browserListIndexCustom;
|
||||||
@@ -277,7 +277,7 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
UpdateBrowserChangeButton();
|
UpdateBrowserChangeButton();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void comboBoxCustomBrowser_SelectedIndexChanged(object sender, EventArgs e) {
|
private void comboBoxCustomBrowser_SelectedIndexChanged(object? sender, EventArgs e) {
|
||||||
if (comboBoxCustomBrowser.SelectedIndex == browserListIndexCustom) {
|
if (comboBoxCustomBrowser.SelectedIndex == browserListIndexCustom) {
|
||||||
btnCustomBrowserChange_Click(sender, e);
|
btnCustomBrowserChange_Click(sender, e);
|
||||||
}
|
}
|
||||||
@@ -288,7 +288,7 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnCustomBrowserChange_Click(object sender, EventArgs e) {
|
private void btnCustomBrowserChange_Click(object? sender, EventArgs e) {
|
||||||
using (DialogSettingsExternalProgram dialog = new DialogSettingsExternalProgram("External Browser", "Open Links With...") {
|
using (DialogSettingsExternalProgram dialog = new DialogSettingsExternalProgram("External Browser", "Open Links With...") {
|
||||||
Path = Config.BrowserPath,
|
Path = Config.BrowserPath,
|
||||||
Args = Config.BrowserPathArgs
|
Args = Config.BrowserPathArgs
|
||||||
@@ -319,7 +319,7 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
UpdateVideoPlayerChangeButton();
|
UpdateVideoPlayerChangeButton();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void comboBoxCustomVideoPlayer_SelectedIndexChanged(object sender, EventArgs e) {
|
private void comboBoxCustomVideoPlayer_SelectedIndexChanged(object? sender, EventArgs e) {
|
||||||
if (comboBoxCustomVideoPlayer.SelectedIndex == videoPlayerListIndexCustom) {
|
if (comboBoxCustomVideoPlayer.SelectedIndex == videoPlayerListIndexCustom) {
|
||||||
btnCustomVideoPlayerChange_Click(sender, e);
|
btnCustomVideoPlayerChange_Click(sender, e);
|
||||||
}
|
}
|
||||||
@@ -330,7 +330,7 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnCustomVideoPlayerChange_Click(object sender, EventArgs e) {
|
private void btnCustomVideoPlayerChange_Click(object? sender, EventArgs e) {
|
||||||
using (DialogSettingsExternalProgram dialog = new DialogSettingsExternalProgram("External Video Player", "Play Videos With...") {
|
using (DialogSettingsExternalProgram dialog = new DialogSettingsExternalProgram("External Video Player", "Play Videos With...") {
|
||||||
Path = Config.VideoPlayerPath,
|
Path = Config.VideoPlayerPath,
|
||||||
Args = Config.VideoPlayerPathArgs
|
Args = Config.VideoPlayerPathArgs
|
||||||
@@ -346,7 +346,7 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
comboBoxCustomVideoPlayer.SelectedIndexChanged += comboBoxCustomVideoPlayer_SelectedIndexChanged;
|
comboBoxCustomVideoPlayer.SelectedIndexChanged += comboBoxCustomVideoPlayer_SelectedIndexChanged;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void comboBoxSearchEngine_SelectedIndexChanged(object sender, EventArgs e) {
|
private void comboBoxSearchEngine_SelectedIndexChanged(object? sender, EventArgs e) {
|
||||||
if (comboBoxSearchEngine.SelectedIndex == searchEngineIndexCustom) {
|
if (comboBoxSearchEngine.SelectedIndex == searchEngineIndexCustom) {
|
||||||
using (DialogSettingsSearchEngine dialog = new DialogSettingsSearchEngine()) {
|
using (DialogSettingsSearchEngine dialog = new DialogSettingsSearchEngine()) {
|
||||||
if (dialog.ShowDialog() == DialogResult.OK) {
|
if (dialog.ShowDialog() == DialogResult.OK) {
|
||||||
@@ -368,7 +368,7 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
comboBoxSearchEngine.SelectedIndex = searchEngineIndexDefault;
|
comboBoxSearchEngine.SelectedIndex = searchEngineIndexDefault;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
SearchEngine engineInfo = comboBoxSearchEngine.Items.OfType<SearchEngine>().FirstOrDefault(engine => engine.Url == Config.SearchEngineUrl);
|
SearchEngine? engineInfo = comboBoxSearchEngine.Items.OfType<SearchEngine>().FirstOrDefault(engine => engine.Url == Config.SearchEngineUrl);
|
||||||
|
|
||||||
if (engineInfo == null) {
|
if (engineInfo == null) {
|
||||||
comboBoxSearchEngine.SelectedIndex = searchEngineIndexCustom;
|
comboBoxSearchEngine.SelectedIndex = searchEngineIndexCustom;
|
||||||
@@ -389,7 +389,7 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public override int GetHashCode() => Name.GetHashCode();
|
public override int GetHashCode() => Name.GetHashCode();
|
||||||
public override bool Equals(object obj) => obj is SearchEngine other && Name == other.Name;
|
public override bool Equals(object? obj) => obj is SearchEngine other && Name == other.Name;
|
||||||
public override string ToString() => Name;
|
public override string ToString() => Name;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -397,20 +397,20 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
|
|
||||||
#region Locales
|
#region Locales
|
||||||
|
|
||||||
private void checkSpellCheck_CheckedChanged(object sender, EventArgs e) {
|
private void checkSpellCheck_CheckedChanged(object? sender, EventArgs e) {
|
||||||
Config.EnableSpellCheck = checkSpellCheck.Checked;
|
Config.EnableSpellCheck = checkSpellCheck.Checked;
|
||||||
BrowserProcessHandler.UpdatePrefs();
|
BrowserProcessHandler.UpdatePrefs();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void comboBoxSpellCheckLanguage_SelectedValueChanged(object sender, EventArgs e) {
|
private void comboBoxSpellCheckLanguage_SelectedValueChanged(object? sender, EventArgs e) {
|
||||||
Config.SpellCheckLanguage = (comboBoxSpellCheckLanguage.SelectedItem as Language)?.Code ?? "en-US";
|
Config.SpellCheckLanguage = (comboBoxSpellCheckLanguage.SelectedItem as Language)?.Code ?? "en-US";
|
||||||
}
|
}
|
||||||
|
|
||||||
private void comboBoxTranslationTarget_SelectedValueChanged(object sender, EventArgs e) {
|
private void comboBoxTranslationTarget_SelectedValueChanged(object? sender, EventArgs e) {
|
||||||
Config.TranslationTarget = (comboBoxTranslationTarget.SelectedItem as Language)?.Code ?? "en";
|
Config.TranslationTarget = (comboBoxTranslationTarget.SelectedItem as Language)?.Code ?? "en";
|
||||||
}
|
}
|
||||||
|
|
||||||
private void comboBoxFirstDayOfWeek_SelectedValueChanged(object sender, EventArgs e) {
|
private void comboBoxFirstDayOfWeek_SelectedValueChanged(object? sender, EventArgs e) {
|
||||||
Config.CalendarFirstDay = (comboBoxFirstDayOfWeek.SelectedItem as DayOfWeekItem)?.Id ?? -1;
|
Config.CalendarFirstDay = (comboBoxFirstDayOfWeek.SelectedItem as DayOfWeekItem)?.Id ?? -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -424,7 +424,7 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public override int GetHashCode() => Name.GetHashCode();
|
public override int GetHashCode() => Name.GetHashCode();
|
||||||
public override bool Equals(object obj) => obj is DayOfWeekItem other && Name == other.Name;
|
public override bool Equals(object? obj) => obj is DayOfWeekItem other && Name == other.Name;
|
||||||
public override string ToString() => Name;
|
public override string ToString() => Name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -143,7 +143,7 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
trackBarScrollSpeed.ValueChanged += trackBarScrollSpeed_ValueChanged;
|
trackBarScrollSpeed.ValueChanged += trackBarScrollSpeed_ValueChanged;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void TabSettingsNotifications_ParentChanged(object sender, EventArgs e) {
|
private void TabSettingsNotifications_ParentChanged(object? sender, EventArgs e) {
|
||||||
if (Parent == null) {
|
if (Parent == null) {
|
||||||
notification.HideNotification();
|
notification.HideNotification();
|
||||||
}
|
}
|
||||||
@@ -152,13 +152,13 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void notification_Move(object sender, EventArgs e) {
|
private void notification_Move(object? sender, EventArgs e) {
|
||||||
if (radioLocCustom.Checked && notification.Location != ControlExtensions.InvisibleLocation) {
|
if (radioLocCustom.Checked && notification.Location != ControlExtensions.InvisibleLocation) {
|
||||||
Config.CustomNotificationPosition = notification.Location;
|
Config.CustomNotificationPosition = notification.Location;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void notification_ResizeEnd(object sender, EventArgs e) {
|
private void notification_ResizeEnd(object? sender, EventArgs e) {
|
||||||
if (radioSizeCustom.Checked) {
|
if (radioSizeCustom.Checked) {
|
||||||
Config.CustomNotificationSize = notification.BrowserSize;
|
Config.CustomNotificationSize = notification.BrowserSize;
|
||||||
notification.ShowExampleNotification(false);
|
notification.ShowExampleNotification(false);
|
||||||
@@ -167,28 +167,28 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
|
|
||||||
#region General
|
#region General
|
||||||
|
|
||||||
private void checkColumnName_CheckedChanged(object sender, EventArgs e) {
|
private void checkColumnName_CheckedChanged(object? sender, EventArgs e) {
|
||||||
Config.DisplayNotificationColumn = checkColumnName.Checked;
|
Config.DisplayNotificationColumn = checkColumnName.Checked;
|
||||||
notification.ShowExampleNotification(false);
|
notification.ShowExampleNotification(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkMediaPreviews_CheckedChanged(object sender, EventArgs e) {
|
private void checkMediaPreviews_CheckedChanged(object? sender, EventArgs e) {
|
||||||
Config.NotificationMediaPreviews = checkMediaPreviews.Checked;
|
Config.NotificationMediaPreviews = checkMediaPreviews.Checked;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkSkipOnLinkClick_CheckedChanged(object sender, EventArgs e) {
|
private void checkSkipOnLinkClick_CheckedChanged(object? sender, EventArgs e) {
|
||||||
Config.NotificationSkipOnLinkClick = checkSkipOnLinkClick.Checked;
|
Config.NotificationSkipOnLinkClick = checkSkipOnLinkClick.Checked;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkNonIntrusive_CheckedChanged(object sender, EventArgs e) {
|
private void checkNonIntrusive_CheckedChanged(object? sender, EventArgs e) {
|
||||||
Config.NotificationNonIntrusiveMode = checkNonIntrusive.Checked;
|
Config.NotificationNonIntrusiveMode = checkNonIntrusive.Checked;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void comboBoxIdlePause_SelectedValueChanged(object sender, EventArgs e) {
|
private void comboBoxIdlePause_SelectedValueChanged(object? sender, EventArgs e) {
|
||||||
Config.NotificationIdlePauseSeconds = IdlePauseSeconds[comboBoxIdlePause.SelectedIndex];
|
Config.NotificationIdlePauseSeconds = IdlePauseSeconds[comboBoxIdlePause.SelectedIndex];
|
||||||
}
|
}
|
||||||
|
|
||||||
private void trackBarOpacity_ValueChanged(object sender, EventArgs e) {
|
private void trackBarOpacity_ValueChanged(object? sender, EventArgs e) {
|
||||||
if (trackBarOpacity.AlignValueToTick()) {
|
if (trackBarOpacity.AlignValueToTick()) {
|
||||||
Config.NotificationWindowOpacity = trackBarOpacity.Value;
|
Config.NotificationWindowOpacity = trackBarOpacity.Value;
|
||||||
labelOpacityValue.Text = Config.NotificationWindowOpacity + "%";
|
labelOpacityValue.Text = Config.NotificationWindowOpacity + "%";
|
||||||
@@ -199,18 +199,18 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
|
|
||||||
#region Timer
|
#region Timer
|
||||||
|
|
||||||
private void checkNotificationTimer_CheckedChanged(object sender, EventArgs e) {
|
private void checkNotificationTimer_CheckedChanged(object? sender, EventArgs e) {
|
||||||
Config.DisplayNotificationTimer = checkNotificationTimer.Checked;
|
Config.DisplayNotificationTimer = checkNotificationTimer.Checked;
|
||||||
checkTimerCountDown.Enabled = checkNotificationTimer.Checked;
|
checkTimerCountDown.Enabled = checkNotificationTimer.Checked;
|
||||||
notification.ShowExampleNotification(true);
|
notification.ShowExampleNotification(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkTimerCountDown_CheckedChanged(object sender, EventArgs e) {
|
private void checkTimerCountDown_CheckedChanged(object? sender, EventArgs e) {
|
||||||
Config.NotificationTimerCountDown = checkTimerCountDown.Checked;
|
Config.NotificationTimerCountDown = checkTimerCountDown.Checked;
|
||||||
notification.ShowExampleNotification(true);
|
notification.ShowExampleNotification(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void trackBarDuration_ValueChanged(object sender, EventArgs e) {
|
private void trackBarDuration_ValueChanged(object? sender, EventArgs e) {
|
||||||
durationUpdateTimer.Stop();
|
durationUpdateTimer.Stop();
|
||||||
durationUpdateTimer.Start();
|
durationUpdateTimer.Start();
|
||||||
|
|
||||||
@@ -218,19 +218,19 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
labelDurationValue.Text = Config.NotificationDurationValue + " ms/c";
|
labelDurationValue.Text = Config.NotificationDurationValue + " ms/c";
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnDurationShort_Click(object sender, EventArgs e) {
|
private void btnDurationShort_Click(object? sender, EventArgs e) {
|
||||||
trackBarDuration.Value = 15;
|
trackBarDuration.Value = 15;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnDurationMedium_Click(object sender, EventArgs e) {
|
private void btnDurationMedium_Click(object? sender, EventArgs e) {
|
||||||
trackBarDuration.Value = 25;
|
trackBarDuration.Value = 25;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnDurationLong_Click(object sender, EventArgs e) {
|
private void btnDurationLong_Click(object? sender, EventArgs e) {
|
||||||
trackBarDuration.Value = 35;
|
trackBarDuration.Value = 35;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void durationUpdateTimer_Tick(object sender, EventArgs e) {
|
private void durationUpdateTimer_Tick(object? sender, EventArgs e) {
|
||||||
notification.ShowExampleNotification(true);
|
notification.ShowExampleNotification(true);
|
||||||
durationUpdateTimer.Stop();
|
durationUpdateTimer.Stop();
|
||||||
}
|
}
|
||||||
@@ -239,7 +239,7 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
|
|
||||||
#region Location
|
#region Location
|
||||||
|
|
||||||
private void radioLoc_CheckedChanged(object sender, EventArgs e) {
|
private void radioLoc_CheckedChanged(object? sender, EventArgs e) {
|
||||||
if (radioLocTL.Checked) {
|
if (radioLocTL.Checked) {
|
||||||
Config.NotificationPosition = DesktopNotification.Position.TopLeft;
|
Config.NotificationPosition = DesktopNotification.Position.TopLeft;
|
||||||
}
|
}
|
||||||
@@ -257,7 +257,7 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
notification.ShowExampleNotification(false);
|
notification.ShowExampleNotification(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void radioLocCustom_Click(object sender, EventArgs e) {
|
private void radioLocCustom_Click(object? sender, EventArgs e) {
|
||||||
if (!Config.IsCustomNotificationPositionSet) {
|
if (!Config.IsCustomNotificationPositionSet) {
|
||||||
Config.CustomNotificationPosition = notification.Location;
|
Config.CustomNotificationPosition = notification.Location;
|
||||||
}
|
}
|
||||||
@@ -278,12 +278,12 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void comboBoxDisplay_SelectedValueChanged(object sender, EventArgs e) {
|
private void comboBoxDisplay_SelectedValueChanged(object? sender, EventArgs e) {
|
||||||
Config.NotificationDisplay = comboBoxDisplay.SelectedIndex;
|
Config.NotificationDisplay = comboBoxDisplay.SelectedIndex;
|
||||||
notification.ShowExampleNotification(false);
|
notification.ShowExampleNotification(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void trackBarEdgeDistance_ValueChanged(object sender, EventArgs e) {
|
private void trackBarEdgeDistance_ValueChanged(object? sender, EventArgs e) {
|
||||||
labelEdgeDistanceValue.Text = trackBarEdgeDistance.Value + " px";
|
labelEdgeDistanceValue.Text = trackBarEdgeDistance.Value + " px";
|
||||||
Config.NotificationEdgeDistance = trackBarEdgeDistance.Value;
|
Config.NotificationEdgeDistance = trackBarEdgeDistance.Value;
|
||||||
notification.ShowExampleNotification(false);
|
notification.ShowExampleNotification(false);
|
||||||
@@ -293,7 +293,7 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
|
|
||||||
#region Size
|
#region Size
|
||||||
|
|
||||||
private void radioSize_CheckedChanged(object sender, EventArgs e) {
|
private void radioSize_CheckedChanged(object? sender, EventArgs e) {
|
||||||
if (radioSizeAuto.Checked) {
|
if (radioSizeAuto.Checked) {
|
||||||
Config.NotificationSize = DesktopNotification.Size.Auto;
|
Config.NotificationSize = DesktopNotification.Size.Auto;
|
||||||
}
|
}
|
||||||
@@ -301,7 +301,7 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
notification.ShowExampleNotification(false);
|
notification.ShowExampleNotification(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void radioSizeCustom_Click(object sender, EventArgs e) {
|
private void radioSizeCustom_Click(object? sender, EventArgs e) {
|
||||||
if (!Config.IsCustomNotificationSizeSet) {
|
if (!Config.IsCustomNotificationSizeSet) {
|
||||||
Config.CustomNotificationSize = notification.BrowserSize;
|
Config.CustomNotificationSize = notification.BrowserSize;
|
||||||
}
|
}
|
||||||
@@ -310,7 +310,7 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
notification.ShowExampleNotification(false);
|
notification.ShowExampleNotification(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void trackBarScrollSpeed_ValueChanged(object sender, EventArgs e) {
|
private void trackBarScrollSpeed_ValueChanged(object? sender, EventArgs e) {
|
||||||
if (trackBarScrollSpeed.AlignValueToTick()) {
|
if (trackBarScrollSpeed.AlignValueToTick()) {
|
||||||
labelScrollSpeedValue.Text = trackBarScrollSpeed.Value + "%";
|
labelScrollSpeedValue.Text = trackBarScrollSpeed.Value + "%";
|
||||||
Config.NotificationScrollSpeed = trackBarScrollSpeed.Value;
|
Config.NotificationScrollSpeed = trackBarScrollSpeed.Value;
|
||||||
|
@@ -51,11 +51,11 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
return canPlay;
|
return canPlay;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void tbCustomSound_TextChanged(object sender, EventArgs e) {
|
private void tbCustomSound_TextChanged(object? sender, EventArgs e) {
|
||||||
RefreshCanPlay();
|
RefreshCanPlay();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnPlaySound_Click(object sender, EventArgs e) {
|
private void btnPlaySound_Click(object? sender, EventArgs e) {
|
||||||
if (RefreshCanPlay()) {
|
if (RefreshCanPlay()) {
|
||||||
Config.NotificationSoundPath = tbCustomSound.Text;
|
Config.NotificationSoundPath = tbCustomSound.Text;
|
||||||
Config.NotificationSoundVolume = trackBarVolume.Value;
|
Config.NotificationSoundVolume = trackBarVolume.Value;
|
||||||
@@ -63,7 +63,7 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnBrowseSound_Click(object sender, EventArgs e) {
|
private void btnBrowseSound_Click(object? sender, EventArgs e) {
|
||||||
using OpenFileDialog dialog = new OpenFileDialog {
|
using OpenFileDialog dialog = new OpenFileDialog {
|
||||||
AutoUpgradeEnabled = true,
|
AutoUpgradeEnabled = true,
|
||||||
DereferenceLinks = true,
|
DereferenceLinks = true,
|
||||||
@@ -84,17 +84,17 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnResetSound_Click(object sender, EventArgs e) {
|
private void btnResetSound_Click(object? sender, EventArgs e) {
|
||||||
tbCustomSound.Text = string.Empty;
|
tbCustomSound.Text = string.Empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void trackBarVolume_ValueChanged(object sender, EventArgs e) {
|
private void trackBarVolume_ValueChanged(object? sender, EventArgs e) {
|
||||||
volumeUpdateTimer.Stop();
|
volumeUpdateTimer.Stop();
|
||||||
volumeUpdateTimer.Start();
|
volumeUpdateTimer.Start();
|
||||||
labelVolumeValue.Text = trackBarVolume.Value + "%";
|
labelVolumeValue.Text = trackBarVolume.Value + "%";
|
||||||
}
|
}
|
||||||
|
|
||||||
private void volumeUpdateTimer_Tick(object sender, EventArgs e) {
|
private void volumeUpdateTimer_Tick(object? sender, EventArgs e) {
|
||||||
Config.NotificationSoundVolume = trackBarVolume.Value;
|
Config.NotificationSoundVolume = trackBarVolume.Value;
|
||||||
volumeUpdateTimer.Stop();
|
volumeUpdateTimer.Stop();
|
||||||
}
|
}
|
||||||
|
@@ -29,12 +29,12 @@ namespace TweetDuck.Dialogs.Settings {
|
|||||||
|
|
||||||
#region System Tray
|
#region System Tray
|
||||||
|
|
||||||
private void comboBoxTrayType_SelectedIndexChanged(object sender, EventArgs e) {
|
private void comboBoxTrayType_SelectedIndexChanged(object? sender, EventArgs e) {
|
||||||
Config.TrayBehavior = (TrayIcon.Behavior) comboBoxTrayType.SelectedIndex;
|
Config.TrayBehavior = (TrayIcon.Behavior) comboBoxTrayType.SelectedIndex;
|
||||||
checkTrayHighlight.Enabled = Config.TrayBehavior.ShouldDisplayIcon();
|
checkTrayHighlight.Enabled = Config.TrayBehavior.ShouldDisplayIcon();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkTrayHighlight_CheckedChanged(object sender, EventArgs e) {
|
private void checkTrayHighlight_CheckedChanged(object? sender, EventArgs e) {
|
||||||
Config.EnableTrayHighlight = checkTrayHighlight.Checked;
|
Config.EnableTrayHighlight = checkTrayHighlight.Checked;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -11,7 +11,7 @@ namespace TweetDuck.Management {
|
|||||||
private static string CacheFolder => CefUtils.GetCacheFolder(App.StoragePath);
|
private static string CacheFolder => CefUtils.GetCacheFolder(App.StoragePath);
|
||||||
|
|
||||||
private static bool clearOnExit;
|
private static bool clearOnExit;
|
||||||
private static Timer autoClearTimer;
|
private static Timer? autoClearTimer;
|
||||||
|
|
||||||
private static long CalculateCacheSize() {
|
private static long CalculateCacheSize() {
|
||||||
return new DirectoryInfo(CacheFolder).EnumerateFiles().Select(file => {
|
return new DirectoryInfo(CacheFolder).EnumerateFiles().Select(file => {
|
||||||
|
@@ -28,12 +28,12 @@ namespace TweetDuck.Management {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static T TryFind<T>() where T : Form {
|
public static T? TryFind<T>() where T : Form {
|
||||||
return OpenForms.OfType<T>().FirstOrDefault();
|
return OpenForms.OfType<T>().FirstOrDefault();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool TryBringToFront<T>() where T : Form {
|
public static bool TryBringToFront<T>() where T : Form {
|
||||||
T form = TryFind<T>();
|
T? form = TryFind<T>();
|
||||||
|
|
||||||
if (form != null) {
|
if (form != null) {
|
||||||
form.BringToFront();
|
form.BringToFront();
|
||||||
|
@@ -61,7 +61,7 @@ namespace TweetDuck.Management {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (items.HasFlag(Items.Session)) {
|
if (items.HasFlag(Items.Session)) {
|
||||||
string authToken = ReadAuthCookie();
|
string? authToken = ReadAuthCookie();
|
||||||
|
|
||||||
if (authToken != null) {
|
if (authToken != null) {
|
||||||
stream.WriteString("cookie.auth", authToken);
|
stream.WriteString("cookie.auth", authToken);
|
||||||
@@ -84,9 +84,8 @@ namespace TweetDuck.Management {
|
|||||||
|
|
||||||
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));
|
||||||
string key;
|
|
||||||
|
|
||||||
while ((key = stream.SkipFile()) != null) {
|
while (stream.SkipFile() is {} key) {
|
||||||
switch (key) {
|
switch (key) {
|
||||||
case "config":
|
case "config":
|
||||||
items |= Items.UserConfig;
|
items |= Items.UserConfig;
|
||||||
@@ -121,9 +120,7 @@ namespace TweetDuck.Management {
|
|||||||
bool oldCookies = false;
|
bool oldCookies = false;
|
||||||
|
|
||||||
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))) {
|
||||||
CombinedFileStream.Entry entry;
|
while (stream.ReadFile() is {} entry) {
|
||||||
|
|
||||||
while ((entry = stream.ReadFile()) != null) {
|
|
||||||
switch (entry.KeyName) {
|
switch (entry.KeyName) {
|
||||||
case "config":
|
case "config":
|
||||||
if (items.HasFlag(Items.UserConfig)) {
|
if (items.HasFlag(Items.UserConfig)) {
|
||||||
@@ -223,11 +220,11 @@ namespace TweetDuck.Management {
|
|||||||
|
|
||||||
public PathInfo(string fullPath, int rootLength) {
|
public PathInfo(string fullPath, int rootLength) {
|
||||||
this.Full = fullPath;
|
this.Full = fullPath;
|
||||||
this.Relative = fullPath.Substring(rootLength).TrimStart(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar); // strip leading separator character
|
this.Relative = fullPath[rootLength..].TrimStart(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar); // strip leading separator character
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static string ReadAuthCookie() {
|
private static string? ReadAuthCookie() {
|
||||||
using var cookieManager = Cef.GetGlobalCookieManager();
|
using var cookieManager = Cef.GetGlobalCookieManager();
|
||||||
|
|
||||||
foreach (var cookie in cookieManager.VisitUrlCookiesAsync(AuthCookieUrl, true).Result) {
|
foreach (var cookie in cookieManager.VisitUrlCookiesAsync(AuthCookieUrl, true).Result) {
|
||||||
|
@@ -16,11 +16,11 @@ namespace TweetDuck.Management {
|
|||||||
|
|
||||||
public bool Running => currentInstance is { Running: true };
|
public bool Running => currentInstance is { Running: true };
|
||||||
|
|
||||||
public event EventHandler ProcessExited;
|
public event EventHandler? ProcessExited;
|
||||||
|
|
||||||
private readonly FormBrowser owner;
|
private readonly FormBrowser owner;
|
||||||
|
|
||||||
private Instance currentInstance;
|
private Instance? currentInstance;
|
||||||
private bool isClosing;
|
private bool isClosing;
|
||||||
|
|
||||||
public VideoPlayer(FormBrowser owner) {
|
public VideoPlayer(FormBrowser owner) {
|
||||||
@@ -44,7 +44,7 @@ namespace TweetDuck.Management {
|
|||||||
RedirectStandardOutput = true
|
RedirectStandardOutput = true
|
||||||
};
|
};
|
||||||
|
|
||||||
Process process;
|
Process? process;
|
||||||
if ((process = Process.Start(startInfo)) != null) {
|
if ((process = Process.Start(startInfo)) != null) {
|
||||||
currentInstance = new Instance(process, pipe, videoUrl, tweetUrl, username);
|
currentInstance = new Instance(process, pipe, videoUrl, tweetUrl, username);
|
||||||
|
|
||||||
@@ -69,7 +69,7 @@ namespace TweetDuck.Management {
|
|||||||
currentInstance?.Pipe.Write("key", ((int) key).ToString());
|
currentInstance?.Pipe.Write("key", ((int) key).ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void pipe_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":
|
||||||
@@ -128,19 +128,19 @@ namespace TweetDuck.Management {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void owner_FormClosing(object sender, FormClosingEventArgs e) {
|
private void owner_FormClosing(object? sender, FormClosingEventArgs e) {
|
||||||
if (currentInstance != null) {
|
if (currentInstance != null) {
|
||||||
currentInstance.Process.Exited -= process_Exited;
|
currentInstance.Process.Exited -= process_Exited;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void process_OutputDataReceived(object sender, DataReceivedEventArgs e) {
|
private void process_OutputDataReceived(object? sender, DataReceivedEventArgs e) {
|
||||||
if (!string.IsNullOrEmpty(e.Data)) {
|
if (!string.IsNullOrEmpty(e.Data)) {
|
||||||
App.Logger.Debug("[VideoPlayer] " + e.Data);
|
App.Logger.Debug("[VideoPlayer] " + e.Data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void process_Exited(object sender, EventArgs e) {
|
private void process_Exited(object? sender, EventArgs e) {
|
||||||
if (currentInstance == null) {
|
if (currentInstance == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@@ -5,18 +5,18 @@ using Win = System.Windows.Forms;
|
|||||||
namespace TweetDuck.Management {
|
namespace TweetDuck.Management {
|
||||||
static class WindowsSessionManager {
|
static class WindowsSessionManager {
|
||||||
public static bool IsLocked { get; private set; } = false;
|
public static bool IsLocked { get; private set; } = false;
|
||||||
public static event EventHandler LockStateChanged;
|
public static event EventHandler? LockStateChanged;
|
||||||
|
|
||||||
public static void Register() {
|
public static void Register() {
|
||||||
Win.Application.ApplicationExit += OnApplicationExit;
|
Win.Application.ApplicationExit += OnApplicationExit;
|
||||||
SystemEvents.SessionSwitch += OnSessionSwitch;
|
SystemEvents.SessionSwitch += OnSessionSwitch;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void OnApplicationExit(object sender, EventArgs e) {
|
private static void OnApplicationExit(object? sender, EventArgs e) {
|
||||||
SystemEvents.SessionSwitch -= OnSessionSwitch;
|
SystemEvents.SessionSwitch -= OnSessionSwitch;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void OnSessionSwitch(object sender, SessionSwitchEventArgs e) {
|
private static void OnSessionSwitch(object? sender, SessionSwitchEventArgs e) {
|
||||||
var reason = e.Reason;
|
var reason = e.Reason;
|
||||||
if (reason == SessionSwitchReason.SessionLock) {
|
if (reason == SessionSwitchReason.SessionLock) {
|
||||||
SetLocked(true);
|
SetLocked(true);
|
||||||
|
@@ -16,9 +16,11 @@ namespace TweetDuck.Plugins {
|
|||||||
|
|
||||||
private int nextHeight;
|
private int nextHeight;
|
||||||
|
|
||||||
|
#pragma warning disable CS8618
|
||||||
private PluginControl() {
|
private PluginControl() {
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
}
|
}
|
||||||
|
#pragma warning restore CS8618
|
||||||
|
|
||||||
public PluginControl(PluginManager pluginManager, Plugin plugin) : this() {
|
public PluginControl(PluginManager pluginManager, Plugin plugin) : this() {
|
||||||
this.pluginManager = pluginManager;
|
this.pluginManager = pluginManager;
|
||||||
@@ -49,13 +51,13 @@ namespace TweetDuck.Plugins {
|
|||||||
panelDescription_Resize(panelDescription, EventArgs.Empty);
|
panelDescription_Resize(panelDescription, EventArgs.Empty);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void timerLayout_Tick(object sender, EventArgs e) {
|
private void timerLayout_Tick(object? sender, EventArgs e) {
|
||||||
timerLayout.Stop();
|
timerLayout.Stop();
|
||||||
Height = nextHeight;
|
Height = nextHeight;
|
||||||
ResumeLayout();
|
ResumeLayout();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void panelDescription_Resize(object sender, EventArgs e) {
|
private void panelDescription_Resize(object? sender, EventArgs e) {
|
||||||
SuspendLayout();
|
SuspendLayout();
|
||||||
|
|
||||||
int maxWidth = panelDescription.Width - (panelDescription.VerticalScroll.Visible ? SystemInformation.VerticalScrollBarWidth : 0);
|
int maxWidth = panelDescription.Width - (panelDescription.VerticalScroll.Visible ? SystemInformation.VerticalScrollBarWidth : 0);
|
||||||
@@ -80,18 +82,18 @@ namespace TweetDuck.Plugins {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void labelWebsite_Click(object sender, EventArgs e) {
|
private void labelWebsite_Click(object? sender, EventArgs e) {
|
||||||
if (labelWebsite.Text.Length > 0) {
|
if (labelWebsite.Text.Length > 0) {
|
||||||
App.SystemHandler.OpenBrowser(labelWebsite.Text);
|
App.SystemHandler.OpenBrowser(labelWebsite.Text);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnConfigure_Click(object sender, EventArgs e) {
|
private void btnConfigure_Click(object? sender, EventArgs e) {
|
||||||
pluginManager.ConfigurePlugin(plugin);
|
pluginManager.ConfigurePlugin(plugin);
|
||||||
ParentForm?.Close();
|
ParentForm?.Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnToggleState_Click(object sender, EventArgs e) {
|
private void btnToggleState_Click(object? sender, EventArgs e) {
|
||||||
pluginManager.Config.SetEnabled(plugin, !pluginManager.Config.IsEnabled(plugin));
|
pluginManager.Config.SetEnabled(plugin, !pluginManager.Config.IsEnabled(plugin));
|
||||||
pluginManager.Config.Save();
|
pluginManager.Config.Save();
|
||||||
UpdatePluginState();
|
UpdatePluginState();
|
||||||
|
@@ -36,11 +36,11 @@ namespace TweetDuck {
|
|||||||
|
|
||||||
public static string ExecutablePath => Win.Application.ExecutablePath;
|
public static string ExecutablePath => Win.Application.ExecutablePath;
|
||||||
|
|
||||||
private static Reporter errorReporter;
|
private static Reporter? errorReporter;
|
||||||
private static LockManager lockManager;
|
private static LockManager lockManager = null!;
|
||||||
private static bool hasCleanedUp;
|
private static bool hasCleanedUp;
|
||||||
|
|
||||||
public static ConfigObjects<UserConfig, SystemConfig> Config { get; private set; }
|
public static ConfigObjects<UserConfig, SystemConfig> Config { get; private set; } = null!;
|
||||||
|
|
||||||
internal static void SetupWinForms() {
|
internal static void SetupWinForms() {
|
||||||
Win.Application.EnableVisualStyles();
|
Win.Application.EnableVisualStyles();
|
||||||
@@ -85,8 +85,8 @@ namespace TweetDuck {
|
|||||||
private sealed class Setup : IAppSetup {
|
private sealed class Setup : IAppSetup {
|
||||||
public bool IsPortable => File.Exists(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "makeportable"));
|
public bool IsPortable => File.Exists(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "makeportable"));
|
||||||
public bool IsDebugLogging => Arguments.HasFlag(Arguments.ArgLogging);
|
public bool IsDebugLogging => Arguments.HasFlag(Arguments.ArgLogging);
|
||||||
public string CustomDataFolder => Arguments.GetValue(Arguments.ArgDataFolder);
|
public string? CustomDataFolder => Arguments.GetValue(Arguments.ArgDataFolder);
|
||||||
public string ResourceRewriteRules => Arguments.GetValue(Arguments.ArgFreeze);
|
public string? ResourceRewriteRules => Arguments.GetValue(Arguments.ArgFreeze);
|
||||||
|
|
||||||
public ConfigManager CreateConfigManager(string storagePath) {
|
public ConfigManager CreateConfigManager(string storagePath) {
|
||||||
return new ConfigManager<UserConfig, SystemConfig>(storagePath, Config);
|
return new ConfigManager<UserConfig, SystemConfig>(storagePath, Config);
|
||||||
@@ -153,7 +153,7 @@ namespace TweetDuck {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void OnUnhandledException(object sender, UnhandledExceptionEventArgs e) {
|
private static void OnUnhandledException(object? sender, UnhandledExceptionEventArgs e) {
|
||||||
if (e.ExceptionObject is Exception ex) {
|
if (e.ExceptionObject is Exception ex) {
|
||||||
const string title = "TweetDuck Has Failed :(";
|
const string title = "TweetDuck Has Failed :(";
|
||||||
string message = "An unhandled exception has occurred: " + ex.Message;
|
string message = "An unhandled exception has occurred: " + ex.Message;
|
||||||
@@ -173,7 +173,7 @@ namespace TweetDuck {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void RestartWithArgs(CommandLineArgs args) {
|
public static void RestartWithArgs(CommandLineArgs args) {
|
||||||
FormBrowser browserForm = FormManager.TryFind<FormBrowser>();
|
FormBrowser? browserForm = FormManager.TryFind<FormBrowser>();
|
||||||
|
|
||||||
if (browserForm != null) {
|
if (browserForm != null) {
|
||||||
browserForm.ForceClose();
|
browserForm.ForceClose();
|
||||||
|
@@ -9,7 +9,7 @@ using TweetLib.Core.Application;
|
|||||||
|
|
||||||
namespace TweetDuck {
|
namespace TweetDuck {
|
||||||
sealed class Reporter : IAppErrorHandler {
|
sealed class Reporter : IAppErrorHandler {
|
||||||
private static void Exit(string message, Exception ex = null) {
|
private static void Exit(string message, Exception? ex = null) {
|
||||||
try {
|
try {
|
||||||
Process.GetCurrentProcess().Kill();
|
Process.GetCurrentProcess().Kill();
|
||||||
} catch {
|
} catch {
|
||||||
|
@@ -16,11 +16,11 @@ namespace TweetDuck.Updates {
|
|||||||
timerDownloadCheck.Start();
|
timerDownloadCheck.Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnCancel_Click(object sender, EventArgs e) {
|
private void btnCancel_Click(object? sender, EventArgs e) {
|
||||||
Close();
|
Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void timerDownloadCheck_Tick(object sender, EventArgs e) {
|
private void timerDownloadCheck_Tick(object? sender, EventArgs e) {
|
||||||
if (updateInfo.DownloadStatus.IsFinished(false)) {
|
if (updateInfo.DownloadStatus.IsFinished(false)) {
|
||||||
timerDownloadCheck.Stop();
|
timerDownloadCheck.Stop();
|
||||||
DialogResult = DialogResult.OK;
|
DialogResult = DialogResult.OK;
|
||||||
|
@@ -33,7 +33,7 @@ namespace TweetDuck.Updates {
|
|||||||
result.SetCanceled();
|
result.SetCanceled();
|
||||||
}
|
}
|
||||||
else if (task.IsFaulted) {
|
else if (task.IsFaulted) {
|
||||||
result.SetException(ExpandWebException(task.Exception.InnerException));
|
result.SetException(ExpandWebException(task.Exception!.InnerException));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
try {
|
try {
|
||||||
@@ -65,7 +65,7 @@ namespace TweetDuck.Updates {
|
|||||||
return new UpdateInfo(versionTag, releaseNotes, downloadUrl, installerFolder);
|
return new UpdateInfo(versionTag, releaseNotes, downloadUrl, installerFolder);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Exception ExpandWebException(Exception e) {
|
private static Exception ExpandWebException(Exception? e) {
|
||||||
if (e is WebException { Response: HttpWebResponse response } ) {
|
if (e is WebException { Response: HttpWebResponse response } ) {
|
||||||
try {
|
try {
|
||||||
using var stream = response.GetResponseStream();
|
using var stream = response.GetResponseStream();
|
||||||
@@ -76,7 +76,7 @@ namespace TweetDuck.Updates {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return e;
|
return e!;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -38,7 +38,7 @@ namespace TweetDuck.Utils {
|
|||||||
args["disable-plugins-discovery"] = "1";
|
args["disable-plugins-discovery"] = "1";
|
||||||
args["enable-system-flash"] = "0";
|
args["enable-system-flash"] = "0";
|
||||||
|
|
||||||
if (args.TryGetValue("js-flags", out string jsFlags)) {
|
if (args.TryGetValue("js-flags", out var jsFlags)) {
|
||||||
args["js-flags"] = "--expose-gc " + jsFlags;
|
args["js-flags"] = "--expose-gc " + jsFlags;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -63,7 +63,7 @@ namespace TweetDuck.Utils {
|
|||||||
host.SetZoomLevel(Math.Log(percentage / 100.0, 1.2));
|
host.SetZoomLevel(Math.Log(percentage / 100.0, 1.2));
|
||||||
}
|
}
|
||||||
|
|
||||||
void UpdateZoomLevel(object sender, EventArgs args) {
|
void UpdateZoomLevel(object? sender, EventArgs args) {
|
||||||
SetZoomLevel(browser.GetBrowserHost(), Config.ZoomLevel);
|
SetZoomLevel(browser.GetBrowserHost(), Config.ZoomLevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -62,7 +62,7 @@ namespace TweetDuck.Utils {
|
|||||||
[DllImport("user32.dll")]
|
[DllImport("user32.dll")]
|
||||||
private static extern bool PostMessage(IntPtr hWnd, uint msg, UIntPtr wParam, IntPtr lParam);
|
private static extern bool PostMessage(IntPtr hWnd, uint msg, UIntPtr wParam, IntPtr lParam);
|
||||||
|
|
||||||
[DllImport("user32.dll")]
|
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
|
||||||
public static extern uint RegisterWindowMessage(string messageName);
|
public static extern uint RegisterWindowMessage(string messageName);
|
||||||
|
|
||||||
[DllImport("user32.dll")]
|
[DllImport("user32.dll")]
|
||||||
|
@@ -43,28 +43,28 @@ namespace TweetDuck.Utils {
|
|||||||
public static IEnumerable<Browser> FindInstalledBrowsers() {
|
public static IEnumerable<Browser> FindInstalledBrowsers() {
|
||||||
static IEnumerable<Browser> ReadBrowsersFromKey(RegistryHive hive) {
|
static IEnumerable<Browser> ReadBrowsersFromKey(RegistryHive hive) {
|
||||||
using RegistryKey root = RegistryKey.OpenBaseKey(hive, RegistryView.Default);
|
using RegistryKey root = RegistryKey.OpenBaseKey(hive, RegistryView.Default);
|
||||||
using RegistryKey browserList = root.OpenSubKey(@"SOFTWARE\Clients\StartMenuInternet", false);
|
using RegistryKey? browserList = root.OpenSubKey(@"SOFTWARE\Clients\StartMenuInternet", false);
|
||||||
|
|
||||||
if (browserList == null) {
|
if (browserList == null) {
|
||||||
yield break;
|
yield break;
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (string sub in browserList.GetSubKeyNames()) {
|
foreach (string sub in browserList.GetSubKeyNames()) {
|
||||||
using RegistryKey browserKey = browserList.OpenSubKey(sub, false);
|
using RegistryKey? browserKey = browserList.OpenSubKey(sub, false);
|
||||||
using RegistryKey shellKey = browserKey?.OpenSubKey(@"shell\open\command");
|
using RegistryKey? shellKey = browserKey?.OpenSubKey(@"shell\open\command");
|
||||||
|
|
||||||
if (shellKey == null) {
|
if (browserKey == null || shellKey == null) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
string browserName = browserKey.GetValue(null) as string;
|
string? browserName = browserKey.GetValue(null) as string;
|
||||||
string browserPath = shellKey.GetValue(null) as string;
|
string? browserPath = shellKey.GetValue(null) as string;
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(browserName) || string.IsNullOrEmpty(browserPath)) {
|
if (string.IsNullOrEmpty(browserName) || string.IsNullOrEmpty(browserPath)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (browserPath[0] == '"' && browserPath[browserPath.Length - 1] == '"') {
|
if (browserPath[0] == '"' && browserPath[^1] == '"') {
|
||||||
browserPath = browserPath.Substring(1, browserPath.Length - 2);
|
browserPath = browserPath.Substring(1, browserPath.Length - 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -94,7 +94,7 @@ namespace TweetDuck.Utils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public override int GetHashCode() => Name.GetHashCode();
|
public override int GetHashCode() => Name.GetHashCode();
|
||||||
public override bool Equals(object obj) => obj is Browser other && Name == other.Name;
|
public override bool Equals(object? obj) => obj is Browser other && Name == other.Name;
|
||||||
public override string ToString() => Name;
|
public override string ToString() => Name;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -12,7 +12,7 @@ namespace TweetImpl.CefSharp.Adapters {
|
|||||||
return errorCode == CefErrorCode.Aborted;
|
return errorCode == CefErrorCode.Aborted;
|
||||||
}
|
}
|
||||||
|
|
||||||
public string GetName(CefErrorCode errorCode) {
|
public string? GetName(CefErrorCode errorCode) {
|
||||||
return Enum.GetName(typeof(CefErrorCode), errorCode);
|
return Enum.GetName(typeof(CefErrorCode), errorCode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -7,7 +7,7 @@ namespace TweetImpl.CefSharp.Adapters {
|
|||||||
|
|
||||||
private CefJsDialogCallbackAdapter() {}
|
private CefJsDialogCallbackAdapter() {}
|
||||||
|
|
||||||
public void Continue(IJsDialogCallback callback, bool success, string userInput = null) {
|
public void Continue(IJsDialogCallback callback, bool success, string? userInput = null) {
|
||||||
if (userInput == null) {
|
if (userInput == null) {
|
||||||
callback.Continue(success);
|
callback.Continue(success);
|
||||||
}
|
}
|
||||||
|
@@ -24,7 +24,7 @@ namespace TweetImpl.CefSharp.Adapters {
|
|||||||
response.SetHeaderByName(header, value, overwrite: true);
|
response.SetHeaderByName(header, value, overwrite: true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public string GetHeader(IResponse response, string header) {
|
public string? GetHeader(IResponse response, string header) {
|
||||||
return response.Headers[header];
|
return response.Headers[header];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -10,7 +10,7 @@ using IContextMenuHandler = TweetLib.Browser.Interfaces.IContextMenuHandler;
|
|||||||
|
|
||||||
namespace TweetImpl.CefSharp.Component {
|
namespace TweetImpl.CefSharp.Component {
|
||||||
public abstract class BrowserComponentBase : BrowserComponent<IFrame, IRequest> {
|
public abstract class BrowserComponentBase : BrowserComponent<IFrame, IRequest> {
|
||||||
public delegate CefContextMenuHandler CreateContextMenu(IContextMenuHandler handler);
|
public delegate CefContextMenuHandler CreateContextMenu(IContextMenuHandler? handler);
|
||||||
|
|
||||||
public ResourceHandlerRegistry<IResourceHandler> ResourceHandlerRegistry { get; } = new ResourceHandlerRegistry<IResourceHandler>(CefResourceHandlerFactory.Instance);
|
public ResourceHandlerRegistry<IResourceHandler> ResourceHandlerRegistry { get; } = new ResourceHandlerRegistry<IResourceHandler>(CefResourceHandlerFactory.Instance);
|
||||||
|
|
||||||
@@ -50,19 +50,19 @@ namespace TweetImpl.CefSharp.Component {
|
|||||||
browser.JavascriptObjectRepository.Register(name, bridge);
|
browser.JavascriptObjectRepository.Register(name, bridge);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnLoadingStateChanged(object sender, LoadingStateChangedEventArgs e) {
|
private void OnLoadingStateChanged(object? sender, LoadingStateChangedEventArgs e) {
|
||||||
base.OnLoadingStateChanged(e.IsLoading);
|
base.OnLoadingStateChanged(e.IsLoading);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnLoadError(object sender, LoadErrorEventArgs e) {
|
private void OnLoadError(object? sender, LoadErrorEventArgs e) {
|
||||||
base.OnLoadError(e.FailedUrl, e.ErrorCode, CefErrorCodeAdapter.Instance);
|
base.OnLoadError(e.FailedUrl, e.ErrorCode, CefErrorCodeAdapter.Instance);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnFrameLoadStart(object sender, FrameLoadStartEventArgs e) {
|
private void OnFrameLoadStart(object? sender, FrameLoadStartEventArgs e) {
|
||||||
base.OnFrameLoadStart(e.Url, e.Frame);
|
base.OnFrameLoadStart(e.Url, e.Frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnFrameLoadEnd(object sender, FrameLoadEndEventArgs e) {
|
private void OnFrameLoadEnd(object? sender, FrameLoadEndEventArgs e) {
|
||||||
base.OnFrameLoadEnd(e.Url, e.Frame);
|
base.OnFrameLoadEnd(e.Url, e.Frame);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -12,25 +12,27 @@ namespace TweetImpl.CefSharp.Handlers {
|
|||||||
dataOut.Write(dataIn, position, length);
|
dataOut.Write(dataIn, position, length);
|
||||||
};
|
};
|
||||||
|
|
||||||
private ByteArrayResourceHandlerLogic<IResponse> logic;
|
private static ByteArrayResourceHandlerLogic<IResponse> CreateLogic(ByteArrayResource resource) {
|
||||||
|
return new ByteArrayResourceHandlerLogic<IResponse>(resource, CefResponseAdapter.Instance);
|
||||||
public CefByteArrayResourceHandler() {
|
|
||||||
SetResource(new ByteArrayResource(Array.Empty<byte>()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private ByteArrayResourceHandlerLogic<IResponse> logic;
|
||||||
|
|
||||||
|
public CefByteArrayResourceHandler() : this(new ByteArrayResource(Array.Empty<byte>())) {}
|
||||||
|
|
||||||
internal CefByteArrayResourceHandler(ByteArrayResource resource) {
|
internal CefByteArrayResourceHandler(ByteArrayResource resource) {
|
||||||
SetResource(resource);
|
this.logic = CreateLogic(resource);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetResource(ByteArrayResource resource) {
|
public void SetResource(ByteArrayResource resource) {
|
||||||
this.logic = new ByteArrayResourceHandlerLogic<IResponse>(resource, CefResponseAdapter.Instance);
|
this.logic = CreateLogic(resource);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IResourceHandler.Open(IRequest request, out bool handleRequest, ICallback callback) {
|
bool IResourceHandler.Open(IRequest request, out bool handleRequest, ICallback callback) {
|
||||||
return logic.Open(out handleRequest);
|
return logic.Open(out handleRequest);
|
||||||
}
|
}
|
||||||
|
|
||||||
void IResourceHandler.GetResponseHeaders(IResponse response, out long responseLength, out string redirectUrl) {
|
void IResourceHandler.GetResponseHeaders(IResponse response, out long responseLength, out string? redirectUrl) {
|
||||||
logic.GetResponseHeaders(response, out responseLength, out redirectUrl);
|
logic.GetResponseHeaders(response, out responseLength, out redirectUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -7,7 +7,7 @@ namespace TweetImpl.CefSharp.Handlers {
|
|||||||
public abstract class CefContextMenuHandler : IContextMenuHandler {
|
public abstract class CefContextMenuHandler : IContextMenuHandler {
|
||||||
private readonly ContextMenuLogic<IMenuModel> logic;
|
private readonly ContextMenuLogic<IMenuModel> logic;
|
||||||
|
|
||||||
protected CefContextMenuHandler(TweetLib.Browser.Interfaces.IContextMenuHandler handler) {
|
protected CefContextMenuHandler(TweetLib.Browser.Interfaces.IContextMenuHandler? handler) {
|
||||||
this.logic = new ContextMenuLogic<IMenuModel>(handler, CefMenuModelAdapter.Instance);
|
this.logic = new ContextMenuLogic<IMenuModel>(handler, CefMenuModelAdapter.Instance);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -12,7 +12,7 @@ namespace TweetImpl.CefSharp.Handlers {
|
|||||||
this.Logic = new LifeSpanHandlerLogic(popupHandler);
|
this.Logic = new LifeSpanHandlerLogic(popupHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override bool OnBeforePopup(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, string targetUrl, string targetFrameName, WindowOpenDisposition targetDisposition, bool userGesture, IPopupFeatures popupFeatures, IWindowInfo windowInfo, IBrowserSettings browserSettings, ref bool noJavascriptAccess, out IWebBrowser newBrowser) {
|
protected override bool OnBeforePopup(IWebBrowser chromiumWebBrowser, 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;
|
newBrowser = null;
|
||||||
return Logic.OnBeforePopup(targetUrl, ConvertTargetDisposition(targetDisposition));
|
return Logic.OnBeforePopup(targetUrl, ConvertTargetDisposition(targetDisposition));
|
||||||
}
|
}
|
||||||
|
@@ -9,7 +9,7 @@ namespace TweetImpl.CefSharp.Handlers {
|
|||||||
sealed class CefResourceRequestHandler : ResourceRequestHandler {
|
sealed class CefResourceRequestHandler : ResourceRequestHandler {
|
||||||
private readonly ResourceRequestHandlerLogic<IRequest, IResponse, IResourceHandler> logic;
|
private readonly ResourceRequestHandlerLogic<IRequest, IResponse, IResourceHandler> logic;
|
||||||
|
|
||||||
public CefResourceRequestHandler(ResourceHandlerRegistry<IResourceHandler> resourceHandlerRegistry, IResourceRequestHandler resourceRequestHandler) {
|
public CefResourceRequestHandler(ResourceHandlerRegistry<IResourceHandler> resourceHandlerRegistry, IResourceRequestHandler? resourceRequestHandler) {
|
||||||
this.logic = new ResourceRequestHandlerLogic<IRequest, IResponse, IResourceHandler>(CefRequestAdapter.Instance, CefResponseAdapter.Instance, resourceHandlerRegistry, resourceRequestHandler);
|
this.logic = new ResourceRequestHandlerLogic<IRequest, IResponse, IResourceHandler>(CefRequestAdapter.Instance, CefResponseAdapter.Instance, resourceHandlerRegistry, resourceRequestHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -17,11 +17,11 @@ namespace TweetImpl.CefSharp.Handlers {
|
|||||||
return logic.OnBeforeResourceLoad(request, callback) ? CefReturnValue.Continue : CefReturnValue.Cancel;
|
return logic.OnBeforeResourceLoad(request, callback) ? CefReturnValue.Continue : CefReturnValue.Cancel;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override IResourceHandler GetResourceHandler(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request) {
|
protected override IResourceHandler? GetResourceHandler(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request) {
|
||||||
return logic.GetResourceHandler(request);
|
return logic.GetResourceHandler(request);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override IResponseFilter GetResourceResponseFilter(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response) {
|
protected override IResponseFilter? GetResourceResponseFilter(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response) {
|
||||||
return CefResponseFilter.Create(logic.GetResourceResponseFilter(request, response));
|
return CefResponseFilter.Create(logic.GetResourceResponseFilter(request, response));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -11,7 +11,7 @@ namespace TweetImpl.CefSharp.Handlers {
|
|||||||
|
|
||||||
private readonly ResourceRequestHandlerFactoryLogic<CefResourceRequestHandler, IResourceHandler, IRequest> logic;
|
private readonly ResourceRequestHandlerFactoryLogic<CefResourceRequestHandler, IResourceHandler, IRequest> logic;
|
||||||
|
|
||||||
public CefResourceRequestHandlerFactory(IResourceRequestHandler resourceRequestHandler, ResourceHandlerRegistry<IResourceHandler> registry) {
|
public CefResourceRequestHandlerFactory(IResourceRequestHandler? resourceRequestHandler, ResourceHandlerRegistry<IResourceHandler> registry) {
|
||||||
this.logic = new ResourceRequestHandlerFactoryLogic<CefResourceRequestHandler, IResourceHandler, IRequest>(CefRequestAdapter.Instance, new CefResourceRequestHandler(registry, resourceRequestHandler), registry);
|
this.logic = new ResourceRequestHandlerFactoryLogic<CefResourceRequestHandler, IResourceHandler, IRequest>(CefRequestAdapter.Instance, new CefResourceRequestHandler(registry, resourceRequestHandler), registry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user