From d5b66fede70b94e1491077a8011a585969773dc1 Mon Sep 17 00:00:00 2001 From: Jaex Date: Mon, 15 Jun 2020 07:02:39 +0300 Subject: [PATCH 01/37] Create parent folders on startup --- ShareX.HelpersLib/Colors/GradientInfo.cs | 2 ++ ShareX.HelpersLib/Forms/GradientPickerForm.cs | 2 +- ShareX/Program.cs | 11 +++++++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/ShareX.HelpersLib/Colors/GradientInfo.cs b/ShareX.HelpersLib/Colors/GradientInfo.cs index cb2b02e21..9b5347e64 100644 --- a/ShareX.HelpersLib/Colors/GradientInfo.cs +++ b/ShareX.HelpersLib/Colors/GradientInfo.cs @@ -23,6 +23,7 @@ #endregion License Information (GPL v3) +using Newtonsoft.Json; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; @@ -38,6 +39,7 @@ public class GradientInfo public List Colors { get; set; } + [JsonIgnore] public bool IsValid => Colors != null && Colors.Count > 0; public GradientInfo() diff --git a/ShareX.HelpersLib/Forms/GradientPickerForm.cs b/ShareX.HelpersLib/Forms/GradientPickerForm.cs index 315747ca3..5ee89266a 100644 --- a/ShareX.HelpersLib/Forms/GradientPickerForm.cs +++ b/ShareX.HelpersLib/Forms/GradientPickerForm.cs @@ -197,7 +197,7 @@ private void nudLocation_ValueChanged(object sender, EventArgs e) { if (isReady) { - GradientStop gradientStop = GetSelectedGradientStop(out ListViewItem lvi); + GradientStop gradientStop = GetSelectedGradientStop(); if (gradientStop != null) { diff --git a/ShareX/Program.cs b/ShareX/Program.cs index 9bf3f3f6b..675a9fabe 100644 --- a/ShareX/Program.cs +++ b/ShareX/Program.cs @@ -232,6 +232,7 @@ public static string ScreenshotsFolder } public static string ToolsFolder => Path.Combine(PersonalFolder, "Tools"); + public static string ImageEffectsFolder => Path.Combine(PersonalFolder, "ImageEffects"); public static string ScreenRecorderCacheFilePath => Path.Combine(PersonalFolder, "ScreenRecorder.avi"); public static string DefaultFFmpegFilePath => Path.Combine(ToolsFolder, "ffmpeg.exe"); public static string ChromeHostManifestFilePath => Path.Combine(ToolsFolder, "Chrome-host-manifest.json"); @@ -270,6 +271,7 @@ private static void Main(string[] args) if (CheckAdminTasks()) return; // If ShareX opened just for be able to execute task as Admin UpdatePersonalPath(); + CreateParentFolders(); DebugHelper.Init(LogsFilePath); @@ -470,6 +472,15 @@ private static void UpdatePersonalPath() } } + private static void CreateParentFolders() + { + Helpers.CreateDirectoryFromDirectoryPath(SettingManager.BackupFolder); + Helpers.CreateDirectoryFromDirectoryPath(ImageEffectsFolder); + Helpers.CreateDirectoryFromDirectoryPath(LogsFolder); + Helpers.CreateDirectoryFromDirectoryPath(ScreenshotsParentFolder); + Helpers.CreateDirectoryFromDirectoryPath(ToolsFolder); + } + private static void MigratePersonalPathConfig() { if (File.Exists(PreviousPersonalPathConfigFilePath)) From cd052ea7837d406c8e9790b8d2f77d80e40098f3 Mon Sep 17 00:00:00 2001 From: Jaex Date: Mon, 15 Jun 2020 07:17:46 +0300 Subject: [PATCH 02/37] Rename create directory method --- ShareX.HelpersLib/Helpers/Helpers.cs | 12 ++++++------ ShareX.HelpersLib/Settings/SettingsBase.cs | 2 +- ShareX.HelpersLib/UpdateChecker/DownloaderForm.cs | 2 +- ShareX.MediaLib/VideoThumbnailer.cs | 2 +- ShareX/Program.cs | 13 ++++++++----- 5 files changed, 17 insertions(+), 14 deletions(-) diff --git a/ShareX.HelpersLib/Helpers/Helpers.cs b/ShareX.HelpersLib/Helpers/Helpers.cs index b55d67a77..3348d7d72 100644 --- a/ShareX.HelpersLib/Helpers/Helpers.cs +++ b/ShareX.HelpersLib/Helpers/Helpers.cs @@ -908,7 +908,7 @@ public static long GetFileSize(string path) return -1; } - public static void CreateDirectoryFromDirectoryPath(string directoryPath) + public static void CreateDirectory(string directoryPath) { if (!string.IsNullOrEmpty(directoryPath) && !Directory.Exists(directoryPath)) { @@ -930,7 +930,7 @@ public static void CreateDirectoryFromFilePath(string filePath) if (!string.IsNullOrEmpty(filePath)) { string directoryPath = Path.GetDirectoryName(filePath); - CreateDirectoryFromDirectoryPath(directoryPath); + CreateDirectory(directoryPath); } } @@ -955,7 +955,7 @@ public static string CopyFile(string filePath, string destinationFolder, bool ov { string fileName = Path.GetFileName(filePath); string destinationFilePath = Path.Combine(destinationFolder, fileName); - CreateDirectoryFromDirectoryPath(destinationFolder); + CreateDirectory(destinationFolder); File.Copy(filePath, destinationFilePath, overwrite); return destinationFilePath; } @@ -969,7 +969,7 @@ public static string MoveFile(string filePath, string destinationFolder, bool ov { string fileName = Path.GetFileName(filePath); string destinationFilePath = Path.Combine(destinationFolder, fileName); - CreateDirectoryFromDirectoryPath(destinationFolder); + CreateDirectory(destinationFolder); if (overwrite && File.Exists(destinationFilePath)) { @@ -1015,7 +1015,7 @@ public static string BackupFileWeekly(string filePath, string destinationFolder) if (!File.Exists(newFilePath)) { - CreateDirectoryFromDirectoryPath(destinationFolder); + CreateDirectory(destinationFolder); File.Copy(filePath, newFilePath, false); return newFilePath; } @@ -1035,7 +1035,7 @@ public static void BackupFileMonthly(string filePath, string destinationFolder) if (!File.Exists(newFilePath)) { - CreateDirectoryFromDirectoryPath(destinationFolder); + CreateDirectory(destinationFolder); File.Copy(filePath, newFilePath, false); } } diff --git a/ShareX.HelpersLib/Settings/SettingsBase.cs b/ShareX.HelpersLib/Settings/SettingsBase.cs index 40bdc81c1..dcc665708 100644 --- a/ShareX.HelpersLib/Settings/SettingsBase.cs +++ b/ShareX.HelpersLib/Settings/SettingsBase.cs @@ -161,7 +161,7 @@ private bool SaveInternal(string filePath) { string fileName = Path.GetFileName(filePath); backupFilePath = Path.Combine(BackupFolder, fileName); - Helpers.CreateDirectoryFromDirectoryPath(BackupFolder); + Helpers.CreateDirectory(BackupFolder); } File.Replace(tempFilePath, filePath, backupFilePath); diff --git a/ShareX.HelpersLib/UpdateChecker/DownloaderForm.cs b/ShareX.HelpersLib/UpdateChecker/DownloaderForm.cs index aa071a931..7c9104347 100644 --- a/ShareX.HelpersLib/UpdateChecker/DownloaderForm.cs +++ b/ShareX.HelpersLib/UpdateChecker/DownloaderForm.cs @@ -215,7 +215,7 @@ private void StartDownload() btnAction.Text = Resources.DownloaderForm_StartDownload_Cancel; string folderPath = Path.Combine(Path.GetTempPath(), "ShareX"); - Helpers.CreateDirectoryFromDirectoryPath(folderPath); + Helpers.CreateDirectory(folderPath); DownloadLocation = Path.Combine(folderPath, Filename); fileDownloader = new FileDownloader(URL, DownloadLocation, Proxy, AcceptHeader); diff --git a/ShareX.MediaLib/VideoThumbnailer.cs b/ShareX.MediaLib/VideoThumbnailer.cs index 312529345..d0d9ae88d 100644 --- a/ShareX.MediaLib/VideoThumbnailer.cs +++ b/ShareX.MediaLib/VideoThumbnailer.cs @@ -178,7 +178,7 @@ private string GetOutputDirectory() break; } - Helpers.CreateDirectoryFromDirectoryPath(directory); + Helpers.CreateDirectory(directory); return directory; } diff --git a/ShareX/Program.cs b/ShareX/Program.cs index 675a9fabe..d938eb001 100644 --- a/ShareX/Program.cs +++ b/ShareX/Program.cs @@ -474,11 +474,14 @@ private static void UpdatePersonalPath() private static void CreateParentFolders() { - Helpers.CreateDirectoryFromDirectoryPath(SettingManager.BackupFolder); - Helpers.CreateDirectoryFromDirectoryPath(ImageEffectsFolder); - Helpers.CreateDirectoryFromDirectoryPath(LogsFolder); - Helpers.CreateDirectoryFromDirectoryPath(ScreenshotsParentFolder); - Helpers.CreateDirectoryFromDirectoryPath(ToolsFolder); + if (Directory.Exists(PersonalFolder)) + { + Helpers.CreateDirectory(SettingManager.BackupFolder); + Helpers.CreateDirectory(ImageEffectsFolder); + Helpers.CreateDirectory(LogsFolder); + Helpers.CreateDirectory(ScreenshotsParentFolder); + Helpers.CreateDirectory(ToolsFolder); + } } private static void MigratePersonalPathConfig() From 6567f852e6df5507a3703d22f02274e94f11aef8 Mon Sep 17 00:00:00 2001 From: Jaex Date: Mon, 15 Jun 2020 07:53:20 +0300 Subject: [PATCH 03/37] Register .sxie extension for ShareX image effects --- ShareX/Forms/MainForm.cs | 7 ----- ShareX/IntegrationHelpers.cs | 61 ++++++++++++++++++++++++++++++++++++ ShareX/Program.cs | 23 ++++++++++++-- 3 files changed, 82 insertions(+), 9 deletions(-) diff --git a/ShareX/Forms/MainForm.cs b/ShareX/Forms/MainForm.cs index bbb895a1c..802bf3469 100644 --- a/ShareX/Forms/MainForm.cs +++ b/ShareX/Forms/MainForm.cs @@ -315,13 +315,6 @@ public void UpdateControls() InitHotkeys(); -#if !WindowsStore - if (!Program.Portable && !IntegrationHelpers.CheckCustomUploaderExtension()) - { - IntegrationHelpers.CreateCustomUploaderExtension(true); - } -#endif - IsReady = true; } diff --git a/ShareX/IntegrationHelpers.cs b/ShareX/IntegrationHelpers.cs index 30694673c..a4304f8a5 100644 --- a/ShareX/IntegrationHelpers.cs +++ b/ShareX/IntegrationHelpers.cs @@ -62,6 +62,15 @@ public static class IntegrationHelpers private static readonly string ShellCustomUploaderCommandPath = $@"{ShellCustomUploaderAssociatePath}\shell\open\command"; private static readonly string ShellCustomUploaderCommandValue = $"{ApplicationPath} -CustomUploader \"%1\""; + private static readonly string ShellImageEffectExtensionPath = @"Software\Classes\.sxie"; + private static readonly string ShellImageEffectExtensionValue = "ShareX.sxie"; + private static readonly string ShellImageEffectAssociatePath = $@"Software\Classes\{ShellImageEffectExtensionValue}"; + private static readonly string ShellImageEffectAssociateValue = "ShareX image effect"; + private static readonly string ShellImageEffectIconPath = $@"{ShellImageEffectAssociatePath}\DefaultIcon"; + private static readonly string ShellImageEffectIconValue = $"{ApplicationPath},0"; + private static readonly string ShellImageEffectCommandPath = $@"{ShellImageEffectAssociatePath}\shell\open\command"; + private static readonly string ShellImageEffectCommandValue = $"{ApplicationPath} -ImageEffect \"%1\""; + private static readonly string ChromeNativeMessagingHosts = @"SOFTWARE\Google\Chrome\NativeMessagingHosts\com.getsharex.sharex"; private static readonly string FirefoxNativeMessagingHosts = @"SOFTWARE\Mozilla\NativeMessagingHosts\ShareX"; @@ -214,6 +223,57 @@ private static void UnregisterCustomUploaderExtension() RegistryHelpers.RemoveRegistry(ShellCustomUploaderAssociatePath, true); } + public static bool CheckImageEffectExtension() + { + try + { + return RegistryHelpers.CheckRegistry(ShellImageEffectExtensionPath, null, ShellImageEffectExtensionValue) && + RegistryHelpers.CheckRegistry(ShellImageEffectCommandPath, null, ShellImageEffectCommandValue); + } + catch (Exception e) + { + DebugHelper.WriteException(e); + } + + return false; + } + + public static void CreateImageEffectExtension(bool create) + { + try + { + if (create) + { + UnregisterImageEffectExtension(); + RegisterImageEffectExtension(); + } + else + { + UnregisterImageEffectExtension(); + } + } + catch (Exception e) + { + DebugHelper.WriteException(e); + } + } + + private static void RegisterImageEffectExtension() + { + RegistryHelpers.CreateRegistry(ShellImageEffectExtensionPath, ShellImageEffectExtensionValue); + RegistryHelpers.CreateRegistry(ShellImageEffectAssociatePath, ShellImageEffectAssociateValue); + RegistryHelpers.CreateRegistry(ShellImageEffectIconPath, ShellImageEffectIconValue); + RegistryHelpers.CreateRegistry(ShellImageEffectCommandPath, ShellImageEffectCommandValue); + + NativeMethods.SHChangeNotify(HChangeNotifyEventID.SHCNE_ASSOCCHANGED, HChangeNotifyFlags.SHCNF_FLUSH, IntPtr.Zero, IntPtr.Zero); + } + + private static void UnregisterImageEffectExtension() + { + RegistryHelpers.RemoveRegistry(ShellImageEffectExtensionPath); + RegistryHelpers.RemoveRegistry(ShellImageEffectAssociatePath, true); + } + public static bool CheckChromeExtensionSupport() { try @@ -401,6 +461,7 @@ public static void Uninstall() CreateShellContextMenuButton(false); CreateEditShellContextMenuButton(false); CreateCustomUploaderExtension(false); + CreateImageEffectExtension(false); CreateSendToMenuButton(false); } } diff --git a/ShareX/Program.cs b/ShareX/Program.cs index d938eb001..985e4cdad 100644 --- a/ShareX/Program.cs +++ b/ShareX/Program.cs @@ -271,7 +271,6 @@ private static void Main(string[] args) if (CheckAdminTasks()) return; // If ShareX opened just for be able to execute task as Admin UpdatePersonalPath(); - CreateParentFolders(); DebugHelper.Init(LogsFilePath); @@ -317,6 +316,8 @@ private static void Run() IgnoreHotkeyWarning = CLI.IsCommandExist("NoHotkeys"); + CreateParentFolders(); + RegisterExtensions(); CheckPuushMode(); DebugWriteFlags(); CleanTempFiles(); @@ -474,7 +475,7 @@ private static void UpdatePersonalPath() private static void CreateParentFolders() { - if (Directory.Exists(PersonalFolder)) + if (!Sandbox && Directory.Exists(PersonalFolder)) { Helpers.CreateDirectory(SettingManager.BackupFolder); Helpers.CreateDirectory(ImageEffectsFolder); @@ -484,6 +485,24 @@ private static void CreateParentFolders() } } + private static void RegisterExtensions() + { +#if !WindowsStore + if (!Portable) + { + if (!IntegrationHelpers.CheckCustomUploaderExtension()) + { + IntegrationHelpers.CreateCustomUploaderExtension(true); + } + + if (!IntegrationHelpers.CheckImageEffectExtension()) + { + IntegrationHelpers.CreateImageEffectExtension(true); + } + } +#endif + } + private static void MigratePersonalPathConfig() { if (File.Exists(PreviousPersonalPathConfigFilePath)) From 91d525f90678891deac2a28cf0418ddd2b465bd3 Mon Sep 17 00:00:00 2001 From: Jaex Date: Mon, 15 Jun 2020 08:12:17 +0300 Subject: [PATCH 04/37] Handle -ImageEffect command --- ShareX/Forms/MainForm.cs | 24 +++++++++++++++++------- ShareX/TaskHelpers.cs | 9 +++++++-- ShareX/WorkerTask.cs | 2 +- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/ShareX/Forms/MainForm.cs b/ShareX/Forms/MainForm.cs index 802bf3469..a955002f2 100644 --- a/ShareX/Forms/MainForm.cs +++ b/ShareX/Forms/MainForm.cs @@ -1052,16 +1052,26 @@ public void UseCommandLineArgs(List commands) { DebugHelper.WriteLine("CommandLine: " + command.Command); - if (command.IsCommand && command.Command.Equals("CustomUploader", StringComparison.InvariantCultureIgnoreCase)) + if (command.IsCommand) { - TaskHelpers.AddCustomUploader(command.Parameter); + if (command.Command.Equals("CustomUploader", StringComparison.InvariantCultureIgnoreCase)) + { + TaskHelpers.AddCustomUploader(command.Parameter); - continue; - } + continue; + } - if (command.IsCommand && (CheckCLIHotkey(command) || CheckCLIWorkflow(command))) - { - continue; + if (command.Command.Equals("ImageEffect", StringComparison.InvariantCultureIgnoreCase)) + { + TaskHelpers.AddImageEffect(command.Parameter); + + continue; + } + + if (CheckCLIHotkey(command) || CheckCLIWorkflow(command)) + { + continue; + } } if (URLHelpers.IsValidURL(command.Command)) diff --git a/ShareX/TaskHelpers.cs b/ShareX/TaskHelpers.cs index bdad016f7..879e3a7c8 100644 --- a/ShareX/TaskHelpers.cs +++ b/ShareX/TaskHelpers.cs @@ -578,7 +578,7 @@ public static void PrintImage(Image img) } } - public static Bitmap AddImageEffects(Bitmap bmp, TaskSettingsImage taskSettingsImage) + public static Bitmap ApplyImageEffects(Bitmap bmp, TaskSettingsImage taskSettingsImage) { if (bmp != null && !bmp.PixelFormat.HasFlag(PixelFormat.Indexed)) { @@ -1595,7 +1595,7 @@ public static void AddCustomUploader(string filePath) if (cui.DestinationType.HasFlag(CustomUploaderDestinationType.TextUploader)) destinations.Add("texts"); if (cui.DestinationType.HasFlag(CustomUploaderDestinationType.FileUploader)) destinations.Add("files"); if (cui.DestinationType.HasFlag(CustomUploaderDestinationType.URLShortener) || - (cui.DestinationType.HasFlag(CustomUploaderDestinationType.URLSharingService))) destinations.Add("urls"); + cui.DestinationType.HasFlag(CustomUploaderDestinationType.URLSharingService)) destinations.Add("urls"); string destinationsText = string.Join("/", destinations); @@ -1666,6 +1666,11 @@ public static void AddCustomUploader(string filePath) } } + public static void AddImageEffect(string filePath) + { + // TODO + } + public static void OpenActionsToolbar() { ActionsToolbarForm.Instance.ForceActivate(); diff --git a/ShareX/WorkerTask.cs b/ShareX/WorkerTask.cs index b5e1674bc..a3da4abbf 100644 --- a/ShareX/WorkerTask.cs +++ b/ShareX/WorkerTask.cs @@ -575,7 +575,7 @@ private bool DoAfterCaptureJobs() if (Info.TaskSettings.AfterCaptureJob.HasFlag(AfterCaptureTasks.AddImageEffects)) { - Image = TaskHelpers.AddImageEffects(Image, Info.TaskSettings.ImageSettingsReference); + Image = TaskHelpers.ApplyImageEffects(Image, Info.TaskSettings.ImageSettingsReference); if (Image == null) { From 5f10e996554ede34c824a69407dc468589f9d34c Mon Sep 17 00:00:00 2001 From: Jaex Date: Tue, 16 Jun 2020 01:31:36 +0300 Subject: [PATCH 05/37] Improvements to ZipManager --- ShareX.HelpersLib/ZipManager.cs | 24 +++++++++++++++++++----- ShareX/SettingManager.cs | 10 +++++----- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/ShareX.HelpersLib/ZipManager.cs b/ShareX.HelpersLib/ZipManager.cs index 0b328805a..8e8d6e082 100644 --- a/ShareX.HelpersLib/ZipManager.cs +++ b/ShareX.HelpersLib/ZipManager.cs @@ -97,7 +97,20 @@ public static void Compress(string source, string archivePath, CompressionLevel ZipFile.CreateFromDirectory(source, archivePath, compression, false); } - public static void Compress(string archivePath, List files, string workingDirectory = "", CompressionLevel compression = CompressionLevel.Optimal) + public static void Compress(string archivePath, List files, CompressionLevel compression = CompressionLevel.Optimal) + { + Dictionary entries = new Dictionary(); + + foreach (string file in files) + { + string fileName = Path.GetFileName(file); + entries.Add(file, fileName); + } + + Compress(archivePath, entries, compression); + } + + public static void Compress(string archivePath, Dictionary files, CompressionLevel compression = CompressionLevel.Optimal) { if (File.Exists(archivePath)) { @@ -106,13 +119,14 @@ public static void Compress(string archivePath, List files, string worki using (ZipArchive archive = ZipFile.Open(archivePath, ZipArchiveMode.Update)) { - foreach (string file in files) + foreach (KeyValuePair file in files) { - string filePath = Path.Combine(workingDirectory, file); + string sourceFilePath = file.Key; - if (File.Exists(filePath)) + if (File.Exists(sourceFilePath)) { - archive.CreateEntryFromFile(filePath, file, compression); + string entryName = file.Value; + archive.CreateEntryFromFile(sourceFilePath, entryName, compression); } } } diff --git a/ShareX/SettingManager.cs b/ShareX/SettingManager.cs index 97fbc38ca..f567306e8 100644 --- a/ShareX/SettingManager.cs +++ b/ShareX/SettingManager.cs @@ -352,17 +352,17 @@ public static bool Export(string archivePath, bool settings, bool history) if (settings) { - files.Add(ApplicationConfigFilename); - files.Add(HotkeysConfigFilename); - files.Add(UploadersConfigFilename); + files.Add(ApplicationConfigFilePath); + files.Add(HotkeysConfigFilePath); + files.Add(UploadersConfigFilePath); } if (history) { - files.Add(Program.HistoryFilename); + files.Add(Program.HistoryFilePath); } - ZipManager.Compress(archivePath, files, Program.PersonalFolder); + ZipManager.Compress(archivePath, files); return true; } catch (Exception e) From 0c9a0287fd8387c1748c2e5ce918c1257941aba5 Mon Sep 17 00:00:00 2001 From: Jaex Date: Tue, 16 Jun 2020 02:02:03 +0300 Subject: [PATCH 06/37] Added image effect packager form --- .../ImageEffectPackagerForm.Designer.cs | 99 ++++++++++++++ .../ImageEffectPackagerForm.cs | 123 ++++++++++++++++++ .../ImageEffectPackagerForm.resx | 120 +++++++++++++++++ .../ImageEffectsForm.Designer.cs | 10 ++ ShareX.ImageEffectsLib/ImageEffectsForm.cs | 18 +++ ShareX.ImageEffectsLib/ImageEffectsForm.resx | 70 ++++++---- .../ShareX.ImageEffectsLib.csproj | 9 ++ 7 files changed, 426 insertions(+), 23 deletions(-) create mode 100644 ShareX.ImageEffectsLib/ImageEffectPackagerForm.Designer.cs create mode 100644 ShareX.ImageEffectsLib/ImageEffectPackagerForm.cs create mode 100644 ShareX.ImageEffectsLib/ImageEffectPackagerForm.resx diff --git a/ShareX.ImageEffectsLib/ImageEffectPackagerForm.Designer.cs b/ShareX.ImageEffectsLib/ImageEffectPackagerForm.Designer.cs new file mode 100644 index 000000000..f09df9be3 --- /dev/null +++ b/ShareX.ImageEffectsLib/ImageEffectPackagerForm.Designer.cs @@ -0,0 +1,99 @@ +namespace ShareX.ImageEffectsLib +{ + partial class ImageEffectPackagerForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.lblAssetsFolder = new System.Windows.Forms.Label(); + this.txtAssetsFolder = new System.Windows.Forms.TextBox(); + this.btnPackage = new System.Windows.Forms.Button(); + this.btnAssetsFolderBrowse = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // lblAssetsFolder + // + this.lblAssetsFolder.AutoSize = true; + this.lblAssetsFolder.Location = new System.Drawing.Point(13, 16); + this.lblAssetsFolder.Name = "lblAssetsFolder"; + this.lblAssetsFolder.Size = new System.Drawing.Size(118, 13); + this.lblAssetsFolder.TabIndex = 0; + this.lblAssetsFolder.Text = "Assets folder (Optional):"; + // + // txtAssetsFolder + // + this.txtAssetsFolder.Location = new System.Drawing.Point(16, 32); + this.txtAssetsFolder.Name = "txtAssetsFolder"; + this.txtAssetsFolder.Size = new System.Drawing.Size(336, 20); + this.txtAssetsFolder.TabIndex = 1; + this.txtAssetsFolder.TextChanged += new System.EventHandler(this.txtAssetsFolder_TextChanged); + // + // btnPackage + // + this.btnPackage.Location = new System.Drawing.Point(16, 64); + this.btnPackage.Name = "btnPackage"; + this.btnPackage.Size = new System.Drawing.Size(128, 23); + this.btnPackage.TabIndex = 2; + this.btnPackage.Text = "Package..."; + this.btnPackage.UseVisualStyleBackColor = true; + this.btnPackage.Click += new System.EventHandler(this.btnPackage_Click); + // + // btnAssetsFolderBrowse + // + this.btnAssetsFolderBrowse.Location = new System.Drawing.Point(360, 31); + this.btnAssetsFolderBrowse.Name = "btnAssetsFolderBrowse"; + this.btnAssetsFolderBrowse.Size = new System.Drawing.Size(32, 23); + this.btnAssetsFolderBrowse.TabIndex = 3; + this.btnAssetsFolderBrowse.Text = "..."; + this.btnAssetsFolderBrowse.UseVisualStyleBackColor = true; + this.btnAssetsFolderBrowse.Click += new System.EventHandler(this.btnAssetsFolderBrowse_Click); + // + // ImageEffectPackagerForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(409, 98); + this.Controls.Add(this.btnAssetsFolderBrowse); + this.Controls.Add(this.btnPackage); + this.Controls.Add(this.txtAssetsFolder); + this.Controls.Add(this.lblAssetsFolder); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Name = "ImageEffectPackagerForm"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "ShareX - Image effect packager"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label lblAssetsFolder; + private System.Windows.Forms.TextBox txtAssetsFolder; + private System.Windows.Forms.Button btnPackage; + private System.Windows.Forms.Button btnAssetsFolderBrowse; + } +} \ No newline at end of file diff --git a/ShareX.ImageEffectsLib/ImageEffectPackagerForm.cs b/ShareX.ImageEffectsLib/ImageEffectPackagerForm.cs new file mode 100644 index 000000000..b9c82a5b0 --- /dev/null +++ b/ShareX.ImageEffectsLib/ImageEffectPackagerForm.cs @@ -0,0 +1,123 @@ +#region License Information (GPL v3) + +/* + ShareX - A program that allows you to take screenshots and share any file type + Copyright (c) 2007-2020 ShareX Team + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + Optionally you can also view the license at . +*/ + +#endregion License Information (GPL v3) + +using ShareX.HelpersLib; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace ShareX.ImageEffectsLib +{ + public partial class ImageEffectPackagerForm : Form + { + public string EffectJson { get; private set; } + public string EffectName { get; private set; } + public string AssetsFolderPath { get; private set; } + + public ImageEffectPackagerForm(string json, string name) + { + EffectJson = json; + EffectName = name; + + InitializeComponent(); + ShareXResources.ApplyTheme(this); + } + + private void Package() + { + using (SaveFileDialog sfd = new SaveFileDialog()) + { + sfd.DefaultExt = "sxie"; + sfd.FileName = EffectName + ".sxie"; + sfd.Filter = "ShareX image effect (*.sxie)|*.sxie"; + + if (sfd.ShowDialog() == DialogResult.OK) + { + Package(sfd.FileName); + } + } + } + + private void Package(string outputFilePath) + { + if (!string.IsNullOrEmpty(outputFilePath)) + { + string outputFolder = Path.GetDirectoryName(outputFilePath); + Helpers.CreateDirectory(outputFolder); + + string jsonFilePath = Path.Combine(outputFolder, "ImageEffect.json"); + File.WriteAllText(jsonFilePath, EffectJson, Encoding.UTF8); + + try + { + Dictionary files = new Dictionary(); + files.Add(jsonFilePath, "ImageEffect.json"); + + if (!string.IsNullOrEmpty(AssetsFolderPath) && Directory.Exists(AssetsFolderPath)) + { + int entryNamePosition = AssetsFolderPath.Length + 1; + + foreach (string assetPath in Directory.EnumerateFiles(AssetsFolderPath, "*.*", SearchOption.AllDirectories).Where(x => Helpers.IsImageFile(x))) + { + string entryName = assetPath.Substring(entryNamePosition); + files.Add(assetPath, entryName); + } + } + + ZipManager.Compress(outputFilePath, files); + } + finally + { + File.Delete(jsonFilePath); + } + } + } + + private void txtAssetsFolder_TextChanged(object sender, EventArgs e) + { + AssetsFolderPath = txtAssetsFolder.Text; + } + + private void btnAssetsFolderBrowse_Click(object sender, EventArgs e) + { + Helpers.BrowseFolder(txtAssetsFolder, "", true); + } + + private void btnPackage_Click(object sender, EventArgs e) + { + try + { + Package(); + } + catch (Exception ex) + { + ex.ShowError(); + } + } + } +} \ No newline at end of file diff --git a/ShareX.ImageEffectsLib/ImageEffectPackagerForm.resx b/ShareX.ImageEffectsLib/ImageEffectPackagerForm.resx new file mode 100644 index 000000000..1af7de150 --- /dev/null +++ b/ShareX.ImageEffectsLib/ImageEffectPackagerForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ShareX.ImageEffectsLib/ImageEffectsForm.Designer.cs b/ShareX.ImageEffectsLib/ImageEffectsForm.Designer.cs index 6b1146506..30fcf9af1 100644 --- a/ShareX.ImageEffectsLib/ImageEffectsForm.Designer.cs +++ b/ShareX.ImageEffectsLib/ImageEffectsForm.Designer.cs @@ -56,6 +56,7 @@ private void InitializeComponent() this.btnRefresh = new System.Windows.Forms.Button(); this.btnDuplicatePreset = new System.Windows.Forms.Button(); this.lblPresets = new System.Windows.Forms.Label(); + this.btnPackager = new System.Windows.Forms.Button(); this.cmsLoadImage.SuspendLayout(); this.SuspendLayout(); // @@ -259,12 +260,20 @@ private void InitializeComponent() resources.ApplyResources(this.lblPresets, "lblPresets"); this.lblPresets.Name = "lblPresets"; // + // btnPackager + // + resources.ApplyResources(this.btnPackager, "btnPackager"); + this.btnPackager.Name = "btnPackager"; + this.btnPackager.UseVisualStyleBackColor = true; + this.btnPackager.Click += new System.EventHandler(this.btnPackager_Click); + // // ImageEffectsForm // resources.ApplyResources(this, "$this"); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.BackColor = System.Drawing.SystemColors.Window; this.CancelButton = this.btnClose; + this.Controls.Add(this.btnPackager); this.Controls.Add(this.lblPresets); this.Controls.Add(this.btnDuplicatePreset); this.Controls.Add(this.btnRefresh); @@ -323,6 +332,7 @@ private void InitializeComponent() private System.Windows.Forms.Button btnRefresh; private System.Windows.Forms.Button btnDuplicatePreset; private System.Windows.Forms.Label lblPresets; + private System.Windows.Forms.Button btnPackager; } } diff --git a/ShareX.ImageEffectsLib/ImageEffectsForm.cs b/ShareX.ImageEffectsLib/ImageEffectsForm.cs index 646b6b13f..9a99e9092 100644 --- a/ShareX.ImageEffectsLib/ImageEffectsForm.cs +++ b/ShareX.ImageEffectsLib/ImageEffectsForm.cs @@ -608,6 +608,24 @@ private void eiImageEffects_ImportRequested(object obj) } } + private void btnPackager_Click(object sender, EventArgs e) + { + ImageEffectPreset preset = GetSelectedPreset(); + + if (preset != null) + { + string json = eiImageEffects.Serialize(preset); + + if (!string.IsNullOrEmpty(json)) + { + using (ImageEffectPackagerForm packagerForm = new ImageEffectPackagerForm(json, preset.Name)) + { + packagerForm.ShowDialog(); + } + } + } + } + private void tsmiLoadImageFromFile_Click(object sender, EventArgs e) { string filePath = ImageHelpers.OpenImageFileDialog(); diff --git a/ShareX.ImageEffectsLib/ImageEffectsForm.resx b/ShareX.ImageEffectsLib/ImageEffectsForm.resx index 98d7486fc..a9e0d88e6 100644 --- a/ShareX.ImageEffectsLib/ImageEffectsForm.resx +++ b/ShareX.ImageEffectsLib/ImageEffectsForm.resx @@ -142,7 +142,7 @@ $this - 20 + 21 408, 40 @@ -166,7 +166,7 @@ $this - 19 + 20 Top, Bottom, Left @@ -193,7 +193,7 @@ $this - 21 + 22 520, 40 @@ -217,7 +217,7 @@ $this - 18 + 19 744, 40 @@ -241,7 +241,7 @@ $this - 17 + 18 632, 40 @@ -265,7 +265,7 @@ $this - 16 + 17 Bottom, Left @@ -274,7 +274,7 @@ True - 328, 504 + 456, 504 120, 24 @@ -298,7 +298,7 @@ $this - 15 + 16 Bottom, Left @@ -322,7 +322,7 @@ $this - 14 + 15 Top, Bottom, Left, Right @@ -346,7 +346,7 @@ $this - 22 + 23 17, 17 @@ -364,7 +364,7 @@ Bottom, Left - 200, 504 + 328, 504 126, 17 @@ -412,7 +412,7 @@ $this - 13 + 14 408, 8 @@ -436,7 +436,7 @@ $this - 12 + 13 552, 8 @@ -460,7 +460,7 @@ $this - 11 + 12 104, 10 @@ -481,7 +481,7 @@ $this - 10 + 11 True @@ -508,7 +508,7 @@ $this - 9 + 10 104, 42 @@ -529,7 +529,7 @@ $this - 8 + 9 Bottom, Right @@ -556,7 +556,7 @@ $this - 7 + 8 Bottom, Right @@ -586,13 +586,13 @@ $this - 6 + 7 Bottom, Left - 456, 504 + 584, 504 120, 24 @@ -616,7 +616,7 @@ $this - 5 + 6 856, 40 @@ -640,7 +640,7 @@ $this - 4 + 5 696, 8 @@ -664,7 +664,7 @@ $this - 3 + 4 True @@ -691,6 +691,30 @@ $this + 3 + + + 200, 504 + + + 120, 24 + + + 21 + + + Packager... + + + btnPackager + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + 2 diff --git a/ShareX.ImageEffectsLib/ShareX.ImageEffectsLib.csproj b/ShareX.ImageEffectsLib/ShareX.ImageEffectsLib.csproj index 9388f7e6d..3390fcd07 100644 --- a/ShareX.ImageEffectsLib/ShareX.ImageEffectsLib.csproj +++ b/ShareX.ImageEffectsLib/ShareX.ImageEffectsLib.csproj @@ -130,6 +130,12 @@ + + Form + + + ImageEffectPackagerForm.cs + @@ -174,6 +180,9 @@ + + ImageEffectPackagerForm.cs + ImageEffectsForm.cs From 573f512589d73e01c3416ecdadaf426f032caed9 Mon Sep 17 00:00:00 2001 From: Jaex Date: Tue, 16 Jun 2020 02:21:20 +0300 Subject: [PATCH 07/37] Added ImageEffectPackager class --- ShareX.ImageEffectsLib/ImageEffectPackager.cs | 92 +++++++++++++++++++ .../ImageEffectPackagerForm.cs | 67 ++------------ .../ShareX.ImageEffectsLib.csproj | 1 + 3 files changed, 99 insertions(+), 61 deletions(-) create mode 100644 ShareX.ImageEffectsLib/ImageEffectPackager.cs diff --git a/ShareX.ImageEffectsLib/ImageEffectPackager.cs b/ShareX.ImageEffectsLib/ImageEffectPackager.cs new file mode 100644 index 000000000..cc7e0a26c --- /dev/null +++ b/ShareX.ImageEffectsLib/ImageEffectPackager.cs @@ -0,0 +1,92 @@ +#region License Information (GPL v3) + +/* + ShareX - A program that allows you to take screenshots and share any file type + Copyright (c) 2007-2020 ShareX Team + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + Optionally you can also view the license at . +*/ + +#endregion License Information (GPL v3) + +using ShareX.HelpersLib; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace ShareX.ImageEffectsLib +{ + public class ImageEffectPackager + { + public string EffectJson { get; set; } + public string EffectName { get; set; } + public string AssetsFolderPath { get; set; } + + public void Package() + { + using (SaveFileDialog sfd = new SaveFileDialog()) + { + sfd.DefaultExt = "sxie"; + sfd.FileName = EffectName + ".sxie"; + sfd.Filter = "ShareX image effect (*.sxie)|*.sxie"; + + if (sfd.ShowDialog() == DialogResult.OK) + { + Package(sfd.FileName); + } + } + } + + public void Package(string outputFilePath) + { + if (!string.IsNullOrEmpty(outputFilePath)) + { + string outputFolder = Path.GetDirectoryName(outputFilePath); + Helpers.CreateDirectory(outputFolder); + + string jsonFileName = "ImageEffect.json"; + string jsonFilePath = Path.Combine(outputFolder, jsonFileName); + File.WriteAllText(jsonFilePath, EffectJson, Encoding.UTF8); + + try + { + Dictionary files = new Dictionary(); + files.Add(jsonFilePath, jsonFileName); + + if (!string.IsNullOrEmpty(AssetsFolderPath) && Directory.Exists(AssetsFolderPath)) + { + int entryNamePosition = AssetsFolderPath.Length + 1; + + foreach (string assetPath in Directory.EnumerateFiles(AssetsFolderPath, "*.*", SearchOption.AllDirectories).Where(x => Helpers.IsImageFile(x))) + { + string entryName = assetPath.Substring(entryNamePosition); + files.Add(assetPath, entryName); + } + } + + ZipManager.Compress(outputFilePath, files); + } + finally + { + File.Delete(jsonFilePath); + } + } + } + } +} \ No newline at end of file diff --git a/ShareX.ImageEffectsLib/ImageEffectPackagerForm.cs b/ShareX.ImageEffectsLib/ImageEffectPackagerForm.cs index b9c82a5b0..669382df7 100644 --- a/ShareX.ImageEffectsLib/ImageEffectPackagerForm.cs +++ b/ShareX.ImageEffectsLib/ImageEffectPackagerForm.cs @@ -25,82 +25,27 @@ using ShareX.HelpersLib; using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; using System.Windows.Forms; namespace ShareX.ImageEffectsLib { public partial class ImageEffectPackagerForm : Form { - public string EffectJson { get; private set; } - public string EffectName { get; private set; } - public string AssetsFolderPath { get; private set; } + public ImageEffectPackager Packager { get; set; } public ImageEffectPackagerForm(string json, string name) { - EffectJson = json; - EffectName = name; + Packager = new ImageEffectPackager(); + Packager.EffectJson = json; + Packager.EffectName = name; InitializeComponent(); ShareXResources.ApplyTheme(this); } - private void Package() - { - using (SaveFileDialog sfd = new SaveFileDialog()) - { - sfd.DefaultExt = "sxie"; - sfd.FileName = EffectName + ".sxie"; - sfd.Filter = "ShareX image effect (*.sxie)|*.sxie"; - - if (sfd.ShowDialog() == DialogResult.OK) - { - Package(sfd.FileName); - } - } - } - - private void Package(string outputFilePath) - { - if (!string.IsNullOrEmpty(outputFilePath)) - { - string outputFolder = Path.GetDirectoryName(outputFilePath); - Helpers.CreateDirectory(outputFolder); - - string jsonFilePath = Path.Combine(outputFolder, "ImageEffect.json"); - File.WriteAllText(jsonFilePath, EffectJson, Encoding.UTF8); - - try - { - Dictionary files = new Dictionary(); - files.Add(jsonFilePath, "ImageEffect.json"); - - if (!string.IsNullOrEmpty(AssetsFolderPath) && Directory.Exists(AssetsFolderPath)) - { - int entryNamePosition = AssetsFolderPath.Length + 1; - - foreach (string assetPath in Directory.EnumerateFiles(AssetsFolderPath, "*.*", SearchOption.AllDirectories).Where(x => Helpers.IsImageFile(x))) - { - string entryName = assetPath.Substring(entryNamePosition); - files.Add(assetPath, entryName); - } - } - - ZipManager.Compress(outputFilePath, files); - } - finally - { - File.Delete(jsonFilePath); - } - } - } - private void txtAssetsFolder_TextChanged(object sender, EventArgs e) { - AssetsFolderPath = txtAssetsFolder.Text; + Packager.AssetsFolderPath = txtAssetsFolder.Text; } private void btnAssetsFolderBrowse_Click(object sender, EventArgs e) @@ -112,7 +57,7 @@ private void btnPackage_Click(object sender, EventArgs e) { try { - Package(); + Packager.Package(); } catch (Exception ex) { diff --git a/ShareX.ImageEffectsLib/ShareX.ImageEffectsLib.csproj b/ShareX.ImageEffectsLib/ShareX.ImageEffectsLib.csproj index 3390fcd07..573d85d69 100644 --- a/ShareX.ImageEffectsLib/ShareX.ImageEffectsLib.csproj +++ b/ShareX.ImageEffectsLib/ShareX.ImageEffectsLib.csproj @@ -130,6 +130,7 @@ + Form From 059e22e0d8dcc74b014bcf3817a7f94309de7ddc Mon Sep 17 00:00:00 2001 From: Jaex Date: Tue, 16 Jun 2020 04:08:17 +0300 Subject: [PATCH 08/37] Added ExtractPackage method --- ShareX.ImageEffectsLib/ImageEffectPackager.cs | 34 ++++++++++++++++--- ShareX/TaskHelpers.cs | 7 +++- 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/ShareX.ImageEffectsLib/ImageEffectPackager.cs b/ShareX.ImageEffectsLib/ImageEffectPackager.cs index cc7e0a26c..3f03c94b1 100644 --- a/ShareX.ImageEffectsLib/ImageEffectPackager.cs +++ b/ShareX.ImageEffectsLib/ImageEffectPackager.cs @@ -34,6 +34,8 @@ namespace ShareX.ImageEffectsLib { public class ImageEffectPackager { + private const string ConfigFileName = "ImageEffect.json"; + public string EffectJson { get; set; } public string EffectName { get; set; } public string AssetsFolderPath { get; set; } @@ -60,14 +62,13 @@ public void Package(string outputFilePath) string outputFolder = Path.GetDirectoryName(outputFilePath); Helpers.CreateDirectory(outputFolder); - string jsonFileName = "ImageEffect.json"; - string jsonFilePath = Path.Combine(outputFolder, jsonFileName); - File.WriteAllText(jsonFilePath, EffectJson, Encoding.UTF8); + string configFilePath = Path.Combine(outputFolder, ConfigFileName); + File.WriteAllText(configFilePath, EffectJson, Encoding.UTF8); try { Dictionary files = new Dictionary(); - files.Add(jsonFilePath, jsonFileName); + files.Add(configFilePath, ConfigFileName); if (!string.IsNullOrEmpty(AssetsFolderPath) && Directory.Exists(AssetsFolderPath)) { @@ -84,9 +85,32 @@ public void Package(string outputFilePath) } finally { - File.Delete(jsonFilePath); + File.Delete(configFilePath); } } } + + public static string ExtractPackage(string packageFilePath, string imageEffectsFolderPath) + { + if (!string.IsNullOrEmpty(packageFilePath) && File.Exists(packageFilePath) && !string.IsNullOrEmpty(imageEffectsFolderPath)) + { + string packageName = Path.GetFileNameWithoutExtension(packageFilePath); + + if (!string.IsNullOrEmpty(packageName) && !packageName.StartsWith(".")) + { + string destination = Path.Combine(imageEffectsFolderPath, packageName); + ZipManager.Extract(packageFilePath, destination); + + string configFilePath = Path.Combine(destination, ConfigFileName); + + if (File.Exists(configFilePath)) + { + return configFilePath; + } + } + } + + return null; + } } } \ No newline at end of file diff --git a/ShareX/TaskHelpers.cs b/ShareX/TaskHelpers.cs index 879e3a7c8..5b8899c53 100644 --- a/ShareX/TaskHelpers.cs +++ b/ShareX/TaskHelpers.cs @@ -1668,7 +1668,12 @@ public static void AddCustomUploader(string filePath) public static void AddImageEffect(string filePath) { - // TODO + string configFilePath = ImageEffectPackager.ExtractPackage(filePath, Program.ImageEffectsFolder); + + if (!string.IsNullOrEmpty(configFilePath)) + { + // TODO + } } public static void OpenActionsToolbar() From 8a6d06b21df345afd8c3d1e453e81bf54faa11cd Mon Sep 17 00:00:00 2001 From: Jaex Date: Tue, 16 Jun 2020 04:40:57 +0300 Subject: [PATCH 09/37] Support singleton in image effects form --- ShareX.ImageEffectsLib/ImageEffectsForm.cs | 17 ++++++++++++++++- ShareX/Forms/TaskSettingsForm.cs | 16 ++++++++++++---- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/ShareX.ImageEffectsLib/ImageEffectsForm.cs b/ShareX.ImageEffectsLib/ImageEffectsForm.cs index 9a99e9092..7e95235bf 100644 --- a/ShareX.ImageEffectsLib/ImageEffectsForm.cs +++ b/ShareX.ImageEffectsLib/ImageEffectsForm.cs @@ -35,6 +35,10 @@ namespace ShareX.ImageEffectsLib { public partial class ImageEffectsForm : Form { + public static bool IsInstanceActive => instance != null && !instance.IsDisposed; + + private static ImageEffectsForm instance; + public event Action ImageProcessRequested; public bool AutoGeneratePreviewImage { get; set; } @@ -67,6 +71,18 @@ public ImageEffectsForm(Bitmap bmp, List presets, int selecte eiImageEffects.ObjectType = typeof(ImageEffectPreset); eiImageEffects.SerializationBinder = new TypeNameSerializationBinder("ShareX.ImageEffectsLib", "ShareX.ImageEffectsLib"); AddAllEffectsToContextMenu(); + + LoadSettings(); + } + + public static ImageEffectsForm GetFormInstance(List presets, int selectedPresetIndex) + { + if (!IsInstanceActive) + { + instance = new ImageEffectsForm(null, presets, selectedPresetIndex); + } + + return instance; } public void EnableToolMode(Action imageProcessRequested, string filePath = null) @@ -419,7 +435,6 @@ private void LoadPreset(ImageEffectPreset preset) private void ImageEffectsForm_Shown(object sender, EventArgs e) { - LoadSettings(); this.ForceActivate(); } diff --git a/ShareX/Forms/TaskSettingsForm.cs b/ShareX/Forms/TaskSettingsForm.cs index 0cf24ecd5..0a8790dd0 100644 --- a/ShareX/Forms/TaskSettingsForm.cs +++ b/ShareX/Forms/TaskSettingsForm.cs @@ -813,11 +813,19 @@ private void chkShowImageEffectsWindowAfterCapture_CheckedChanged(object sender, private void btnImageEffects_Click(object sender, EventArgs e) { - using (ImageEffectsForm imageEffectsForm = new ImageEffectsForm(null, TaskSettings.ImageSettings.ImageEffectPresets, - TaskSettings.ImageSettings.SelectedImageEffectPreset)) + bool firstInstance = !ImageEffectsForm.IsInstanceActive; + + ImageEffectsForm imageEffectsForm = ImageEffectsForm.GetFormInstance(TaskSettings.ImageSettings.ImageEffectPresets, + TaskSettings.ImageSettings.SelectedImageEffectPreset); + + if (firstInstance) { - imageEffectsForm.ShowDialog(); - TaskSettings.ImageSettings.SelectedImageEffectPreset = imageEffectsForm.SelectedPresetIndex; + imageEffectsForm.FormClosed += (sender2, e2) => TaskSettings.ImageSettings.SelectedImageEffectPreset = imageEffectsForm.SelectedPresetIndex; + imageEffectsForm.Show(); + } + else + { + imageEffectsForm.ForceActivate(); } } From 28c7b91752d7fca335eaa1bc805bcf055485207c Mon Sep 17 00:00:00 2001 From: Jaex Date: Tue, 16 Jun 2020 05:29:07 +0300 Subject: [PATCH 10/37] Support importing .sxie files --- .../Controls/ExportImportControl.cs | 9 ++++-- ShareX.ImageEffectsLib/ImageEffectPackager.cs | 7 +---- ShareX.ImageEffectsLib/ImageEffectsForm.cs | 9 ++++-- ShareX/Forms/TaskSettingsForm.cs | 15 +-------- ShareX/TaskHelpers.cs | 31 +++++++++++++++++-- 5 files changed, 45 insertions(+), 26 deletions(-) diff --git a/ShareX.HelpersLib/Controls/ExportImportControl.cs b/ShareX.HelpersLib/Controls/ExportImportControl.cs index 08dd648f4..3e7672400 100644 --- a/ShareX.HelpersLib/Controls/ExportImportControl.cs +++ b/ShareX.HelpersLib/Controls/ExportImportControl.cs @@ -231,6 +231,12 @@ private void tsmiImportClipboard_Click(object sender, EventArgs e) } } + public void ImportFile(string filePath) + { + string json = File.ReadAllText(filePath, Encoding.UTF8); + OnImportRequested(json); + } + private void tsmiImportFile_Click(object sender, EventArgs e) { string filter = "Settings (*.json)|*.json|All files (*.*)|*.*"; @@ -246,8 +252,7 @@ private void tsmiImportFile_Click(object sender, EventArgs e) { foreach (string filename in ofd.FileNames) { - string json = File.ReadAllText(filename, Encoding.UTF8); - OnImportRequested(json); + ImportFile(filename); } OnImportCompleted(); diff --git a/ShareX.ImageEffectsLib/ImageEffectPackager.cs b/ShareX.ImageEffectsLib/ImageEffectPackager.cs index 3f03c94b1..3db678718 100644 --- a/ShareX.ImageEffectsLib/ImageEffectPackager.cs +++ b/ShareX.ImageEffectsLib/ImageEffectPackager.cs @@ -101,12 +101,7 @@ public static string ExtractPackage(string packageFilePath, string imageEffectsF string destination = Path.Combine(imageEffectsFolderPath, packageName); ZipManager.Extract(packageFilePath, destination); - string configFilePath = Path.Combine(destination, ConfigFileName); - - if (File.Exists(configFilePath)) - { - return configFilePath; - } + return Path.Combine(destination, ConfigFileName); } } diff --git a/ShareX.ImageEffectsLib/ImageEffectsForm.cs b/ShareX.ImageEffectsLib/ImageEffectsForm.cs index 7e95235bf..659b68519 100644 --- a/ShareX.ImageEffectsLib/ImageEffectsForm.cs +++ b/ShareX.ImageEffectsLib/ImageEffectsForm.cs @@ -71,8 +71,6 @@ public ImageEffectsForm(Bitmap bmp, List presets, int selecte eiImageEffects.ObjectType = typeof(ImageEffectPreset); eiImageEffects.SerializationBinder = new TypeNameSerializationBinder("ShareX.ImageEffectsLib", "ShareX.ImageEffectsLib"); AddAllEffectsToContextMenu(); - - LoadSettings(); } public static ImageEffectsForm GetFormInstance(List presets, int selectedPresetIndex) @@ -101,6 +99,11 @@ public void EditorMode() btnClose.Text = Resources.ImageEffectsForm_EditorMode_Cancel; } + public void ImportImageEffectFromFilePath(string filePath) + { + eiImageEffects.ImportFile(filePath); + } + protected void OnImageProcessRequested(Bitmap bmp) { ImageProcessRequested?.Invoke(bmp); @@ -435,6 +438,8 @@ private void LoadPreset(ImageEffectPreset preset) private void ImageEffectsForm_Shown(object sender, EventArgs e) { + LoadSettings(); + this.ForceActivate(); } diff --git a/ShareX/Forms/TaskSettingsForm.cs b/ShareX/Forms/TaskSettingsForm.cs index 0a8790dd0..7dee35cb4 100644 --- a/ShareX/Forms/TaskSettingsForm.cs +++ b/ShareX/Forms/TaskSettingsForm.cs @@ -813,20 +813,7 @@ private void chkShowImageEffectsWindowAfterCapture_CheckedChanged(object sender, private void btnImageEffects_Click(object sender, EventArgs e) { - bool firstInstance = !ImageEffectsForm.IsInstanceActive; - - ImageEffectsForm imageEffectsForm = ImageEffectsForm.GetFormInstance(TaskSettings.ImageSettings.ImageEffectPresets, - TaskSettings.ImageSettings.SelectedImageEffectPreset); - - if (firstInstance) - { - imageEffectsForm.FormClosed += (sender2, e2) => TaskSettings.ImageSettings.SelectedImageEffectPreset = imageEffectsForm.SelectedPresetIndex; - imageEffectsForm.Show(); - } - else - { - imageEffectsForm.ForceActivate(); - } + TaskHelpers.OpenImageEffectsSingleton(TaskSettings); } private void nudThumbnailWidth_ValueChanged(object sender, EventArgs e) diff --git a/ShareX/TaskHelpers.cs b/ShareX/TaskHelpers.cs index 5b8899c53..57f71aab6 100644 --- a/ShareX/TaskHelpers.cs +++ b/ShareX/TaskHelpers.cs @@ -1061,6 +1061,28 @@ public static void OpenImageEffects(TaskSettings taskSettings = null) } } + public static ImageEffectsForm OpenImageEffectsSingleton(TaskSettings taskSettings = null) + { + if (taskSettings == null) taskSettings = Program.DefaultTaskSettings; + + bool firstInstance = !ImageEffectsForm.IsInstanceActive; + + ImageEffectsForm imageEffectsForm = ImageEffectsForm.GetFormInstance(taskSettings.ImageSettings.ImageEffectPresets, + taskSettings.ImageSettings.SelectedImageEffectPreset); + + if (firstInstance) + { + imageEffectsForm.FormClosed += (sender, e) => taskSettings.ImageSettings.SelectedImageEffectPreset = imageEffectsForm.SelectedPresetIndex; + imageEffectsForm.Show(); + } + else + { + imageEffectsForm.ForceActivate(); + } + + return imageEffectsForm; + } + public static void OpenMonitorTest() { using (MonitorTestForm monitorTestForm = new MonitorTestForm()) @@ -1670,9 +1692,14 @@ public static void AddImageEffect(string filePath) { string configFilePath = ImageEffectPackager.ExtractPackage(filePath, Program.ImageEffectsFolder); - if (!string.IsNullOrEmpty(configFilePath)) + if (!string.IsNullOrEmpty(configFilePath) && File.Exists(configFilePath)) { - // TODO + ImageEffectsForm imageEffectsForm = OpenImageEffectsSingleton(Program.DefaultTaskSettings); + + if (imageEffectsForm != null) + { + imageEffectsForm.ImportImageEffectFromFilePath(configFilePath); + } } } From d4bd293bbe9924337767db67614ead86012a6051 Mon Sep 17 00:00:00 2001 From: Jaex Date: Tue, 16 Jun 2020 05:52:44 +0300 Subject: [PATCH 11/37] Fix unnecessary preview updates --- ShareX.ImageEffectsLib/ImageEffectsForm.cs | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/ShareX.ImageEffectsLib/ImageEffectsForm.cs b/ShareX.ImageEffectsLib/ImageEffectsForm.cs index 659b68519..235264946 100644 --- a/ShareX.ImageEffectsLib/ImageEffectsForm.cs +++ b/ShareX.ImageEffectsLib/ImageEffectsForm.cs @@ -52,6 +52,8 @@ public partial class ImageEffectsForm : Form public ImageEffectsForm(Bitmap bmp, List presets, int selectedPresetIndex) { + pauseUpdate = true; + InitializeComponent(); ShareXResources.ApplyTheme(this); @@ -68,9 +70,14 @@ public ImageEffectsForm(Bitmap bmp, List presets, int selecte } SelectedPresetIndex = selectedPresetIndex; + eiImageEffects.ObjectType = typeof(ImageEffectPreset); eiImageEffects.SerializationBinder = new TypeNameSerializationBinder("ShareX.ImageEffectsLib", "ShareX.ImageEffectsLib"); + AddAllEffectsToContextMenu(); + LoadSettings(); + + pauseUpdate = false; } public static ImageEffectsForm GetFormInstance(List presets, int selectedPresetIndex) @@ -180,8 +187,6 @@ private void AddEffectToContextMenu(string groupName, params Type[] imageEffects private void LoadSettings() { - pauseUpdate = true; - foreach (ImageEffectPreset preset in Presets) { cbPresets.Items.Add(preset); @@ -193,8 +198,6 @@ private void LoadSettings() } UpdateControlStates(); - - pauseUpdate = false; } private ImageEffectPreset GetSelectedPreset() @@ -220,7 +223,9 @@ private void AddPreset(ImageEffectPreset preset) { Presets.Add(preset); cbPresets.Items.Add(preset); + ignorePresetsSelectedIndexChanged = true; cbPresets.SelectedIndex = cbPresets.Items.Count - 1; + ignorePresetsSelectedIndexChanged = false; LoadPreset(preset); txtPresetName.Focus(); } @@ -438,8 +443,6 @@ private void LoadPreset(ImageEffectPreset preset) private void ImageEffectsForm_Shown(object sender, EventArgs e) { - LoadSettings(); - this.ForceActivate(); } @@ -585,7 +588,7 @@ private void lvEffects_SelectedIndexChanged(object sender, EventArgs e) private void lvEffects_ItemChecked(object sender, ItemCheckedEventArgs e) { - if (e.Item != null && e.Item.Tag is ImageEffect) + if (e.Item != null && e.Item.Focused && e.Item.Tag is ImageEffect) { ImageEffect imageEffect = (ImageEffect)e.Item.Tag; imageEffect.Enabled = e.Item.Checked; From e01f8304b4d3d4d2ffa7d9977f66f39a40825aac Mon Sep 17 00:00:00 2001 From: Jaex Date: Tue, 16 Jun 2020 06:23:13 +0300 Subject: [PATCH 12/37] Try catch extract --- ShareX.ImageEffectsLib/ImageEffectsForm.cs | 2 +- ShareX/Forms/MainForm.cs | 4 ++-- ShareX/TaskHelpers.cs | 17 +++++++++++++---- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/ShareX.ImageEffectsLib/ImageEffectsForm.cs b/ShareX.ImageEffectsLib/ImageEffectsForm.cs index 235264946..ddab1ae0d 100644 --- a/ShareX.ImageEffectsLib/ImageEffectsForm.cs +++ b/ShareX.ImageEffectsLib/ImageEffectsForm.cs @@ -106,7 +106,7 @@ public void EditorMode() btnClose.Text = Resources.ImageEffectsForm_EditorMode_Cancel; } - public void ImportImageEffectFromFilePath(string filePath) + public void ImportImageEffectFromFile(string filePath) { eiImageEffects.ImportFile(filePath); } diff --git a/ShareX/Forms/MainForm.cs b/ShareX/Forms/MainForm.cs index a955002f2..857ad6617 100644 --- a/ShareX/Forms/MainForm.cs +++ b/ShareX/Forms/MainForm.cs @@ -1056,14 +1056,14 @@ public void UseCommandLineArgs(List commands) { if (command.Command.Equals("CustomUploader", StringComparison.InvariantCultureIgnoreCase)) { - TaskHelpers.AddCustomUploader(command.Parameter); + TaskHelpers.ImportCustomUploader(command.Parameter); continue; } if (command.Command.Equals("ImageEffect", StringComparison.InvariantCultureIgnoreCase)) { - TaskHelpers.AddImageEffect(command.Parameter); + TaskHelpers.ImportImageEffect(command.Parameter); continue; } diff --git a/ShareX/TaskHelpers.cs b/ShareX/TaskHelpers.cs index 57f71aab6..cd5127b98 100644 --- a/ShareX/TaskHelpers.cs +++ b/ShareX/TaskHelpers.cs @@ -1588,7 +1588,7 @@ public static Screenshot GetScreenshot(TaskSettings taskSettings = null) return screenshot; } - public static void AddCustomUploader(string filePath) + public static void ImportCustomUploader(string filePath) { if (Program.UploadersConfig != null) { @@ -1688,9 +1688,18 @@ public static void AddCustomUploader(string filePath) } } - public static void AddImageEffect(string filePath) + public static void ImportImageEffect(string filePath) { - string configFilePath = ImageEffectPackager.ExtractPackage(filePath, Program.ImageEffectsFolder); + string configFilePath = null; + + try + { + configFilePath = ImageEffectPackager.ExtractPackage(filePath, Program.ImageEffectsFolder); + } + catch (Exception ex) + { + ex.ShowError(); + } if (!string.IsNullOrEmpty(configFilePath) && File.Exists(configFilePath)) { @@ -1698,7 +1707,7 @@ public static void AddImageEffect(string filePath) if (imageEffectsForm != null) { - imageEffectsForm.ImportImageEffectFromFilePath(configFilePath); + imageEffectsForm.ImportImageEffectFromFile(configFilePath); } } } From 0a5d80325560fe83e8c4cdc344dc66bb0b8f7c3f Mon Sep 17 00:00:00 2001 From: Jaex Date: Tue, 16 Jun 2020 07:27:32 +0300 Subject: [PATCH 13/37] Added custom path variable %ShareXImageEffects% --- ShareX.HelpersLib/Helpers/Helpers.cs | 20 +++++++++++++++++-- ShareX.HelpersLib/HelpersOptions.cs | 1 + .../UITypeEditors/DirectoryNameEditor.cs | 2 +- .../UITypeEditors/ImageFileNameEditor.cs | 2 +- ShareX.ImageEffectsLib/Drawings/DrawImage.cs | 2 +- .../Drawings/DrawParticles.cs | 2 +- ShareX/Forms/MainForm.cs | 1 + ShareX/Program.cs | 10 ++++++++-- 8 files changed, 32 insertions(+), 8 deletions(-) diff --git a/ShareX.HelpersLib/Helpers/Helpers.cs b/ShareX.HelpersLib/Helpers/Helpers.cs index 3348d7d72..3e65601fe 100644 --- a/ShareX.HelpersLib/Helpers/Helpers.cs +++ b/ShareX.HelpersLib/Helpers/Helpers.cs @@ -791,12 +791,20 @@ public static bool BrowseFolder(string title, TextBox tb, string initialDirector return false; } - public static string GetVariableFolderPath(string path) + public static string GetVariableFolderPath(string path, bool supportCustomSpecialFolders = false) { if (!string.IsNullOrEmpty(path)) { try { + if (supportCustomSpecialFolders) + { + foreach (KeyValuePair specialFolder in HelpersOptions.ShareXSpecialFolders) + { + path = path.Replace(specialFolder.Value, $"%{specialFolder.Key}%", StringComparison.OrdinalIgnoreCase); + } + } + foreach (Environment.SpecialFolder specialFolder in GetEnums()) { path = path.Replace(Environment.GetFolderPath(specialFolder), $"%{specialFolder}%", StringComparison.OrdinalIgnoreCase); @@ -811,12 +819,20 @@ public static string GetVariableFolderPath(string path) return path; } - public static string ExpandFolderVariables(string path) + public static string ExpandFolderVariables(string path, bool supportCustomSpecialFolders = false) { if (!string.IsNullOrEmpty(path)) { try { + if (supportCustomSpecialFolders) + { + foreach (KeyValuePair specialFolder in HelpersOptions.ShareXSpecialFolders) + { + path = path.Replace($"%{specialFolder.Key}%", specialFolder.Value, StringComparison.OrdinalIgnoreCase); + } + } + foreach (Environment.SpecialFolder specialFolder in GetEnums()) { path = path.Replace($"%{specialFolder}%", Environment.GetFolderPath(specialFolder), StringComparison.OrdinalIgnoreCase); diff --git a/ShareX.HelpersLib/HelpersOptions.cs b/ShareX.HelpersLib/HelpersOptions.cs index 91eeffd25..a48b2dc00 100644 --- a/ShareX.HelpersLib/HelpersOptions.cs +++ b/ShareX.HelpersLib/HelpersOptions.cs @@ -40,5 +40,6 @@ public static class HelpersOptions public static List RecentColors { get; set; } = new List(); public static string LastSaveDirectory { get; set; } = ""; public static bool URLEncodeIgnoreEmoji { get; set; } = false; + public static Dictionary ShareXSpecialFolders { get; set; } = new Dictionary(); } } \ No newline at end of file diff --git a/ShareX.HelpersLib/UITypeEditors/DirectoryNameEditor.cs b/ShareX.HelpersLib/UITypeEditors/DirectoryNameEditor.cs index cf35911ee..2ed0ac6da 100644 --- a/ShareX.HelpersLib/UITypeEditors/DirectoryNameEditor.cs +++ b/ShareX.HelpersLib/UITypeEditors/DirectoryNameEditor.cs @@ -45,7 +45,7 @@ public override object EditValue(ITypeDescriptorContext context, IServiceProvide if (dlg.ShowDialog()) { - value = Helpers.GetVariableFolderPath(dlg.FileName); + value = Helpers.GetVariableFolderPath(dlg.FileName, true); } } diff --git a/ShareX.HelpersLib/UITypeEditors/ImageFileNameEditor.cs b/ShareX.HelpersLib/UITypeEditors/ImageFileNameEditor.cs index c379571e7..6b04c0fc3 100644 --- a/ShareX.HelpersLib/UITypeEditors/ImageFileNameEditor.cs +++ b/ShareX.HelpersLib/UITypeEditors/ImageFileNameEditor.cs @@ -42,7 +42,7 @@ public override object EditValue(ITypeDescriptorContext context, IServiceProvide if (!string.IsNullOrEmpty(filePath)) { - value = Helpers.GetVariableFolderPath(filePath); + value = Helpers.GetVariableFolderPath(filePath, true); } return value; diff --git a/ShareX.ImageEffectsLib/Drawings/DrawImage.cs b/ShareX.ImageEffectsLib/Drawings/DrawImage.cs index 5dad1b9a2..6783e3f85 100644 --- a/ShareX.ImageEffectsLib/Drawings/DrawImage.cs +++ b/ShareX.ImageEffectsLib/Drawings/DrawImage.cs @@ -59,7 +59,7 @@ public DrawImage() public override Bitmap Apply(Bitmap bmp) { - string imageFilePath = Helpers.ExpandFolderVariables(ImageLocation); + string imageFilePath = Helpers.ExpandFolderVariables(ImageLocation, true); if (!string.IsNullOrEmpty(imageFilePath) && File.Exists(imageFilePath)) { diff --git a/ShareX.ImageEffectsLib/Drawings/DrawParticles.cs b/ShareX.ImageEffectsLib/Drawings/DrawParticles.cs index de14ff2a5..d12ae066d 100644 --- a/ShareX.ImageEffectsLib/Drawings/DrawParticles.cs +++ b/ShareX.ImageEffectsLib/Drawings/DrawParticles.cs @@ -99,7 +99,7 @@ public DrawParticles() public override Bitmap Apply(Bitmap bmp) { - string imageFolder = Helpers.ExpandFolderVariables(ImageFolder); + string imageFolder = Helpers.ExpandFolderVariables(ImageFolder, true); if (!string.IsNullOrEmpty(imageFolder) && Directory.Exists(imageFolder)) { diff --git a/ShareX/Forms/MainForm.cs b/ShareX/Forms/MainForm.cs index 857ad6617..01ba37435 100644 --- a/ShareX/Forms/MainForm.cs +++ b/ShareX/Forms/MainForm.cs @@ -950,6 +950,7 @@ private void AfterApplicationSettingsJobs() HelpersOptions.RotateImageByExifOrientationData = Program.Settings.RotateImageByExifOrientationData; HelpersOptions.BrowserPath = Program.Settings.BrowserPath; HelpersOptions.RecentColors = Program.Settings.RecentColors; + Program.UpdateHelpersSpecialFolders(); TaskManager.RecentManager.MaxCount = Program.Settings.RecentTasksMaxCount; diff --git a/ShareX/Program.cs b/ShareX/Program.cs index 985e4cdad..3b9090230 100644 --- a/ShareX/Program.cs +++ b/ShareX/Program.cs @@ -326,10 +326,9 @@ private static void Run() Uploader.UpdateServicePointManager(); UpdateManager = new GitHubUpdateManager("ShareX", "ShareX", Dev, Portable); - LanguageHelper.ChangeLanguage(Settings.Language); - Helpers.TryFixHandCursor(); + DebugHelper.WriteLine("MainForm init started."); MainForm = new MainForm(); DebugHelper.WriteLine("MainForm init finished."); @@ -503,6 +502,13 @@ private static void RegisterExtensions() #endif } + public static void UpdateHelpersSpecialFolders() + { + Dictionary specialFolders = new Dictionary(); + specialFolders.Add("ShareXImageEffects", ImageEffectsFolder); + HelpersOptions.ShareXSpecialFolders = specialFolders; + } + private static void MigratePersonalPathConfig() { if (File.Exists(PreviousPersonalPathConfigFilePath)) From 056cb7cbac696fc844e017665222bf534295ff85 Mon Sep 17 00:00:00 2001 From: Jaex Date: Tue, 16 Jun 2020 07:55:17 +0300 Subject: [PATCH 14/37] Don't let selecting assets folder outside of ShareX image effects folder --- .../ImageEffectPackagerForm.Designer.cs | 4 ++-- ShareX.ImageEffectsLib/ImageEffectPackagerForm.cs | 14 ++++++++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/ShareX.ImageEffectsLib/ImageEffectPackagerForm.Designer.cs b/ShareX.ImageEffectsLib/ImageEffectPackagerForm.Designer.cs index f09df9be3..9a266b15a 100644 --- a/ShareX.ImageEffectsLib/ImageEffectPackagerForm.Designer.cs +++ b/ShareX.ImageEffectsLib/ImageEffectPackagerForm.Designer.cs @@ -56,7 +56,7 @@ private void InitializeComponent() this.btnPackage.Location = new System.Drawing.Point(16, 64); this.btnPackage.Name = "btnPackage"; this.btnPackage.Size = new System.Drawing.Size(128, 23); - this.btnPackage.TabIndex = 2; + this.btnPackage.TabIndex = 3; this.btnPackage.Text = "Package..."; this.btnPackage.UseVisualStyleBackColor = true; this.btnPackage.Click += new System.EventHandler(this.btnPackage_Click); @@ -66,7 +66,7 @@ private void InitializeComponent() this.btnAssetsFolderBrowse.Location = new System.Drawing.Point(360, 31); this.btnAssetsFolderBrowse.Name = "btnAssetsFolderBrowse"; this.btnAssetsFolderBrowse.Size = new System.Drawing.Size(32, 23); - this.btnAssetsFolderBrowse.TabIndex = 3; + this.btnAssetsFolderBrowse.TabIndex = 2; this.btnAssetsFolderBrowse.Text = "..."; this.btnAssetsFolderBrowse.UseVisualStyleBackColor = true; this.btnAssetsFolderBrowse.Click += new System.EventHandler(this.btnAssetsFolderBrowse_Click); diff --git a/ShareX.ImageEffectsLib/ImageEffectPackagerForm.cs b/ShareX.ImageEffectsLib/ImageEffectPackagerForm.cs index 669382df7..333651595 100644 --- a/ShareX.ImageEffectsLib/ImageEffectPackagerForm.cs +++ b/ShareX.ImageEffectsLib/ImageEffectPackagerForm.cs @@ -50,14 +50,24 @@ private void txtAssetsFolder_TextChanged(object sender, EventArgs e) private void btnAssetsFolderBrowse_Click(object sender, EventArgs e) { - Helpers.BrowseFolder(txtAssetsFolder, "", true); + Helpers.BrowseFolder(txtAssetsFolder, HelpersOptions.ShareXSpecialFolders["ShareXImageEffects"]); } private void btnPackage_Click(object sender, EventArgs e) { try { - Packager.Package(); + if (!string.IsNullOrEmpty(Packager.AssetsFolderPath) && + !Packager.AssetsFolderPath.StartsWith(HelpersOptions.ShareXSpecialFolders["ShareXImageEffects"] + "\\", StringComparison.OrdinalIgnoreCase)) + { + // TODO: Translate + MessageBox.Show("Assets folder must be inside ShareX image effects folder.", "ShareX - " + "Invalid assets folder path", + MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + else + { + Packager.Package(); + } } catch (Exception ex) { From 06bc6c44a848b7572b493f803e767cf1927c528a Mon Sep 17 00:00:00 2001 From: Jaex Date: Tue, 16 Jun 2020 08:02:59 +0300 Subject: [PATCH 15/37] After package open folder automatically --- ShareX.ImageEffectsLib/ImageEffectPackager.cs | 12 +++++++++--- ShareX.ImageEffectsLib/ImageEffectPackagerForm.cs | 8 +++++++- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/ShareX.ImageEffectsLib/ImageEffectPackager.cs b/ShareX.ImageEffectsLib/ImageEffectPackager.cs index 3db678718..5027dc69d 100644 --- a/ShareX.ImageEffectsLib/ImageEffectPackager.cs +++ b/ShareX.ImageEffectsLib/ImageEffectPackager.cs @@ -40,7 +40,7 @@ public class ImageEffectPackager public string EffectName { get; set; } public string AssetsFolderPath { get; set; } - public void Package() + public string Package() { using (SaveFileDialog sfd = new SaveFileDialog()) { @@ -50,12 +50,14 @@ public void Package() if (sfd.ShowDialog() == DialogResult.OK) { - Package(sfd.FileName); + return Package(sfd.FileName); } } + + return null; } - public void Package(string outputFilePath) + public string Package(string outputFilePath) { if (!string.IsNullOrEmpty(outputFilePath)) { @@ -87,7 +89,11 @@ public void Package(string outputFilePath) { File.Delete(configFilePath); } + + return outputFilePath; } + + return null; } public static string ExtractPackage(string packageFilePath, string imageEffectsFolderPath) diff --git a/ShareX.ImageEffectsLib/ImageEffectPackagerForm.cs b/ShareX.ImageEffectsLib/ImageEffectPackagerForm.cs index 333651595..002cdb5ec 100644 --- a/ShareX.ImageEffectsLib/ImageEffectPackagerForm.cs +++ b/ShareX.ImageEffectsLib/ImageEffectPackagerForm.cs @@ -25,6 +25,7 @@ using ShareX.HelpersLib; using System; +using System.IO; using System.Windows.Forms; namespace ShareX.ImageEffectsLib @@ -66,7 +67,12 @@ private void btnPackage_Click(object sender, EventArgs e) } else { - Packager.Package(); + string outputFilePath = Packager.Package(); + + if (!string.IsNullOrEmpty(outputFilePath) && File.Exists(outputFilePath)) + { + Helpers.OpenFolderWithFile(outputFilePath); + } } } catch (Exception ex) From fa0e636575c5f815faff5863e2857677befb586a Mon Sep 17 00:00:00 2001 From: Jaex Date: Tue, 16 Jun 2020 08:31:14 +0300 Subject: [PATCH 16/37] Rename config file name --- ShareX.ImageEffectsLib/ImageEffectPackager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ShareX.ImageEffectsLib/ImageEffectPackager.cs b/ShareX.ImageEffectsLib/ImageEffectPackager.cs index 5027dc69d..ba63956ee 100644 --- a/ShareX.ImageEffectsLib/ImageEffectPackager.cs +++ b/ShareX.ImageEffectsLib/ImageEffectPackager.cs @@ -34,7 +34,7 @@ namespace ShareX.ImageEffectsLib { public class ImageEffectPackager { - private const string ConfigFileName = "ImageEffect.json"; + private const string ConfigFileName = "Config.json"; public string EffectJson { get; set; } public string EffectName { get; set; } From 65d2041a3aad235a65c2264a0e157703561c1786 Mon Sep 17 00:00:00 2001 From: Jaex Date: Tue, 16 Jun 2020 09:02:32 +0300 Subject: [PATCH 17/37] Refactor packager codes --- ShareX.ImageEffectsLib/ImageEffectPackager.cs | 34 ++++--------------- .../ImageEffectPackagerForm.cs | 33 ++++++++++++------ 2 files changed, 28 insertions(+), 39 deletions(-) diff --git a/ShareX.ImageEffectsLib/ImageEffectPackager.cs b/ShareX.ImageEffectsLib/ImageEffectPackager.cs index ba63956ee..2438c3a91 100644 --- a/ShareX.ImageEffectsLib/ImageEffectPackager.cs +++ b/ShareX.ImageEffectsLib/ImageEffectPackager.cs @@ -28,36 +28,14 @@ using System.IO; using System.Linq; using System.Text; -using System.Windows.Forms; namespace ShareX.ImageEffectsLib { - public class ImageEffectPackager + public static class ImageEffectPackager { private const string ConfigFileName = "Config.json"; - public string EffectJson { get; set; } - public string EffectName { get; set; } - public string AssetsFolderPath { get; set; } - - public string Package() - { - using (SaveFileDialog sfd = new SaveFileDialog()) - { - sfd.DefaultExt = "sxie"; - sfd.FileName = EffectName + ".sxie"; - sfd.Filter = "ShareX image effect (*.sxie)|*.sxie"; - - if (sfd.ShowDialog() == DialogResult.OK) - { - return Package(sfd.FileName); - } - } - - return null; - } - - public string Package(string outputFilePath) + public static string Package(string outputFilePath, string configJson, string assetsFolderPath) { if (!string.IsNullOrEmpty(outputFilePath)) { @@ -65,18 +43,18 @@ public string Package(string outputFilePath) Helpers.CreateDirectory(outputFolder); string configFilePath = Path.Combine(outputFolder, ConfigFileName); - File.WriteAllText(configFilePath, EffectJson, Encoding.UTF8); + File.WriteAllText(configFilePath, configJson, Encoding.UTF8); try { Dictionary files = new Dictionary(); files.Add(configFilePath, ConfigFileName); - if (!string.IsNullOrEmpty(AssetsFolderPath) && Directory.Exists(AssetsFolderPath)) + if (!string.IsNullOrEmpty(assetsFolderPath) && Directory.Exists(assetsFolderPath)) { - int entryNamePosition = AssetsFolderPath.Length + 1; + int entryNamePosition = assetsFolderPath.Length + 1; - foreach (string assetPath in Directory.EnumerateFiles(AssetsFolderPath, "*.*", SearchOption.AllDirectories).Where(x => Helpers.IsImageFile(x))) + foreach (string assetPath in Directory.EnumerateFiles(assetsFolderPath, "*.*", SearchOption.AllDirectories).Where(x => Helpers.IsImageFile(x))) { string entryName = assetPath.Substring(entryNamePosition); files.Add(assetPath, entryName); diff --git a/ShareX.ImageEffectsLib/ImageEffectPackagerForm.cs b/ShareX.ImageEffectsLib/ImageEffectPackagerForm.cs index 002cdb5ec..3427a3c16 100644 --- a/ShareX.ImageEffectsLib/ImageEffectPackagerForm.cs +++ b/ShareX.ImageEffectsLib/ImageEffectPackagerForm.cs @@ -32,13 +32,14 @@ namespace ShareX.ImageEffectsLib { public partial class ImageEffectPackagerForm : Form { - public ImageEffectPackager Packager { get; set; } + public string ImageEffectJson { get; private set; } + public string ImageEffectName { get; private set; } + public string AssetsFolderPath { get; set; } public ImageEffectPackagerForm(string json, string name) { - Packager = new ImageEffectPackager(); - Packager.EffectJson = json; - Packager.EffectName = name; + ImageEffectJson = json; + ImageEffectName = name; InitializeComponent(); ShareXResources.ApplyTheme(this); @@ -46,7 +47,7 @@ public ImageEffectPackagerForm(string json, string name) private void txtAssetsFolder_TextChanged(object sender, EventArgs e) { - Packager.AssetsFolderPath = txtAssetsFolder.Text; + AssetsFolderPath = txtAssetsFolder.Text; } private void btnAssetsFolderBrowse_Click(object sender, EventArgs e) @@ -58,8 +59,8 @@ private void btnPackage_Click(object sender, EventArgs e) { try { - if (!string.IsNullOrEmpty(Packager.AssetsFolderPath) && - !Packager.AssetsFolderPath.StartsWith(HelpersOptions.ShareXSpecialFolders["ShareXImageEffects"] + "\\", StringComparison.OrdinalIgnoreCase)) + if (!string.IsNullOrEmpty(AssetsFolderPath) && + !AssetsFolderPath.StartsWith(HelpersOptions.ShareXSpecialFolders["ShareXImageEffects"] + "\\", StringComparison.OrdinalIgnoreCase)) { // TODO: Translate MessageBox.Show("Assets folder must be inside ShareX image effects folder.", "ShareX - " + "Invalid assets folder path", @@ -67,11 +68,21 @@ private void btnPackage_Click(object sender, EventArgs e) } else { - string outputFilePath = Packager.Package(); - - if (!string.IsNullOrEmpty(outputFilePath) && File.Exists(outputFilePath)) + using (SaveFileDialog sfd = new SaveFileDialog()) { - Helpers.OpenFolderWithFile(outputFilePath); + sfd.DefaultExt = "sxie"; + sfd.FileName = ImageEffectName + ".sxie"; + sfd.Filter = "ShareX image effect (*.sxie)|*.sxie"; + + if (sfd.ShowDialog() == DialogResult.OK) + { + string outputFilePath = ImageEffectPackager.Package(sfd.FileName, ImageEffectJson, AssetsFolderPath); + + if (!string.IsNullOrEmpty(outputFilePath) && File.Exists(outputFilePath)) + { + Helpers.OpenFolderWithFile(outputFilePath); + } + } } } } From b8579bc0a8767ee1a91ca93e5ea27c680f08e47e Mon Sep 17 00:00:00 2001 From: Jaex Date: Tue, 16 Jun 2020 09:18:17 +0300 Subject: [PATCH 18/37] Set initial directory of save dialog --- ShareX.ImageEffectsLib/ImageEffectPackagerForm.cs | 9 ++++++--- ShareX.ImageEffectsLib/ImageEffectsForm.cs | 3 ++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/ShareX.ImageEffectsLib/ImageEffectPackagerForm.cs b/ShareX.ImageEffectsLib/ImageEffectPackagerForm.cs index 3427a3c16..799be3af9 100644 --- a/ShareX.ImageEffectsLib/ImageEffectPackagerForm.cs +++ b/ShareX.ImageEffectsLib/ImageEffectPackagerForm.cs @@ -34,12 +34,14 @@ public partial class ImageEffectPackagerForm : Form { public string ImageEffectJson { get; private set; } public string ImageEffectName { get; private set; } + public string ShareXImageEffectsFolderPath { get; private set; } public string AssetsFolderPath { get; set; } - public ImageEffectPackagerForm(string json, string name) + public ImageEffectPackagerForm(string json, string name, string imageEffectsFolderPath) { ImageEffectJson = json; ImageEffectName = name; + ShareXImageEffectsFolderPath = imageEffectsFolderPath; InitializeComponent(); ShareXResources.ApplyTheme(this); @@ -52,7 +54,7 @@ private void txtAssetsFolder_TextChanged(object sender, EventArgs e) private void btnAssetsFolderBrowse_Click(object sender, EventArgs e) { - Helpers.BrowseFolder(txtAssetsFolder, HelpersOptions.ShareXSpecialFolders["ShareXImageEffects"]); + Helpers.BrowseFolder(txtAssetsFolder, ShareXImageEffectsFolderPath); } private void btnPackage_Click(object sender, EventArgs e) @@ -60,7 +62,7 @@ private void btnPackage_Click(object sender, EventArgs e) try { if (!string.IsNullOrEmpty(AssetsFolderPath) && - !AssetsFolderPath.StartsWith(HelpersOptions.ShareXSpecialFolders["ShareXImageEffects"] + "\\", StringComparison.OrdinalIgnoreCase)) + !AssetsFolderPath.StartsWith(ShareXImageEffectsFolderPath + "\\", StringComparison.OrdinalIgnoreCase)) { // TODO: Translate MessageBox.Show("Assets folder must be inside ShareX image effects folder.", "ShareX - " + "Invalid assets folder path", @@ -73,6 +75,7 @@ private void btnPackage_Click(object sender, EventArgs e) sfd.DefaultExt = "sxie"; sfd.FileName = ImageEffectName + ".sxie"; sfd.Filter = "ShareX image effect (*.sxie)|*.sxie"; + sfd.InitialDirectory = ShareXImageEffectsFolderPath; if (sfd.ShowDialog() == DialogResult.OK) { diff --git a/ShareX.ImageEffectsLib/ImageEffectsForm.cs b/ShareX.ImageEffectsLib/ImageEffectsForm.cs index ddab1ae0d..99e90255f 100644 --- a/ShareX.ImageEffectsLib/ImageEffectsForm.cs +++ b/ShareX.ImageEffectsLib/ImageEffectsForm.cs @@ -641,7 +641,8 @@ private void btnPackager_Click(object sender, EventArgs e) if (!string.IsNullOrEmpty(json)) { - using (ImageEffectPackagerForm packagerForm = new ImageEffectPackagerForm(json, preset.Name)) + using (ImageEffectPackagerForm packagerForm = new ImageEffectPackagerForm(json, preset.Name, + HelpersOptions.ShareXSpecialFolders["ShareXImageEffects"])) { packagerForm.ShowDialog(); } From 41cf8ff1335c04a5f04dd934b8bba6b64a486e27 Mon Sep 17 00:00:00 2001 From: Jaex Date: Tue, 16 Jun 2020 11:24:12 +0300 Subject: [PATCH 19/37] Make sure preset name is not empty --- .../ImageEffectPackagerForm.Designer.cs | 1 + ShareX.ImageEffectsLib/ImageEffectsForm.cs | 20 +++++++++++++------ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/ShareX.ImageEffectsLib/ImageEffectPackagerForm.Designer.cs b/ShareX.ImageEffectsLib/ImageEffectPackagerForm.Designer.cs index 9a266b15a..8268ae473 100644 --- a/ShareX.ImageEffectsLib/ImageEffectPackagerForm.Designer.cs +++ b/ShareX.ImageEffectsLib/ImageEffectPackagerForm.Designer.cs @@ -81,6 +81,7 @@ private void InitializeComponent() this.Controls.Add(this.txtAssetsFolder); this.Controls.Add(this.lblAssetsFolder); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.MaximizeBox = false; this.Name = "ImageEffectPackagerForm"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "ShareX - Image effect packager"; diff --git a/ShareX.ImageEffectsLib/ImageEffectsForm.cs b/ShareX.ImageEffectsLib/ImageEffectsForm.cs index 99e90255f..9795f1b04 100644 --- a/ShareX.ImageEffectsLib/ImageEffectsForm.cs +++ b/ShareX.ImageEffectsLib/ImageEffectsForm.cs @@ -637,14 +637,22 @@ private void btnPackager_Click(object sender, EventArgs e) if (preset != null) { - string json = eiImageEffects.Serialize(preset); - - if (!string.IsNullOrEmpty(json)) + if (string.IsNullOrEmpty(preset.Name)) { - using (ImageEffectPackagerForm packagerForm = new ImageEffectPackagerForm(json, preset.Name, - HelpersOptions.ShareXSpecialFolders["ShareXImageEffects"])) + // TODO: Translate + MessageBox.Show("Preset name cannot be empty.", "ShareX - " + "Missing preset name", MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + else + { + string json = eiImageEffects.Serialize(preset); + + if (!string.IsNullOrEmpty(json)) { - packagerForm.ShowDialog(); + using (ImageEffectPackagerForm packagerForm = new ImageEffectPackagerForm(json, preset.Name, + HelpersOptions.ShareXSpecialFolders["ShareXImageEffects"])) + { + packagerForm.ShowDialog(); + } } } } From 7b302567f00ea0c2176bb7ca08b07741f7910e9f Mon Sep 17 00:00:00 2001 From: Jaex Date: Tue, 16 Jun 2020 11:50:11 +0300 Subject: [PATCH 20/37] If destination folder already exists then ask for overwrite --- ShareX.ImageEffectsLib/ImageEffectPackager.cs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/ShareX.ImageEffectsLib/ImageEffectPackager.cs b/ShareX.ImageEffectsLib/ImageEffectPackager.cs index 2438c3a91..08cbbb31e 100644 --- a/ShareX.ImageEffectsLib/ImageEffectPackager.cs +++ b/ShareX.ImageEffectsLib/ImageEffectPackager.cs @@ -28,6 +28,7 @@ using System.IO; using System.Linq; using System.Text; +using System.Windows.Forms; namespace ShareX.ImageEffectsLib { @@ -83,6 +84,21 @@ public static string ExtractPackage(string packageFilePath, string imageEffectsF if (!string.IsNullOrEmpty(packageName) && !packageName.StartsWith(".")) { string destination = Path.Combine(imageEffectsFolderPath, packageName); + + if (Directory.Exists(destination)) + { + // TODO: Translate + if (MessageBox.Show($"Destination folder already exists:\r\n\"{destination}\"\r\n\r\nWould you like to overwrite it?", "ShareX - " + + "Image effect packager", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes) + { + Directory.Delete(destination, true); + } + else + { + return null; + } + } + ZipManager.Extract(packageFilePath, destination); return Path.Combine(destination, ConfigFileName); From 3293de0703b2ed3813c5b23074fbabcbe0b3f056 Mon Sep 17 00:00:00 2001 From: Jaex Date: Wed, 17 Jun 2020 01:37:16 +0300 Subject: [PATCH 21/37] Revert ApplicationInstanceManager for testing issue --- .../ApplicationInstanceManager.cs | 158 ++++++++++-------- 1 file changed, 92 insertions(+), 66 deletions(-) diff --git a/ShareX.HelpersLib/ApplicationInstanceManager.cs b/ShareX.HelpersLib/ApplicationInstanceManager.cs index 42b86751d..5c3d1c034 100644 --- a/ShareX.HelpersLib/ApplicationInstanceManager.cs +++ b/ShareX.HelpersLib/ApplicationInstanceManager.cs @@ -23,11 +23,11 @@ #endregion License Information (GPL v3) -using Newtonsoft.Json; using System; -using System.IO; -using System.IO.Pipes; -using System.Text; +using System.Runtime.Remoting; +using System.Runtime.Remoting.Channels; +using System.Runtime.Remoting.Channels.Ipc; +using System.Security.Permissions; using System.Threading; namespace ShareX.HelpersLib @@ -36,15 +36,15 @@ public class ApplicationInstanceManager : IDisposable { private static readonly string MutexName = "82E6AC09-0FEF-4390-AD9F-0DD3F5561EFC"; private static readonly string AppName = "ShareX"; - private static readonly string PipeName = $"{Environment.MachineName}-{Environment.UserName}-{AppName}"; - private static readonly string SemaphoreName = PipeName + "Semaphore"; + private static readonly string EventName = string.Format("{0}-{1}-{2}", Environment.MachineName, Environment.UserName, AppName); + private static readonly string SemaphoreName = string.Format("{0}{1}", EventName, "Semaphore"); public bool IsSingleInstance { get; private set; } public bool IsFirstInstance { get; private set; } private Mutex mutex; private Semaphore semaphore; - private NamedPipeServerStream pipeServer; + private IpcServerChannel serverChannel; public ApplicationInstanceManager(bool isSingleInstance, string[] args, EventHandler callback) { @@ -75,28 +75,44 @@ public void Dispose() { if (IsFirstInstance) { - mutex.ReleaseMutex(); - } + if (mutex != null) + { + mutex.ReleaseMutex(); + } - mutex.Dispose(); - semaphore?.Dispose(); - pipeServer?.Dispose(); + if (serverChannel != null) + { + ChannelServices.UnregisterChannel(serverChannel); + } + + if (semaphore != null) + { + semaphore.Close(); + } + } } private void CreateFirstInstance(EventHandler callback) { try { - semaphore = new Semaphore(1, 1, SemaphoreName, out var createdNew); - // Mixing single instance and multi instance (via command line parameter) copies of the program can - // result in CreateFirstInstance being called if it isn't really the first one. Make sure this is - // really first instance by detecting if the semaphore was created - if (!createdNew) - { - return; - } + bool createdNew; - CreateServer(callback); + using (EventWaitHandle eventWaitHandle = new EventWaitHandle(false, EventResetMode.AutoReset, EventName, out createdNew)) + { + // Mixing single instance and multi instance (via command line parameter) copies of the program can + // result in CreateFirstInstance being called if it isn't really the first one. Make sure this is + // really first instance by detecting if EventWaitHandle was created + if (!createdNew) + { + return; + } + + semaphore = new Semaphore(1, 1, SemaphoreName); + ThreadPool.RegisterWaitForSingleObject(eventWaitHandle, WaitOrTimerCallback, callback, Timeout.Infinite, false); + + RegisterRemoteType(AppName); + } } catch (Exception e) { @@ -108,11 +124,19 @@ private void CreateMultipleInstance(string[] args) { try { - semaphore = Semaphore.OpenExisting(SemaphoreName); + InstanceProxy.CommandLineArgs = args; - // Wait until the server is ready to accept data - semaphore.WaitOne(); - SendDataToServer(args); + using (EventWaitHandle eventWaitHandle = EventWaitHandle.OpenExisting(EventName)) + { + semaphore = Semaphore.OpenExisting(SemaphoreName); + semaphore.WaitOne(); + UpdateRemoteObject(AppName); + + if (eventWaitHandle != null) + { + eventWaitHandle.Set(); + } + } } catch (Exception e) { @@ -122,67 +146,69 @@ private void CreateMultipleInstance(string[] args) Environment.Exit(0); } - private void SendDataToServer(string[] args) + private void UpdateRemoteObject(string uri) { - using (var pipeClient = new NamedPipeClientStream(".", PipeName, PipeDirection.Out)) + IpcClientChannel clientChannel = new IpcClientChannel(); + ChannelServices.RegisterChannel(clientChannel, true); + + InstanceProxy proxy = Activator.GetObject(typeof(InstanceProxy), string.Format("ipc://{0}{1}{2}/{2}", Environment.MachineName, Environment.UserName, uri)) as InstanceProxy; + + if (proxy != null) { - pipeClient.Connect(); - - var pipeData = new InstanceCallbackEventArgs - { - CommandLineArgs = args - }; - - var bytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(pipeData)); - pipeClient.Write(bytes, 0, bytes.Length); + proxy.SetCommandLineArgs(InstanceProxy.CommandLineArgs); } + + ChannelServices.UnregisterChannel(clientChannel); } - private void CreateServer(EventHandler callback) + private void RegisterRemoteType(string uri) { - pipeServer = new NamedPipeServerStream(PipeName, PipeDirection.In, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous); - pipeServer.BeginWaitForConnection(ConnectionCallback, callback); + serverChannel = new IpcServerChannel(Environment.MachineName + Environment.UserName + uri); + ChannelServices.RegisterChannel(serverChannel, true); + + RemotingConfiguration.RegisterWellKnownServiceType(typeof(InstanceProxy), uri, WellKnownObjectMode.Singleton); } - private void ConnectionCallback(IAsyncResult ar) + private void WaitOrTimerCallback(object state, bool timedOut) { - try - { - pipeServer.EndWaitForConnection(ar); - } - catch (ObjectDisposedException) - { - // Operation got aborted as part of program exit. - return; - } + EventHandler callback = state as EventHandler; - var callback = ar.AsyncState as EventHandler; - var sr = new StreamReader(pipeServer, Encoding.UTF8); - try + if (callback != null) { - if (callback != null) + try { - var data = sr.ReadToEnd(); - callback(this, JsonConvert.DeserializeObject(data)); + callback(state, new InstanceCallbackEventArgs(InstanceProxy.CommandLineArgs)); + } + finally + { + if (semaphore != null) + { + semaphore.Release(); + } } } - finally - { - // Close the existing server - sr.Dispose(); + } + } - // Create a new server - CreateServer(callback); + [Serializable] + [PermissionSet(SecurityAction.Demand, Name = "FullTrust")] + internal class InstanceProxy : MarshalByRefObject + { + public static string[] CommandLineArgs { get; internal set; } - // Signal that we are ready to accept a new connection - semaphore.Release(); - } + public void SetCommandLineArgs(string[] commandLineArgs) + { + CommandLineArgs = commandLineArgs; } } public class InstanceCallbackEventArgs : EventArgs { - [JsonProperty] - public string[] CommandLineArgs { get; internal set; } + public string[] CommandLineArgs { get; private set; } + + internal InstanceCallbackEventArgs(string[] commandLineArgs) + { + CommandLineArgs = commandLineArgs; + } } } \ No newline at end of file From 2a2f42639fd37174a6892e872dcad440457a9126 Mon Sep 17 00:00:00 2001 From: Jaex Date: Wed, 17 Jun 2020 02:38:38 +0300 Subject: [PATCH 22/37] Update image effect text in after capture tasks because it is not about watermark anymore --- ShareX.HelpersLib/Properties/Resources.Designer.cs | 2 +- ShareX.HelpersLib/Properties/Resources.resx | 2 +- ShareX.ImageEffectsLib/WatermarkForm.cs | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ShareX.HelpersLib/Properties/Resources.Designer.cs b/ShareX.HelpersLib/Properties/Resources.Designer.cs index eac34bfca..ba7e1f6eb 100644 --- a/ShareX.HelpersLib/Properties/Resources.Designer.cs +++ b/ShareX.HelpersLib/Properties/Resources.Designer.cs @@ -146,7 +146,7 @@ internal class Resources { } /// - /// Looks up a localized string similar to Add image effects / watermark. + /// Looks up a localized string similar to Add image effects. /// internal static string AfterCaptureTasks_AddImageEffects { get { diff --git a/ShareX.HelpersLib/Properties/Resources.resx b/ShareX.HelpersLib/Properties/Resources.resx index b487622e4..11f50cdac 100644 --- a/ShareX.HelpersLib/Properties/Resources.resx +++ b/ShareX.HelpersLib/Properties/Resources.resx @@ -477,7 +477,7 @@ Would you like to download it? Manual - Add image effects / watermark + Add image effects Delete file locally diff --git a/ShareX.ImageEffectsLib/WatermarkForm.cs b/ShareX.ImageEffectsLib/WatermarkForm.cs index b6d0fcf87..37238bb6e 100644 --- a/ShareX.ImageEffectsLib/WatermarkForm.cs +++ b/ShareX.ImageEffectsLib/WatermarkForm.cs @@ -35,7 +35,7 @@ namespace ShareX.ImageEffectsLib public partial class WatermarkForm : Form { private WatermarkConfig config; - private bool IsGuiReady; + private bool isReady; public WatermarkForm(WatermarkConfig watermarkConfig) { @@ -85,7 +85,7 @@ private void WatermarkUI_Load(object sender, EventArgs e) txtWatermarkImageLocation.Text = config.Image.ImageLocation; - IsGuiReady = true; + isReady = true; UpdatePreview(); } @@ -96,7 +96,7 @@ private void WatermarkUI_Resize(object sender, EventArgs e) private void UpdatePreview() { - if (IsGuiReady) + if (isReady) { using (Bitmap bmp = new Bitmap(pbPreview.ClientSize.Width, pbPreview.ClientSize.Height)) { From b2c6e9fd25a5cc1236df7274633f160fcea47040 Mon Sep 17 00:00:00 2001 From: Jaex Date: Wed, 17 Jun 2020 04:24:14 +0300 Subject: [PATCH 23/37] Populate assets folder path and package file path automatically --- .../ImageEffectPackagerForm.Designer.cs | 113 ++++++++++++------ .../ImageEffectPackagerForm.cs | 57 +++++---- 2 files changed, 110 insertions(+), 60 deletions(-) diff --git a/ShareX.ImageEffectsLib/ImageEffectPackagerForm.Designer.cs b/ShareX.ImageEffectsLib/ImageEffectPackagerForm.Designer.cs index 8268ae473..ddd27280c 100644 --- a/ShareX.ImageEffectsLib/ImageEffectPackagerForm.Designer.cs +++ b/ShareX.ImageEffectsLib/ImageEffectPackagerForm.Designer.cs @@ -28,58 +28,91 @@ protected override void Dispose(bool disposing) /// private void InitializeComponent() { - this.lblAssetsFolder = new System.Windows.Forms.Label(); - this.txtAssetsFolder = new System.Windows.Forms.TextBox(); this.btnPackage = new System.Windows.Forms.Button(); - this.btnAssetsFolderBrowse = new System.Windows.Forms.Button(); + this.lblAssetsFolderPath = new System.Windows.Forms.Label(); + this.lblPackageFilePath = new System.Windows.Forms.Label(); + this.txtPackageFilePath = new System.Windows.Forms.TextBox(); + this.btnPackageFilePathBrowse = new System.Windows.Forms.Button(); + this.txtAssetsFolderPath = new System.Windows.Forms.TextBox(); + this.btnAssetsFolderPathBrowse = new System.Windows.Forms.Button(); this.SuspendLayout(); // - // lblAssetsFolder - // - this.lblAssetsFolder.AutoSize = true; - this.lblAssetsFolder.Location = new System.Drawing.Point(13, 16); - this.lblAssetsFolder.Name = "lblAssetsFolder"; - this.lblAssetsFolder.Size = new System.Drawing.Size(118, 13); - this.lblAssetsFolder.TabIndex = 0; - this.lblAssetsFolder.Text = "Assets folder (Optional):"; - // - // txtAssetsFolder - // - this.txtAssetsFolder.Location = new System.Drawing.Point(16, 32); - this.txtAssetsFolder.Name = "txtAssetsFolder"; - this.txtAssetsFolder.Size = new System.Drawing.Size(336, 20); - this.txtAssetsFolder.TabIndex = 1; - this.txtAssetsFolder.TextChanged += new System.EventHandler(this.txtAssetsFolder_TextChanged); - // // btnPackage // - this.btnPackage.Location = new System.Drawing.Point(16, 64); + this.btnPackage.Location = new System.Drawing.Point(16, 112); this.btnPackage.Name = "btnPackage"; this.btnPackage.Size = new System.Drawing.Size(128, 23); - this.btnPackage.TabIndex = 3; - this.btnPackage.Text = "Package..."; + this.btnPackage.TabIndex = 0; + this.btnPackage.Text = "Package"; this.btnPackage.UseVisualStyleBackColor = true; this.btnPackage.Click += new System.EventHandler(this.btnPackage_Click); // - // btnAssetsFolderBrowse + // lblAssetsFolderPath // - this.btnAssetsFolderBrowse.Location = new System.Drawing.Point(360, 31); - this.btnAssetsFolderBrowse.Name = "btnAssetsFolderBrowse"; - this.btnAssetsFolderBrowse.Size = new System.Drawing.Size(32, 23); - this.btnAssetsFolderBrowse.TabIndex = 2; - this.btnAssetsFolderBrowse.Text = "..."; - this.btnAssetsFolderBrowse.UseVisualStyleBackColor = true; - this.btnAssetsFolderBrowse.Click += new System.EventHandler(this.btnAssetsFolderBrowse_Click); + this.lblAssetsFolderPath.AutoSize = true; + this.lblAssetsFolderPath.Location = new System.Drawing.Point(13, 16); + this.lblAssetsFolderPath.Name = "lblAssetsFolderPath"; + this.lblAssetsFolderPath.Size = new System.Drawing.Size(94, 13); + this.lblAssetsFolderPath.TabIndex = 1; + this.lblAssetsFolderPath.Text = "Assets folder path:"; + // + // lblPackageFilePath + // + this.lblPackageFilePath.AutoSize = true; + this.lblPackageFilePath.Location = new System.Drawing.Point(13, 64); + this.lblPackageFilePath.Name = "lblPackageFilePath"; + this.lblPackageFilePath.Size = new System.Drawing.Size(93, 13); + this.lblPackageFilePath.TabIndex = 4; + this.lblPackageFilePath.Text = "Package file path:"; + // + // txtPackageFilePath + // + this.txtPackageFilePath.Location = new System.Drawing.Point(16, 80); + this.txtPackageFilePath.Name = "txtPackageFilePath"; + this.txtPackageFilePath.Size = new System.Drawing.Size(344, 20); + this.txtPackageFilePath.TabIndex = 5; + this.txtPackageFilePath.TextChanged += new System.EventHandler(this.txtPackageFilePath_TextChanged); + // + // btnPackageFilePathBrowse + // + this.btnPackageFilePathBrowse.Location = new System.Drawing.Point(368, 79); + this.btnPackageFilePathBrowse.Name = "btnPackageFilePathBrowse"; + this.btnPackageFilePathBrowse.Size = new System.Drawing.Size(32, 23); + this.btnPackageFilePathBrowse.TabIndex = 6; + this.btnPackageFilePathBrowse.Text = "..."; + this.btnPackageFilePathBrowse.UseVisualStyleBackColor = true; + this.btnPackageFilePathBrowse.Click += new System.EventHandler(this.btnPackageFilePathBrowse_Click); + // + // txtAssetsFolderPath + // + this.txtAssetsFolderPath.Location = new System.Drawing.Point(16, 32); + this.txtAssetsFolderPath.Name = "txtAssetsFolderPath"; + this.txtAssetsFolderPath.Size = new System.Drawing.Size(344, 20); + this.txtAssetsFolderPath.TabIndex = 2; + this.txtAssetsFolderPath.TextChanged += new System.EventHandler(this.txtAssetsFolderPath_TextChanged); + // + // btnAssetsFolderPathBrowse + // + this.btnAssetsFolderPathBrowse.Location = new System.Drawing.Point(368, 31); + this.btnAssetsFolderPathBrowse.Name = "btnAssetsFolderPathBrowse"; + this.btnAssetsFolderPathBrowse.Size = new System.Drawing.Size(32, 23); + this.btnAssetsFolderPathBrowse.TabIndex = 3; + this.btnAssetsFolderPathBrowse.Text = "..."; + this.btnAssetsFolderPathBrowse.UseVisualStyleBackColor = true; + this.btnAssetsFolderPathBrowse.Click += new System.EventHandler(this.btnAssetsFolderPathBrowse_Click); // // ImageEffectPackagerForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(409, 98); - this.Controls.Add(this.btnAssetsFolderBrowse); + this.ClientSize = new System.Drawing.Size(417, 145); + this.Controls.Add(this.btnAssetsFolderPathBrowse); + this.Controls.Add(this.txtAssetsFolderPath); + this.Controls.Add(this.btnPackageFilePathBrowse); + this.Controls.Add(this.txtPackageFilePath); + this.Controls.Add(this.lblPackageFilePath); + this.Controls.Add(this.lblAssetsFolderPath); this.Controls.Add(this.btnPackage); - this.Controls.Add(this.txtAssetsFolder); - this.Controls.Add(this.lblAssetsFolder); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; this.MaximizeBox = false; this.Name = "ImageEffectPackagerForm"; @@ -91,10 +124,12 @@ private void InitializeComponent() } #endregion - - private System.Windows.Forms.Label lblAssetsFolder; - private System.Windows.Forms.TextBox txtAssetsFolder; private System.Windows.Forms.Button btnPackage; - private System.Windows.Forms.Button btnAssetsFolderBrowse; + private System.Windows.Forms.Label lblAssetsFolderPath; + private System.Windows.Forms.Label lblPackageFilePath; + private System.Windows.Forms.TextBox txtPackageFilePath; + private System.Windows.Forms.Button btnPackageFilePathBrowse; + private System.Windows.Forms.TextBox txtAssetsFolderPath; + private System.Windows.Forms.Button btnAssetsFolderPathBrowse; } } \ No newline at end of file diff --git a/ShareX.ImageEffectsLib/ImageEffectPackagerForm.cs b/ShareX.ImageEffectsLib/ImageEffectPackagerForm.cs index 799be3af9..a19ce63b6 100644 --- a/ShareX.ImageEffectsLib/ImageEffectPackagerForm.cs +++ b/ShareX.ImageEffectsLib/ImageEffectPackagerForm.cs @@ -36,6 +36,7 @@ public partial class ImageEffectPackagerForm : Form public string ImageEffectName { get; private set; } public string ShareXImageEffectsFolderPath { get; private set; } public string AssetsFolderPath { get; set; } + public string PackageFilePath { get; set; } public ImageEffectPackagerForm(string json, string name, string imageEffectsFolderPath) { @@ -45,24 +46,49 @@ public ImageEffectPackagerForm(string json, string name, string imageEffectsFold InitializeComponent(); ShareXResources.ApplyTheme(this); + + AssetsFolderPath = Path.Combine(ShareXImageEffectsFolderPath, ImageEffectName); + txtAssetsFolderPath.Text = AssetsFolderPath; + PackageFilePath = AssetsFolderPath + ".sxie"; + txtPackageFilePath.Text = PackageFilePath; } - private void txtAssetsFolder_TextChanged(object sender, EventArgs e) + private void txtAssetsFolderPath_TextChanged(object sender, EventArgs e) { - AssetsFolderPath = txtAssetsFolder.Text; + AssetsFolderPath = txtAssetsFolderPath.Text; } - private void btnAssetsFolderBrowse_Click(object sender, EventArgs e) + private void btnAssetsFolderPathBrowse_Click(object sender, EventArgs e) { - Helpers.BrowseFolder(txtAssetsFolder, ShareXImageEffectsFolderPath); + Helpers.BrowseFolder(txtAssetsFolderPath, ShareXImageEffectsFolderPath); + } + + private void txtPackageFilePath_TextChanged(object sender, EventArgs e) + { + PackageFilePath = txtPackageFilePath.Text; + } + + private void btnPackageFilePathBrowse_Click(object sender, EventArgs e) + { + using (SaveFileDialog sfd = new SaveFileDialog()) + { + sfd.DefaultExt = "sxie"; + sfd.FileName = ImageEffectName + ".sxie"; + sfd.Filter = "ShareX image effect (*.sxie)|*.sxie"; + sfd.InitialDirectory = ShareXImageEffectsFolderPath; + + if (sfd.ShowDialog() == DialogResult.OK) + { + txtPackageFilePath.Text = sfd.FileName; + } + } } private void btnPackage_Click(object sender, EventArgs e) { try { - if (!string.IsNullOrEmpty(AssetsFolderPath) && - !AssetsFolderPath.StartsWith(ShareXImageEffectsFolderPath + "\\", StringComparison.OrdinalIgnoreCase)) + if (!string.IsNullOrEmpty(AssetsFolderPath) && !AssetsFolderPath.StartsWith(ShareXImageEffectsFolderPath + "\\", StringComparison.OrdinalIgnoreCase)) { // TODO: Translate MessageBox.Show("Assets folder must be inside ShareX image effects folder.", "ShareX - " + "Invalid assets folder path", @@ -70,22 +96,11 @@ private void btnPackage_Click(object sender, EventArgs e) } else { - using (SaveFileDialog sfd = new SaveFileDialog()) + string outputFilePath = ImageEffectPackager.Package(PackageFilePath, ImageEffectJson, AssetsFolderPath); + + if (!string.IsNullOrEmpty(outputFilePath) && File.Exists(outputFilePath)) { - sfd.DefaultExt = "sxie"; - sfd.FileName = ImageEffectName + ".sxie"; - sfd.Filter = "ShareX image effect (*.sxie)|*.sxie"; - sfd.InitialDirectory = ShareXImageEffectsFolderPath; - - if (sfd.ShowDialog() == DialogResult.OK) - { - string outputFilePath = ImageEffectPackager.Package(sfd.FileName, ImageEffectJson, AssetsFolderPath); - - if (!string.IsNullOrEmpty(outputFilePath) && File.Exists(outputFilePath)) - { - Helpers.OpenFolderWithFile(outputFilePath); - } - } + Helpers.OpenFolderWithFile(outputFilePath); } } } From b3bcffbde017a0bc0ccd9ea7564966c50a124cbc Mon Sep 17 00:00:00 2001 From: Jaex Date: Wed, 17 Jun 2020 09:53:24 +0300 Subject: [PATCH 24/37] Use linq in extract method --- ShareX.HelpersLib/ZipManager.cs | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/ShareX.HelpersLib/ZipManager.cs b/ShareX.HelpersLib/ZipManager.cs index 8e8d6e082..d63e635c2 100644 --- a/ShareX.HelpersLib/ZipManager.cs +++ b/ShareX.HelpersLib/ZipManager.cs @@ -27,6 +27,7 @@ using System.Collections.Generic; using System.IO; using System.IO.Compression; +using System.Linq; namespace ShareX.HelpersLib { @@ -42,23 +43,9 @@ public static void Extract(string archivePath, string destination, bool retainDi { string entryName = entry.Name; - if (fileFilter != null) + if (fileFilter != null && !fileFilter.Any(x => x.Equals(entryName, StringComparison.OrdinalIgnoreCase))) { - bool match = false; - - foreach (string file in fileFilter) - { - if (file.Equals(entryName, StringComparison.OrdinalIgnoreCase)) - { - match = true; - break; - } - } - - if (!match) - { - continue; - } + continue; } if (retainDirectoryStructure) From a4ce67415359729c5d520753544c8d8d3229f091 Mon Sep 17 00:00:00 2001 From: Jaex Date: Wed, 17 Jun 2020 10:14:31 +0300 Subject: [PATCH 25/37] Extract not relies on package name now --- ShareX.ImageEffectsLib/ImageEffectPackager.cs | 61 ++++++++----------- .../ImageEffectPackagerForm.Designer.cs | 2 +- ShareX/TaskHelpers.cs | 9 ++- 3 files changed, 33 insertions(+), 39 deletions(-) diff --git a/ShareX.ImageEffectsLib/ImageEffectPackager.cs b/ShareX.ImageEffectsLib/ImageEffectPackager.cs index 08cbbb31e..393bcf87b 100644 --- a/ShareX.ImageEffectsLib/ImageEffectPackager.cs +++ b/ShareX.ImageEffectsLib/ImageEffectPackager.cs @@ -46,22 +46,23 @@ public static string Package(string outputFilePath, string configJson, string as string configFilePath = Path.Combine(outputFolder, ConfigFileName); File.WriteAllText(configFilePath, configJson, Encoding.UTF8); + Dictionary files = new Dictionary(); + files.Add(configFilePath, ConfigFileName); + + if (!string.IsNullOrEmpty(assetsFolderPath) && Directory.Exists(assetsFolderPath)) + { + string parentFolderPath = Directory.GetParent(assetsFolderPath).FullName; + int entryNamePosition = parentFolderPath.Length + 1; + + foreach (string assetPath in Directory.EnumerateFiles(assetsFolderPath, "*.*", SearchOption.AllDirectories).Where(x => Helpers.IsImageFile(x))) + { + string entryName = assetPath.Substring(entryNamePosition); + files.Add(assetPath, entryName); + } + } + try { - Dictionary files = new Dictionary(); - files.Add(configFilePath, ConfigFileName); - - if (!string.IsNullOrEmpty(assetsFolderPath) && Directory.Exists(assetsFolderPath)) - { - int entryNamePosition = assetsFolderPath.Length + 1; - - foreach (string assetPath in Directory.EnumerateFiles(assetsFolderPath, "*.*", SearchOption.AllDirectories).Where(x => Helpers.IsImageFile(x))) - { - string entryName = assetPath.Substring(entryNamePosition); - files.Add(assetPath, entryName); - } - } - ZipManager.Compress(outputFilePath, files); } finally @@ -75,34 +76,20 @@ public static string Package(string outputFilePath, string configJson, string as return null; } - public static string ExtractPackage(string packageFilePath, string imageEffectsFolderPath) + public static string ExtractPackage(string packageFilePath, string destination) { - if (!string.IsNullOrEmpty(packageFilePath) && File.Exists(packageFilePath) && !string.IsNullOrEmpty(imageEffectsFolderPath)) + if (!string.IsNullOrEmpty(packageFilePath) && File.Exists(packageFilePath) && !string.IsNullOrEmpty(destination)) { - string packageName = Path.GetFileNameWithoutExtension(packageFilePath); + string configFilePath = Path.Combine(destination, ConfigFileName); - if (!string.IsNullOrEmpty(packageName) && !packageName.StartsWith(".")) + if (File.Exists(configFilePath)) { - string destination = Path.Combine(imageEffectsFolderPath, packageName); - - if (Directory.Exists(destination)) - { - // TODO: Translate - if (MessageBox.Show($"Destination folder already exists:\r\n\"{destination}\"\r\n\r\nWould you like to overwrite it?", "ShareX - " + - "Image effect packager", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes) - { - Directory.Delete(destination, true); - } - else - { - return null; - } - } - - ZipManager.Extract(packageFilePath, destination); - - return Path.Combine(destination, ConfigFileName); + File.Delete(configFilePath); } + + ZipManager.Extract(packageFilePath, destination); + + return configFilePath; } return null; diff --git a/ShareX.ImageEffectsLib/ImageEffectPackagerForm.Designer.cs b/ShareX.ImageEffectsLib/ImageEffectPackagerForm.Designer.cs index ddd27280c..aaaa812b3 100644 --- a/ShareX.ImageEffectsLib/ImageEffectPackagerForm.Designer.cs +++ b/ShareX.ImageEffectsLib/ImageEffectPackagerForm.Designer.cs @@ -41,7 +41,7 @@ private void InitializeComponent() // this.btnPackage.Location = new System.Drawing.Point(16, 112); this.btnPackage.Name = "btnPackage"; - this.btnPackage.Size = new System.Drawing.Size(128, 23); + this.btnPackage.Size = new System.Drawing.Size(384, 24); this.btnPackage.TabIndex = 0; this.btnPackage.Text = "Package"; this.btnPackage.UseVisualStyleBackColor = true; diff --git a/ShareX/TaskHelpers.cs b/ShareX/TaskHelpers.cs index cd5127b98..1030733ff 100644 --- a/ShareX/TaskHelpers.cs +++ b/ShareX/TaskHelpers.cs @@ -1707,7 +1707,14 @@ public static void ImportImageEffect(string filePath) if (imageEffectsForm != null) { - imageEffectsForm.ImportImageEffectFromFile(configFilePath); + try + { + imageEffectsForm.ImportImageEffectFromFile(configFilePath); + } + finally + { + File.Delete(configFilePath); + } } } } From b16f93fda583b9498e2f819b0925f4bf8d328f4b Mon Sep 17 00:00:00 2001 From: Jaex Date: Wed, 17 Jun 2020 16:40:29 +0300 Subject: [PATCH 26/37] Added interpolation mode option to image watermark --- ShareX.HelpersLib/Enums.cs | 9 ++ ShareX.HelpersLib/Helpers/ImageHelpers.cs | 18 ++++ .../Properties/Resources.Designer.cs | 90 +++++++++---------- ShareX.HelpersLib/Properties/Resources.resx | 10 +-- ShareX.ImageEffectsLib/Drawings/DrawImage.cs | 7 +- .../ImageEffectPackagerForm.Designer.cs | 2 +- ShareX.ScreenCaptureLib/Enums.cs | 9 -- .../Forms/ImageSizeForm.cs | 8 +- .../RegionCaptureOptions.cs | 2 +- .../Shapes/AnnotationOptions.cs | 3 +- .../Shapes/Drawing/ImageDrawingShape.cs | 5 +- .../Shapes/Drawing/MagnifyDrawingShape.cs | 5 +- .../Shapes/Drawing/StickerDrawingShape.cs | 2 +- .../Shapes/ShapeManager.cs | 20 +---- .../Shapes/ShapeManagerMenu.cs | 4 +- 15 files changed, 101 insertions(+), 93 deletions(-) diff --git a/ShareX.HelpersLib/Enums.cs b/ShareX.HelpersLib/Enums.cs index d2ac30d28..9ab197155 100644 --- a/ShareX.HelpersLib/Enums.cs +++ b/ShareX.HelpersLib/Enums.cs @@ -188,4 +188,13 @@ public enum ImageCombinerAlignment Center, RightOrBottom } + + public enum ImageInterpolationMode // Localized + { + HighQualityBicubic, + Bicubic, + HighQualityBilinear, + Bilinear, + NearestNeighbor + } } \ No newline at end of file diff --git a/ShareX.HelpersLib/Helpers/ImageHelpers.cs b/ShareX.HelpersLib/Helpers/ImageHelpers.cs index 6f908a301..eceb7898c 100644 --- a/ShareX.HelpersLib/Helpers/ImageHelpers.cs +++ b/ShareX.HelpersLib/Helpers/ImageHelpers.cs @@ -2078,5 +2078,23 @@ public static Size GetImageFileDimensions(string filePath) return Size.Empty; } + + public static InterpolationMode GetInterpolationMode(ImageInterpolationMode interpolationMode) + { + switch (interpolationMode) + { + default: + case ImageInterpolationMode.HighQualityBicubic: + return InterpolationMode.HighQualityBicubic; + case ImageInterpolationMode.Bicubic: + return InterpolationMode.Bicubic; + case ImageInterpolationMode.HighQualityBilinear: + return InterpolationMode.HighQualityBilinear; + case ImageInterpolationMode.Bilinear: + return InterpolationMode.Bilinear; + case ImageInterpolationMode.NearestNeighbor: + return InterpolationMode.NearestNeighbor; + } + } } } \ No newline at end of file diff --git a/ShareX.HelpersLib/Properties/Resources.Designer.cs b/ShareX.HelpersLib/Properties/Resources.Designer.cs index ba7e1f6eb..fa8da4e66 100644 --- a/ShareX.HelpersLib/Properties/Resources.Designer.cs +++ b/ShareX.HelpersLib/Properties/Resources.Designer.cs @@ -2058,51 +2058,6 @@ internal class Resources { } } - /// - /// Looks up a localized string similar to Bicubic. - /// - internal static string ImageEditorInterpolationMode_Bicubic { - get { - return ResourceManager.GetString("ImageEditorInterpolationMode_Bicubic", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Bilinear. - /// - internal static string ImageEditorInterpolationMode_Bilinear { - get { - return ResourceManager.GetString("ImageEditorInterpolationMode_Bilinear", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to High quality bicubic. - /// - internal static string ImageEditorInterpolationMode_HighQualityBicubic { - get { - return ResourceManager.GetString("ImageEditorInterpolationMode_HighQualityBicubic", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to High quality bilinear. - /// - internal static string ImageEditorInterpolationMode_HighQualityBilinear { - get { - return ResourceManager.GetString("ImageEditorInterpolationMode_HighQualityBilinear", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Nearest neighbor. - /// - internal static string ImageEditorInterpolationMode_NearestNeighbor { - get { - return ResourceManager.GetString("ImageEditorInterpolationMode_NearestNeighbor", resourceCulture); - } - } - /// /// Looks up a localized string similar to Auto size. /// @@ -2148,6 +2103,51 @@ internal class Resources { } } + /// + /// Looks up a localized string similar to Bicubic. + /// + internal static string ImageInterpolationMode_Bicubic { + get { + return ResourceManager.GetString("ImageInterpolationMode_Bicubic", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Bilinear. + /// + internal static string ImageInterpolationMode_Bilinear { + get { + return ResourceManager.GetString("ImageInterpolationMode_Bilinear", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to High quality bicubic. + /// + internal static string ImageInterpolationMode_HighQualityBicubic { + get { + return ResourceManager.GetString("ImageInterpolationMode_HighQualityBicubic", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to High quality bilinear. + /// + internal static string ImageInterpolationMode_HighQualityBilinear { + get { + return ResourceManager.GetString("ImageInterpolationMode_HighQualityBilinear", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Nearest neighbor. + /// + internal static string ImageInterpolationMode_NearestNeighbor { + get { + return ResourceManager.GetString("ImageInterpolationMode_NearestNeighbor", resourceCulture); + } + } + /// /// Looks up a localized string similar to Big square. /// diff --git a/ShareX.HelpersLib/Properties/Resources.resx b/ShareX.HelpersLib/Properties/Resources.resx index 11f50cdac..7876a7470 100644 --- a/ShareX.HelpersLib/Properties/Resources.resx +++ b/ShareX.HelpersLib/Properties/Resources.resx @@ -135,7 +135,7 @@ Custom text uploader - + High quality bicubic @@ -683,7 +683,7 @@ Would you like to download and install it? Screen record - + Bilinear @@ -710,7 +710,7 @@ Would you like to download and install it? Paste - + High quality bilinear @@ -734,7 +734,7 @@ Would you like to download and install it? Remove shape or cancel capture - + Nearest neighbor @@ -746,7 +746,7 @@ Would you like to download and install it? Status: {0} - + Bicubic diff --git a/ShareX.ImageEffectsLib/Drawings/DrawImage.cs b/ShareX.ImageEffectsLib/Drawings/DrawImage.cs index 6783e3f85..1ab0e9674 100644 --- a/ShareX.ImageEffectsLib/Drawings/DrawImage.cs +++ b/ShareX.ImageEffectsLib/Drawings/DrawImage.cs @@ -27,6 +27,7 @@ using System.ComponentModel; using System.Drawing; using System.Drawing.Design; +using System.Drawing.Drawing2D; using System.IO; namespace ShareX.ImageEffectsLib @@ -49,6 +50,9 @@ public class DrawImage : ImageEffect [DefaultValue(typeof(Size), "0, 0")] public Size Size { get; set; } + [DefaultValue(ImageInterpolationMode.HighQualityBicubic), TypeConverter(typeof(EnumDescriptionConverter))] + public ImageInterpolationMode InterpolationMode { get; set; } + [DefaultValue(true), Description("If image watermark size bigger than source image then don't draw it.")] public bool AutoHide { get; set; } @@ -97,7 +101,8 @@ public override Bitmap Apply(Bitmap bmp) using (Graphics g = Graphics.FromImage(bmp)) { - g.SetHighQuality(); + g.InterpolationMode = ImageHelpers.GetInterpolationMode(InterpolationMode); + g.PixelOffsetMode = PixelOffsetMode.Half; g.DrawImage(bmp2, imageRectangle); } } diff --git a/ShareX.ImageEffectsLib/ImageEffectPackagerForm.Designer.cs b/ShareX.ImageEffectsLib/ImageEffectPackagerForm.Designer.cs index aaaa812b3..bd151b8a3 100644 --- a/ShareX.ImageEffectsLib/ImageEffectPackagerForm.Designer.cs +++ b/ShareX.ImageEffectsLib/ImageEffectPackagerForm.Designer.cs @@ -105,7 +105,7 @@ private void InitializeComponent() // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(417, 145); + this.ClientSize = new System.Drawing.Size(417, 150); this.Controls.Add(this.btnAssetsFolderPathBrowse); this.Controls.Add(this.txtAssetsFolderPath); this.Controls.Add(this.btnPackageFilePathBrowse); diff --git a/ShareX.ScreenCaptureLib/Enums.cs b/ShareX.ScreenCaptureLib/Enums.cs index dcc82c923..8904f47e8 100644 --- a/ShareX.ScreenCaptureLib/Enums.cs +++ b/ShareX.ScreenCaptureLib/Enums.cs @@ -318,15 +318,6 @@ public enum ImageEditorStartMode // Localized Fullscreen } - public enum ImageEditorInterpolationMode // Localized - { - HighQualityBicubic, - Bicubic, - HighQualityBilinear, - Bilinear, - NearestNeighbor - } - public enum ImageInsertMethod { Center, diff --git a/ShareX.ScreenCaptureLib/Forms/ImageSizeForm.cs b/ShareX.ScreenCaptureLib/Forms/ImageSizeForm.cs index fb22fffc0..5b85b1743 100644 --- a/ShareX.ScreenCaptureLib/Forms/ImageSizeForm.cs +++ b/ShareX.ScreenCaptureLib/Forms/ImageSizeForm.cs @@ -33,12 +33,12 @@ namespace ShareX.ScreenCaptureLib public partial class ImageSizeForm : Form { public Size ImageSize { get; private set; } - public ImageEditorInterpolationMode InterpolationMode { get; private set; } + public ImageInterpolationMode InterpolationMode { get; private set; } private double widthRatio, heightRatio; private bool ignoreValueChanged = true; - public ImageSizeForm(Size size, ImageEditorInterpolationMode interpolationMode) + public ImageSizeForm(Size size, ImageInterpolationMode interpolationMode) { InitializeComponent(); ShareXResources.ApplyTheme(this); @@ -56,7 +56,7 @@ public ImageSizeForm(Size size, ImageEditorInterpolationMode interpolationMode) nudWidth.TextChanged += NudWidth_TextChanged; nudHeight.TextChanged += NudHeight_TextChanged; - cbResampling.Items.AddRange(Helpers.GetLocalizedEnumDescriptions()); + cbResampling.Items.AddRange(Helpers.GetLocalizedEnumDescriptions()); cbResampling.SelectedIndex = (int)InterpolationMode; ignoreValueChanged = false; @@ -119,7 +119,7 @@ private void cbAspectRatio_CheckedChanged(object sender, EventArgs e) private void cbResampling_SelectedIndexChanged(object sender, EventArgs e) { - InterpolationMode = (ImageEditorInterpolationMode)cbResampling.SelectedIndex; + InterpolationMode = (ImageInterpolationMode)cbResampling.SelectedIndex; } private void btnOK_Click(object sender, EventArgs e) diff --git a/ShareX.ScreenCaptureLib/RegionCaptureOptions.cs b/ShareX.ScreenCaptureLib/RegionCaptureOptions.cs index 780b3ee85..88ff7b763 100644 --- a/ShareX.ScreenCaptureLib/RegionCaptureOptions.cs +++ b/ShareX.ScreenCaptureLib/RegionCaptureOptions.cs @@ -89,7 +89,7 @@ public class RegionCaptureOptions public WindowState ImageEditorWindowState = new WindowState(); public bool AutoCloseEditorOnTask = false; public bool ShowEditorPanTip = true; - public ImageEditorInterpolationMode ImageEditorResizeInterpolationMode = ImageEditorInterpolationMode.Bicubic; + public ImageInterpolationMode ImageEditorResizeInterpolationMode = ImageInterpolationMode.Bicubic; public Size EditorNewImageSize = new Size(800, 600); public bool EditorNewImageTransparent = false; public Color EditorNewImageBackgroundColor = Color.White; diff --git a/ShareX.ScreenCaptureLib/Shapes/AnnotationOptions.cs b/ShareX.ScreenCaptureLib/Shapes/AnnotationOptions.cs index fd0965d3b..f07ce4d9e 100644 --- a/ShareX.ScreenCaptureLib/Shapes/AnnotationOptions.cs +++ b/ShareX.ScreenCaptureLib/Shapes/AnnotationOptions.cs @@ -23,6 +23,7 @@ #endregion License Information (GPL v3) +using ShareX.HelpersLib; using System.Collections.Generic; using System.Drawing; @@ -74,7 +75,7 @@ public class AnnotationOptions public Color TextFillColor { get; set; } = PrimaryColor; // Image drawing - public ImageEditorInterpolationMode ImageInterpolationMode = ImageEditorInterpolationMode.NearestNeighbor; + public ImageInterpolationMode ImageInterpolationMode = ImageInterpolationMode.NearestNeighbor; public string LastImageFilePath { get; set; } // Step drawing diff --git a/ShareX.ScreenCaptureLib/Shapes/Drawing/ImageDrawingShape.cs b/ShareX.ScreenCaptureLib/Shapes/Drawing/ImageDrawingShape.cs index e7ae26242..20f2951cd 100644 --- a/ShareX.ScreenCaptureLib/Shapes/Drawing/ImageDrawingShape.cs +++ b/ShareX.ScreenCaptureLib/Shapes/Drawing/ImageDrawingShape.cs @@ -23,6 +23,7 @@ #endregion License Information (GPL v3) +using ShareX.HelpersLib; using System.Drawing; using System.Drawing.Drawing2D; @@ -33,7 +34,7 @@ public class ImageDrawingShape : BaseDrawingShape public override ShapeType ShapeType { get; } = ShapeType.DrawingImage; public Image Image { get; protected set; } - public ImageEditorInterpolationMode ImageInterpolationMode { get; protected set; } + public ImageInterpolationMode ImageInterpolationMode { get; protected set; } public override void OnConfigLoad() { @@ -79,7 +80,7 @@ protected void DrawImage(Graphics g) if (Image != null) { g.PixelOffsetMode = PixelOffsetMode.Half; - g.InterpolationMode = Manager.GetInterpolationMode(ImageInterpolationMode); + g.InterpolationMode = ImageHelpers.GetInterpolationMode(ImageInterpolationMode); g.DrawImage(Image, Rectangle); diff --git a/ShareX.ScreenCaptureLib/Shapes/Drawing/MagnifyDrawingShape.cs b/ShareX.ScreenCaptureLib/Shapes/Drawing/MagnifyDrawingShape.cs index de291f8eb..013f065bd 100644 --- a/ShareX.ScreenCaptureLib/Shapes/Drawing/MagnifyDrawingShape.cs +++ b/ShareX.ScreenCaptureLib/Shapes/Drawing/MagnifyDrawingShape.cs @@ -23,6 +23,7 @@ #endregion License Information (GPL v3) +using ShareX.HelpersLib; using System; using System.Drawing; using System.Drawing.Drawing2D; @@ -34,7 +35,7 @@ public class MagnifyDrawingShape : EllipseDrawingShape public override ShapeType ShapeType { get; } = ShapeType.DrawingMagnify; public int MagnifyStrength { get; set; } = 200; - public ImageEditorInterpolationMode ImageInterpolationMode { get; set; } + public ImageInterpolationMode ImageInterpolationMode { get; set; } public MagnifyDrawingShape() { @@ -58,7 +59,7 @@ public override void OnConfigSave() public override void OnDraw(Graphics g) { g.PixelOffsetMode = PixelOffsetMode.Half; - g.InterpolationMode = Manager.GetInterpolationMode(ImageInterpolationMode); + g.InterpolationMode = ImageHelpers.GetInterpolationMode(ImageInterpolationMode); using (GraphicsPath gp = new GraphicsPath()) { diff --git a/ShareX.ScreenCaptureLib/Shapes/Drawing/StickerDrawingShape.cs b/ShareX.ScreenCaptureLib/Shapes/Drawing/StickerDrawingShape.cs index 8235cc527..fa2370073 100644 --- a/ShareX.ScreenCaptureLib/Shapes/Drawing/StickerDrawingShape.cs +++ b/ShareX.ScreenCaptureLib/Shapes/Drawing/StickerDrawingShape.cs @@ -35,7 +35,7 @@ public class StickerDrawingShape : ImageDrawingShape public override void OnConfigLoad() { - ImageInterpolationMode = ImageEditorInterpolationMode.NearestNeighbor; + ImageInterpolationMode = ImageInterpolationMode.NearestNeighbor; } public override void OnConfigSave() diff --git a/ShareX.ScreenCaptureLib/Shapes/ShapeManager.cs b/ShareX.ScreenCaptureLib/Shapes/ShapeManager.cs index 440a21214..98803140d 100644 --- a/ShareX.ScreenCaptureLib/Shapes/ShapeManager.cs +++ b/ShareX.ScreenCaptureLib/Shapes/ShapeManager.cs @@ -1928,7 +1928,7 @@ private void ChangeImageSize() if (size != oldSize) { - InterpolationMode interpolationMode = GetInterpolationMode(Options.ImageEditorResizeInterpolationMode); + InterpolationMode interpolationMode = ImageHelpers.GetInterpolationMode(Options.ImageEditorResizeInterpolationMode); Bitmap bmp = ImageHelpers.ResizeImage(Form.Canvas, size, interpolationMode); if (bmp != null) @@ -1942,24 +1942,6 @@ private void ChangeImageSize() Form.Resume(); } - internal InterpolationMode GetInterpolationMode(ImageEditorInterpolationMode interpolationMode) - { - switch (interpolationMode) - { - default: - case ImageEditorInterpolationMode.HighQualityBicubic: - return InterpolationMode.HighQualityBicubic; - case ImageEditorInterpolationMode.Bicubic: - return InterpolationMode.Bicubic; - case ImageEditorInterpolationMode.HighQualityBilinear: - return InterpolationMode.HighQualityBilinear; - case ImageEditorInterpolationMode.Bilinear: - return InterpolationMode.Bilinear; - case ImageEditorInterpolationMode.NearestNeighbor: - return InterpolationMode.NearestNeighbor; - } - } - private void ChangeCanvasSize() { Form.Pause(); diff --git a/ShareX.ScreenCaptureLib/Shapes/ShapeManagerMenu.cs b/ShareX.ScreenCaptureLib/Shapes/ShapeManagerMenu.cs index d641c2be4..afe895a7e 100644 --- a/ShareX.ScreenCaptureLib/Shapes/ShapeManagerMenu.cs +++ b/ShareX.ScreenCaptureLib/Shapes/ShapeManagerMenu.cs @@ -506,10 +506,10 @@ internal void CreateToolbar() tsddbShapeOptions.DropDownItems.Add(tslnudCornerRadius); tscbImageInterpolationMode = new ToolStripLabeledComboBox(Resources.ShapeManager_CreateToolbar_InterpolationMode); - tscbImageInterpolationMode.Content.AddRange(Helpers.GetLocalizedEnumDescriptions()); + tscbImageInterpolationMode.Content.AddRange(Helpers.GetLocalizedEnumDescriptions()); tscbImageInterpolationMode.Content.SelectedIndexChanged += (sender, e) => { - AnnotationOptions.ImageInterpolationMode = (ImageEditorInterpolationMode)tscbImageInterpolationMode.Content.SelectedIndex; + AnnotationOptions.ImageInterpolationMode = (ImageInterpolationMode)tscbImageInterpolationMode.Content.SelectedIndex; tscbImageInterpolationMode.Invalidate(); UpdateCurrentShape(); }; From 4470741b32e9df42d60903d061bfe4145939c1e9 Mon Sep 17 00:00:00 2001 From: Jaex Date: Wed, 17 Jun 2020 17:03:20 +0300 Subject: [PATCH 27/37] Fix control anchor --- ShareX.ImageEffectsLib/ImageEffectsForm.resx | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/ShareX.ImageEffectsLib/ImageEffectsForm.resx b/ShareX.ImageEffectsLib/ImageEffectsForm.resx index a9e0d88e6..7529c222d 100644 --- a/ShareX.ImageEffectsLib/ImageEffectsForm.resx +++ b/ShareX.ImageEffectsLib/ImageEffectsForm.resx @@ -280,7 +280,7 @@ 120, 24 - 19 + 20 Save image... @@ -394,7 +394,7 @@ 120, 24 - 18 + 19 Load image @@ -598,7 +598,7 @@ 120, 24 - 20 + 21 Upload image @@ -693,6 +693,9 @@ 3 + + Bottom, Left + 200, 504 @@ -700,7 +703,7 @@ 120, 24 - 21 + 18 Packager... From 68ff7a27f092526942f62abe39bc8970b30dcd1d Mon Sep 17 00:00:00 2001 From: morsisko Date: Wed, 17 Jun 2020 23:12:46 +0200 Subject: [PATCH 28/37] Docked label to the bottom-left corner of TextDrawingInputBox --- ShareX.ScreenCaptureLib/Forms/TextDrawingInputBox.resx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/ShareX.ScreenCaptureLib/Forms/TextDrawingInputBox.resx b/ShareX.ScreenCaptureLib/Forms/TextDrawingInputBox.resx index 6a15bef6d..056380196 100644 --- a/ShareX.ScreenCaptureLib/Forms/TextDrawingInputBox.resx +++ b/ShareX.ScreenCaptureLib/Forms/TextDrawingInputBox.resx @@ -750,11 +750,17 @@ True + + Bottom + NoControl - 5, 334 + 0, 339 + + + 0, 0, 0, 13 106, 13 From 442391b2723ebebdc185d09c0acb49eac529bd13 Mon Sep 17 00:00:00 2001 From: Jaex Date: Thu, 18 Jun 2020 10:09:45 +0300 Subject: [PATCH 29/37] Added dark theme compatible loading gif --- .../Properties/Resources.Designer.cs | 14 ++++++++++++-- ShareX.HelpersLib/Properties/Resources.resx | 9 ++++++--- .../{LoadingSmall.gif => LoadingSmallBlack.gif} | Bin ShareX.HelpersLib/Resources/LoadingSmallWhite.gif | Bin 0 -> 847 bytes ShareX.HelpersLib/ShareX.HelpersLib.csproj | 5 ++++- .../UpdateChecker/UpdateCheckerLabel.Designer.cs | 2 +- .../UpdateChecker/UpdateCheckerLabel.cs | 12 ++++++++++++ ShareX/Forms/AboutForm.cs | 2 ++ 8 files changed, 37 insertions(+), 7 deletions(-) rename ShareX.HelpersLib/Resources/{LoadingSmall.gif => LoadingSmallBlack.gif} (100%) create mode 100644 ShareX.HelpersLib/Resources/LoadingSmallWhite.gif diff --git a/ShareX.HelpersLib/Properties/Resources.Designer.cs b/ShareX.HelpersLib/Properties/Resources.Designer.cs index fa8da4e66..bae32c7fe 100644 --- a/ShareX.HelpersLib/Properties/Resources.Designer.cs +++ b/ShareX.HelpersLib/Properties/Resources.Designer.cs @@ -2251,9 +2251,19 @@ internal class Resources { /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static System.Drawing.Bitmap LoadingSmall { + internal static System.Drawing.Bitmap LoadingSmallBlack { get { - object obj = ResourceManager.GetObject("LoadingSmall", resourceCulture); + object obj = ResourceManager.GetObject("LoadingSmallBlack", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap LoadingSmallWhite { + get { + object obj = ResourceManager.GetObject("LoadingSmallWhite", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } diff --git a/ShareX.HelpersLib/Properties/Resources.resx b/ShareX.HelpersLib/Properties/Resources.resx index 7876a7470..9500916ca 100644 --- a/ShareX.HelpersLib/Properties/Resources.resx +++ b/ShareX.HelpersLib/Properties/Resources.resx @@ -1193,9 +1193,6 @@ Would you like to download and install it? Amazon S3 Standard-Infrequent Access - - ..\Resources\LoadingSmall.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - Random non ambiguous alphanumeric char. Repeat using {n} @@ -1250,4 +1247,10 @@ Would you like to download and install it? Amazon S3 One Zone-Infrequent Access + + ..\Resources\LoadingSmallBlack.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\LoadingSmallWhite.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/ShareX.HelpersLib/Resources/LoadingSmall.gif b/ShareX.HelpersLib/Resources/LoadingSmallBlack.gif similarity index 100% rename from ShareX.HelpersLib/Resources/LoadingSmall.gif rename to ShareX.HelpersLib/Resources/LoadingSmallBlack.gif diff --git a/ShareX.HelpersLib/Resources/LoadingSmallWhite.gif b/ShareX.HelpersLib/Resources/LoadingSmallWhite.gif new file mode 100644 index 0000000000000000000000000000000000000000..dc6640f1c51cf354d68d7e86f3c51cff76b74f04 GIT binary patch literal 847 zcmZ?wbhEHb6krfw_`(1J|NsAIV`DpZ>{wM*)sG)PZrr$`p`j5L7WU%Bi;j+t88c=` zNlB%prCC^5Y}>YN#flYRO~ew4|GE8KLxP39Hu55IHtc z%CzAF+s%%K=w22Zrp(rWi2|*Rovn-d)@bT9ct-tLq>}Vum&c?D7A-4G)nqF=O|unj zghf78${u~+?}W{g3|px_|L z<#V9nLvo;dGn3Pnr`rNdXDHaLG7U`$+@}3PY2V`XDF!RV)-77t@0cxcUfGd>+a|!= zfZc|ZrNMwNlFdSkm$O}25u4=+Kp!f9o}h6{#6yegNPq~Z?vi%H_r{G}R?eply|;L@ zG(BYV(3_!hb7Lg~hrqszXIO7!aqBgPyExq8i)2`2;K3=@s$$WezC&CYUcYs8ObcQ?&pRCIchV9(IFooU|$ zW!EN)DyP7RhUDG3i^{l#lol$yJhV8WF`rIX28%n80C|*UIW?pwc1HE9Y&#iPuAi{a~kVNwZc{v#XSdz>>qd7ZX-= oBphJ+DPY*iA+ce)LqDIhc?O5RAxj!-jAnO_nj(WWD0zYb0L796mH+?% literal 0 HcmV?d00001 diff --git a/ShareX.HelpersLib/ShareX.HelpersLib.csproj b/ShareX.HelpersLib/ShareX.HelpersLib.csproj index d36e1b73c..6f10e3d65 100644 --- a/ShareX.HelpersLib/ShareX.HelpersLib.csproj +++ b/ShareX.HelpersLib/ShareX.HelpersLib.csproj @@ -1473,7 +1473,10 @@ - + + + +