From 4933a2e28c4d1572172e49ae0a23288ad9219bdd Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Sun, 31 Jan 2021 17:49:08 +1100 Subject: [PATCH 01/26] add python installation --- Flow.Launcher.Core/Flow.Launcher.Core.csproj | 1 + Flow.Launcher.Core/Plugin/PluginsLoader.cs | 113 ++++++++++++++----- 2 files changed, 88 insertions(+), 26 deletions(-) diff --git a/Flow.Launcher.Core/Flow.Launcher.Core.csproj b/Flow.Launcher.Core/Flow.Launcher.Core.csproj index 189a6669e..deb73ba80 100644 --- a/Flow.Launcher.Core/Flow.Launcher.Core.csproj +++ b/Flow.Launcher.Core/Flow.Launcher.Core.csproj @@ -53,6 +53,7 @@ + diff --git a/Flow.Launcher.Core/Plugin/PluginsLoader.cs b/Flow.Launcher.Core/Plugin/PluginsLoader.cs index fcf178445..45be6c7c1 100644 --- a/Flow.Launcher.Core/Plugin/PluginsLoader.cs +++ b/Flow.Launcher.Core/Plugin/PluginsLoader.cs @@ -3,13 +3,14 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; -using System.Runtime.Loader; using System.Threading.Tasks; using System.Windows.Forms; +using Droplex; using Flow.Launcher.Infrastructure; using Flow.Launcher.Infrastructure.Logger; using Flow.Launcher.Infrastructure.UserSettings; using Flow.Launcher.Plugin; +using Flow.Launcher.Plugin.SharedCommands; namespace Flow.Launcher.Core.Plugin { @@ -22,7 +23,7 @@ namespace Flow.Launcher.Core.Plugin public static List Plugins(List metadatas, PluginsSettings settings) { var dotnetPlugins = DotNetPlugins(metadatas); - var pythonPlugins = PythonPlugins(metadatas, settings.PythonDirectory); + var pythonPlugins = PythonPlugins(metadatas, settings); var executablePlugins = ExecutablePlugins(metadatas); var plugins = dotnetPlugins.Concat(pythonPlugins).Concat(executablePlugins).ToList(); return plugins; @@ -113,11 +114,14 @@ namespace Flow.Launcher.Core.Plugin return plugins; } - public static IEnumerable PythonPlugins(List source, string pythonDirectory) + public static IEnumerable PythonPlugins(List source, PluginsSettings settings) { - // try to set Constant.PythonPath, either from + if (!source.Any(o => o.Language.ToUpper() == AllowedLanguage.Python)) + return new List(); + + // Try setting Constant.PythonPath first, either from // PATH or from the given pythonDirectory - if (string.IsNullOrEmpty(pythonDirectory)) + if (string.IsNullOrEmpty(settings.PythonDirectory)) { var paths = Environment.GetEnvironmentVariable(PATH); if (paths != null) @@ -129,47 +133,104 @@ namespace Flow.Launcher.Core.Plugin if (pythonInPath) { - Constant.PythonPath = PythonExecutable; + Constant.PythonPath = + Path.Combine(paths.Split(';').Where(p => p.ToLower().Contains(Python)).FirstOrDefault(), PythonExecutable); + settings.PythonDirectory = FilesFolders.GetPreviousExistingDirectory(FilesFolders.LocationExists, Constant.PythonPath); } else { - Log.Error("|PluginsLoader.PythonPlugins|Python can't be found in PATH."); + Log.Error("PluginsLoader","Failed to set Python path despite the environment variable PATH is found", "PythonPlugins"); } } - else - { - Log.Error("|PluginsLoader.PythonPlugins|PATH environment variable is not set."); - } } else { - var path = Path.Combine(pythonDirectory, PythonExecutable); + var path = Path.Combine(settings.PythonDirectory, PythonExecutable); if (File.Exists(path)) { Constant.PythonPath = path; } else { - Log.Error($"|PluginsLoader.PythonPlugins|Can't find python executable in {path}"); + Log.Error("PluginsLoader",$"Tried to automatically set from Settings.PythonDirectory " + + $"but can't find python executable in {path}", "PythonPlugins"); } } - // if we have a path to the python executable, - // load every python plugin pair. - if (String.IsNullOrEmpty(Constant.PythonPath)) + if (string.IsNullOrEmpty(settings.PythonDirectory)) { + if (MessageBox.Show("Flow detected you have installed Python plugins, " + + "would you like to install Python to run them? " + + Environment.NewLine + Environment.NewLine + + "Click no if it's already installed, " + + "and you will be prompted to select the folder that contains the Python executable", + string.Empty, MessageBoxButtons.YesNo) == DialogResult.No + && string.IsNullOrEmpty(settings.PythonDirectory)) + { + var dlg = new FolderBrowserDialog + { + SelectedPath = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) + }; + + var result = dlg.ShowDialog(); + if (result == DialogResult.OK) + { + string pythonDirectory = dlg.SelectedPath; + if (!string.IsNullOrEmpty(pythonDirectory)) + { + var pythonPath = Path.Combine(pythonDirectory, PythonExecutable); + if (File.Exists(pythonPath)) + { + settings.PythonDirectory = pythonDirectory; + Constant.PythonPath = pythonPath; + } + else + { + MessageBox.Show("Can't find python in given directory"); + } + } + } + } + else + { + var installation = Task.Run(async () => { await DroplexPackage.Drop(App.python3_9_1).ConfigureAwait(false); }); + installation.Wait(); + + var installedPythonDirectory = + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), @"Programs\Python\Python39"); + var pythonPath = Path.Combine(installedPythonDirectory, PythonExecutable); + if (FilesFolders.FileExists(pythonPath)) + { + settings.PythonDirectory = installedPythonDirectory; + Constant.PythonPath = pythonPath; + } + else + { + Log.Error("PluginsLoader", + $"Failed to set Python path after Droplex install, {pythonPath} does not exist", + "PythonPlugins"); + } + } + } + + if (string.IsNullOrEmpty(settings.PythonDirectory)) + { + MessageBox.Show("Unable to set Python executable path, please try from Flow's settings (scroll down to the bottom)."); + Log.Error("PluginsLoader", + $"Not able to successfully set Python path, the PythonDirectory variable is still an empty string.", + "PythonPlugins"); + return new List(); } - else - { - return source - .Where(o => o.Language.ToUpper() == AllowedLanguage.Python) - .Select(metadata => new PluginPair - { - Plugin = new PythonPlugin(Constant.PythonPath), - Metadata = metadata - }); - } + + return source + .Where(o => o.Language.ToUpper() == AllowedLanguage.Python) + .Select(metadata => new PluginPair + { + Plugin = new PythonPlugin(Constant.PythonPath), + Metadata = metadata + }) + .ToList(); } public static IEnumerable ExecutablePlugins(IEnumerable source) From f3d0b8861641c70444cc85b26302336a37e12da1 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Fri, 5 Feb 2021 08:08:33 +1100 Subject: [PATCH 02/26] remove task --- Flow.Launcher.Core/Plugin/PluginsLoader.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Flow.Launcher.Core/Plugin/PluginsLoader.cs b/Flow.Launcher.Core/Plugin/PluginsLoader.cs index 45be6c7c1..2c75f9633 100644 --- a/Flow.Launcher.Core/Plugin/PluginsLoader.cs +++ b/Flow.Launcher.Core/Plugin/PluginsLoader.cs @@ -193,8 +193,7 @@ namespace Flow.Launcher.Core.Plugin } else { - var installation = Task.Run(async () => { await DroplexPackage.Drop(App.python3_9_1).ConfigureAwait(false); }); - installation.Wait(); + DroplexPackage.Drop(App.python3_9_1).Wait(); var installedPythonDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), @"Programs\Python\Python39"); From 1af95254874874029d818b7ffe3d3a0e2e26da47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=98=E9=9F=AC=20=E5=BC=A0?= Date: Sat, 6 Feb 2021 16:12:38 +0800 Subject: [PATCH 03/26] move ISavable to Flow.Launcher.Plugin\Interfaces --- .../Storage => Flow.Launcher.Plugin/Interfaces}/ISavable.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename {Flow.Launcher.Infrastructure/Storage => Flow.Launcher.Plugin/Interfaces}/ISavable.cs (81%) diff --git a/Flow.Launcher.Infrastructure/Storage/ISavable.cs b/Flow.Launcher.Plugin/Interfaces/ISavable.cs similarity index 81% rename from Flow.Launcher.Infrastructure/Storage/ISavable.cs rename to Flow.Launcher.Plugin/Interfaces/ISavable.cs index 8294a3df8..7c1110e0e 100644 --- a/Flow.Launcher.Infrastructure/Storage/ISavable.cs +++ b/Flow.Launcher.Plugin/Interfaces/ISavable.cs @@ -1,4 +1,4 @@ -namespace Flow.Launcher.Infrastructure.Storage +namespace Flow.Launcher.Plugin { /// /// Save plugin settings/cache, From 8fa843ea453cc0af58cf51be5698fce8b2ba1868 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Mon, 8 Feb 2021 21:05:50 +1100 Subject: [PATCH 04/26] fix incorrect icopath context menu --- .../ContextMenu.cs | 4 ++-- .../Images/{website.png => manifestsite.png} | Bin .../Flow.Launcher.Plugin.PluginsManager/plugin.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename Plugins/Flow.Launcher.Plugin.PluginsManager/Images/{website.png => manifestsite.png} (100%) diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/ContextMenu.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/ContextMenu.cs index 7bc357be4..85f918a03 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/ContextMenu.cs +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/ContextMenu.cs @@ -25,7 +25,7 @@ namespace Flow.Launcher.Plugin.PluginsManager { Title = Context.API.GetTranslation("plugin_pluginsmanager_plugin_contextmenu_openwebsite_title"), SubTitle = Context.API.GetTranslation("plugin_pluginsmanager_plugin_contextmenu_openwebsite_subtitle"), - IcoPath = "Images\\website.png", + IcoPath = selectedResult.IcoPath, Action = _ => { SharedCommands.SearchWeb.NewTabInBrowser(pluginManifestInfo.Website); @@ -63,7 +63,7 @@ namespace Flow.Launcher.Plugin.PluginsManager { Title = Context.API.GetTranslation("plugin_pluginsmanager_plugin_contextmenu_pluginsmanifest_title"), SubTitle = Context.API.GetTranslation("plugin_pluginsmanager_plugin_contextmenu_pluginsmanifest_subtitle"), - IcoPath = selectedResult.IcoPath, + IcoPath = "Images\\manifestsite.png", Action = _ => { SharedCommands.SearchWeb.NewTabInBrowser("https://github.com/Flow-Launcher/Flow.Launcher.PluginsManifest"); diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Images/website.png b/Plugins/Flow.Launcher.Plugin.PluginsManager/Images/manifestsite.png similarity index 100% rename from Plugins/Flow.Launcher.Plugin.PluginsManager/Images/website.png rename to Plugins/Flow.Launcher.Plugin.PluginsManager/Images/manifestsite.png diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/plugin.json b/Plugins/Flow.Launcher.Plugin.PluginsManager/plugin.json index b37a6b1af..ad4601586 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/plugin.json +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/plugin.json @@ -6,7 +6,7 @@ "Name": "Plugins Manager", "Description": "Management of installing, uninstalling or updating Flow Launcher plugins", "Author": "Jeremy Wu", - "Version": "1.6.2", + "Version": "1.6.3", "Language": "csharp", "Website": "https://github.com/Flow-Launcher/Flow.Launcher", "ExecuteFileName": "Flow.Launcher.Plugin.PluginsManager.dll", From 20f895c7810a3559800b3f5b7a3f9cf5e59215de Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Wed, 10 Feb 2021 21:17:03 +1100 Subject: [PATCH 05/26] upgrade Droplex to use mirror site --- Flow.Launcher.Core/Flow.Launcher.Core.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Flow.Launcher.Core/Flow.Launcher.Core.csproj b/Flow.Launcher.Core/Flow.Launcher.Core.csproj index deb73ba80..b0cc07e1a 100644 --- a/Flow.Launcher.Core/Flow.Launcher.Core.csproj +++ b/Flow.Launcher.Core/Flow.Launcher.Core.csproj @@ -53,7 +53,7 @@ - + From 416ad3bb89bc862eae865da0090714d98e8a4f82 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Thu, 11 Feb 2021 14:00:17 +1100 Subject: [PATCH 06/26] Update README.md --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 9af47a5ee..39e8a7dea 100644 --- a/README.md +++ b/README.md @@ -38,10 +38,11 @@ Flow Launcher. Dedicated to make your workflow flow more seamlessly. Aimed at be Windows may complain about security due to code not being signed, this will be completed at a later stage. If you downloaded from this repo, you are good to continue the set up. **Integrations** - - If you use Python plugins: - - Install [Python3](https://www.python.org/downloads/), download `.exe` installer. + - Python plugins: + - Once a Python plugin has been detected at start up, you will be prompted to either select the location or allow Python 3.9.1 to automatic download and install. - Add Python to `%PATH%` or set it in flow's settings. - - Use `pip` to install `flowlauncher`, cmd in `pip install flowlauncher`. + - Use `pip` to install `flowlauncher`, open cmd and type `pip install flowlauncher`. + - The Python plugin may require additional modules to be installed, please ensure you check by visiting the plugin's website via `pm install` + plugin name, go to context menu and select `Open website`. - Start to launch your Python plugins. - Flow searches files and contents via Windows Index Search, to use Everything, download the plugin [here](https://github.com/Flow-Launcher/Flow.Launcher.Plugin.Everything/releases/latest). From 52875dab0c00840a7b032fa51770ca35200c861e Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Fri, 12 Feb 2021 07:56:35 +1100 Subject: [PATCH 07/26] version bump --- SolutionAssemblyInfo.cs | 6 +++--- appveyor.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/SolutionAssemblyInfo.cs b/SolutionAssemblyInfo.cs index afd76b5d7..7f13f4130 100644 --- a/SolutionAssemblyInfo.cs +++ b/SolutionAssemblyInfo.cs @@ -16,6 +16,6 @@ using System.Runtime.InteropServices; [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] [assembly: ComVisible(false)] -[assembly: AssemblyVersion("1.7.0")] -[assembly: AssemblyFileVersion("1.7.0")] -[assembly: AssemblyInformationalVersion("1.7.0")] \ No newline at end of file +[assembly: AssemblyVersion("1.7.1")] +[assembly: AssemblyFileVersion("1.7.1")] +[assembly: AssemblyInformationalVersion("1.7.1")] \ No newline at end of file diff --git a/appveyor.yml b/appveyor.yml index 2c2f43b66..6340318d4 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: '1.7.0.{build}' +version: '1.7.1.{build}' init: - ps: | From 80f1585f88e1f17492d5c9896e8f91c32e610978 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Fri, 12 Feb 2021 14:45:31 +1100 Subject: [PATCH 08/26] add press F5 to reload all plugin data --- Flow.Launcher/Languages/en.xaml | 1 + Flow.Launcher/MainWindow.xaml | 1 + Flow.Launcher/Msg.xaml.cs | 2 +- Flow.Launcher/ViewModel/MainViewModel.cs | 29 +++++++++++++++++++----- 4 files changed, 26 insertions(+), 7 deletions(-) diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml index b6bf76b7f..a036949fc 100644 --- a/Flow.Launcher/Languages/en.xaml +++ b/Flow.Launcher/Languages/en.xaml @@ -121,6 +121,7 @@ New Action Keyword can't be empty This new Action Keyword is already assigned to another plugin, please choose a different one Success + Completed successfully Use * if you don't want to specify an action keyword diff --git a/Flow.Launcher/MainWindow.xaml b/Flow.Launcher/MainWindow.xaml index 4cc0b4428..aa0240dd4 100644 --- a/Flow.Launcher/MainWindow.xaml +++ b/Flow.Launcher/MainWindow.xaml @@ -34,6 +34,7 @@ + diff --git a/Flow.Launcher/Msg.xaml.cs b/Flow.Launcher/Msg.xaml.cs index 4129ce28b..6bb2fc2dc 100644 --- a/Flow.Launcher/Msg.xaml.cs +++ b/Flow.Launcher/Msg.xaml.cs @@ -66,7 +66,7 @@ namespace Flow.Launcher } if (!File.Exists(iconPath)) { - imgIco.Source = ImageLoader.Load(Path.Combine(Infrastructure.Constant.ProgramDirectory, "Images\\app.png")); + imgIco.Source = ImageLoader.Load(Path.Combine(Constant.ProgramDirectory, "Images\\app.png")); } else { imgIco.Source = ImageLoader.Load(iconPath); diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index afbe6e197..a12912b67 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -89,7 +89,6 @@ namespace Flow.Launcher.ViewModel _resultsViewUpdateTask = Task.Run(updateAction).ContinueWith(continueAction, TaskContinuationOptions.OnlyOnFaulted); - async Task updateAction() { var queue = new Dictionary(); @@ -105,9 +104,7 @@ namespace Flow.Launcher.ViewModel UpdateResultView(queue.Values); } - } - - ; + }; void continueAction(Task t) { @@ -115,8 +112,8 @@ namespace Flow.Launcher.ViewModel throw t.Exception; #else Log.Error($"Error happen in task dealing with viewupdate for results. {t.Exception}"); - _resultsViewUpdateTask = - Task.Run(updateAction).ContinueWith(continueAction, TaskContinuationOptions.OnlyOnFaulted); + _resultsViewUpdateTask = + Task.Run(updateAction).ContinueWith(continueAction, TaskContinuationOptions.OnlyOnFaulted); #endif } } @@ -225,6 +222,25 @@ namespace Flow.Launcher.ViewModel SelectedResults = Results; } }); + + ReloadPluginDataCommand = new RelayCommand(_ => + { + var msg = new Msg { Owner = Application.Current.MainWindow }; + + MainWindowVisibility = Visibility.Collapsed; + + PluginManager + .ReloadData() + .ContinueWith(_ => + Application.Current.Dispatcher.Invoke(() => + { + msg.Show( + InternationalizationManager.Instance.GetTranslation("success"), + InternationalizationManager.Instance.GetTranslation("completedSuccessfully"), + ""); + })) + .ConfigureAwait(false); + }); } #endregion @@ -313,6 +329,7 @@ namespace Flow.Launcher.ViewModel public ICommand LoadContextMenuCommand { get; set; } public ICommand LoadHistoryCommand { get; set; } public ICommand OpenResultCommand { get; set; } + public ICommand ReloadPluginDataCommand { get; set; } public string OpenResultCommandModifiers { get; private set; } From fcc0bb11facfa21e795b2f7fac10a93bbf6c4949 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Fri, 12 Feb 2021 14:49:21 +1100 Subject: [PATCH 09/26] update readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 9af47a5ee..3e420bfac 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,7 @@ Windows may complain about security due to code not being signed, this will be c - Open context menu: on the selected result, press Ctrl+O/Shift+Enter. - Cancel/Return to previous screen: Esc. - Install/Uninstall/Update plugins: in the search window, type `pm install`/`pm uninstall`/`pm update` + the plugin name. +- Press `F5` while in the query window to reload all plugin data. - Saved user settings are located: - If using roaming: `%APPDATA%\FlowLauncher` - If using portable, by default: `%localappdata%\FlowLauncher\app-\UserData` From b503584dbf8be2782085ade7610c423d98516143 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=98=E9=9F=AC=20=E5=BC=A0?= Date: Fri, 12 Feb 2021 22:03:35 +0800 Subject: [PATCH 10/26] Use app.ico as icon instead of app.png for setting window --- Flow.Launcher/Flow.Launcher.csproj | 9 +++++++++ Flow.Launcher/Images/app.ico | Bin 0 -> 116895 bytes Flow.Launcher/SettingWindow.xaml | 3 ++- 3 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 Flow.Launcher/Images/app.ico diff --git a/Flow.Launcher/Flow.Launcher.csproj b/Flow.Launcher/Flow.Launcher.csproj index 289a502d0..ce3bebd57 100644 --- a/Flow.Launcher/Flow.Launcher.csproj +++ b/Flow.Launcher/Flow.Launcher.csproj @@ -66,6 +66,9 @@ PreserveNewest + + PreserveNewest + @@ -94,6 +97,12 @@ + + + PreserveNewest + + + diff --git a/Flow.Launcher/Images/app.ico b/Flow.Launcher/Images/app.ico new file mode 100644 index 0000000000000000000000000000000000000000..36b1d22d0b3bcfb91c8ff451953e9eb421da1385 GIT binary patch literal 116895 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 literal 0 HcmV?d00001 diff --git a/Flow.Launcher/SettingWindow.xaml b/Flow.Launcher/SettingWindow.xaml index 4c7eac114..8d88ff3fd 100644 --- a/Flow.Launcher/SettingWindow.xaml +++ b/Flow.Launcher/SettingWindow.xaml @@ -11,13 +11,14 @@ xmlns:svgc="http://sharpvectors.codeplex.com/svgc/" x:Class="Flow.Launcher.SettingWindow" mc:Ignorable="d" - Icon="Images\app.png" + Icon="Images\app.ico" Title="{DynamicResource flowlauncher_settings}" ResizeMode="NoResize" WindowStartupLocation="CenterScreen" Height="600" Width="800" Closed="OnClosed" d:DataContext="{d:DesignInstance vm:SettingWindowViewModel}"> + From 9df72010370ce04a12dcb4e60155474010211d13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=98=E9=9F=AC=20=E5=BC=A0?= Date: Fri, 12 Feb 2021 23:47:21 +0800 Subject: [PATCH 11/26] Remove setting after uninstalling plugin --- .../Flow.Launcher.Plugin.PluginsManager.csproj | 1 + .../Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Flow.Launcher.Plugin.PluginsManager.csproj b/Plugins/Flow.Launcher.Plugin.PluginsManager/Flow.Launcher.Plugin.PluginsManager.csproj index cb2507a2b..f94027bcc 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Flow.Launcher.Plugin.PluginsManager.csproj +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Flow.Launcher.Plugin.PluginsManager.csproj @@ -18,6 +18,7 @@ + diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs index 881872fc1..b2f18e39a 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs @@ -1,8 +1,10 @@ using Flow.Launcher.Infrastructure; using Flow.Launcher.Infrastructure.Http; using Flow.Launcher.Infrastructure.Logger; +using Flow.Launcher.Infrastructure.Storage; using Flow.Launcher.Infrastructure.UserSettings; using Flow.Launcher.Plugin.PluginsManager.Models; +using Flow.Launcher.Plugin.PluginsManager.ViewModels; using Flow.Launcher.Plugin.SharedCommands; using System; using System.Collections.Generic; @@ -400,6 +402,12 @@ namespace Flow.Launcher.Plugin.PluginsManager private void Uninstall(PluginMetadata plugin) { + + + Core.Plugin.PluginManager.Settings.Plugins.Remove(plugin.ID); + Core.Plugin.PluginManager.AllPlugins.RemoveAll(p => p.Metadata.ID == plugin.ID); + + // Marked for deletion. Will be deleted on next start up using var _ = File.CreateText(Path.Combine(plugin.PluginDirectory, "NeedDelete.txt")); } From 59a767fafbaf469978ce548b2b62d830489e2495 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=98=E9=9F=AC=20=E5=BC=A0?= Date: Sat, 13 Feb 2021 12:22:59 +0800 Subject: [PATCH 12/26] remove unexpected space --- Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs index b2f18e39a..4949c4e04 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs @@ -402,8 +402,6 @@ namespace Flow.Launcher.Plugin.PluginsManager private void Uninstall(PluginMetadata plugin) { - - Core.Plugin.PluginManager.Settings.Plugins.Remove(plugin.ID); Core.Plugin.PluginManager.AllPlugins.RemoveAll(p => p.Metadata.ID == plugin.ID); From baf75c4985745a53b89640724635fa027e99ae39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=98=E9=9F=AC=20=E5=BC=A0?= Date: Sat, 13 Feb 2021 12:25:02 +0800 Subject: [PATCH 13/26] remove extra copy --- Flow.Launcher/Flow.Launcher.csproj | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Flow.Launcher/Flow.Launcher.csproj b/Flow.Launcher/Flow.Launcher.csproj index ce3bebd57..01098771d 100644 --- a/Flow.Launcher/Flow.Launcher.csproj +++ b/Flow.Launcher/Flow.Launcher.csproj @@ -97,12 +97,6 @@ - - - PreserveNewest - - - From 0707ae39978019671683f7bd8650d9e0677d10f9 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Sat, 13 Feb 2021 21:03:26 +1100 Subject: [PATCH 14/26] fix formattng --- .../Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs index 4949c4e04..90d103bc7 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs @@ -1,10 +1,9 @@ +using Flow.Launcher.Core.Plugin; using Flow.Launcher.Infrastructure; using Flow.Launcher.Infrastructure.Http; using Flow.Launcher.Infrastructure.Logger; -using Flow.Launcher.Infrastructure.Storage; using Flow.Launcher.Infrastructure.UserSettings; using Flow.Launcher.Plugin.PluginsManager.Models; -using Flow.Launcher.Plugin.PluginsManager.ViewModels; using Flow.Launcher.Plugin.SharedCommands; using System; using System.Collections.Generic; @@ -402,9 +401,8 @@ namespace Flow.Launcher.Plugin.PluginsManager private void Uninstall(PluginMetadata plugin) { - Core.Plugin.PluginManager.Settings.Plugins.Remove(plugin.ID); - Core.Plugin.PluginManager.AllPlugins.RemoveAll(p => p.Metadata.ID == plugin.ID); - + PluginManager.Settings.Plugins.Remove(plugin.ID); + PluginManager.AllPlugins.RemoveAll(p => p.Metadata.ID == plugin.ID); // Marked for deletion. Will be deleted on next start up using var _ = File.CreateText(Path.Combine(plugin.PluginDirectory, "NeedDelete.txt")); From 92f757c47ed44c8fc852aaf1198cd70bdfed66b5 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Sat, 13 Feb 2021 21:35:08 +1100 Subject: [PATCH 15/26] add restart notes --- Flow.Launcher/PublicAPIInstance.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs index 427fd9fc6..0afa67d1a 100644 --- a/Flow.Launcher/PublicAPIInstance.cs +++ b/Flow.Launcher/PublicAPIInstance.cs @@ -61,6 +61,9 @@ namespace Flow.Launcher // which will cause ungraceful exit SaveAppAllSettings(); + // Restart requires Squirrel's Update.exe to be present in the parent folder, + // it is only published from the project's release pipeline. When debugging without it, + // the project may not restart or just terminates. This is expected. UpdateManager.RestartApp(Constant.ApplicationFileName); } From 7c2c78733ef1dffcabf84aab39d813c54c259a99 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Sat, 13 Feb 2021 21:41:56 +1100 Subject: [PATCH 16/26] version bump PluginsManager --- Plugins/Flow.Launcher.Plugin.PluginsManager/plugin.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/plugin.json b/Plugins/Flow.Launcher.Plugin.PluginsManager/plugin.json index ad4601586..4cba7ec83 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/plugin.json +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/plugin.json @@ -6,7 +6,7 @@ "Name": "Plugins Manager", "Description": "Management of installing, uninstalling or updating Flow Launcher plugins", "Author": "Jeremy Wu", - "Version": "1.6.3", + "Version": "1.6.4", "Language": "csharp", "Website": "https://github.com/Flow-Launcher/Flow.Launcher", "ExecuteFileName": "Flow.Launcher.Plugin.PluginsManager.dll", From 13f737740e048bbea16d2d453f277ed7564eefd2 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Sat, 13 Feb 2021 22:01:52 +1100 Subject: [PATCH 17/26] fix formatting --- Flow.Launcher/Flow.Launcher.csproj | 6 +++--- Flow.Launcher/SettingWindow.xaml | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Flow.Launcher/Flow.Launcher.csproj b/Flow.Launcher/Flow.Launcher.csproj index 01098771d..20e847f82 100644 --- a/Flow.Launcher/Flow.Launcher.csproj +++ b/Flow.Launcher/Flow.Launcher.csproj @@ -66,9 +66,9 @@ PreserveNewest - - PreserveNewest - + + PreserveNewest + diff --git a/Flow.Launcher/SettingWindow.xaml b/Flow.Launcher/SettingWindow.xaml index 8d88ff3fd..cb0ef2def 100644 --- a/Flow.Launcher/SettingWindow.xaml +++ b/Flow.Launcher/SettingWindow.xaml @@ -18,7 +18,6 @@ Height="600" Width="800" Closed="OnClosed" d:DataContext="{d:DesignInstance vm:SettingWindowViewModel}"> - From f9b8216e3b9e9021e5ea0eaee39bea0eae3837d1 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Sun, 14 Feb 2021 19:00:00 +1100 Subject: [PATCH 18/26] add copy bookmark's url to clipboard --- .../Images/copylink.png | Bin 0 -> 10725 bytes .../Languages/en.xaml | 2 + .../Main.cs | 47 ++++++++++++++++-- .../plugin.json | 2 +- 4 files changed, 46 insertions(+), 5 deletions(-) create mode 100644 Plugins/Flow.Launcher.Plugin.BrowserBookmark/Images/copylink.png diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Images/copylink.png b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Images/copylink.png new file mode 100644 index 0000000000000000000000000000000000000000..0dee870b615bc9caddeff44be4096b4b5f6fa92e GIT binary patch literal 10725 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 tab Set browser from path: Choose + Copy url + Copy the bookmark's url to clipboard \ No newline at end of file diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs index 47493654f..3726f1683 100644 --- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs +++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs @@ -1,6 +1,9 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; +using System.Windows; using System.Windows.Controls; +using Flow.Launcher.Infrastructure.Logger; using Flow.Launcher.Infrastructure.Storage; using Flow.Launcher.Plugin.BrowserBookmark.Commands; using Flow.Launcher.Plugin.BrowserBookmark.Models; @@ -9,7 +12,7 @@ using Flow.Launcher.Plugin.SharedCommands; namespace Flow.Launcher.Plugin.BrowserBookmark { - public class Main : ISettingProvider, IPlugin, IReloadable, IPluginI18n, ISavable + public class Main : ISettingProvider, IPlugin, IReloadable, IPluginI18n, ISavable, IContextMenu { private PluginInitContext context; @@ -60,7 +63,8 @@ namespace Flow.Launcher.Plugin.BrowserBookmark } return true; - } + }, + ContextData = new BookmarkAttributes { Url = c.Url } }).Where(r => r.Score > 0); return returnList.ToList(); } @@ -84,7 +88,8 @@ namespace Flow.Launcher.Plugin.BrowserBookmark } return true; - } + }, + ContextData = new BookmarkAttributes { Url = c.Url } }).ToList(); } } @@ -115,5 +120,39 @@ namespace Flow.Launcher.Plugin.BrowserBookmark { _storage.Save(); } + + public List LoadContextMenus(Result selectedResult) + { + return new List() { + new Result + { + Title = context.API.GetTranslation("flowlauncher_plugin_browserbookmark_copyurl_title"), + SubTitle = context.API.GetTranslation("flowlauncher_plugin_browserbookmark_copyurl_subtitle"), + Action = _ => + { + try + { + Clipboard.SetText(((BookmarkAttributes)selectedResult.ContextData).Url); + + return true; + } + catch (Exception e) + { + var message = "Failed to set url in clipboard"; + Log.Exception("Main",message, e, "LoadContextMenus"); + + context.API.ShowMsg(message); + + return false; + } + }, + IcoPath = "Images\\copylink.png" + }}; + } + + internal class BookmarkAttributes + { + internal string Url { get; set; } + } } } diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/plugin.json b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/plugin.json index b0c3d2e29..62311f514 100644 --- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/plugin.json +++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/plugin.json @@ -4,7 +4,7 @@ "Name": "Browser Bookmarks", "Description": "Search your browser bookmarks", "Author": "qianlifeng, Ioannis G.", - "Version": "1.3.2", + "Version": "1.4.0", "Language": "csharp", "Website": "https://github.com/Flow-Launcher/Flow.Launcher", "ExecuteFileName": "Flow.Launcher.Plugin.BrowserBookmark.dll", From 93f4b6d90adaf017a7e0df5a2dd6e8172a2686ef Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Sun, 14 Feb 2021 20:32:20 +1100 Subject: [PATCH 19/26] update to use SetDataObject --- Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs index 3726f1683..b889bb0d0 100644 --- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs +++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs @@ -132,7 +132,7 @@ namespace Flow.Launcher.Plugin.BrowserBookmark { try { - Clipboard.SetText(((BookmarkAttributes)selectedResult.ContextData).Url); + Clipboard.SetDataObject(((BookmarkAttributes)selectedResult.ContextData).Url); return true; } From f8557da336171ddb738715d700e70dca4bf2a5cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=98=E9=9F=AC=20=E5=BC=A0?= Date: Sun, 14 Feb 2021 18:08:30 +0800 Subject: [PATCH 20/26] add Logs, LoadJsonStorage, SaveJsonStorage to IPublicAPI --- .../Storage/JsonStorage.cs | 2 +- .../Storage/PluginJsonStorage.cs | 5 +++ Flow.Launcher.Plugin/IPublicAPI.cs | 12 ++++++ Flow.Launcher/PublicAPIInstance.cs | 39 +++++++++++++++++++ 4 files changed, 57 insertions(+), 1 deletion(-) diff --git a/Flow.Launcher.Infrastructure/Storage/JsonStorage.cs b/Flow.Launcher.Infrastructure/Storage/JsonStorage.cs index f0e4a79fc..37cfec252 100644 --- a/Flow.Launcher.Infrastructure/Storage/JsonStorage.cs +++ b/Flow.Launcher.Infrastructure/Storage/JsonStorage.cs @@ -12,7 +12,7 @@ namespace Flow.Launcher.Infrastructure.Storage public class JsonStrorage where T : new() { private readonly JsonSerializerOptions _serializerSettings; - private T _data; + protected T _data; // need a new directory name public const string DirectoryName = "Settings"; public const string FileSuffix = ".json"; diff --git a/Flow.Launcher.Infrastructure/Storage/PluginJsonStorage.cs b/Flow.Launcher.Infrastructure/Storage/PluginJsonStorage.cs index 5418e1837..ca7c454c4 100644 --- a/Flow.Launcher.Infrastructure/Storage/PluginJsonStorage.cs +++ b/Flow.Launcher.Infrastructure/Storage/PluginJsonStorage.cs @@ -15,5 +15,10 @@ namespace Flow.Launcher.Infrastructure.Storage FilePath = Path.Combine(DirectoryPath, $"{dataType.Name}{FileSuffix}"); } + + public PluginJsonStorage(T data) : this() + { + _data = data; + } } } diff --git a/Flow.Launcher.Plugin/IPublicAPI.cs b/Flow.Launcher.Plugin/IPublicAPI.cs index dd73eb0e5..2a69a2495 100644 --- a/Flow.Launcher.Plugin/IPublicAPI.cs +++ b/Flow.Launcher.Plugin/IPublicAPI.cs @@ -3,6 +3,7 @@ using JetBrains.Annotations; using System; using System.Collections.Generic; using System.IO; +using System.Runtime.CompilerServices; using System.Threading; using System.Threading.Tasks; @@ -100,5 +101,16 @@ namespace Flow.Launcher.Plugin void RemoveActionKeyword(string pluginId, string oldActionKeyword); + void LogDebug(string className, string message, [CallerMemberName] string methodName = ""); + + void LogInfo(string className, string message, [CallerMemberName] string methodName = ""); + + void LogWarn(string className, string message, [CallerMemberName] string methodName = ""); + + void LogException(string className, string message, Exception e, [CallerMemberName] string methodName = ""); + + T LoadJsonStorage(PluginMetadata metadata) where T : new(); + + void SaveJsonStorage(PluginMetadata metadata, T setting) where T : new(); } } diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs index 0afa67d1a..9c36a709e 100644 --- a/Flow.Launcher/PublicAPIInstance.cs +++ b/Flow.Launcher/PublicAPIInstance.cs @@ -18,6 +18,9 @@ using System.Threading; using System.IO; using Flow.Launcher.Infrastructure.Http; using JetBrains.Annotations; +using System.Runtime.CompilerServices; +using Flow.Launcher.Infrastructure.Logger; +using Flow.Launcher.Infrastructure.Storage; namespace Flow.Launcher { @@ -160,6 +163,41 @@ namespace Flow.Launcher { PluginManager.RemoveActionKeyword(pluginId, oldActionKeyword); } + + + public void LogDebug(string className, string message, [CallerMemberName] string methodName = "") + { + Log.Debug(className, message, methodName); + } + + public void LogInfo(string className, string message, [CallerMemberName] string methodName = "") + { + Log.Info(className, message, methodName); + } + + public void LogWarn(string className, string message, [CallerMemberName] string methodName = "") + { + Log.Warn(className, message, methodName); + } + + public void LogException(string className, string message, Exception e, [CallerMemberName] string methodName = "") + { + Log.Exception(className, message, e, methodName); + } + + public T LoadJsonStorage(PluginMetadata metadata) where T : new() + { + var storage = new PluginJsonStorage(); + return storage.Load(); + } + + public void SaveJsonStorage(PluginMetadata metadata, T setting) where T : new() + { + var storage = new PluginJsonStorage(setting); + storage.Save(); + } + + #endregion #region Private Methods @@ -173,6 +211,7 @@ namespace Flow.Launcher return true; } + #endregion } } From 9fb44e6002d62227ffef1828c6e33c85a2ad6758 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=98=E9=9F=AC=20=E5=BC=A0?= Date: Sun, 14 Feb 2021 18:12:57 +0800 Subject: [PATCH 21/26] format code --- Flow.Launcher/PublicAPIInstance.cs | 97 ++++++------------------------ 1 file changed, 19 insertions(+), 78 deletions(-) diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs index 9c36a709e..967cf1bf7 100644 --- a/Flow.Launcher/PublicAPIInstance.cs +++ b/Flow.Launcher/PublicAPIInstance.cs @@ -70,15 +70,9 @@ namespace Flow.Launcher UpdateManager.RestartApp(Constant.ApplicationFileName); } - public void RestarApp() - { - RestartApp(); - } + public void RestarApp() => RestartApp(); - public void CheckForNewUpdate() - { - _settingsVM.UpdateApp(); - } + public void CheckForNewUpdate() => _settingsVM.UpdateApp(); public void SaveAppAllSettings() { @@ -88,15 +82,9 @@ namespace Flow.Launcher ImageLoader.Save(); } - public Task ReloadAllPluginData() - { - return PluginManager.ReloadData(); - } + public Task ReloadAllPluginData() => PluginManager.ReloadData(); - public void ShowMsg(string title, string subTitle = "", string iconPath = "") - { - ShowMsg(title, subTitle, iconPath, true); - } + public void ShowMsg(string title, string subTitle = "", string iconPath = "") => ShowMsg(title, subTitle, iconPath, true); public void ShowMsg(string title, string subTitle, string iconPath, bool useMainWindowAsOwner = true) { @@ -115,87 +103,40 @@ namespace Flow.Launcher }); } - public void StartLoadingBar() - { - _mainVM.ProgressBarVisibility = Visibility.Visible; - } + public void StartLoadingBar() => _mainVM.ProgressBarVisibility = Visibility.Visible; - public void StopLoadingBar() - { - _mainVM.ProgressBarVisibility = Visibility.Collapsed; - } + public void StopLoadingBar() => _mainVM.ProgressBarVisibility = Visibility.Collapsed; - public string GetTranslation(string key) - { - return InternationalizationManager.Instance.GetTranslation(key); - } + public string GetTranslation(string key) => InternationalizationManager.Instance.GetTranslation(key); - public List GetAllPlugins() - { - return PluginManager.AllPlugins.ToList(); - } + public List GetAllPlugins() => PluginManager.AllPlugins.ToList(); public event FlowLauncherGlobalKeyboardEventHandler GlobalKeyboardEvent; public MatchResult FuzzySearch(string query, string stringToCompare) => StringMatcher.FuzzySearch(query, stringToCompare); - public Task HttpGetStringAsync(string url, CancellationToken token = default) - { - return Http.GetAsync(url); - } + public Task HttpGetStringAsync(string url, CancellationToken token = default) => Http.GetAsync(url); - public Task HttpGetStreamAsync(string url, CancellationToken token = default) - { - return Http.GetStreamAsync(url); - } + public Task HttpGetStreamAsync(string url, CancellationToken token = default) => Http.GetStreamAsync(url); - public Task HttpDownloadAsync([NotNull] string url, [NotNull] string filePath) - { - return Http.DownloadAsync(url, filePath); - } + public Task HttpDownloadAsync([NotNull] string url, [NotNull] string filePath) => Http.DownloadAsync(url, filePath); - public void AddActionKeyword(string pluginId, string newActionKeyword) - { - PluginManager.AddActionKeyword(pluginId, newActionKeyword); - } + public void AddActionKeyword(string pluginId, string newActionKeyword) => PluginManager.AddActionKeyword(pluginId, newActionKeyword); - public void RemoveActionKeyword(string pluginId, string oldActionKeyword) - { - PluginManager.RemoveActionKeyword(pluginId, oldActionKeyword); - } + public void RemoveActionKeyword(string pluginId, string oldActionKeyword) => PluginManager.RemoveActionKeyword(pluginId, oldActionKeyword); - public void LogDebug(string className, string message, [CallerMemberName] string methodName = "") - { - Log.Debug(className, message, methodName); - } + public void LogDebug(string className, string message, [CallerMemberName] string methodName = "") => Log.Debug(className, message, methodName); - public void LogInfo(string className, string message, [CallerMemberName] string methodName = "") - { - Log.Info(className, message, methodName); - } + public void LogInfo(string className, string message, [CallerMemberName] string methodName = "") => Log.Info(className, message, methodName); - public void LogWarn(string className, string message, [CallerMemberName] string methodName = "") - { - Log.Warn(className, message, methodName); - } + public void LogWarn(string className, string message, [CallerMemberName] string methodName = "") => Log.Warn(className, message, methodName); - public void LogException(string className, string message, Exception e, [CallerMemberName] string methodName = "") - { - Log.Exception(className, message, e, methodName); - } + public void LogException(string className, string message, Exception e, [CallerMemberName] string methodName = "") => Log.Exception(className, message, e, methodName); - public T LoadJsonStorage(PluginMetadata metadata) where T : new() - { - var storage = new PluginJsonStorage(); - return storage.Load(); - } + public T LoadJsonStorage(PluginMetadata metadata) where T : new() => new PluginJsonStorage().Load(); - public void SaveJsonStorage(PluginMetadata metadata, T setting) where T : new() - { - var storage = new PluginJsonStorage(setting); - storage.Save(); - } + public void SaveJsonStorage(PluginMetadata metadata, T setting) where T : new() => new PluginJsonStorage(setting).Save(); #endregion From 71ca3bbf38b4fd55aca0540530d812d6df9d7011 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=98=E9=9F=AC=20=E5=BC=A0?= Date: Sun, 14 Feb 2021 18:15:46 +0800 Subject: [PATCH 22/26] formatting --- Flow.Launcher/PublicAPIInstance.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs index 967cf1bf7..327ee6658 100644 --- a/Flow.Launcher/PublicAPIInstance.cs +++ b/Flow.Launcher/PublicAPIInstance.cs @@ -111,8 +111,6 @@ namespace Flow.Launcher public List GetAllPlugins() => PluginManager.AllPlugins.ToList(); - public event FlowLauncherGlobalKeyboardEventHandler GlobalKeyboardEvent; - public MatchResult FuzzySearch(string query, string stringToCompare) => StringMatcher.FuzzySearch(query, stringToCompare); public Task HttpGetStringAsync(string url, CancellationToken token = default) => Http.GetAsync(url); @@ -125,7 +123,6 @@ namespace Flow.Launcher public void RemoveActionKeyword(string pluginId, string oldActionKeyword) => PluginManager.RemoveActionKeyword(pluginId, oldActionKeyword); - public void LogDebug(string className, string message, [CallerMemberName] string methodName = "") => Log.Debug(className, message, methodName); public void LogInfo(string className, string message, [CallerMemberName] string methodName = "") => Log.Info(className, message, methodName); @@ -138,6 +135,7 @@ namespace Flow.Launcher public void SaveJsonStorage(PluginMetadata metadata, T setting) where T : new() => new PluginJsonStorage(setting).Save(); + public event FlowLauncherGlobalKeyboardEventHandler GlobalKeyboardEvent; #endregion From 8a26471c4fca63ce8b413d69ce3f32fd1849f389 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=98=E9=9F=AC=20=E5=BC=A0?= Date: Sun, 14 Feb 2021 18:25:09 +0800 Subject: [PATCH 23/26] Update Document and remove unused parameter --- Flow.Launcher.Plugin/IPublicAPI.cs | 61 +++++++++++++++++++++++++++++- Flow.Launcher/PublicAPIInstance.cs | 4 +- 2 files changed, 61 insertions(+), 4 deletions(-) diff --git a/Flow.Launcher.Plugin/IPublicAPI.cs b/Flow.Launcher.Plugin/IPublicAPI.cs index 2a69a2495..a3f711a17 100644 --- a/Flow.Launcher.Plugin/IPublicAPI.cs +++ b/Flow.Launcher.Plugin/IPublicAPI.cs @@ -89,28 +89,85 @@ namespace Flow.Launcher.Plugin /// event FlowLauncherGlobalKeyboardEventHandler GlobalKeyboardEvent; + /// + /// Fuzzy Search the string with query + /// + /// Query String + /// The string to Search for Query + /// Match results MatchResult FuzzySearch(string query, string stringToCompare); + /// + /// Http Get to the spefic URL + /// + /// URL to call Http Get + /// Cancellation Token + /// Task to get string result Task HttpGetStringAsync(string url, CancellationToken token = default); + /// + /// Http Get to the spefic URL + /// + /// URL to call Http Get + /// Cancellation Token + /// Task to get stream result Task HttpGetStreamAsync(string url, CancellationToken token = default); + /// + /// Download the specific url to a cretain file path + /// + /// URL to download file + /// place to store file + /// Task showing the progress Task HttpDownloadAsync([NotNull] string url, [NotNull] string filePath); + /// + /// Add ActionKeyword for specific plugin + /// + /// ID for plugin that needs to add action keyword + /// The actionkeyword that is supposed to be added void AddActionKeyword(string pluginId, string newActionKeyword); + /// + /// Remove ActionKeyword for specific plugin + /// + /// ID for plugin that needs to remove action keyword + /// The actionkeyword that is supposed to be removed void RemoveActionKeyword(string pluginId, string oldActionKeyword); + /// + /// Log Debug message + /// Message will only be logged in Debug mode + /// void LogDebug(string className, string message, [CallerMemberName] string methodName = ""); + /// + /// Log Message + /// void LogInfo(string className, string message, [CallerMemberName] string methodName = ""); + /// + /// Log Warning + /// void LogWarn(string className, string message, [CallerMemberName] string methodName = ""); + /// + /// Log an Exception + /// void LogException(string className, string message, Exception e, [CallerMemberName] string methodName = ""); - T LoadJsonStorage(PluginMetadata metadata) where T : new(); + /// + /// Load JsonStorage for current plugin + /// + /// Type for deserialization + /// + T LoadJsonStorage() where T : new(); - void SaveJsonStorage(PluginMetadata metadata, T setting) where T : new(); + /// + /// Save JsonStorage for current plugin + /// + /// Type for Serialization + /// + void SaveJsonStorage(T setting) where T : new(); } } diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs index 327ee6658..200eb166a 100644 --- a/Flow.Launcher/PublicAPIInstance.cs +++ b/Flow.Launcher/PublicAPIInstance.cs @@ -131,9 +131,9 @@ namespace Flow.Launcher public void LogException(string className, string message, Exception e, [CallerMemberName] string methodName = "") => Log.Exception(className, message, e, methodName); - public T LoadJsonStorage(PluginMetadata metadata) where T : new() => new PluginJsonStorage().Load(); + public T LoadJsonStorage() where T : new() => new PluginJsonStorage().Load(); - public void SaveJsonStorage(PluginMetadata metadata, T setting) where T : new() => new PluginJsonStorage(setting).Save(); + public void SaveJsonStorage(T setting) where T : new() => new PluginJsonStorage(setting).Save(); public event FlowLauncherGlobalKeyboardEventHandler GlobalKeyboardEvent; From 1ec069bfcf1a982de6a2222bc70bcfe8eebfdf6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=98=E9=9F=AC=20=E5=BC=A0?= Date: Sun, 14 Feb 2021 22:36:05 +0800 Subject: [PATCH 24/26] Use HttpCompletionOption.ResponseHeadersRead for Stream reading and downloading --- Flow.Launcher.Infrastructure/Http/Http.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Flow.Launcher.Infrastructure/Http/Http.cs b/Flow.Launcher.Infrastructure/Http/Http.cs index de2e82359..3a3e770a5 100644 --- a/Flow.Launcher.Infrastructure/Http/Http.cs +++ b/Flow.Launcher.Infrastructure/Http/Http.cs @@ -75,7 +75,7 @@ namespace Flow.Launcher.Infrastructure.Http { try { - using var response = await client.GetAsync(url, token); + using var response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead, token); if (response.StatusCode == HttpStatusCode.OK) { await using var fileStream = new FileStream(filePath, FileMode.CreateNew); @@ -135,7 +135,7 @@ namespace Flow.Launcher.Infrastructure.Http public static async Task GetStreamAsync([NotNull] string url, CancellationToken token = default) { Log.Debug($"|Http.Get|Url <{url}>"); - var response = await client.GetAsync(url, token); + var response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead, token); return await response.Content.ReadAsStreamAsync(); } } From 20c0b1788ffda2c5ac38589f828912cb5bc80137 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=98=E9=9F=AC=20=E5=BC=A0?= Date: Sun, 14 Feb 2021 22:43:11 +0800 Subject: [PATCH 25/26] Add Cancellation to IPublicAPI download method --- Flow.Launcher.Plugin/IPublicAPI.cs | 2 +- Flow.Launcher/PublicAPIInstance.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Flow.Launcher.Plugin/IPublicAPI.cs b/Flow.Launcher.Plugin/IPublicAPI.cs index a3f711a17..27a65191a 100644 --- a/Flow.Launcher.Plugin/IPublicAPI.cs +++ b/Flow.Launcher.Plugin/IPublicAPI.cs @@ -119,7 +119,7 @@ namespace Flow.Launcher.Plugin /// URL to download file /// place to store file /// Task showing the progress - Task HttpDownloadAsync([NotNull] string url, [NotNull] string filePath); + Task HttpDownloadAsync([NotNull] string url, [NotNull] string filePath, CancellationToken token = default); /// /// Add ActionKeyword for specific plugin diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs index 200eb166a..6c55e37fe 100644 --- a/Flow.Launcher/PublicAPIInstance.cs +++ b/Flow.Launcher/PublicAPIInstance.cs @@ -117,7 +117,7 @@ namespace Flow.Launcher public Task HttpGetStreamAsync(string url, CancellationToken token = default) => Http.GetStreamAsync(url); - public Task HttpDownloadAsync([NotNull] string url, [NotNull] string filePath) => Http.DownloadAsync(url, filePath); + public Task HttpDownloadAsync([NotNull] string url, [NotNull] string filePath, CancellationToken token = default) => Http.DownloadAsync(url, filePath, token); public void AddActionKeyword(string pluginId, string newActionKeyword) => PluginManager.AddActionKeyword(pluginId, newActionKeyword); From 14e51c07310fd38d5e0a93964bf04a4c77ab9695 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Mon, 15 Feb 2021 06:42:18 +1100 Subject: [PATCH 26/26] update comments --- Flow.Launcher.Plugin/IPublicAPI.cs | 23 ++++++++++++----------- Flow.Launcher/PublicAPIInstance.cs | 1 - 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Flow.Launcher.Plugin/IPublicAPI.cs b/Flow.Launcher.Plugin/IPublicAPI.cs index 27a65191a..07e2b2700 100644 --- a/Flow.Launcher.Plugin/IPublicAPI.cs +++ b/Flow.Launcher.Plugin/IPublicAPI.cs @@ -90,15 +90,15 @@ namespace Flow.Launcher.Plugin event FlowLauncherGlobalKeyboardEventHandler GlobalKeyboardEvent; /// - /// Fuzzy Search the string with query + /// Fuzzy Search the string with the given query. This is the core search mechanism Flow uses /// - /// Query String - /// The string to Search for Query + /// Query string + /// The string that will be compared against the query /// Match results MatchResult FuzzySearch(string query, string stringToCompare); /// - /// Http Get to the spefic URL + /// Http download the spefic url and return as string /// /// URL to call Http Get /// Cancellation Token @@ -106,7 +106,7 @@ namespace Flow.Launcher.Plugin Task HttpGetStringAsync(string url, CancellationToken token = default); /// - /// Http Get to the spefic URL + /// Http download the spefic url and return as stream /// /// URL to call Http Get /// Cancellation Token @@ -136,35 +136,36 @@ namespace Flow.Launcher.Plugin void RemoveActionKeyword(string pluginId, string oldActionKeyword); /// - /// Log Debug message + /// Log debug message /// Message will only be logged in Debug mode /// void LogDebug(string className, string message, [CallerMemberName] string methodName = ""); /// - /// Log Message + /// Log info message /// void LogInfo(string className, string message, [CallerMemberName] string methodName = ""); /// - /// Log Warning + /// Log warning message /// void LogWarn(string className, string message, [CallerMemberName] string methodName = ""); /// - /// Log an Exception + /// Log an Exception. Will throw if in debug mode so developer will be aware, + /// otherwise logs the eror message. This is the primary logging method used for Flow /// void LogException(string className, string message, Exception e, [CallerMemberName] string methodName = ""); /// - /// Load JsonStorage for current plugin + /// Load JsonStorage for current plugin. This is the method used to load settings from json in Flow /// /// Type for deserialization /// T LoadJsonStorage() where T : new(); /// - /// Save JsonStorage for current plugin + /// Save JsonStorage for current plugin. This is the method used to save settings to json in Flow /// /// Type for Serialization /// diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs index 6c55e37fe..9b41c2c05 100644 --- a/Flow.Launcher/PublicAPIInstance.cs +++ b/Flow.Launcher/PublicAPIInstance.cs @@ -150,7 +150,6 @@ namespace Flow.Launcher return true; } - #endregion } }