From ee0f8ef22a8563c3b53f697fb1b0f7cf02cc6ae3 Mon Sep 17 00:00:00 2001 From: Hongtao Zhang Date: Sat, 11 Dec 2021 11:52:43 -0600 Subject: [PATCH 0001/1125] Implement PluginSearch TextBox & ContentControl Lazy Load --- Flow.Launcher/SettingWindow.xaml | 16 ++++++++-- Flow.Launcher/SettingWindow.xaml.cs | 32 +++++++++++++++++-- Flow.Launcher/ViewModel/PluginViewModel.cs | 13 +++++++- .../ViewModel/SettingWindowViewModel.cs | 1 + 4 files changed, 56 insertions(+), 6 deletions(-) diff --git a/Flow.Launcher/SettingWindow.xaml b/Flow.Launcher/SettingWindow.xaml index d8c94390b..7d144e3a1 100644 --- a/Flow.Launcher/SettingWindow.xaml +++ b/Flow.Launcher/SettingWindow.xaml @@ -901,6 +901,7 @@ + @@ -912,12 +913,23 @@ Text="{DynamicResource plugin}" TextAlignment="left" /> + + + ThemeManager.Current.ApplicationTheme = settings.ColorScheme switch { Constant.Light => ApplicationTheme.Light, @@ -370,5 +379,22 @@ namespace Flow.Launcher RefreshMaximizeRestoreButton(); } + private CollectionView pluginListView; + + private bool PluginFilter(object item) + { + if (string.IsNullOrEmpty(pluginFilterTxb.Text)) + return true; + if (item is PluginViewModel model) + { + return StringMatcher.FuzzySearch(pluginFilterTxb.Text, model.PluginPair.Metadata.Name).IsSearchPrecisionScoreMet(); + } + return false; + } + + private void OnPluginSearchTextChanged(object sender, TextChangedEventArgs e) + { + pluginListView.Refresh(); + } } -} +} \ No newline at end of file diff --git a/Flow.Launcher/ViewModel/PluginViewModel.cs b/Flow.Launcher/ViewModel/PluginViewModel.cs index 209198822..864a60646 100644 --- a/Flow.Launcher/ViewModel/PluginViewModel.cs +++ b/Flow.Launcher/ViewModel/PluginViewModel.cs @@ -30,9 +30,20 @@ namespace Flow.Launcher.ViewModel get => !PluginPair.Metadata.Disabled; set => PluginPair.Metadata.Disabled = !value; } + public bool IsExpanded + { + get => _isExpanded; + set + { + _isExpanded = value; + OnPropertyChanged(); + OnPropertyChanged(nameof(SettingControl)); + } + } private Control _settingControl; - public Control SettingControl => _settingControl ??= PluginPair.Plugin is not ISettingProvider settingProvider ? new Control() : settingProvider.CreateSettingPanel(); + private bool _isExpanded; + public Control SettingControl => IsExpanded ? _settingControl ??= PluginPair.Plugin is not ISettingProvider settingProvider ? new Control() : settingProvider.CreateSettingPanel() : null; public Visibility ActionKeywordsVisibility => PluginPair.Metadata.ActionKeywords.Count == 1 ? Visibility.Visible : Visibility.Collapsed; public string InitilizaTime => PluginPair.Metadata.InitTime + "ms"; diff --git a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs index 342c85da2..7c9caf13c 100644 --- a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs +++ b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs @@ -19,6 +19,7 @@ using Flow.Launcher.Infrastructure.Storage; using Flow.Launcher.Infrastructure.UserSettings; using Flow.Launcher.Plugin; using Flow.Launcher.Plugin.SharedModels; +using System.Windows.Data; namespace Flow.Launcher.ViewModel { From 2b134c8b9ab304bac7c0f1ed0be1649729ea3659 Mon Sep 17 00:00:00 2001 From: DB p Date: Sun, 12 Dec 2021 06:49:15 +0900 Subject: [PATCH 0002/1125] Adjust Design & Add Searchbox in plugin store --- Flow.Launcher/SettingWindow.xaml | 66 +++++++++++++++++++++----------- 1 file changed, 43 insertions(+), 23 deletions(-) diff --git a/Flow.Launcher/SettingWindow.xaml b/Flow.Launcher/SettingWindow.xaml index 7d144e3a1..b130fbfca 100644 --- a/Flow.Launcher/SettingWindow.xaml +++ b/Flow.Launcher/SettingWindow.xaml @@ -901,30 +901,38 @@ - - - - - - + + + + + + + @@ -1296,19 +1304,31 @@ Text="{DynamicResource pluginStore}" TextAlignment="left" /> - + Margin="5,18,0,0"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Flow.Launcher/CustomShortcutSetting.xaml.cs b/Flow.Launcher/CustomShortcutSetting.xaml.cs new file mode 100644 index 000000000..feea064a4 --- /dev/null +++ b/Flow.Launcher/CustomShortcutSetting.xaml.cs @@ -0,0 +1,52 @@ +using Flow.Launcher.Core.Resource; +using Flow.Launcher.Helper; +using Flow.Launcher.Infrastructure.UserSettings; +using System.Collections.ObjectModel; +using System.Linq; +using System.Windows; +using System.Windows.Input; +using System.Windows.Controls; +using System.Collections.Generic; + +namespace Flow.Launcher +{ + public partial class CustomShortcutSetting : Window + { + private SettingWindow _settingWidow; + private bool update; + private CustomPluginHotkey updateCustomHotkey; + private Settings _settings; + + public string Key { get; set; } + public string Value { get; set; } + public ShortCutModel ShortCut => (Key, Value); + public CustomShortcutSetting() + { + InitializeComponent(); + } + + public CustomShortcutSetting((string, string) shortcut) + { + (Key, Value) = shortcut; + InitializeComponent(); + } + + private void BtnCancel_OnClick(object sender, RoutedEventArgs e) + { + DialogResult = false; + Close(); + } + + private void btnAdd_OnClick(object sender, RoutedEventArgs e) + { + DialogResult = true; + Close(); + } + + private void cmdEsc_OnPress(object sender, ExecutedRoutedEventArgs e) + { + DialogResult = false; + Close(); + } + } +} diff --git a/Flow.Launcher/Flow.Launcher.csproj b/Flow.Launcher/Flow.Launcher.csproj index 35a6389ca..ef0bc4f14 100644 --- a/Flow.Launcher/Flow.Launcher.csproj +++ b/Flow.Launcher/Flow.Launcher.csproj @@ -12,6 +12,7 @@ false false en + false diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml index 25de530bc..401f532a2 100644 --- a/Flow.Launcher/Languages/en.xaml +++ b/Flow.Launcher/Languages/en.xaml @@ -115,6 +115,8 @@ Show result selection hotkey with results. Custom Query Hotkey Query + Shortcut + Expanded Delete Edit Add diff --git a/Flow.Launcher/SettingWindow.xaml b/Flow.Launcher/SettingWindow.xaml index 2fe5d2353..47933f326 100644 --- a/Flow.Launcher/SettingWindow.xaml +++ b/Flow.Launcher/SettingWindow.xaml @@ -2159,7 +2159,7 @@ diff --git a/Flow.Launcher/CustomShortcutSetting.xaml.cs b/Flow.Launcher/CustomShortcutSetting.xaml.cs index 25ce82424..292288473 100644 --- a/Flow.Launcher/CustomShortcutSetting.xaml.cs +++ b/Flow.Launcher/CustomShortcutSetting.xaml.cs @@ -34,9 +34,9 @@ namespace Flow.Launcher Close(); } - private void btnAdd_OnClick(object sender, RoutedEventArgs e) + private void BtnAdd_OnClick(object sender, RoutedEventArgs e) { - if (!update && _settings.CustomShortcuts.Contains(new CustomShortcutModel(Key, Value))) + if (!update && (_settings.CustomShortcuts.Contains(new CustomShortcutModel(Key, Value)) || _settings.BuiltinShortcuts.Contains(new CustomShortcutModel(Key, Value)))) { MessageBox.Show(InternationalizationManager.Instance.GetTranslation("dulplicateShortcut")); return; diff --git a/Flow.Launcher/SettingWindow.xaml b/Flow.Launcher/SettingWindow.xaml index dc290ccd6..f15de6afe 100644 --- a/Flow.Launcher/SettingWindow.xaml +++ b/Flow.Launcher/SettingWindow.xaml @@ -2223,7 +2223,7 @@ - - + + - - - From 3c1451e319000ff3ef118b5f974ef42caf129074 Mon Sep 17 00:00:00 2001 From: DB p Date: Tue, 8 Nov 2022 15:58:17 +0900 Subject: [PATCH 0450/1125] Change Plugin Store Icon Image Rendermode --- Flow.Launcher/SettingWindow.xaml | 1 + 1 file changed, 1 insertion(+) diff --git a/Flow.Launcher/SettingWindow.xaml b/Flow.Launcher/SettingWindow.xaml index 668269461..1892a62d3 100644 --- a/Flow.Launcher/SettingWindow.xaml +++ b/Flow.Launcher/SettingWindow.xaml @@ -1608,6 +1608,7 @@ Height="32" Margin="18,24,0,0" HorizontalAlignment="Left" + RenderOptions.BitmapScalingMode="Fant" Source="{Binding IcoPath, IsAsync=True}" /> Date: Tue, 8 Nov 2022 18:45:58 +0900 Subject: [PATCH 0451/1125] Remove unused method --- Flow.Launcher/SettingWindow.xaml.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/Flow.Launcher/SettingWindow.xaml.cs b/Flow.Launcher/SettingWindow.xaml.cs index dfddd137b..5634bb507 100644 --- a/Flow.Launcher/SettingWindow.xaml.cs +++ b/Flow.Launcher/SettingWindow.xaml.cs @@ -428,9 +428,6 @@ namespace Flow.Launcher } } - private void ShowStoreItem_Click(object sender, RoutedEventArgs e) - { - } private void RefreshPluginStoreEventHandler(object sender, RoutedEventArgs e) { if (pluginStoreFilterTxb.Text != lastPluginStoreSearch) From 6e76d87f6636148a209a434718ab70dc085c5a61 Mon Sep 17 00:00:00 2001 From: DB p Date: Tue, 8 Nov 2022 19:34:40 +0900 Subject: [PATCH 0452/1125] Add VirtualPanel in other scrollviews --- Flow.Launcher/SettingWindow.xaml | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/Flow.Launcher/SettingWindow.xaml b/Flow.Launcher/SettingWindow.xaml index 86f740d78..1ebe69e80 100644 --- a/Flow.Launcher/SettingWindow.xaml +++ b/Flow.Launcher/SettingWindow.xaml @@ -607,7 +607,8 @@ + ScrollViewer.CanContentScroll="False" + VirtualizingStackPanel.IsVirtualizing="True"> -  +  + - From 8bac95db662251d579b3c64817d6cbb469f1ddf9 Mon Sep 17 00:00:00 2001 From: Vic <10308169+VictoriousRaptor@users.noreply.github.com> Date: Fri, 18 Nov 2022 01:16:57 +0800 Subject: [PATCH 0504/1125] fix typo --- Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml | 2 +- Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml index ec9b41889..6d9f916e1 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml @@ -61,7 +61,7 @@ Insert file suffixes you want to index. Suffixes should be separated by ';'. (ex>bat;py) - Insert protocols of .url files you want to index. Protocols should be separated by ';', and should end with "//". (ex>ftp://;mailto://) + Insert protocols of .url files you want to index. Protocols should be separated by ';', and should end with "://". (ex>ftp://;mailto://) Run As Different User diff --git a/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs b/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs index ac425e092..2b4e81bc4 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs +++ b/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs @@ -387,7 +387,7 @@ namespace Flow.Launcher.Plugin.Program.Programs } } - private static IEnumerable EnmuerateProgramsInDir(string directory, string[] suffixes, bool recursive = true) + private static IEnumerable EnumerateProgramsInDir(string directory, string[] suffixes, bool recursive = true) { if (!Directory.Exists(directory)) return Enumerable.Empty(); @@ -416,7 +416,7 @@ namespace Flow.Launcher.Plugin.Program.Programs { // Disabled custom sources are not in DisabledProgramSources var paths = directories.AsParallel() - .SelectMany(s => EnmuerateProgramsInDir(s, suffixes)); + .SelectMany(s => EnumerateProgramsInDir(s, suffixes)); // Remove disabled programs in DisabledProgramSources var programs = ExceptDisabledSource(paths).Select(x => GetProgramFromPath(x, protocols)); @@ -427,8 +427,8 @@ namespace Flow.Launcher.Plugin.Program.Programs { var directory1 = Environment.GetFolderPath(Environment.SpecialFolder.Programs); var directory2 = Environment.GetFolderPath(Environment.SpecialFolder.CommonPrograms); - var paths1 = EnmuerateProgramsInDir(directory1, suffixes); - var paths2 = EnmuerateProgramsInDir(directory2, suffixes); + var paths1 = EnumerateProgramsInDir(directory1, suffixes); + var paths2 = EnumerateProgramsInDir(directory2, suffixes); var toFilter = paths1.Concat(paths2); @@ -449,7 +449,7 @@ namespace Flow.Launcher.Plugin.Program.Programs paths = paths.Where(x => commonParents.All(parent => !x.StartsWith(parent, StringComparison.OrdinalIgnoreCase))); - var toFilter = paths.AsParallel().SelectMany(p => EnmuerateProgramsInDir(p, suffixes, recursive: false)); + var toFilter = paths.AsParallel().SelectMany(p => EnumerateProgramsInDir(p, suffixes, recursive: false)); var programs = ExceptDisabledSource(toFilter.Distinct()) .Select(x => GetProgramFromPath(x, protocols)); From db8ba91558c88525836464723db9d35155cca253 Mon Sep 17 00:00:00 2001 From: Vic <10308169+VictoriousRaptor@users.noreply.github.com> Date: Fri, 18 Nov 2022 01:39:42 +0800 Subject: [PATCH 0505/1125] Fix subpath --- .../Programs/Win32.cs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs b/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs index 2b4e81bc4..d9c26435a 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs +++ b/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs @@ -737,6 +737,17 @@ namespace Flow.Launcher.Plugin.Program.Programs } } + // https://stackoverflow.com/a/66877016 + private static bool IsSubPathOf(string subPath, string basePath) + { + var rel = Path.GetRelativePath(basePath, subPath); + return rel != "." + && rel != ".." + && !rel.StartsWith("../") + && !rel.StartsWith(@"..\") + && !Path.IsPathRooted(rel); + } + private static List GetCommonParents(IEnumerable programSources) { // To avoid unnecessary io @@ -748,8 +759,8 @@ namespace Flow.Launcher.Plugin.Program.Programs HashSet parents = group.ToHashSet(); foreach (var source in group) { - if (parents.Any(p => source.Location.StartsWith(p.Location, StringComparison.OrdinalIgnoreCase) && - source != p)) + if (parents.Any(p => IsSubPathOf(source.Location, p.Location) && + source != p)) // TODO startwith not accurate { parents.Remove(source); } From 9dcf030e8abfa3405dee158c4defd51fe41c0090 Mon Sep 17 00:00:00 2001 From: Vic <10308169+VictoriousRaptor@users.noreply.github.com> Date: Fri, 18 Nov 2022 01:42:15 +0800 Subject: [PATCH 0506/1125] formatting --- .../Flow.Launcher.Plugin.Program/Programs/Win32.cs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs b/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs index d9c26435a..25ac2b213 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs +++ b/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs @@ -440,9 +440,9 @@ namespace Flow.Launcher.Plugin.Program.Programs private static IEnumerable PATHPrograms(string[] suffixes, string[] protocols, List commonParents) { var pathEnv = Environment.GetEnvironmentVariable("Path"); - if (String.IsNullOrEmpty(pathEnv)) - { - return Array.Empty(); + if (String.IsNullOrEmpty(pathEnv)) + { + return Array.Empty(); } var paths = pathEnv.Split(";", StringSplitOptions.RemoveEmptyEntries).DistinctBy(p => p.ToLowerInvariant()); @@ -722,7 +722,8 @@ namespace Flow.Launcher.Plugin.Program.Programs watcher.Deleted += static (_, _) => indexQueue.Writer.TryWrite(default); watcher.EnableRaisingEvents = true; watcher.IncludeSubdirectories = true; - foreach(var extension in extensions) { + foreach (var extension in extensions) + { watcher.Filters.Add($"*.{extension}"); } @@ -760,7 +761,7 @@ namespace Flow.Launcher.Plugin.Program.Programs foreach (var source in group) { if (parents.Any(p => IsSubPathOf(source.Location, p.Location) && - source != p)) // TODO startwith not accurate + source != p)) { parents.Remove(source); } From 9be732279f5fdee33afc9a8740ef48955a655feb Mon Sep 17 00:00:00 2001 From: DB p Date: Fri, 18 Nov 2022 03:13:44 +0900 Subject: [PATCH 0507/1125] Add icons / Change "Flow Launcher Settings" to "Settings" in context menu --- Flow.Launcher/Languages/en.xaml | 2 +- Flow.Launcher/MainWindow.xaml | 12 ++++++++++-- Flow.Launcher/MainWindow.xaml.cs | 4 +++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml index 9d21a5d5c..b9f65a58c 100644 --- a/Flow.Launcher/Languages/en.xaml +++ b/Flow.Launcher/Languages/en.xaml @@ -27,7 +27,7 @@ Reset search window position - Flow Launcher Settings + Settings General Portable Mode Store all settings and user data in one folder (Useful when used with removable drives or cloud services). diff --git a/Flow.Launcher/MainWindow.xaml b/Flow.Launcher/MainWindow.xaml index db798087f..3bf855da7 100644 --- a/Flow.Launcher/MainWindow.xaml +++ b/Flow.Launcher/MainWindow.xaml @@ -229,8 +229,16 @@ Margin="0" Padding="0,4,0,4" Background="{DynamicResource ContextSeparator}" /> - - + + + + + + + + + + diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs index 7095ed24f..747509d77 100644 --- a/Flow.Launcher/MainWindow.xaml.cs +++ b/Flow.Launcher/MainWindow.xaml.cs @@ -256,9 +256,11 @@ namespace Flow.Launcher Header = InternationalizationManager.Instance.GetTranslation("GameMode"), Icon = gamemodeIcon }; + var positionresetIcon = new FontIcon { Glyph = "\ue73f" }; var positionreset = new MenuItem { - Header = InternationalizationManager.Instance.GetTranslation("PositionReset") + Header = InternationalizationManager.Instance.GetTranslation("PositionReset"), + Icon = positionresetIcon }; var settingsIcon = new FontIcon { Glyph = "\ue713" }; var settings = new MenuItem From 07a69da0c245a8072f464d6b11caff54130727cb Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Fri, 18 Nov 2022 13:40:13 +1100 Subject: [PATCH 0508/1125] allow branch builds and do not skip md files --- appveyor.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 1e15bd159..aa490fd25 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -22,12 +22,6 @@ assembly_info: assembly_file_version: $(flowVersion) assembly_informational_version: $(flowVersion) -skip_branch_with_pr: true - -skip_commits: - files: - - '*.md' - image: Visual Studio 2022 platform: Any CPU configuration: Release From 4845e35d712d03c1cb0162d47c5a284685773601 Mon Sep 17 00:00:00 2001 From: Vic <10308169+VictoriousRaptor@users.noreply.github.com> Date: Fri, 18 Nov 2022 12:11:24 +0800 Subject: [PATCH 0509/1125] Fix subpath detection in PATH --- Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs b/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs index 25ac2b213..8ba40b881 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs +++ b/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs @@ -447,9 +447,9 @@ namespace Flow.Launcher.Plugin.Program.Programs var paths = pathEnv.Split(";", StringSplitOptions.RemoveEmptyEntries).DistinctBy(p => p.ToLowerInvariant()); - paths = paths.Where(x => commonParents.All(parent => !x.StartsWith(parent, StringComparison.OrdinalIgnoreCase))); - - var toFilter = paths.AsParallel().SelectMany(p => EnumerateProgramsInDir(p, suffixes, recursive: false)); + var toFilter = paths.Where(x => commonParents.All(parent => !IsSubPathOf(x, parent))) + .AsParallel() + .SelectMany(p => EnumerateProgramsInDir(p, suffixes, recursive: false)); var programs = ExceptDisabledSource(toFilter.Distinct()) .Select(x => GetProgramFromPath(x, protocols)); From 087df5143ef57f564bef3f783c39e2c05cf6b827 Mon Sep 17 00:00:00 2001 From: DB p Date: Fri, 18 Nov 2022 13:26:29 +0900 Subject: [PATCH 0510/1125] Changed ActionKeywordWindow to Responsive (Explorer Plugin) --- .../Views/ActionKeywordSetting.xaml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ActionKeywordSetting.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ActionKeywordSetting.xaml index 195fc7df9..8397145cf 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ActionKeywordSetting.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ActionKeywordSetting.xaml @@ -6,12 +6,13 @@ xmlns:local="clr-namespace:Flow.Launcher.Plugin.Explorer.Views" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" Title="{DynamicResource plugin_explorer_manageactionkeywords_header}" - Width="400" - SizeToContent="Height" + Width="Auto" + Height="255" Background="{DynamicResource PopuBGColor}" DataContext="{Binding RelativeSource={RelativeSource Self}}" Foreground="{DynamicResource PopupTextColor}" ResizeMode="NoResize" + SizeToContent="Width" WindowStartupLocation="CenterScreen" mc:Ignorable="d"> @@ -68,7 +69,7 @@ - Date: Fri, 18 Nov 2022 13:57:09 +0900 Subject: [PATCH 0511/1125] Changed Icons(about) label to string --- Flow.Launcher/Languages/en.xaml | 1 + Flow.Launcher/SettingWindow.xaml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml index b9f65a58c..e3312d788 100644 --- a/Flow.Launcher/Languages/en.xaml +++ b/Flow.Launcher/Languages/en.xaml @@ -188,6 +188,7 @@ Github Docs Version + Icons You have activated Flow Launcher {0} times Check for Updates New version {0} is available, would you like to restart Flow Launcher to use the update? diff --git a/Flow.Launcher/SettingWindow.xaml b/Flow.Launcher/SettingWindow.xaml index 636d2d4cd..097da029f 100644 --- a/Flow.Launcher/SettingWindow.xaml +++ b/Flow.Launcher/SettingWindow.xaml @@ -2922,7 +2922,7 @@ Style="{DynamicResource SettingGroupBox}"> - + Date: Fri, 18 Nov 2022 14:13:57 +0900 Subject: [PATCH 0512/1125] Change Constant Tooltips to String --- Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml | 4 ++++ .../Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs | 7 ++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml index cd147a3a2..8256b82c5 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml @@ -58,6 +58,10 @@ Explorer Search and manage files and folders. Explorer utilises Windows Index Search + + Ctrl + Enter to open the directory + Ctrl + Enter to open the containing folder + Copy path Copy diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs index f970dd729..f697230e6 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs @@ -1,4 +1,5 @@ -using Flow.Launcher.Infrastructure; +using Flow.Launcher.Core.Resource; +using Flow.Launcher.Infrastructure; using Flow.Launcher.Plugin.SharedCommands; using System; using System.Diagnostics; @@ -78,7 +79,7 @@ namespace Flow.Launcher.Plugin.Explorer.Search return false; }, Score = score, - TitleToolTip = Constants.ToolTipOpenDirectory, + TitleToolTip = InternationalizationManager.Instance.GetTranslation("plugin_explorer_plugin_ToolTipOpenDirectory"), SubTitleToolTip = path, ContextData = new SearchResult { @@ -254,7 +255,7 @@ namespace Flow.Launcher.Plugin.Explorer.Search return true; }, - TitleToolTip = Constants.ToolTipOpenContainingFolder, + TitleToolTip = InternationalizationManager.Instance.GetTranslation("plugin_explorer_plugin_ToolTipOpenContainingFolder"), SubTitleToolTip = filePath, ContextData = new SearchResult { From 48b2fd62d4598824fdf73daefbeab8054a62ab53 Mon Sep 17 00:00:00 2001 From: DB p Date: Fri, 18 Nov 2022 14:43:28 +0900 Subject: [PATCH 0513/1125] Adjust Context Menu Hover/Click Colors --- Flow.Launcher/Resources/CustomControlTemplate.xaml | 4 ++-- Flow.Launcher/Resources/Dark.xaml | 3 ++- Flow.Launcher/Resources/Light.xaml | 3 ++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Flow.Launcher/Resources/CustomControlTemplate.xaml b/Flow.Launcher/Resources/CustomControlTemplate.xaml index 70fe02c95..50c7cf612 100644 --- a/Flow.Launcher/Resources/CustomControlTemplate.xaml +++ b/Flow.Launcher/Resources/CustomControlTemplate.xaml @@ -2956,13 +2956,13 @@ - + - + diff --git a/Flow.Launcher/Resources/Dark.xaml b/Flow.Launcher/Resources/Dark.xaml index 674e04deb..a5eec29ab 100644 --- a/Flow.Launcher/Resources/Dark.xaml +++ b/Flow.Launcher/Resources/Dark.xaml @@ -65,7 +65,8 @@ - + + diff --git a/Flow.Launcher/Resources/Light.xaml b/Flow.Launcher/Resources/Light.xaml index 8b04196dd..a78b14d65 100644 --- a/Flow.Launcher/Resources/Light.xaml +++ b/Flow.Launcher/Resources/Light.xaml @@ -58,7 +58,8 @@ - + + From 65920a50a5330148917a697fc96d12cde4fe3e66 Mon Sep 17 00:00:00 2001 From: DB p Date: Fri, 18 Nov 2022 15:28:16 +0900 Subject: [PATCH 0514/1125] Fix ProgramSetting's Button Area --- .../Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml b/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml index 227c23ebc..74c29576e 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml @@ -11,7 +11,7 @@ - + @@ -145,8 +145,8 @@ DragEnter="programSourceView_DragEnter" Drop="programSourceView_Drop" GridViewColumnHeader.Click="GridViewColumnHeaderClickedHandler" - PreviewMouseRightButtonUp="ProgramSourceView_PreviewMouseRightButtonUp" MouseDoubleClick="programSourceView_MouseDoubleClick" + PreviewMouseRightButtonUp="ProgramSourceView_PreviewMouseRightButtonUp" SelectionChanged="programSourceView_SelectionChanged" SelectionMode="Extended"> From 24d255a56df78437e255dc7f3a0c660ba35d2b1d Mon Sep 17 00:00:00 2001 From: Vic <10308169+VictoriousRaptor@users.noreply.github.com> Date: Fri, 18 Nov 2022 14:32:53 +0800 Subject: [PATCH 0515/1125] Change spell of plugin --- Flow.Launcher/Languages/en.xaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml index f393af119..1b751eac3 100644 --- a/Flow.Launcher/Languages/en.xaml +++ b/Flow.Launcher/Languages/en.xaml @@ -105,9 +105,9 @@ Install Uninstall Update - Plug-in already installed + Plugin already installed New Version - This plug-in has been updated within the last 7 days + This plugin has been updated within the last 7 days New Update is Available From c57a2be5f0edee85fbb888767326c517dbea384f Mon Sep 17 00:00:00 2001 From: DB p Date: Fri, 18 Nov 2022 16:07:43 +0900 Subject: [PATCH 0516/1125] Adjust Button Template --- Flow.Launcher/Resources/CustomControlTemplate.xaml | 3 ++- Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Flow.Launcher/Resources/CustomControlTemplate.xaml b/Flow.Launcher/Resources/CustomControlTemplate.xaml index 50c7cf612..07897361c 100644 --- a/Flow.Launcher/Resources/CustomControlTemplate.xaml +++ b/Flow.Launcher/Resources/CustomControlTemplate.xaml @@ -1407,7 +1407,8 @@ Padding="{TemplateBinding Padding}" BorderBrush="{DynamicResource ButtonInsideBorder}" BorderThickness="{DynamicResource CustomButtonInsideBorderThickness}" - CornerRadius="4"> + CornerRadius="4" + SnapsToDevicePixels="True"> - + From 16abd9d4f0443b04b438cac5dce37c0ae6e9a435 Mon Sep 17 00:00:00 2001 From: DB p Date: Fri, 18 Nov 2022 16:22:19 +0900 Subject: [PATCH 0517/1125] Fix Button Moving in programSetting panel --- Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml | 1 + 1 file changed, 1 insertion(+) diff --git a/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml b/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml index 387ed905e..3f9e7196c 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml @@ -91,6 +91,7 @@ BorderThickness="1" /> From 4ba027d5e26f9158422e121e5e785447019e54c8 Mon Sep 17 00:00:00 2001 From: DB p Date: Fri, 18 Nov 2022 18:12:10 +0900 Subject: [PATCH 0518/1125] Adjust Center Line --- .../ProgramSuffixes.xaml | 53 ++++++++++++++----- 1 file changed, 40 insertions(+), 13 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Program/ProgramSuffixes.xaml b/Plugins/Flow.Launcher.Plugin.Program/ProgramSuffixes.xaml index fbe538b7f..e4467a8b6 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/ProgramSuffixes.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/ProgramSuffixes.xaml @@ -8,8 +8,8 @@ Title="{DynamicResource flowlauncher_plugin_program_suffixes}" Width="600" Background="{DynamicResource PopuBGColor}" - Foreground="{DynamicResource PopupTextColor}" DataContext="{Binding RelativeSource={RelativeSource Self}}" + Foreground="{DynamicResource PopupTextColor}" ResizeMode="NoResize" SizeToContent="Height" WindowStartupLocation="CenterScreen" @@ -163,17 +163,32 @@ FontSize="16" FontWeight="SemiBold" Text="{DynamicResource flowlauncher_plugin_program_suffixes_excutable_types}" /> - appref-ms - exe - lnk + + appref-ms + + + exe + + + lnk + + Content="{DynamicResource flowlauncher_plugin_program_suffixes_custom_file_types}" + IsChecked="{Binding UseCustomSuffixes}" /> @@ -189,17 +204,29 @@ FontSize="16" FontWeight="SemiBold" Text="{DynamicResource flowlauncher_plugin_program_suffixes_URL_types}" /> - - - + + + + Content="{DynamicResource flowlauncher_plugin_program_suffixes_custom_urls}" + IsChecked="{Binding UseCustomProtocols}" /> From 4a991e59424d7ae8b8d22c6f2a3cb7a6cf6cd671 Mon Sep 17 00:00:00 2001 From: DB p Date: Fri, 18 Nov 2022 20:17:31 +0900 Subject: [PATCH 0519/1125] Add Images in custom query windows --- Flow.Launcher/CustomQueryHotkeySetting.xaml | 4 ++++ Flow.Launcher/CustomShortcutSetting.xaml | 21 +++++++++++--------- Flow.Launcher/Images/illustration_01.png | Bin 0 -> 44947 bytes Flow.Launcher/Images/illustration_02.png | Bin 0 -> 14360 bytes 4 files changed, 16 insertions(+), 9 deletions(-) create mode 100644 Flow.Launcher/Images/illustration_01.png create mode 100644 Flow.Launcher/Images/illustration_02.png diff --git a/Flow.Launcher/CustomQueryHotkeySetting.xaml b/Flow.Launcher/CustomQueryHotkeySetting.xaml index ddf0d0e45..02ce7b92f 100644 --- a/Flow.Launcher/CustomQueryHotkeySetting.xaml +++ b/Flow.Launcher/CustomQueryHotkeySetting.xaml @@ -75,6 +75,10 @@ Text="{DynamicResource customeQueryHotkeyTips}" TextAlignment="Left" TextWrapping="WrapWithOverflow" /> + diff --git a/Flow.Launcher/CustomShortcutSetting.xaml b/Flow.Launcher/CustomShortcutSetting.xaml index 78b392f3e..33e77c12c 100644 --- a/Flow.Launcher/CustomShortcutSetting.xaml +++ b/Flow.Launcher/CustomShortcutSetting.xaml @@ -6,12 +6,12 @@ Title="{DynamicResource customeQueryShortcutTitle}" Width="530" Background="{DynamicResource PopuBGColor}" + DataContext="{Binding RelativeSource={RelativeSource Self}}" Foreground="{DynamicResource PopupTextColor}" Icon="Images\app.png" ResizeMode="NoResize" SizeToContent="Height" - WindowStartupLocation="CenterScreen" - DataContext="{Binding RelativeSource={RelativeSource Self}}"> + WindowStartupLocation="CenterScreen"> @@ -76,9 +76,13 @@ Text="{DynamicResource customeQueryShortcutTips}" TextAlignment="Left" TextWrapping="WrapWithOverflow" /> + - + @@ -100,8 +104,7 @@ Grid.Row="0" Grid.Column="1" Margin="10" - Text="{Binding Key}" - /> + Text="{Binding Key}" /> + VerticalAlignment="Center" + Text="{Binding Value}" /> @@ -135,7 +138,7 @@ diff --git a/Flow.Launcher/Images/illustration_01.png b/Flow.Launcher/Images/illustration_01.png new file mode 100644 index 0000000000000000000000000000000000000000..aaeab3d35c9fcb5b50aea42e65582e14ae5a61fa GIT binary patch literal 44947 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 z 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 z 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 O2r|+)(<{c?hy6eGQp*+ScY)-Yz}XvH*Z&gX*J) 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 Date: Fri, 18 Nov 2022 19:49:39 +0800 Subject: [PATCH 0520/1125] update wording --- Flow.Launcher/Languages/en.xaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml index e3312d788..f45578540 100644 --- a/Flow.Launcher/Languages/en.xaml +++ b/Flow.Launcher/Languages/en.xaml @@ -149,7 +149,7 @@ Built-in Shortcuts Query Shortcut - Expanded + Expansion Description Delete Edit @@ -245,7 +245,7 @@ Custom Query Hotkey - Press the custom hotkey to automatically insert the specified query. + Enter a custom hotkey to open Flow Laucher and input the specified query automatically. Preview Hotkey is unavailable, please select a new hotkey Invalid plugin hotkey From caf4d13d506a6b85f0d5ed1aac08c5ebb60b1293 Mon Sep 17 00:00:00 2001 From: DB p Date: Fri, 18 Nov 2022 20:52:15 +0900 Subject: [PATCH 0521/1125] Add Time Formats --- Flow.Launcher/ViewModel/SettingWindowViewModel.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs index 65321e6ba..e7ef4da11 100644 --- a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs +++ b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs @@ -463,7 +463,10 @@ namespace Flow.Launcher.ViewModel "dd'/'MM", "ddd MM'/'dd", "dddd MM'/'dd", - "dddd" + "dddd", + "ddd dd'/MM'", + "dddd dd'/MM'" + }; public double WindowWidthSize From ddb5f898d39387ff2ea68d3860c1a6f87b61d2f4 Mon Sep 17 00:00:00 2001 From: DB p Date: Fri, 18 Nov 2022 21:08:39 +0900 Subject: [PATCH 0522/1125] Add timeformats --- Flow.Launcher/ViewModel/SettingWindowViewModel.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs index e7ef4da11..aa79248b8 100644 --- a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs +++ b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs @@ -464,8 +464,11 @@ namespace Flow.Launcher.ViewModel "ddd MM'/'dd", "dddd MM'/'dd", "dddd", - "ddd dd'/MM'", - "dddd dd'/MM'" + "ddd dd'/'MM", + "dddd dd'/'MM", + "dddd dd', 'MMMM", + "dddd DDDD', 'MMMM", + "dd', 'MMMM" }; From 9e8bf456c0cc4a9f611c5907625013fe70bef137 Mon Sep 17 00:00:00 2001 From: DB p Date: Fri, 18 Nov 2022 21:11:27 +0900 Subject: [PATCH 0523/1125] Formatting --- Flow.Launcher/ViewModel/SettingWindowViewModel.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs index aa79248b8..e6df8e4fd 100644 --- a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs +++ b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs @@ -467,9 +467,7 @@ namespace Flow.Launcher.ViewModel "ddd dd'/'MM", "dddd dd'/'MM", "dddd dd', 'MMMM", - "dddd DDDD', 'MMMM", "dd', 'MMMM" - }; public double WindowWidthSize From 1d674c4d0e2a71a95a8533d2d2700cd0c576173e Mon Sep 17 00:00:00 2001 From: DB p Date: Sat, 19 Nov 2022 00:03:01 +0900 Subject: [PATCH 0524/1125] Split Preview Style --- Flow.Launcher/MainWindow.xaml | 198 +++++++++++---------- Flow.Launcher/Themes/Atom.xaml | 17 +- Flow.Launcher/Themes/Base.xaml | 35 +++- Flow.Launcher/Themes/BlackAndWhite.xaml | 74 ++++++-- Flow.Launcher/Themes/BlurBlack Darker.xaml | 13 ++ Flow.Launcher/Themes/BlurBlack.xaml | 12 ++ Flow.Launcher/Themes/BlurWhite.xaml | 12 ++ Flow.Launcher/Themes/Darker Glass.xaml | 19 +- Flow.Launcher/Themes/Darker.xaml | 12 ++ Flow.Launcher/Themes/Discord Dark.xaml | 19 +- Flow.Launcher/Themes/Dracula.xaml | 20 ++- Flow.Launcher/Themes/Gray.xaml | 12 ++ Flow.Launcher/Themes/League.xaml | 19 +- Flow.Launcher/Themes/Light.xaml | 119 +++++++++---- Flow.Launcher/Themes/Metro Server.xaml | 17 +- Flow.Launcher/Themes/Nord Darker.xaml | 14 +- Flow.Launcher/Themes/Nord.xaml | 17 +- Flow.Launcher/Themes/Pink.xaml | 13 ++ Flow.Launcher/Themes/Sublime.xaml | 17 +- Flow.Launcher/Themes/Win10Light.xaml | 17 +- Flow.Launcher/Themes/Win11Dark.xaml | 17 +- Flow.Launcher/Themes/Win11Light.xaml | 12 ++ Flow.Launcher/Themes/Win11System.xaml | 19 +- 23 files changed, 565 insertions(+), 159 deletions(-) diff --git a/Flow.Launcher/MainWindow.xaml b/Flow.Launcher/MainWindow.xaml index cb7cc07ae..8a9e026a2 100644 --- a/Flow.Launcher/MainWindow.xaml +++ b/Flow.Launcher/MainWindow.xaml @@ -1,4 +1,5 @@ - - - - - - + + + + - - - - - - - - - - - + + - - - - + - - - - - - - - - - - - + - - - - + + + - - + - - - - + + + - - + + - + - + Text="{Binding DateText}" + Visibility="{Binding Settings.UseDate, Converter={StaticResource BooleanToVisibilityConverter}}" /> + - - - - + Style="{DynamicResource PreviewItemSubTitleStyle}" + Text="{Binding Result.SubTitle}" /> diff --git a/Flow.Launcher/Themes/Atom.xaml b/Flow.Launcher/Themes/Atom.xaml index c1fcd90d1..87c2e6e83 100644 --- a/Flow.Launcher/Themes/Atom.xaml +++ b/Flow.Launcher/Themes/Atom.xaml @@ -167,7 +167,22 @@ TargetType="{x:Type TextBlock}"> - + + diff --git a/Flow.Launcher/Themes/Base.xaml b/Flow.Launcher/Themes/Base.xaml index 92b842c69..0bc64ddfd 100644 --- a/Flow.Launcher/Themes/Base.xaml +++ b/Flow.Launcher/Themes/Base.xaml @@ -3,7 +3,7 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib" xmlns:userSettings="clr-namespace:Flow.Launcher.Infrastructure.UserSettings;assembly=Flow.Launcher.Infrastructure"> - + + + + + + + + diff --git a/Flow.Launcher/Themes/BlackAndWhite.xaml b/Flow.Launcher/Themes/BlackAndWhite.xaml index 395f5d614..5c7b03d26 100644 --- a/Flow.Launcher/Themes/BlackAndWhite.xaml +++ b/Flow.Launcher/Themes/BlackAndWhite.xaml @@ -1,44 +1,80 @@ - + - - - - - - - - - #494949 - @@ -50,4 +86,16 @@ + + \ No newline at end of file diff --git a/Flow.Launcher/Themes/BlurBlack Darker.xaml b/Flow.Launcher/Themes/BlurBlack Darker.xaml index 6dc0db45e..9e8a6f095 100644 --- a/Flow.Launcher/Themes/BlurBlack Darker.xaml +++ b/Flow.Launcher/Themes/BlurBlack Darker.xaml @@ -156,4 +156,17 @@ + + diff --git a/Flow.Launcher/Themes/BlurBlack.xaml b/Flow.Launcher/Themes/BlurBlack.xaml index 5a0023d4a..60237fdac 100644 --- a/Flow.Launcher/Themes/BlurBlack.xaml +++ b/Flow.Launcher/Themes/BlurBlack.xaml @@ -137,4 +137,16 @@ + + \ No newline at end of file diff --git a/Flow.Launcher/Themes/BlurWhite.xaml b/Flow.Launcher/Themes/BlurWhite.xaml index 6308f9e47..f05327990 100644 --- a/Flow.Launcher/Themes/BlurWhite.xaml +++ b/Flow.Launcher/Themes/BlurWhite.xaml @@ -157,4 +157,16 @@ + + diff --git a/Flow.Launcher/Themes/Darker Glass.xaml b/Flow.Launcher/Themes/Darker Glass.xaml index 41f2d16bf..80a9c353b 100644 --- a/Flow.Launcher/Themes/Darker Glass.xaml +++ b/Flow.Launcher/Themes/Darker Glass.xaml @@ -150,7 +150,24 @@ TargetType="{x:Type TextBlock}"> - + + + + diff --git a/Flow.Launcher/Themes/Darker.xaml b/Flow.Launcher/Themes/Darker.xaml index b255c4d9e..3c4438384 100644 --- a/Flow.Launcher/Themes/Darker.xaml +++ b/Flow.Launcher/Themes/Darker.xaml @@ -94,4 +94,16 @@ TargetType="{x:Type TextBlock}"> + + diff --git a/Flow.Launcher/Themes/Discord Dark.xaml b/Flow.Launcher/Themes/Discord Dark.xaml index b8872385e..df0f143cb 100644 --- a/Flow.Launcher/Themes/Discord Dark.xaml +++ b/Flow.Launcher/Themes/Discord Dark.xaml @@ -165,7 +165,22 @@ TargetType="{x:Type TextBlock}"> - + + + diff --git a/Flow.Launcher/Themes/Dracula.xaml b/Flow.Launcher/Themes/Dracula.xaml index 0dd97b9fe..93cad211e 100644 --- a/Flow.Launcher/Themes/Dracula.xaml +++ b/Flow.Launcher/Themes/Dracula.xaml @@ -167,8 +167,22 @@ TargetType="{x:Type TextBlock}"> - - + + + diff --git a/Flow.Launcher/Themes/Gray.xaml b/Flow.Launcher/Themes/Gray.xaml index 1cacc8ec2..487c9a839 100644 --- a/Flow.Launcher/Themes/Gray.xaml +++ b/Flow.Launcher/Themes/Gray.xaml @@ -126,4 +126,16 @@ TargetType="{x:Type TextBlock}"> + + diff --git a/Flow.Launcher/Themes/League.xaml b/Flow.Launcher/Themes/League.xaml index d926f0519..70f63cb76 100644 --- a/Flow.Launcher/Themes/League.xaml +++ b/Flow.Launcher/Themes/League.xaml @@ -130,9 +130,24 @@ TargetType="{x:Type TextBlock}"> - + + \ No newline at end of file diff --git a/Flow.Launcher/Themes/Light.xaml b/Flow.Launcher/Themes/Light.xaml index dae40e9eb..97dd09a79 100644 --- a/Flow.Launcher/Themes/Light.xaml +++ b/Flow.Launcher/Themes/Light.xaml @@ -1,63 +1,103 @@ - + - + - - - - - - + - - - + + #d9d9d9 - - - - - + + + \ No newline at end of file diff --git a/Flow.Launcher/Themes/Metro Server.xaml b/Flow.Launcher/Themes/Metro Server.xaml index 1b6795b59..d6b3ed52b 100644 --- a/Flow.Launcher/Themes/Metro Server.xaml +++ b/Flow.Launcher/Themes/Metro Server.xaml @@ -110,7 +110,22 @@ - + + \ No newline at end of file diff --git a/Flow.Launcher/Themes/Nord Darker.xaml b/Flow.Launcher/Themes/Nord Darker.xaml index 3946b91ff..9f32a3add 100644 --- a/Flow.Launcher/Themes/Nord Darker.xaml +++ b/Flow.Launcher/Themes/Nord Darker.xaml @@ -131,5 +131,17 @@ + + + diff --git a/Flow.Launcher/Themes/Nord.xaml b/Flow.Launcher/Themes/Nord.xaml index dafb83c39..8c9a092cc 100644 --- a/Flow.Launcher/Themes/Nord.xaml +++ b/Flow.Launcher/Themes/Nord.xaml @@ -128,7 +128,22 @@ TargetType="{x:Type TextBlock}"> - + + diff --git a/Flow.Launcher/Themes/Pink.xaml b/Flow.Launcher/Themes/Pink.xaml index 7e1ae911a..f3fd4cdac 100644 --- a/Flow.Launcher/Themes/Pink.xaml +++ b/Flow.Launcher/Themes/Pink.xaml @@ -125,4 +125,17 @@ TargetType="{x:Type TextBlock}"> + + \ No newline at end of file diff --git a/Flow.Launcher/Themes/Sublime.xaml b/Flow.Launcher/Themes/Sublime.xaml index 4cc2248f3..0373467cd 100644 --- a/Flow.Launcher/Themes/Sublime.xaml +++ b/Flow.Launcher/Themes/Sublime.xaml @@ -164,7 +164,22 @@ TargetType="{x:Type TextBlock}"> - + + diff --git a/Flow.Launcher/Themes/Win10Light.xaml b/Flow.Launcher/Themes/Win10Light.xaml index 7d3ae2cac..af3c45260 100644 --- a/Flow.Launcher/Themes/Win10Light.xaml +++ b/Flow.Launcher/Themes/Win10Light.xaml @@ -167,7 +167,22 @@ TargetType="{x:Type TextBlock}"> - + + diff --git a/Flow.Launcher/Themes/Win11Dark.xaml b/Flow.Launcher/Themes/Win11Dark.xaml index 1558bd1f4..edf765a2d 100644 --- a/Flow.Launcher/Themes/Win11Dark.xaml +++ b/Flow.Launcher/Themes/Win11Dark.xaml @@ -168,7 +168,22 @@ TargetType="{x:Type TextBlock}"> - + + diff --git a/Flow.Launcher/Themes/Win11Light.xaml b/Flow.Launcher/Themes/Win11Light.xaml index 731246565..d55974570 100644 --- a/Flow.Launcher/Themes/Win11Light.xaml +++ b/Flow.Launcher/Themes/Win11Light.xaml @@ -179,4 +179,16 @@ + + diff --git a/Flow.Launcher/Themes/Win11System.xaml b/Flow.Launcher/Themes/Win11System.xaml index d136d24a8..1d1a4d437 100644 --- a/Flow.Launcher/Themes/Win11System.xaml +++ b/Flow.Launcher/Themes/Win11System.xaml @@ -168,7 +168,24 @@ TargetType="{x:Type TextBlock}"> - + + From 7270c9f35d392e8f26bf2b3f53df810e48da9324 Mon Sep 17 00:00:00 2001 From: Vic <10308169+VictoriousRaptor@users.noreply.github.com> Date: Sat, 19 Nov 2022 00:47:04 +0800 Subject: [PATCH 0525/1125] Display current time in time/date format combobox --- Flow.Launcher/SettingWindow.xaml | 8 ++-- Flow.Launcher/SettingWindow.xaml.cs | 11 +++++ .../ViewModel/SettingWindowViewModel.cs | 44 ++++++++++++++++++- 3 files changed, 57 insertions(+), 6 deletions(-) diff --git a/Flow.Launcher/SettingWindow.xaml b/Flow.Launcher/SettingWindow.xaml index 5584983a9..6e2aa590c 100644 --- a/Flow.Launcher/SettingWindow.xaml +++ b/Flow.Launcher/SettingWindow.xaml @@ -2169,8 +2169,8 @@ Margin="0,0,18,0" VerticalAlignment="Center" FontSize="14" - ItemsSource="{Binding TimeFormatList}" - SelectedValue="{Binding Settings.TimeFormat}" + ItemsSource="{Binding TimeFormatDisplayList}" + SelectedIndex="{Binding TimeFormatIndex, Mode=OneTime}" SelectionChanged="PreviewClockAndDate" /> x.Equals(Settings.TimeFormat))) >= 0 ? tmp : 0; + DateFormatIndex = (tmp = DateFormatList.FindIndex(x => x.Equals(Settings.DateFormat))) >= 0 ? tmp : 0; + + TimeFormatDisplayList = TimeFormatList.Select(x => DateTime.Now.ToString(x, CultureInfo.CurrentCulture)).ToList(); + DateFormatDisplayList = DateFormatList.Select(x => DateTime.Now.ToString(x, CultureInfo.CurrentCulture)).ToList(); + UpdateSettingsDateTimeFormat(); // just in case something wrong } public Settings Settings { get; set; } @@ -422,8 +430,6 @@ namespace Flow.Launcher.ViewModel } } - - public class SearchWindowPosition { public string Display { get; set; } @@ -470,6 +476,40 @@ namespace Flow.Launcher.ViewModel "dd', 'MMMM" }; + public int TimeFormatIndex { get; set; } = 0; + + public int DateFormatIndex { get; set; } = 0; + + public List TimeFormatDisplayList { get; set; } = null; + + public List DateFormatDisplayList { get; set; } = null; + + public void UpdateSettingsDateTimeFormat() + { + Settings.DateFormat = DateFormatList[DateFormatIndex]; + Settings.TimeFormat = TimeFormatList[TimeFormatIndex]; + } + + public void UpdateDateTimeDisplayList(int dateIndex, int timeIndex) + { + if (dateIndex == -1 || timeIndex == -1) + return; + DateFormatIndex = dateIndex; + TimeFormatIndex = timeIndex; + + for (int i = 0; i < TimeFormatList.Count; ++i) + { + TimeFormatDisplayList[i] = DateTime.Now.ToString(TimeFormatList[i], CultureInfo.CurrentCulture); + } + + for (int i = 0; i < DateFormatList.Count; ++i) + { + DateFormatDisplayList[i] = DateTime.Now.ToString(DateFormatList[i], CultureInfo.CurrentCulture); + } + + UpdateSettingsDateTimeFormat(); + } + public double WindowWidthSize { get => Settings.WindowSize; From a70b9fcb2dc1ebb9f71940cc23e363551865835f Mon Sep 17 00:00:00 2001 From: Vic <10308169+VictoriousRaptor@users.noreply.github.com> Date: Sat, 19 Nov 2022 01:43:20 +0800 Subject: [PATCH 0526/1125] Try to avoid recurion and comment --- Flow.Launcher/SettingWindow.xaml.cs | 4 ++++ Flow.Launcher/ViewModel/SettingWindowViewModel.cs | 4 +--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Flow.Launcher/SettingWindow.xaml.cs b/Flow.Launcher/SettingWindow.xaml.cs index 7e029910f..bdc858527 100644 --- a/Flow.Launcher/SettingWindow.xaml.cs +++ b/Flow.Launcher/SettingWindow.xaml.cs @@ -519,6 +519,10 @@ namespace Flow.Launcher { if (DateFormat != null && TimeFormat != null) { + if (DateFormat.SelectedIndex == -1 || TimeFormat.SelectedIndex == -1) + { + return; + } viewModel.UpdateDateTimeDisplayList(DateFormat.SelectedIndex, TimeFormat.SelectedIndex); DateFormat.Items.Refresh(); TimeFormat.Items.Refresh(); // selected = -1 diff --git a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs index 302310e43..5066d0ca6 100644 --- a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs +++ b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs @@ -52,7 +52,7 @@ namespace Flow.Launcher.ViewModel int tmp = 0; TimeFormatIndex = (tmp = TimeFormatList.FindIndex(x => x.Equals(Settings.TimeFormat))) >= 0 ? tmp : 0; DateFormatIndex = (tmp = DateFormatList.FindIndex(x => x.Equals(Settings.DateFormat))) >= 0 ? tmp : 0; - + // TODO: CurrentCulture may equal to settings.language when this is constructed TimeFormatDisplayList = TimeFormatList.Select(x => DateTime.Now.ToString(x, CultureInfo.CurrentCulture)).ToList(); DateFormatDisplayList = DateFormatList.Select(x => DateTime.Now.ToString(x, CultureInfo.CurrentCulture)).ToList(); UpdateSettingsDateTimeFormat(); // just in case something wrong @@ -492,8 +492,6 @@ namespace Flow.Launcher.ViewModel public void UpdateDateTimeDisplayList(int dateIndex, int timeIndex) { - if (dateIndex == -1 || timeIndex == -1) - return; DateFormatIndex = dateIndex; TimeFormatIndex = timeIndex; From 8159b6edf1b101609e02ee6a80f372e04778fa7b Mon Sep 17 00:00:00 2001 From: Vic <10308169+VictoriousRaptor@users.noreply.github.com> Date: Sat, 19 Nov 2022 12:25:46 +0800 Subject: [PATCH 0527/1125] auto update value string in index setter --- .../ViewModel/SettingWindowViewModel.cs | 48 +++++++++++++------ 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs index 5066d0ca6..1d78ca1aa 100644 --- a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs +++ b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs @@ -55,7 +55,7 @@ namespace Flow.Launcher.ViewModel // TODO: CurrentCulture may equal to settings.language when this is constructed TimeFormatDisplayList = TimeFormatList.Select(x => DateTime.Now.ToString(x, CultureInfo.CurrentCulture)).ToList(); DateFormatDisplayList = DateFormatList.Select(x => DateTime.Now.ToString(x, CultureInfo.CurrentCulture)).ToList(); - UpdateSettingsDateTimeFormat(); // just in case something wrong + //UpdateSettingsDateTimeFormat(); // just in case something wrong } public Settings Settings { get; set; } @@ -64,7 +64,7 @@ namespace Flow.Launcher.ViewModel { await _updater.UpdateAppAsync(App.API, false); } - + public bool AutoUpdates { get => Settings.AutoUpdates; @@ -310,11 +310,11 @@ namespace Flow.Launcher.ViewModel } } - private IList LabelMaker(IList list) + private IList LabelMaker(IList list) { - return list.Select(p=>new PluginStoreItemViewModel(p)) + return list.Select(p => new PluginStoreItemViewModel(p)) .OrderByDescending(p => p.Category == PluginStoreItemViewModel.NewRelease) - .ThenByDescending(p=>p.Category == PluginStoreItemViewModel.RecentlyUpdated) + .ThenByDescending(p => p.Category == PluginStoreItemViewModel.RecentlyUpdated) .ThenByDescending(p => p.Category == PluginStoreItemViewModel.None) .ThenByDescending(p => p.Category == PluginStoreItemViewModel.Installed) .ToList(); @@ -348,10 +348,10 @@ namespace Flow.Launcher.ViewModel internal void DisplayPluginQuery(string queryToDisplay, PluginPair plugin, int actionKeywordPosition = 0) { - var actionKeyword = plugin.Metadata.ActionKeywords.Count == 0 - ? string.Empty + var actionKeyword = plugin.Metadata.ActionKeywords.Count == 0 + ? string.Empty : plugin.Metadata.ActionKeywords[actionKeywordPosition]; - + App.API.ChangeQuery($"{actionKeyword} {queryToDisplay}"); App.API.ShowMainWindow(); } @@ -476,9 +476,27 @@ namespace Flow.Launcher.ViewModel "dd', 'MMMM" }; - public int TimeFormatIndex { get; set; } = 0; + private int timeFormatIndex = 0; + public int TimeFormatIndex + { + get => timeFormatIndex; + set + { + timeFormatIndex = value; + Settings.TimeFormat = TimeFormatList[TimeFormatIndex]; + } + } - public int DateFormatIndex { get; set; } = 0; + private int dateFormatIndex = 0; + public int DateFormatIndex + { + get => dateFormatIndex; + set + { + dateFormatIndex = value; + Settings.DateFormat = DateFormatList[DateFormatIndex]; + } + } public List TimeFormatDisplayList { get; set; } = null; @@ -505,7 +523,7 @@ namespace Flow.Launcher.ViewModel DateFormatDisplayList[i] = DateTime.Now.ToString(DateFormatList[i], CultureInfo.CurrentCulture); } - UpdateSettingsDateTimeFormat(); + //UpdateSettingsDateTimeFormat(); } public double WindowWidthSize @@ -815,15 +833,15 @@ namespace Flow.Launcher.ViewModel } } public string ActivatedTimes => string.Format(_translater.GetTranslation("about_activate_times"), Settings.ActivateTimes); - + public string CheckLogFolder { - get + get { var dirInfo = new DirectoryInfo(Path.Combine(DataLocation.DataDirectory(), Constant.Logs, Constant.Version)); long size = dirInfo.EnumerateFiles("*", SearchOption.AllDirectories).Sum(file => file.Length); - - return _translater.GetTranslation("clearlogfolder") + " (" + FormatBytes(size) + ")" ; + + return _translater.GetTranslation("clearlogfolder") + " (" + FormatBytes(size) + ")"; } } From 48aaf3a7db730a49bcec473eb6b38086364a765b Mon Sep 17 00:00:00 2001 From: Hongtao Zhang Date: Fri, 18 Nov 2022 23:15:02 -0600 Subject: [PATCH 0528/1125] fix right click not working (and refactor left click) --- Flow.Launcher/MainWindow.xaml | 246 ++++++++++---------- Flow.Launcher/MainWindow.xaml.cs | 22 -- Flow.Launcher/ResultListBox.xaml | 4 +- Flow.Launcher/ResultListBox.xaml.cs | 48 +++- Flow.Launcher/ViewModel/MainViewModel.cs | 31 +-- Flow.Launcher/ViewModel/ResultsViewModel.cs | 5 + 6 files changed, 192 insertions(+), 164 deletions(-) diff --git a/Flow.Launcher/MainWindow.xaml b/Flow.Launcher/MainWindow.xaml index 3bf855da7..17444aae8 100644 --- a/Flow.Launcher/MainWindow.xaml +++ b/Flow.Launcher/MainWindow.xaml @@ -1,5 +1,4 @@ - - - - - - + + + + - - - - - - - - - - - - + + - - - + + - - - - - - - - + - - - - - - - - - - - - + - - - - + + + - - + - + - + - + - - + - + @@ -243,23 +228,19 @@ - - - - - - - - - - + + + - + LeftClickResultCommand="{Binding LeftClickResultCommand}" + RightClickResultCommand="{Binding RightClickResultCommand}" /> - - - + + + - + LeftClickResultCommand="{Binding LeftClickResultCommand}" + RightClickResultCommand="{Binding RightClickResultCommand}" /> - - - + + + - + LeftClickResultCommand="{Binding LeftClickResultCommand}" + RightClickResultCommand="{Binding RightClickResultCommand}" /> diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs index 747509d77..10b22e33a 100644 --- a/Flow.Launcher/MainWindow.xaml.cs +++ b/Flow.Launcher/MainWindow.xaml.cs @@ -405,28 +405,6 @@ namespace Flow.Launcher if (e.ChangedButton == MouseButton.Left) DragMove(); } - private void OnPreviewMouseButtonDown(object sender, MouseButtonEventArgs e) - { - if (sender != null && e.OriginalSource != null) - { - var r = (ResultListBox)sender; - var d = (DependencyObject)e.OriginalSource; - var item = ItemsControl.ContainerFromElement(r, d) as ListBoxItem; - var result = (ResultViewModel)item?.DataContext; - if (result != null) - { - if (e.ChangedButton == MouseButton.Left) - { - _viewModel.OpenResultCommand.Execute(null); - } - else if (e.ChangedButton == MouseButton.Right) - { - _viewModel.LoadContextMenuCommand.Execute(null); - } - } - } - } - private void OnPreviewDragOver(object sender, DragEventArgs e) { e.Handled = true; diff --git a/Flow.Launcher/ResultListBox.xaml b/Flow.Launcher/ResultListBox.xaml index 1ece390d1..d6cf3462b 100644 --- a/Flow.Launcher/ResultListBox.xaml +++ b/Flow.Launcher/ResultListBox.xaml @@ -27,7 +27,9 @@ Visibility="{Binding Visbility}" mc:Ignorable="d" PreviewMouseMove="ResultList_MouseMove" - PreviewMouseLeftButtonDown="ResultList_PreviewMouseLeftButtonDown"> + PreviewMouseLeftButtonDown="ResultList_PreviewMouseLeftButtonDown" + PreviewMouseLeftButtonUp="ResultListBox_OnPreviewMouseUp" + PreviewMouseRightButtonDown="ResultListBox_OnPreviewMouseRightButtonDown"> diff --git a/Flow.Launcher/ResultListBox.xaml.cs b/Flow.Launcher/ResultListBox.xaml.cs index d1415f8ab..6bd1490c3 100644 --- a/Flow.Launcher/ResultListBox.xaml.cs +++ b/Flow.Launcher/ResultListBox.xaml.cs @@ -17,6 +17,36 @@ namespace Flow.Launcher InitializeComponent(); } + public static readonly DependencyProperty RightClickResultCommandProperty = + DependencyProperty.Register("RightClickResultCommand", typeof(ICommand), typeof(ResultListBox), new UIPropertyMetadata(null)); + + public ICommand RightClickResultCommand + { + get + { + return (ICommand)GetValue(RightClickResultCommandProperty); + } + set + { + SetValue(RightClickResultCommandProperty, value); + } + } + + public static readonly DependencyProperty LeftClickResultCommandProperty = + DependencyProperty.Register("LeftClickResultCommand", typeof(ICommand), typeof(ResultListBox), new UIPropertyMetadata(null)); + + public ICommand LeftClickResultCommand + { + get + { + return (ICommand)GetValue(LeftClickResultCommandProperty); + } + set + { + SetValue(LeftClickResultCommandProperty, value); + } + } + private void OnSelectionChanged(object sender, SelectionChangedEventArgs e) { if (e.AddedItems.Count > 0 && e.AddedItems[0] != null) @@ -98,10 +128,24 @@ namespace Flow.Launcher path }); DragDrop.DoDragDrop((DependencyObject)sender, data, DragDropEffects.Move | DragDropEffects.Copy); - + App.API.ChangeQuery(query, true); - + e.Handled = true; } + private void ResultListBox_OnPreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e) + { + if (Mouse.DirectlyOver is not FrameworkElement { DataContext: ResultViewModel result }) + return; + + RightClickResultCommand?.Execute(result.Result); + } + private void ResultListBox_OnPreviewMouseUp(object sender, MouseButtonEventArgs e) + { + if (Mouse.DirectlyOver is not FrameworkElement { DataContext: ResultViewModel result }) + return; + + LeftClickResultCommand?.Execute(null); + } } } diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index 73be0bbed..99d2a0990 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -77,12 +77,22 @@ namespace Flow.Launcher.ViewModel _userSelectedRecord = _userSelectedRecordStorage.Load(); _topMostRecord = _topMostRecordStorage.Load(); - ContextMenu = new ResultsViewModel(Settings); - Results = new ResultsViewModel(Settings); - History = new ResultsViewModel(Settings); + InitializeKeyCommands(); + + ContextMenu = new ResultsViewModel(Settings) + { + LeftClickResultCommand = OpenResultCommand, RightClickResultCommand = LoadContextMenuCommand + }; + Results = new ResultsViewModel(Settings) + { + LeftClickResultCommand = OpenResultCommand, RightClickResultCommand = LoadContextMenuCommand + }; + History = new ResultsViewModel(Settings) + { + LeftClickResultCommand = OpenResultCommand, RightClickResultCommand = LoadContextMenuCommand + }; _selectedResults = Results; - InitializeKeyCommands(); RegisterViewUpdate(); RegisterResultsUpdatedEvent(); @@ -199,15 +209,10 @@ namespace Flow.Launcher.ViewModel PluginManager.API.OpenUrl("https://github.com/Flow-Launcher/Flow.Launcher/wiki/Flow-Launcher/"); }); OpenSettingCommand = new RelayCommand(_ => { App.API.OpenSettingDialog(); }); - OpenResultCommand = new RelayCommand(async index => + OpenResultCommand = new AsyncRelayCommand(async _ => { var results = SelectedResults; - if (index != null) - { - results.SelectedIndex = int.Parse(index.ToString()!); - } - var result = results.SelectedItem?.Result; if (result == null) { @@ -363,9 +368,9 @@ namespace Flow.Launcher.ViewModel { if (MainWindowWidth + 100 > 1920 || Settings.WindowSize == 1920) { - Settings.WindowSize = 1920; + Settings.WindowSize = 1920; } - else + else { Settings.WindowSize += 100; Settings.WindowLeft -= 50; @@ -648,7 +653,7 @@ namespace Flow.Launcher.ViewModel if (currentCancellationToken.IsCancellationRequested) return; - + // handle the exclusiveness of plugin using action keyword RemoveOldQueryResults(query); diff --git a/Flow.Launcher/ViewModel/ResultsViewModel.cs b/Flow.Launcher/ViewModel/ResultsViewModel.cs index db24825d0..1820ea56b 100644 --- a/Flow.Launcher/ViewModel/ResultsViewModel.cs +++ b/Flow.Launcher/ViewModel/ResultsViewModel.cs @@ -8,6 +8,8 @@ using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; +using System.Windows.Input; +using JetBrains.Annotations; namespace Flow.Launcher.ViewModel { @@ -49,6 +51,9 @@ namespace Flow.Launcher.ViewModel public ResultViewModel SelectedItem { get; set; } public Thickness Margin { get; set; } public Visibility Visbility { get; set; } = Visibility.Collapsed; + + public ICommand RightClickResultCommand { get; init; } + public ICommand LeftClickResultCommand { get; init; } #endregion From 337e6ca4270071157d330785d9f76983f0f62990 Mon Sep 17 00:00:00 2001 From: Hongtao Zhang Date: Fri, 18 Nov 2022 23:31:17 -0600 Subject: [PATCH 0529/1125] use Enabled and showtooltipondisabled to show tooltip --- Flow.Launcher/ResultListBox.xaml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Flow.Launcher/ResultListBox.xaml b/Flow.Launcher/ResultListBox.xaml index d6cf3462b..691158630 100644 --- a/Flow.Launcher/ResultListBox.xaml +++ b/Flow.Launcher/ResultListBox.xaml @@ -139,10 +139,11 @@ x:Name="Title" VerticalAlignment="Center" DockPanel.Dock="Left" - IsHitTestVisible="False" Style="{DynamicResource ItemTitleStyle}" Text="{Binding Result.Title}" - ToolTip="{Binding ShowTitleToolTip}"> + ToolTip="{Binding ShowTitleToolTip}" + ToolTipService.ShowOnDisabled="True" + IsEnabled="False"> @@ -153,11 +154,11 @@ - + ToolTip="{Binding ShowSubTitleToolTip}"/> From 673e8c8e9dd2ec44525cadb13225bcefad95b5d3 Mon Sep 17 00:00:00 2001 From: DB p Date: Sat, 19 Nov 2022 14:33:27 +0900 Subject: [PATCH 0530/1125] Add Datetimeformat --- .../ViewModel/SettingWindowViewModel.cs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs index 5066d0ca6..d48e64380 100644 --- a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs +++ b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs @@ -455,9 +455,13 @@ namespace Flow.Launcher.ViewModel public List TimeFormatList { get; set; } = new List() { + "h:mm", "hh:mm", + "H:mm", "HH:mm", + "tt h:mm", "tt hh:mm", + "h:mm tt", "hh:mm tt" }; @@ -466,7 +470,10 @@ namespace Flow.Launcher.ViewModel "MM'/'dd dddd", "MM'/'dd ddd", "MM'/'dd", + "MM'-'dd", + "MMMM', 'dd", "dd'/'MM", + "dd'-'MM", "ddd MM'/'dd", "dddd MM'/'dd", "dddd", @@ -500,6 +507,15 @@ namespace Flow.Launcher.ViewModel TimeFormatDisplayList[i] = DateTime.Now.ToString(TimeFormatList[i], CultureInfo.CurrentCulture); } + TimeFormatDisplayList[0] = DateTime.Now.ToString(TimeFormatList[0], CultureInfo.CurrentCulture) + " (h:mm)"; + TimeFormatDisplayList[1] = DateTime.Now.ToString(TimeFormatList[1], CultureInfo.CurrentCulture) + " (hh:mm)"; + TimeFormatDisplayList[2] = DateTime.Now.ToString(TimeFormatList[2], CultureInfo.CurrentCulture) + " (H:mm)"; + TimeFormatDisplayList[3] = DateTime.Now.ToString(TimeFormatList[3], CultureInfo.CurrentCulture) + " (HH:mm)"; + TimeFormatDisplayList[4] = DateTime.Now.ToString(TimeFormatList[4], CultureInfo.CurrentCulture) + " (tt h:mm)"; + TimeFormatDisplayList[5] = DateTime.Now.ToString(TimeFormatList[5], CultureInfo.CurrentCulture) + " (tt hh:mm)"; + TimeFormatDisplayList[6] = DateTime.Now.ToString(TimeFormatList[6], CultureInfo.CurrentCulture) + " (h:mm tt)"; + TimeFormatDisplayList[7] = DateTime.Now.ToString(TimeFormatList[6], CultureInfo.CurrentCulture) + " (hh:mm tt)"; + for (int i = 0; i < DateFormatList.Count; ++i) { DateFormatDisplayList[i] = DateTime.Now.ToString(DateFormatList[i], CultureInfo.CurrentCulture); From 32c7ca8ade8123067ccfccf75c369e040b227072 Mon Sep 17 00:00:00 2001 From: DB p Date: Sat, 19 Nov 2022 14:35:56 +0900 Subject: [PATCH 0531/1125] Remove Timeformat info --- Flow.Launcher/ViewModel/SettingWindowViewModel.cs | 9 --------- 1 file changed, 9 deletions(-) diff --git a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs index d48e64380..24229e9da 100644 --- a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs +++ b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs @@ -507,15 +507,6 @@ namespace Flow.Launcher.ViewModel TimeFormatDisplayList[i] = DateTime.Now.ToString(TimeFormatList[i], CultureInfo.CurrentCulture); } - TimeFormatDisplayList[0] = DateTime.Now.ToString(TimeFormatList[0], CultureInfo.CurrentCulture) + " (h:mm)"; - TimeFormatDisplayList[1] = DateTime.Now.ToString(TimeFormatList[1], CultureInfo.CurrentCulture) + " (hh:mm)"; - TimeFormatDisplayList[2] = DateTime.Now.ToString(TimeFormatList[2], CultureInfo.CurrentCulture) + " (H:mm)"; - TimeFormatDisplayList[3] = DateTime.Now.ToString(TimeFormatList[3], CultureInfo.CurrentCulture) + " (HH:mm)"; - TimeFormatDisplayList[4] = DateTime.Now.ToString(TimeFormatList[4], CultureInfo.CurrentCulture) + " (tt h:mm)"; - TimeFormatDisplayList[5] = DateTime.Now.ToString(TimeFormatList[5], CultureInfo.CurrentCulture) + " (tt hh:mm)"; - TimeFormatDisplayList[6] = DateTime.Now.ToString(TimeFormatList[6], CultureInfo.CurrentCulture) + " (h:mm tt)"; - TimeFormatDisplayList[7] = DateTime.Now.ToString(TimeFormatList[6], CultureInfo.CurrentCulture) + " (hh:mm tt)"; - for (int i = 0; i < DateFormatList.Count; ++i) { DateFormatDisplayList[i] = DateTime.Now.ToString(DateFormatList[i], CultureInfo.CurrentCulture); From 45e9a430601cd070c4ee798ba4ff9b5c710a6ceb Mon Sep 17 00:00:00 2001 From: Vic <10308169+VictoriousRaptor@users.noreply.github.com> Date: Sat, 19 Nov 2022 15:44:51 +0800 Subject: [PATCH 0532/1125] reorganize logic for date/time dropdown --- Flow.Launcher/SettingWindow.xaml | 7 ++-- Flow.Launcher/SettingWindow.xaml.cs | 33 +++++++++++-------- .../ViewModel/SettingWindowViewModel.cs | 27 +++++++-------- 3 files changed, 36 insertions(+), 31 deletions(-) diff --git a/Flow.Launcher/SettingWindow.xaml b/Flow.Launcher/SettingWindow.xaml index 6e2aa590c..3eb2c21bb 100644 --- a/Flow.Launcher/SettingWindow.xaml +++ b/Flow.Launcher/SettingWindow.xaml @@ -1815,6 +1815,7 @@ @@ -2170,7 +2171,8 @@ VerticalAlignment="Center" FontSize="14" ItemsSource="{Binding TimeFormatDisplayList}" - SelectedIndex="{Binding TimeFormatIndex, Mode=OneTime}" + SelectedIndex="{Binding TimeFormatIndex, Mode=OneWayToSource}" + DropDownOpened="RefreshDateTimeList" SelectionChanged="PreviewClockAndDate" /> timeFormatIndex; set { - timeFormatIndex = value; - Settings.TimeFormat = TimeFormatList[TimeFormatIndex]; + if (value != -1) + { + timeFormatIndex = value; + Settings.TimeFormat = TimeFormatList[value]; + } } } @@ -493,8 +496,11 @@ namespace Flow.Launcher.ViewModel get => dateFormatIndex; set { - dateFormatIndex = value; - Settings.DateFormat = DateFormatList[DateFormatIndex]; + if (value != -1) + { + dateFormatIndex = value; + Settings.DateFormat = DateFormatList[value]; + } } } @@ -502,17 +508,8 @@ namespace Flow.Launcher.ViewModel public List DateFormatDisplayList { get; set; } = null; - public void UpdateSettingsDateTimeFormat() + public void UpdateDateTimeDisplayList() { - Settings.DateFormat = DateFormatList[DateFormatIndex]; - Settings.TimeFormat = TimeFormatList[TimeFormatIndex]; - } - - public void UpdateDateTimeDisplayList(int dateIndex, int timeIndex) - { - DateFormatIndex = dateIndex; - TimeFormatIndex = timeIndex; - for (int i = 0; i < TimeFormatList.Count; ++i) { TimeFormatDisplayList[i] = DateTime.Now.ToString(TimeFormatList[i], CultureInfo.CurrentCulture); @@ -522,8 +519,6 @@ namespace Flow.Launcher.ViewModel { DateFormatDisplayList[i] = DateTime.Now.ToString(DateFormatList[i], CultureInfo.CurrentCulture); } - - //UpdateSettingsDateTimeFormat(); } public double WindowWidthSize From bde471afa87748490267f81ea72136f876d0f272 Mon Sep 17 00:00:00 2001 From: Vic <10308169+VictoriousRaptor@users.noreply.github.com> Date: Sat, 19 Nov 2022 16:03:44 +0800 Subject: [PATCH 0533/1125] Use binding for date time preview --- Flow.Launcher/SettingWindow.xaml | 27 ++++++++++-------- Flow.Launcher/SettingWindow.xaml.cs | 28 ------------------- .../ViewModel/SettingWindowViewModel.cs | 9 ++++++ 3 files changed, 25 insertions(+), 39 deletions(-) diff --git a/Flow.Launcher/SettingWindow.xaml b/Flow.Launcher/SettingWindow.xaml index 3eb2c21bb..e08ce7c40 100644 --- a/Flow.Launcher/SettingWindow.xaml +++ b/Flow.Launcher/SettingWindow.xaml @@ -39,6 +39,7 @@ + @@ -1820,9 +1821,17 @@ Style="{DynamicResource QueryBoxStyle}" Text="{DynamicResource hiThere}" /> - - - + + + + DropDownOpened="RefreshDateTimeList"/> + Style="{DynamicResource SideToggleSwitch}"/>  @@ -2211,14 +2218,12 @@ FontSize="14" ItemsSource="{Binding DateFormatDisplayList}" SelectedIndex="{Binding DateFormatIndex, Mode=OneWayToSource}" - DropDownOpened="RefreshDateTimeList" - SelectionChanged="PreviewClockAndDate" /> + DropDownOpened="RefreshDateTimeList"/> + Style="{DynamicResource SideToggleSwitch}"/>  diff --git a/Flow.Launcher/SettingWindow.xaml.cs b/Flow.Launcher/SettingWindow.xaml.cs index 97493ca5c..8a80ed680 100644 --- a/Flow.Launcher/SettingWindow.xaml.cs +++ b/Flow.Launcher/SettingWindow.xaml.cs @@ -517,34 +517,6 @@ namespace Flow.Launcher } } - private void PreviewClockAndDate(object sender, RoutedEventArgs e) - { - ClockDisplay(); - } - - public void ClockDisplay() - { - if (settings.UseClock) - { - ClockBox.Visibility = Visibility.Visible; - ClockBox.Text = DateTime.Now.ToString(settings.TimeFormat); - } - else - { - ClockBox.Visibility = Visibility.Collapsed; - } - - if (settings.UseDate) - { - DateBox.Visibility = Visibility.Visible; - DateBox.Text = DateTime.Now.ToString(settings.DateFormat); - } - else - { - DateBox.Visibility = Visibility.Collapsed; - } - } - public void InitializePosition() { if (settings.SettingWindowTop >= 0 && settings.SettingWindowLeft >= 0) diff --git a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs index 8f02a7083..4a4cf9404 100644 --- a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs +++ b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs @@ -486,6 +486,7 @@ namespace Flow.Launcher.ViewModel { timeFormatIndex = value; Settings.TimeFormat = TimeFormatList[value]; + ClockText = DateTime.Now.ToString(Settings.TimeFormat, CultureInfo.CurrentCulture); } } } @@ -500,10 +501,15 @@ namespace Flow.Launcher.ViewModel { dateFormatIndex = value; Settings.DateFormat = DateFormatList[value]; + DateText = DateTime.Now.ToString(Settings.DateFormat, CultureInfo.CurrentCulture); } } } + public string ClockText { get; private set; } + + public string DateText { get; private set; } + public List TimeFormatDisplayList { get; set; } = null; public List DateFormatDisplayList { get; set; } = null; @@ -519,6 +525,9 @@ namespace Flow.Launcher.ViewModel { DateFormatDisplayList[i] = DateTime.Now.ToString(DateFormatList[i], CultureInfo.CurrentCulture); } + + ClockText = DateTime.Now.ToString(Settings.TimeFormat, CultureInfo.CurrentCulture); + DateText = DateTime.Now.ToString(Settings.DateFormat, CultureInfo.CurrentCulture); } public double WindowWidthSize From e60635608d9a336020153b8e66d2fbf784e45582 Mon Sep 17 00:00:00 2001 From: Vic <10308169+VictoriousRaptor@users.noreply.github.com> Date: Sat, 19 Nov 2022 16:22:46 +0800 Subject: [PATCH 0534/1125] Separate date/time format list refresh --- Flow.Launcher/SettingWindow.xaml | 4 +-- Flow.Launcher/SettingWindow.xaml.cs | 26 +++++++++++++------ .../ViewModel/SettingWindowViewModel.cs | 25 +++++++++++------- 3 files changed, 35 insertions(+), 20 deletions(-) diff --git a/Flow.Launcher/SettingWindow.xaml b/Flow.Launcher/SettingWindow.xaml index e08ce7c40..996c30542 100644 --- a/Flow.Launcher/SettingWindow.xaml +++ b/Flow.Launcher/SettingWindow.xaml @@ -2181,7 +2181,7 @@ FontSize="14" ItemsSource="{Binding TimeFormatDisplayList}" SelectedIndex="{Binding TimeFormatIndex, Mode=OneWayToSource}" - DropDownOpened="RefreshDateTimeList"/> + DropDownOpened="RefreshTimeList"/> + DropDownOpened="RefreshDateList"/> x.Equals(Settings.TimeFormat))) >= 0 ? tmp : 0; DateFormatIndex = (tmp = DateFormatList.FindIndex(x => x.Equals(Settings.DateFormat))) >= 0 ? tmp : 0; - // TODO: CurrentCulture may equal to settings.language when this is constructed + // TODO: CurrentCulture may not equal to settings.language when this is constructed TimeFormatDisplayList = TimeFormatList.Select(x => DateTime.Now.ToString(x, CultureInfo.CurrentCulture)).ToList(); DateFormatDisplayList = DateFormatList.Select(x => DateTime.Now.ToString(x, CultureInfo.CurrentCulture)).ToList(); - //UpdateSettingsDateTimeFormat(); // just in case something wrong } public Settings Settings { get; set; } @@ -514,20 +513,26 @@ namespace Flow.Launcher.ViewModel public List DateFormatDisplayList { get; set; } = null; - public void UpdateDateTimeDisplayList() + public void UpdateDateDisplayList() + { + for (int i = 0; i < DateFormatList.Count; ++i) + { + DateFormatDisplayList[i] = DateTime.Now.ToString(DateFormatList[i], CultureInfo.CurrentCulture); + } + // TODO: CurrentCulture may not equal to settings.language + // Cross thread issue? + DateText = DateTime.Now.ToString(Settings.DateFormat, CultureInfo.CurrentCulture); + } + + public void UpdateTimeDisplayList() { for (int i = 0; i < TimeFormatList.Count; ++i) { TimeFormatDisplayList[i] = DateTime.Now.ToString(TimeFormatList[i], CultureInfo.CurrentCulture); } - - for (int i = 0; i < DateFormatList.Count; ++i) - { - DateFormatDisplayList[i] = DateTime.Now.ToString(DateFormatList[i], CultureInfo.CurrentCulture); - } - + // TODO: CurrentCulture may not equal to settings.language + // Cross thread issue? ClockText = DateTime.Now.ToString(Settings.TimeFormat, CultureInfo.CurrentCulture); - DateText = DateTime.Now.ToString(Settings.DateFormat, CultureInfo.CurrentCulture); } public double WindowWidthSize From f1889a950d0e4fbd992f00028546ca3c6df2fffb Mon Sep 17 00:00:00 2001 From: Vic <10308169+VictoriousRaptor@users.noreply.github.com> Date: Sat, 19 Nov 2022 16:36:27 +0800 Subject: [PATCH 0535/1125] Remov unused imports --- Flow.Launcher/SettingWindow.xaml.cs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Flow.Launcher/SettingWindow.xaml.cs b/Flow.Launcher/SettingWindow.xaml.cs index ae84cdad2..a3cb85b41 100644 --- a/Flow.Launcher/SettingWindow.xaml.cs +++ b/Flow.Launcher/SettingWindow.xaml.cs @@ -7,21 +7,17 @@ using Flow.Launcher.Infrastructure.UserSettings; using Flow.Launcher.Plugin; using Flow.Launcher.Plugin.SharedCommands; using Flow.Launcher.ViewModel; -using Microsoft.VisualBasic; using ModernWpf; using ModernWpf.Controls; using System; -using System.Drawing.Printing; using System.IO; using System.Windows; -using System.Windows.Controls.Primitives; using System.Windows.Data; using System.Windows.Forms; using System.Windows.Input; using System.Windows.Interop; using System.Windows.Media; using System.Windows.Navigation; -using static System.Windows.Forms.VisualStyles.VisualStyleElement.Window; using Button = System.Windows.Controls.Button; using Control = System.Windows.Controls.Control; using KeyEventArgs = System.Windows.Input.KeyEventArgs; From e2fcd9120297b4f7c0fc507d772eaf5e0f9ead8c Mon Sep 17 00:00:00 2001 From: Vic <10308169+VictoriousRaptor@users.noreply.github.com> Date: Sat, 19 Nov 2022 17:54:34 +0800 Subject: [PATCH 0536/1125] Fix ClockText type --- Flow.Launcher/ViewModel/MainViewModel.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index 73be0bbed..dc8121c5a 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -323,7 +323,7 @@ namespace Flow.Launcher.ViewModel #region ViewModel Properties public Settings Settings { get; } - public object ClockText { get; private set; } + public string ClockText { get; private set; } public string DateText { get; private set; } private async Task RegisterClockAndDateUpdateAsync() From dbfb0393173a56cf6d691df2f54c21296d2395d3 Mon Sep 17 00:00:00 2001 From: Vic <10308169+VictoriousRaptor@users.noreply.github.com> Date: Sat, 19 Nov 2022 18:03:25 +0800 Subject: [PATCH 0537/1125] Remove null check for selected shortcut --- Flow.Launcher/ViewModel/SettingWindowViewModel.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs index f3538e02d..cfc53a370 100644 --- a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs +++ b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs @@ -783,7 +783,7 @@ namespace Flow.Launcher.ViewModel string deleteWarning = string.Format( InternationalizationManager.Instance.GetTranslation("deleteCustomShortcutWarning"), - item?.Key, item?.Value); + item.Key, item.Value); if (MessageBox.Show(deleteWarning, InternationalizationManager.Instance.GetTranslation("delete"), MessageBoxButton.YesNo) == MessageBoxResult.Yes) { From 28a26644f255bb4c25dc94ef8e068a466f227944 Mon Sep 17 00:00:00 2001 From: Vic <10308169+VictoriousRaptor@users.noreply.github.com> Date: Sat, 19 Nov 2022 18:10:21 +0800 Subject: [PATCH 0538/1125] fix indent --- Flow.Launcher/SettingWindow.xaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Flow.Launcher/SettingWindow.xaml b/Flow.Launcher/SettingWindow.xaml index 996c30542..bc0ff1ce4 100644 --- a/Flow.Launcher/SettingWindow.xaml +++ b/Flow.Launcher/SettingWindow.xaml @@ -1822,8 +1822,8 @@ Text="{DynamicResource hiThere}" /> + x:Name="ClockPanel" + Style="{DynamicResource ClockPanel}"> Date: Sat, 19 Nov 2022 12:08:32 -0600 Subject: [PATCH 0539/1125] refactor relaycommands with mvvmtoolkit sourcegenerator to prevent potential null reference --- Flow.Launcher/ViewModel/MainViewModel.cs | 302 +++++++++++------------ 1 file changed, 142 insertions(+), 160 deletions(-) diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index 99d2a0990..85119fee1 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -77,7 +77,6 @@ namespace Flow.Launcher.ViewModel _userSelectedRecord = _userSelectedRecordStorage.Load(); _topMostRecord = _topMostRecordStorage.Load(); - InitializeKeyCommands(); ContextMenu = new ResultsViewModel(Settings) { @@ -167,160 +166,161 @@ namespace Flow.Launcher.ViewModel } } - - - private void InitializeKeyCommands() + [RelayCommand] + private async Task ReloadPluginDataAsync() { - EscCommand = new RelayCommand(_ => + Hide(); + + await PluginManager.ReloadDataAsync().ConfigureAwait(false); + Notification.Show(InternationalizationManager.Instance.GetTranslation("success"), InternationalizationManager.Instance.GetTranslation("completedSuccessfully")); + } + [RelayCommand] + private void LoadHistory() + { + if (SelectedIsFromQueryResults()) { - if (!SelectedIsFromQueryResults()) - { - SelectedResults = Results; - } - else - { - Hide(); - } - }); - - ClearQueryCommand = new RelayCommand(_ => + SelectedResults = History; + History.SelectedIndex = _history.Items.Count - 1; + } + else { - if (!string.IsNullOrEmpty(QueryText)) - { - ChangeQueryText(string.Empty); - - // Push Event to UI SystemQuery has changed - //OnPropertyChanged(nameof(SystemQueryText)); - } - }); - - SelectNextItemCommand = new RelayCommand(_ => { SelectedResults.SelectNextResult(); }); - - SelectPrevItemCommand = new RelayCommand(_ => { SelectedResults.SelectPrevResult(); }); - - SelectNextPageCommand = new RelayCommand(_ => { SelectedResults.SelectNextPage(); }); - - SelectPrevPageCommand = new RelayCommand(_ => { SelectedResults.SelectPrevPage(); }); - - SelectFirstResultCommand = new RelayCommand(_ => SelectedResults.SelectFirstResult()); - - StartHelpCommand = new RelayCommand(_ => + SelectedResults = Results; + } + } + [RelayCommand] + private void LoadContextMenu() + { + if (SelectedIsFromQueryResults()) { - PluginManager.API.OpenUrl("https://github.com/Flow-Launcher/Flow.Launcher/wiki/Flow-Launcher/"); - }); - OpenSettingCommand = new RelayCommand(_ => { App.API.OpenSettingDialog(); }); - OpenResultCommand = new AsyncRelayCommand(async _ => + // When switch to ContextMenu from QueryResults, but no item being chosen, should do nothing + // i.e. Shift+Enter/Ctrl+O right after Alt + Space should do nothing + if (SelectedResults.SelectedItem != null) + SelectedResults = ContextMenu; + } + else { - var results = SelectedResults; + SelectedResults = Results; + } + } + [RelayCommand] + private void Backspace(object index) + { + var query = QueryBuilder.Build(QueryText.Trim(), PluginManager.NonGlobalPlugins); - var result = results.SelectedItem?.Result; - if (result == null) + // GetPreviousExistingDirectory does not require trailing '\', otherwise will return empty string + var path = FilesFolders.GetPreviousExistingDirectory((_) => true, query.Search.TrimEnd('\\')); + + var actionKeyword = string.IsNullOrEmpty(query.ActionKeyword) ? string.Empty : $"{query.ActionKeyword} "; + + ChangeQueryText($"{actionKeyword}{path}"); + } + [RelayCommand] + private void AutocompleteQuery() + { + var result = SelectedResults.SelectedItem?.Result; + if (result != null && SelectedIsFromQueryResults()) // SelectedItem returns null if selection is empty. + { + var autoCompleteText = result.Title; + + if (!string.IsNullOrEmpty(result.AutoCompleteText)) { - return; + autoCompleteText = result.AutoCompleteText; } - var hideWindow = await result.ExecuteAsync(new ActionContext + else if (!string.IsNullOrEmpty(SelectedResults.SelectedItem?.QuerySuggestionText)) + { + autoCompleteText = SelectedResults.SelectedItem.QuerySuggestionText; + } + + var specialKeyState = GlobalHotkey.CheckModifiers(); + if (specialKeyState.ShiftPressed) + { + autoCompleteText = result.SubTitle; + } + + ChangeQueryText(autoCompleteText); + } + } + [RelayCommand] + private async Task OpenResult() + { + var results = SelectedResults; + + var result = results.SelectedItem?.Result; + if (result == null) + { + return; + } + var hideWindow = await result.ExecuteAsync(new ActionContext { SpecialKeyState = GlobalHotkey.CheckModifiers() - }).ConfigureAwait(false); + }) + .ConfigureAwait(false); - if (hideWindow) - { - Hide(); - } - - if (SelectedIsFromQueryResults()) - { - _userSelectedRecord.Add(result); - _history.Add(result.OriginQuery.RawQuery); - } - else - { - SelectedResults = Results; - } - }); - - AutocompleteQueryCommand = new RelayCommand(_ => - { - var result = SelectedResults.SelectedItem?.Result; - if (result != null && SelectedIsFromQueryResults()) // SelectedItem returns null if selection is empty. - { - var autoCompleteText = result.Title; - - if (!string.IsNullOrEmpty(result.AutoCompleteText)) - { - autoCompleteText = result.AutoCompleteText; - } - else if (!string.IsNullOrEmpty(SelectedResults.SelectedItem?.QuerySuggestionText)) - { - autoCompleteText = SelectedResults.SelectedItem.QuerySuggestionText; - } - - var specialKeyState = GlobalHotkey.CheckModifiers(); - if (specialKeyState.ShiftPressed) - { - autoCompleteText = result.SubTitle; - } - - ChangeQueryText(autoCompleteText); - } - }); - - BackspaceCommand = new RelayCommand(index => - { - var query = QueryBuilder.Build(QueryText.Trim(), PluginManager.NonGlobalPlugins); - - // GetPreviousExistingDirectory does not require trailing '\', otherwise will return empty string - var path = FilesFolders.GetPreviousExistingDirectory((_) => true, query.Search.TrimEnd('\\')); - - var actionKeyword = string.IsNullOrEmpty(query.ActionKeyword) ? string.Empty : $"{query.ActionKeyword} "; - - ChangeQueryText($"{actionKeyword}{path}"); - }); - - LoadContextMenuCommand = new RelayCommand(_ => - { - if (SelectedIsFromQueryResults()) - { - // When switch to ContextMenu from QueryResults, but no item being chosen, should do nothing - // i.e. Shift+Enter/Ctrl+O right after Alt + Space should do nothing - if (SelectedResults.SelectedItem != null) - SelectedResults = ContextMenu; - } - else - { - SelectedResults = Results; - } - }); - - LoadHistoryCommand = new RelayCommand(_ => - { - if (SelectedIsFromQueryResults()) - { - SelectedResults = History; - History.SelectedIndex = _history.Items.Count - 1; - } - else - { - SelectedResults = Results; - } - }); - - ReloadPluginDataCommand = new RelayCommand(_ => + if (hideWindow) { Hide(); + } - _ = PluginManager - .ReloadDataAsync() - .ContinueWith(_ => - Application.Current.Dispatcher.Invoke(() => - { - Notification.Show( - InternationalizationManager.Instance.GetTranslation("success"), - InternationalizationManager.Instance.GetTranslation("completedSuccessfully") - ); - }), TaskScheduler.Default) - .ConfigureAwait(false); - }); + if (SelectedIsFromQueryResults()) + { + _userSelectedRecord.Add(result); + _history.Add(result.OriginQuery.RawQuery); + } + else + { + SelectedResults = Results; + } + } + [RelayCommand] + private void OpenSetting() + { + App.API.OpenSettingDialog(); + } + + [RelayCommand] + private void SelectHelp() + { + PluginManager.API.OpenUrl("https://github.com/Flow-Launcher/Flow.Launcher/wiki/Flow-Launcher/"); + } + + [RelayCommand] + private void SelectFirstResult() + { + SelectedResults.SelectFirstResult(); + } + [RelayCommand] + private void SelectPrevPage() + { + SelectedResults.SelectPrevPage(); + } + + [RelayCommand] + private void SelectNextPage() + { + SelectedResults.SelectNextPage(); + } + [RelayCommand] + private void SelectPrevItem() + { + SelectedResults.SelectPrevResult(); + } + [RelayCommand] + private void SelectNextItem() + { + SelectedResults.SelectNextResult(); + } + + [RelayCommand] + private void Esc() + { + if (!SelectedIsFromQueryResults()) + { + SelectedResults = Results; + } + else + { + Hide(); + } } #endregion @@ -416,6 +416,7 @@ namespace Flow.Launcher.ViewModel /// but we don't want to move cursor to end when query is updated from TextBox /// /// + /// Force query even when Query Text doesn't change public void ChangeQueryText(string queryText, bool reQuery = false) { if (QueryText != queryText) @@ -494,25 +495,6 @@ namespace Flow.Launcher.ViewModel public string PluginIconPath { get; set; } = null; - public ICommand EscCommand { get; set; } - public ICommand BackspaceCommand { get; set; } - public ICommand SelectNextItemCommand { get; set; } - public ICommand SelectPrevItemCommand { get; set; } - public ICommand SelectNextPageCommand { get; set; } - public ICommand SelectPrevPageCommand { get; set; } - public ICommand SelectFirstResultCommand { get; set; } - public ICommand StartHelpCommand { get; set; } - public ICommand LoadContextMenuCommand { get; set; } - public ICommand LoadHistoryCommand { get; set; } - public ICommand OpenResultCommand { get; set; } - public ICommand OpenSettingCommand { get; set; } - public ICommand ReloadPluginDataCommand { get; set; } - public ICommand ClearQueryCommand { get; private set; } - - public ICommand CopyToClipboard { get; set; } - - public ICommand AutocompleteQueryCommand { get; set; } - public string OpenResultCommandModifiers { get; private set; } public string Image => Constant.QueryTextBoxIconImagePath; From 7b90808b43da615c91912f7cfad088bf386e0f71 Mon Sep 17 00:00:00 2001 From: Hongtao Zhang Date: Sat, 19 Nov 2022 16:09:39 -0600 Subject: [PATCH 0540/1125] Use Converter to transform format to actual display --- .../DateTimeFormatToNowConverter.cs | 19 + Flow.Launcher/SettingWindow.xaml | 1666 +++++++++-------- Flow.Launcher/SettingWindow.xaml.cs | 24 - .../ViewModel/SettingWindowViewModel.cs | 99 +- 4 files changed, 920 insertions(+), 888 deletions(-) create mode 100644 Flow.Launcher/Converters/DateTimeFormatToNowConverter.cs diff --git a/Flow.Launcher/Converters/DateTimeFormatToNowConverter.cs b/Flow.Launcher/Converters/DateTimeFormatToNowConverter.cs new file mode 100644 index 000000000..3c46fd01a --- /dev/null +++ b/Flow.Launcher/Converters/DateTimeFormatToNowConverter.cs @@ -0,0 +1,19 @@ +using System; +using System.Globalization; +using System.Windows.Data; + +namespace Flow.Launcher.Converters +{ + public class DateTimeFormatToNowConverter : IValueConverter + { + + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + return value is not string format ? null : DateTime.Now.ToString(format); + } + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + } +} diff --git a/Flow.Launcher/SettingWindow.xaml b/Flow.Launcher/SettingWindow.xaml index bc0ff1ce4..5b841978f 100644 --- a/Flow.Launcher/SettingWindow.xaml +++ b/Flow.Launcher/SettingWindow.xaml @@ -1,5 +1,4 @@ - - + - + - + @@ -44,12 +47,15 @@ - + + - + @@ -59,127 +65,172 @@ - - - - - - - - - - - - - - - - - - - - - + @@ -606,13 +717,11 @@ - - - + @@ -628,25 +738,24 @@ - + - - - - + - + - @@ -672,10 +781,10 @@ - + - @@ -685,13 +794,14 @@ - + - + - @@ -702,24 +812,26 @@ - - + + - - + - + - - - + + - @@ -752,14 +865,16 @@ - + - - + + - - + - + - @@ -789,11 +905,12 @@ - - + + - @@ -803,52 +920,46 @@ - - - - + - - - - - + - - - - - + - - + - - + - - - - - - - + @@ -717,11 +606,13 @@ - - - + @@ -738,24 +628,25 @@ - + - - - - + - + - @@ -781,10 +672,10 @@ - + - @@ -794,14 +685,13 @@ - + - + - @@ -812,26 +702,24 @@ - - + + - - + - + - - - + + - @@ -865,16 +752,14 @@ - + - - + + - - + - + - @@ -905,12 +789,11 @@ - - + + - @@ -920,46 +803,52 @@ - - - - + - - - - - + - - - - - + - - + - - + - - + + diff --git a/Flow.Launcher/SettingWindow.xaml.cs b/Flow.Launcher/SettingWindow.xaml.cs index 9ceb9789d..70758540d 100644 --- a/Flow.Launcher/SettingWindow.xaml.cs +++ b/Flow.Launcher/SettingWindow.xaml.cs @@ -10,7 +10,9 @@ using Flow.Launcher.ViewModel; using ModernWpf; using ModernWpf.Controls; using System; +using System.Diagnostics; using System.IO; +using System.Security.Policy; using System.Windows; using System.Windows.Data; using System.Windows.Forms; diff --git a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs index 60dc95e2e..0c25dcc85 100644 --- a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs +++ b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs @@ -799,6 +799,7 @@ namespace Flow.Launcher.ViewModel #region about public string Website => Constant.Website; + public string SponsorPage => Constant.SponsorPage; public string ReleaseNotes => _updater.GitHubRepository + @"/releases/latest"; public string Documentation => Constant.Documentation; public string Docs => Constant.Docs; From d70c0ce58c601fe0ac70b127eab7c9cf0f77f49d Mon Sep 17 00:00:00 2001 From: DB p Date: Thu, 24 Nov 2022 20:24:08 +0900 Subject: [PATCH 0584/1125] Add Become A sponsor button --- Flow.Launcher/SettingWindow.xaml | 1 - 1 file changed, 1 deletion(-) diff --git a/Flow.Launcher/SettingWindow.xaml b/Flow.Launcher/SettingWindow.xaml index 4a8a52ea1..2c0e4db25 100644 --- a/Flow.Launcher/SettingWindow.xaml +++ b/Flow.Launcher/SettingWindow.xaml @@ -2863,7 +2863,6 @@ NavigateUri="{Binding SponsorPage, Mode=OneWay}" RequestNavigate="OnRequestNavigate" TextDecorations="None"> - Date: Thu, 24 Nov 2022 20:05:07 +0800 Subject: [PATCH 0585/1125] Store CultureInfo in i18n manager --- Flow.Launcher.Core/Resource/Internationalization.cs | 7 ++++++- Flow.Launcher/ViewModel/MainViewModel.cs | 10 +--------- Flow.Launcher/ViewModel/SettingWindowViewModel.cs | 4 +--- 3 files changed, 8 insertions(+), 13 deletions(-) diff --git a/Flow.Launcher.Core/Resource/Internationalization.cs b/Flow.Launcher.Core/Resource/Internationalization.cs index 4568e92f3..91bcfdf5a 100644 --- a/Flow.Launcher.Core/Resource/Internationalization.cs +++ b/Flow.Launcher.Core/Resource/Internationalization.cs @@ -17,6 +17,7 @@ namespace Flow.Launcher.Core.Resource public class Internationalization { public Settings Settings { get; set; } + public CultureInfo CurrentCulture { get; private set; } private const string Folder = "Languages"; private const string DefaultFile = "en.xaml"; private const string Extension = ".xaml"; @@ -62,6 +63,7 @@ namespace Flow.Launcher.Core.Resource { LoadLanguage(AvailableLanguages.English); _oldResources.Clear(); + CurrentCulture = new CultureInfo("en"); } public void ChangeLanguage(string languageCode) @@ -96,9 +98,12 @@ namespace Flow.Launcher.Core.Resource { LoadLanguage(language); } - Settings.Language = language.LanguageCode; CultureInfo.CurrentCulture = new CultureInfo(language.LanguageCode); CultureInfo.CurrentUICulture = CultureInfo.CurrentCulture; + CurrentCulture = CultureInfo.CurrentCulture; + + // Raise event after this.CurrentCulture is set + Settings.Language = language.LanguageCode; _ = Task.Run(() => { UpdatePluginMetadataTranslations(); diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index 109cfc81e..5be065429 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -65,16 +65,10 @@ namespace Flow.Launcher.ViewModel Settings = settings; Settings.PropertyChanged += (_, args) => { - if (args.PropertyName == nameof(Settings.WindowSize)) - { - } switch (args.PropertyName) { case nameof(Settings.WindowSize): OnPropertyChanged(nameof(MainWindowWidth)); break; - case nameof(Settings.Language): - Culture = new CultureInfo(Settings.Language); - break; } }; @@ -106,8 +100,6 @@ namespace Flow.Launcher.ViewModel RegisterClockAndDateUpdateAsync(); SetOpenResultModifiers(); - - Culture = new CultureInfo(Settings.Language); } private void RegisterViewUpdate() @@ -343,7 +335,7 @@ namespace Flow.Launcher.ViewModel public Settings Settings { get; } public string ClockText { get; private set; } public string DateText { get; private set; } - public CultureInfo Culture { get; set; } + public CultureInfo Culture => InternationalizationManager.Instance.CurrentCulture; private async Task RegisterClockAndDateUpdateAsync() { diff --git a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs index c51e3e421..f31e838fa 100644 --- a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs +++ b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs @@ -56,14 +56,12 @@ namespace Flow.Launcher.ViewModel OnPropertyChanged(nameof(ClockText)); break; case nameof(Settings.Language): - Culture = new CultureInfo(Settings.Language); OnPropertyChanged(nameof(ClockText)); OnPropertyChanged(nameof(DateText)); break; } }; - Culture = new CultureInfo(Settings.Language); } public Settings Settings { get; set; } @@ -87,7 +85,7 @@ namespace Flow.Launcher.ViewModel } } - public CultureInfo Culture { get; private set; } + public CultureInfo Culture => InternationalizationManager.Instance.CurrentCulture; public bool StartFlowLauncherOnSystemStartup { From 303d3b97541715af83a2fd02d8209c49cfbffb88 Mon Sep 17 00:00:00 2001 From: Hongtao Zhang Date: Thu, 24 Nov 2022 14:18:31 -0600 Subject: [PATCH 0586/1125] remove task.run outside --- Flow.Launcher/ViewModel/ResultViewModel.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Flow.Launcher/ViewModel/ResultViewModel.cs b/Flow.Launcher/ViewModel/ResultViewModel.cs index d12a765ae..282c45f46 100644 --- a/Flow.Launcher/ViewModel/ResultViewModel.cs +++ b/Flow.Launcher/ViewModel/ResultViewModel.cs @@ -15,7 +15,7 @@ namespace Flow.Launcher.ViewModel public class ResultViewModel : BaseModel { private static PrivateFontCollection fontCollection = new(); - private static Dictionary fonts = new(); + private static Dictionary fonts = new(); public ResultViewModel(Result result, Settings settings) { @@ -173,7 +173,7 @@ namespace Flow.Launcher.ViewModel } // We need to modify the property not field here to trigger the OnPropertyChanged event - var i = await Task.Run(async () => await ImageLoader.LoadAsync(imagePath, loadFullImage)); + var i = await ImageLoader.LoadAsync(imagePath, loadFullImage); Image = i; } From fb3a23fb2c58b040966bf11fcef42377b79e03c6 Mon Sep 17 00:00:00 2001 From: Hongtao Zhang Date: Thu, 24 Nov 2022 14:19:16 -0600 Subject: [PATCH 0587/1125] remove unnecessary local variable --- Flow.Launcher/ViewModel/ResultViewModel.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Flow.Launcher/ViewModel/ResultViewModel.cs b/Flow.Launcher/ViewModel/ResultViewModel.cs index 282c45f46..2d61f6cab 100644 --- a/Flow.Launcher/ViewModel/ResultViewModel.cs +++ b/Flow.Launcher/ViewModel/ResultViewModel.cs @@ -173,8 +173,7 @@ namespace Flow.Launcher.ViewModel } // We need to modify the property not field here to trigger the OnPropertyChanged event - var i = await ImageLoader.LoadAsync(imagePath, loadFullImage); - Image = i; + Image = await ImageLoader.LoadAsync(imagePath, loadFullImage).ConfigureAwait(false); } public Result Result { get; } From f3fe26bd55f8da09aa8487b8b89ade76c775a20b Mon Sep 17 00:00:00 2001 From: Hongtao Zhang Date: Thu, 24 Nov 2022 15:08:54 -0600 Subject: [PATCH 0588/1125] Adjust ComboBox binding --- .../Views/ExplorerSettings.xaml | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml index 5a3f73b0a..539d65b70 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml @@ -161,11 +161,6 @@ - - - - - + SelectedItem="{Binding SelectedIndexSearchEngine}" + DisplayMemberPath="Description"/> + SelectedItem="{Binding SelectedContentSearchEngine}" + DisplayMemberPath="Description"/> From ec810865ccca19557eac5caab3c06043c0dac5ec Mon Sep 17 00:00:00 2001 From: Hongtao Zhang Date: Thu, 24 Nov 2022 15:09:02 -0600 Subject: [PATCH 0589/1125] Port Everything string --- .../Languages/en.xaml | 31 +++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml index 8256b82c5..6fdfaf7c1 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml @@ -1,5 +1,4 @@ - @@ -91,4 +90,32 @@ Remove the current {0} from Quick Access Show Windows Context Menu + + Warning: Everything service is not running + Error while querying Everything + Sort By + Name + Path + Size + Extension + Type Name + Date Created + Date Modified + Attributes + File List FileName + Run Count + Date Recently Changed + Date Accessed + Date Run + + + Warning: This is not a Fast Sort option, searches may be slow + + Everything Installation + Installing Everything service. Please wait... + Successfully installed Everything service + Failed to automatically install Everything service. Please manually install it from https://www.voidtools.com + Click here to start it + Unable to find an Everything installation, would you like to manually select a location?{0}{0}Click no and Everything will be automatically installed for you + \ No newline at end of file From 2da557c2db001419dec497ffe8a074064f7ddd79 Mon Sep 17 00:00:00 2001 From: Hongtao Zhang Date: Thu, 24 Nov 2022 16:46:20 -0600 Subject: [PATCH 0590/1125] fix path equality check --- .../Flow.Launcher.Plugin.Explorer/Search/SearchManager.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/SearchManager.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/SearchManager.cs index f814214dd..7bee3747e 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Search/SearchManager.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/SearchManager.cs @@ -1,7 +1,6 @@ using Flow.Launcher.Plugin.Explorer.Search.DirectoryInfo; using Flow.Launcher.Plugin.Explorer.Search.Everything; using Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks; -using Flow.Launcher.Plugin.Explorer.Search.WindowsIndex; using Flow.Launcher.Plugin.SharedCommands; using System; using System.Collections.Generic; @@ -31,12 +30,12 @@ namespace Flow.Launcher.Plugin.Explorer.Search public bool Equals(Result x, Result y) { - return x.SubTitle == y.SubTitle; + return x.Title == y.Title && x.SubTitle == y.SubTitle; } public int GetHashCode(Result obj) { - return obj.SubTitle?.GetHashCode() ?? 0; + return HashCode.Combine(obj.Title.GetHashCode(), obj.SubTitle?.GetHashCode() ?? 0); } } From 786e9427d9fe9e27b6b14c3a3939c1142e2040a4 Mon Sep 17 00:00:00 2001 From: Hongtao Zhang Date: Thu, 24 Nov 2022 17:06:22 -0600 Subject: [PATCH 0591/1125] Apply IndexSearchExcludedPaths to Index Search in a unified way --- Plugins/Flow.Launcher.Plugin.Explorer/Search/SearchManager.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/SearchManager.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/SearchManager.cs index 7bee3747e..d9beea456 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Search/SearchManager.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/SearchManager.cs @@ -99,6 +99,9 @@ namespace Flow.Launcher.Plugin.Explorer.Search results.Add(ResultManager.CreateResult(query, search)); } + results.RemoveWhere(r => Settings.IndexSearchExcludedSubdirectoryPaths.Any( + excludedPath => r.SubTitle.StartsWith(excludedPath.Path, StringComparison.OrdinalIgnoreCase))); + return results.ToList(); } From 17bc59d0bf21780b960fba351db78dba016f6127 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Fri, 25 Nov 2022 13:59:30 +1100 Subject: [PATCH 0592/1125] update sponsor link --- Flow.Launcher.Infrastructure/Constant.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Flow.Launcher.Infrastructure/Constant.cs b/Flow.Launcher.Infrastructure/Constant.cs index ed4e34fee..b0eebd2df 100644 --- a/Flow.Launcher.Infrastructure/Constant.cs +++ b/Flow.Launcher.Infrastructure/Constant.cs @@ -45,7 +45,7 @@ namespace Flow.Launcher.Infrastructure public const string Logs = "Logs"; public const string Website = "https://flowlauncher.com"; - public const string SponsorPage = "https://opencollective.com/flow-launcher"; + public const string SponsorPage = "https://github.com/sponsors/Flow-Launcher"; public const string GitHub = "https://github.com/Flow-Launcher/Flow.Launcher"; public const string Docs = "https://flowlauncher.com/docs"; } From 30987f9c95e22bee43f16ccb8b7cb3ce74cbcf38 Mon Sep 17 00:00:00 2001 From: Vic <10308169+VictoriousRaptor@users.noreply.github.com> Date: Fri, 25 Nov 2022 12:00:37 +0800 Subject: [PATCH 0593/1125] Use DefaultThreadCurrentCulture for culture in app domain --- .../Resource/Internationalization.cs | 14 ++++++++------ .../UserSettings/Settings.cs | 1 - .../Converters/QuerySuggestionBoxConverter.cs | 5 +++-- Flow.Launcher/ViewModel/MainViewModel.cs | 2 +- Flow.Launcher/ViewModel/SettingWindowViewModel.cs | 2 +- Plugins/Flow.Launcher.Plugin.Calculator/Main.cs | 6 +++--- 6 files changed, 16 insertions(+), 14 deletions(-) diff --git a/Flow.Launcher.Core/Resource/Internationalization.cs b/Flow.Launcher.Core/Resource/Internationalization.cs index 91bcfdf5a..acc693ed5 100644 --- a/Flow.Launcher.Core/Resource/Internationalization.cs +++ b/Flow.Launcher.Core/Resource/Internationalization.cs @@ -17,7 +17,6 @@ namespace Flow.Launcher.Core.Resource public class Internationalization { public Settings Settings { get; set; } - public CultureInfo CurrentCulture { get; private set; } private const string Folder = "Languages"; private const string DefaultFile = "en.xaml"; private const string Extension = ".xaml"; @@ -63,7 +62,6 @@ namespace Flow.Launcher.Core.Resource { LoadLanguage(AvailableLanguages.English); _oldResources.Clear(); - CurrentCulture = new CultureInfo("en"); } public void ChangeLanguage(string languageCode) @@ -98,11 +96,15 @@ namespace Flow.Launcher.Core.Resource { LoadLanguage(language); } - CultureInfo.CurrentCulture = new CultureInfo(language.LanguageCode); + // Culture of this thread + // Use CreateSpecificCulture to preserve possible user-override settings in Windows + CultureInfo.CurrentCulture = CultureInfo.CreateSpecificCulture(language.LanguageCode); CultureInfo.CurrentUICulture = CultureInfo.CurrentCulture; - CurrentCulture = CultureInfo.CurrentCulture; + // App domain + CultureInfo.DefaultThreadCurrentCulture = CultureInfo.CreateSpecificCulture(language.LanguageCode); + CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.DefaultThreadCurrentCulture; - // Raise event after this.CurrentCulture is set + // Raise event after culture is set Settings.Language = language.LanguageCode; _ = Task.Run(() => { @@ -191,7 +193,7 @@ namespace Flow.Launcher.Core.Resource { p.Metadata.Name = pluginI18N.GetTranslatedPluginTitle(); p.Metadata.Description = pluginI18N.GetTranslatedPluginDescription(); - pluginI18N.OnCultureInfoChanged(CultureInfo.CurrentCulture); + pluginI18N.OnCultureInfoChanged(CultureInfo.DefaultThreadCurrentCulture); } catch (Exception e) { diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs index 33072b53d..3561c6ffe 100644 --- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs +++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs @@ -6,7 +6,6 @@ using System.Text.Json.Serialization; using System.Windows; using Flow.Launcher.Plugin; using Flow.Launcher.Plugin.SharedModels; -using Flow.Launcher; using Flow.Launcher.ViewModel; namespace Flow.Launcher.Infrastructure.UserSettings diff --git a/Flow.Launcher/Converters/QuerySuggestionBoxConverter.cs b/Flow.Launcher/Converters/QuerySuggestionBoxConverter.cs index ecdfc5851..1e39473e0 100644 --- a/Flow.Launcher/Converters/QuerySuggestionBoxConverter.cs +++ b/Flow.Launcher/Converters/QuerySuggestionBoxConverter.cs @@ -52,7 +52,8 @@ namespace Flow.Launcher.Converters // Check if Text will be larger then our QueryTextBox System.Windows.Media.Typeface typeface = new Typeface(QueryTextBox.FontFamily, QueryTextBox.FontStyle, QueryTextBox.FontWeight, QueryTextBox.FontStretch); - System.Windows.Media.FormattedText ft = new FormattedText(QueryTextBox.Text, System.Globalization.CultureInfo.CurrentCulture, System.Windows.FlowDirection.LeftToRight, typeface, QueryTextBox.FontSize, Brushes.Black); + // TODO: Obsolete warning? + System.Windows.Media.FormattedText ft = new FormattedText(QueryTextBox.Text, System.Globalization.CultureInfo.DefaultThreadCurrentCulture, System.Windows.FlowDirection.LeftToRight, typeface, QueryTextBox.FontSize, Brushes.Black); var offset = QueryTextBox.Padding.Right; @@ -75,4 +76,4 @@ namespace Flow.Launcher.Converters throw new NotImplementedException(); } } -} \ No newline at end of file +} diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index 5be065429..4db8e3df3 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -335,7 +335,7 @@ namespace Flow.Launcher.ViewModel public Settings Settings { get; } public string ClockText { get; private set; } public string DateText { get; private set; } - public CultureInfo Culture => InternationalizationManager.Instance.CurrentCulture; + public CultureInfo Culture => CultureInfo.DefaultThreadCurrentCulture; private async Task RegisterClockAndDateUpdateAsync() { diff --git a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs index f31e838fa..de4544233 100644 --- a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs +++ b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs @@ -85,7 +85,7 @@ namespace Flow.Launcher.ViewModel } } - public CultureInfo Culture => InternationalizationManager.Instance.CurrentCulture; + public CultureInfo Culture => CultureInfo.DefaultThreadCurrentCulture; public bool StartFlowLauncherOnSystemStartup { diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs b/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs index bc79219b6..d5dcdacea 100644 --- a/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs +++ b/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Globalization; using System.Runtime.InteropServices; @@ -61,7 +61,7 @@ namespace Flow.Launcher.Plugin.Caculator switch (_settings.DecimalSeparator) { case DecimalSeparator.Comma: - case DecimalSeparator.UseSystemLocale when CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator == ",": + case DecimalSeparator.UseSystemLocale when CultureInfo.DefaultThreadCurrentCulture.NumberFormat.NumberDecimalSeparator == ",": expression = query.Search.Replace(",", "."); break; default: @@ -157,7 +157,7 @@ namespace Flow.Launcher.Plugin.Caculator private string GetDecimalSeparator() { - string systemDecimalSeperator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator; + string systemDecimalSeperator = CultureInfo.DefaultThreadCurrentCulture.NumberFormat.NumberDecimalSeparator; switch (_settings.DecimalSeparator) { case DecimalSeparator.UseSystemLocale: return systemDecimalSeperator; From e38a3b0505677b78b511ce85169dbaa728262f4a Mon Sep 17 00:00:00 2001 From: DB p Date: Fri, 25 Nov 2022 14:08:37 +0900 Subject: [PATCH 0594/1125] Change Keyword to ws from * --- Plugins/Flow.Launcher.Plugin.WindowsSettings/plugin.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Flow.Launcher.Plugin.WindowsSettings/plugin.json b/Plugins/Flow.Launcher.Plugin.WindowsSettings/plugin.json index b5121b36a..17e6eb39b 100644 --- a/Plugins/Flow.Launcher.Plugin.WindowsSettings/plugin.json +++ b/Plugins/Flow.Launcher.Plugin.WindowsSettings/plugin.json @@ -1,6 +1,6 @@ { "ID": "5043CETYU6A748679OPA02D27D99677A", - "ActionKeyword": "*", + "ActionKeyword": "ws", "Description": "Search settings inside Control Panel and Settings App", "Name": "Windows Settings", "Author": "TobiasSekan", From 21babd13dbcca0cf9db31389278aaef0ba4a6279 Mon Sep 17 00:00:00 2001 From: DB p Date: Fri, 25 Nov 2022 15:30:26 +0900 Subject: [PATCH 0595/1125] Fix Plugin Trigger Icon Position --- Flow.Launcher/MainWindow.xaml | 47 +++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/Flow.Launcher/MainWindow.xaml b/Flow.Launcher/MainWindow.xaml index c71a2d7a3..82c32a3d8 100644 --- a/Flow.Launcher/MainWindow.xaml +++ b/Flow.Launcher/MainWindow.xaml @@ -260,28 +260,31 @@ Text="{Binding DateText}" Visibility="{Binding Settings.UseDate, Converter={StaticResource BoolToVisibilityConverter}}" /> - - - - - + + + + + + + + From 32e406e575c4e4acce47d4950d2e144865e92b48 Mon Sep 17 00:00:00 2001 From: DB p Date: Fri, 25 Nov 2022 16:20:54 +0900 Subject: [PATCH 0596/1125] Add MinWidth ContextMenu --- Flow.Launcher/MainWindow.xaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Flow.Launcher/MainWindow.xaml b/Flow.Launcher/MainWindow.xaml index 82c32a3d8..49854ed81 100644 --- a/Flow.Launcher/MainWindow.xaml +++ b/Flow.Launcher/MainWindow.xaml @@ -210,7 +210,7 @@ - + From 7f375be727f84eab553b8b23718f07c1c037da1f Mon Sep 17 00:00:00 2001 From: DB p Date: Fri, 25 Nov 2022 16:35:00 +0900 Subject: [PATCH 0597/1125] Add SnapPixel --- Flow.Launcher/Themes/Base.xaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Flow.Launcher/Themes/Base.xaml b/Flow.Launcher/Themes/Base.xaml index edb9ce04d..94740a730 100644 --- a/Flow.Launcher/Themes/Base.xaml +++ b/Flow.Launcher/Themes/Base.xaml @@ -87,6 +87,8 @@ + + diff --git a/Flow.Launcher/Themes/BlurBlack Darker.xaml b/Flow.Launcher/Themes/BlurBlack Darker.xaml index 904c7ead4..a8de180d8 100644 --- a/Flow.Launcher/Themes/BlurBlack Darker.xaml +++ b/Flow.Launcher/Themes/BlurBlack Darker.xaml @@ -37,7 +37,6 @@ x:Key="WindowBorderStyle" BasedOn="{StaticResource BaseWindowBorderStyle}" TargetType="{x:Type Border}"> - @@ -48,6 +47,15 @@ + + + + + + + @@ -181,4 +181,22 @@ TargetType="{x:Type TextBlock}"> + + + \ No newline at end of file diff --git a/Flow.Launcher/Themes/Circle Light.xaml b/Flow.Launcher/Themes/Circle Light.xaml index 316023ab3..57e0da832 100644 --- a/Flow.Launcher/Themes/Circle Light.xaml +++ b/Flow.Launcher/Themes/Circle Light.xaml @@ -69,7 +69,7 @@ x:Key="SeparatorStyle" BasedOn="{StaticResource BaseSeparatorStyle}" TargetType="{x:Type Rectangle}"> - + @@ -167,18 +167,18 @@ x:Key="PreviewBorderStyle" BasedOn="{StaticResource BasePreviewBorderStyle}" TargetType="{x:Type Border}"> - + diff --git a/Flow.Launcher/Themes/Circle System.xaml b/Flow.Launcher/Themes/Circle System.xaml index b00f03e76..811b278fa 100644 --- a/Flow.Launcher/Themes/Circle System.xaml +++ b/Flow.Launcher/Themes/Circle System.xaml @@ -70,7 +70,7 @@ x:Key="SeparatorStyle" BasedOn="{StaticResource BaseSeparatorStyle}" TargetType="{x:Type Rectangle}"> - + @@ -164,4 +164,22 @@ TargetType="{x:Type TextBlock}"> + + + \ No newline at end of file diff --git a/Flow.Launcher/Themes/Cyan Dark.xaml b/Flow.Launcher/Themes/Cyan Dark.xaml index c79044f00..77e4b06bc 100644 --- a/Flow.Launcher/Themes/Cyan Dark.xaml +++ b/Flow.Launcher/Themes/Cyan Dark.xaml @@ -164,7 +164,7 @@ 0 0 - 0 0 0 0 + 0 0 0 4 + + + \ No newline at end of file diff --git a/Flow.Launcher/Themes/Darker Glass.xaml b/Flow.Launcher/Themes/Darker Glass.xaml index 1f079de05..d97789b90 100644 --- a/Flow.Launcher/Themes/Darker Glass.xaml +++ b/Flow.Launcher/Themes/Darker Glass.xaml @@ -5,7 +5,7 @@ - + 0 0 0 8 + + diff --git a/Flow.Launcher/Themes/League.xaml b/Flow.Launcher/Themes/League.xaml index f014ed055..7b42b1cd9 100644 --- a/Flow.Launcher/Themes/League.xaml +++ b/Flow.Launcher/Themes/League.xaml @@ -141,9 +141,8 @@ x:Key="PreviewBorderStyle" BasedOn="{StaticResource BasePreviewBorderStyle}" TargetType="{x:Type Border}"> - - - + + diff --git a/Flow.Launcher/Themes/Nord Darker.xaml b/Flow.Launcher/Themes/Nord Darker.xaml index 20f9b16c4..d7641afec 100644 --- a/Flow.Launcher/Themes/Nord Darker.xaml +++ b/Flow.Launcher/Themes/Nord Darker.xaml @@ -3,6 +3,7 @@ + 0 0 0 8 + - + + \ No newline at end of file diff --git a/Flow.Launcher/Themes/Sublime.xaml b/Flow.Launcher/Themes/Sublime.xaml index e03ab7c43..9f46a8077 100644 --- a/Flow.Launcher/Themes/Sublime.xaml +++ b/Flow.Launcher/Themes/Sublime.xaml @@ -5,6 +5,7 @@ + 0 0 0 8 + + + \ No newline at end of file diff --git a/Flow.Launcher/Themes/Win10Light.xaml b/Flow.Launcher/Themes/Win10Light.xaml index c03f6ce1d..28737d14e 100644 --- a/Flow.Launcher/Themes/Win10Light.xaml +++ b/Flow.Launcher/Themes/Win10Light.xaml @@ -5,6 +5,7 @@ + 0 0 0 4 - + diff --git a/Flow.Launcher/Themes/Win11System.xaml b/Flow.Launcher/Themes/Win11System.xaml index 93b761ba2..63d7af073 100644 --- a/Flow.Launcher/Themes/Win11System.xaml +++ b/Flow.Launcher/Themes/Win11System.xaml @@ -6,6 +6,7 @@ + 0 0 0 8 @@ -325,57 +326,57 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + VerticalAlignment="Center"> + + + + + + + diff --git a/Flow.Launcher/Themes/Base.xaml b/Flow.Launcher/Themes/Base.xaml index e28e60e07..e3ad6360e 100644 --- a/Flow.Launcher/Themes/Base.xaml +++ b/Flow.Launcher/Themes/Base.xaml @@ -478,7 +478,8 @@ + - - - + - - - - + + + - @@ -351,14 +338,16 @@ - - - + + + - @@ -367,52 +356,64 @@ - - - + + + - - - - + - + - - - + + + + + - - + diff --git a/Flow.Launcher/ViewModel/ResultViewModel.cs b/Flow.Launcher/ViewModel/ResultViewModel.cs index fca37a359..1bfaa9c52 100644 --- a/Flow.Launcher/ViewModel/ResultViewModel.cs +++ b/Flow.Launcher/ViewModel/ResultViewModel.cs @@ -20,47 +20,51 @@ namespace Flow.Launcher.ViewModel public ResultViewModel(Result result, Settings settings) { - if (result != null) + Settings = settings; + + if (result == null) { - Result = result; + return; + } + Result = result; - if (Result.Glyph is { FontFamily: not null } glyph) + PreviewExtension = Path.GetExtension(result.PreviewImage ?? result.IcoPath); + + if (Result.Glyph is { FontFamily: not null } glyph) + { + // Checks if it's a system installed font, which does not require path to be provided. + if (glyph.FontFamily.EndsWith(".ttf") || glyph.FontFamily.EndsWith(".otf")) { - // Checks if it's a system installed font, which does not require path to be provided. - if (glyph.FontFamily.EndsWith(".ttf") || glyph.FontFamily.EndsWith(".otf")) + string fontFamilyPath = glyph.FontFamily; + + if (!Path.IsPathRooted(fontFamilyPath)) { - string fontFamilyPath = glyph.FontFamily; + fontFamilyPath = Path.Combine(Result.PluginDirectory, fontFamilyPath); + } - if (!Path.IsPathRooted(fontFamilyPath)) + if (fonts.ContainsKey(fontFamilyPath)) + { + Glyph = glyph with { - fontFamilyPath = Path.Combine(Result.PluginDirectory, fontFamilyPath); - } - - if (fonts.ContainsKey(fontFamilyPath)) - { - Glyph = glyph with - { - FontFamily = fonts[fontFamilyPath] - }; - } - else - { - fontCollection.AddFontFile(fontFamilyPath); - fonts[fontFamilyPath] = $"{Path.GetDirectoryName(fontFamilyPath)}/#{fontCollection.Families[^1].Name}"; - Glyph = glyph with - { - FontFamily = fonts[fontFamilyPath] - }; - } + FontFamily = fonts[fontFamilyPath] + }; } else { - Glyph = glyph; + fontCollection.AddFontFile(fontFamilyPath); + fonts[fontFamilyPath] = $"{Path.GetDirectoryName(fontFamilyPath)}/#{fontCollection.Families[^1].Name}"; + Glyph = glyph with + { + FontFamily = fonts[fontFamilyPath] + }; } } + else + { + Glyph = glyph; + } } - Settings = settings; } private Settings Settings { get; } @@ -165,6 +169,13 @@ namespace Flow.Launcher.ViewModel private set => previewImage = value; } + public string PreviewExtension { get; set; } + + public bool PreviewIsImageOrVideo => PreviewExtension is ".jpg" + or ".png" + or ".gif" + or ".mp4"; + public GlyphInfo Glyph { get; set; } private async Task LoadImageAsync() From c622edab99bcffc901de1cd55fdf8610c514d49e Mon Sep 17 00:00:00 2001 From: DB p Date: Sat, 26 Nov 2022 06:12:23 +0900 Subject: [PATCH 0610/1125] Add FileType / Ignore Case Senstive --- Flow.Launcher/ViewModel/ResultViewModel.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Flow.Launcher/ViewModel/ResultViewModel.cs b/Flow.Launcher/ViewModel/ResultViewModel.cs index 1bfaa9c52..20ea9cf7c 100644 --- a/Flow.Launcher/ViewModel/ResultViewModel.cs +++ b/Flow.Launcher/ViewModel/ResultViewModel.cs @@ -29,6 +29,11 @@ namespace Flow.Launcher.ViewModel Result = result; PreviewExtension = Path.GetExtension(result.PreviewImage ?? result.IcoPath); + if (PreviewExtension != null) + { + PreviewExtension = PreviewExtension.ToLowerInvariant(); + + } if (Result.Glyph is { FontFamily: not null } glyph) { @@ -173,7 +178,11 @@ namespace Flow.Launcher.ViewModel public bool PreviewIsImageOrVideo => PreviewExtension is ".jpg" or ".png" + or ".avi" + or ".mkv" + or ".bmp" or ".gif" + or ".wmv" or ".mp4"; public GlyphInfo Glyph { get; set; } From c95c276ac7efa66970b03ceea5c8fbd3ef39193c Mon Sep 17 00:00:00 2001 From: Vic <10308169+VictoriousRaptor@users.noreply.github.com> Date: Sat, 26 Nov 2022 11:43:35 +0800 Subject: [PATCH 0611/1125] fix typo --- Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml index 6d9f916e1..654322805 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml @@ -39,7 +39,7 @@ Please select a program source Are you sure you want to delete the selected program sources? - Another program source with the same location alreaday exists. + Another program source with the same location already exists. Program Source Edit directory and status of this program source. From 2641fa2ce1c2fe1fcc553cc2c7fd1ffc5fab244f Mon Sep 17 00:00:00 2001 From: Vic <10308169+VictoriousRaptor@users.noreply.github.com> Date: Sat, 26 Nov 2022 11:46:39 +0800 Subject: [PATCH 0612/1125] update wording --- Flow.Launcher/Languages/en.xaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml index 9074b5df9..a5edd7ee1 100644 --- a/Flow.Launcher/Languages/en.xaml +++ b/Flow.Launcher/Languages/en.xaml @@ -36,8 +36,7 @@ Hide Flow Launcher when focus is lost Do not show new version notifications Search Window Position - Remember last launch location - Remember Last Location + Remember Last Position Mouse Focused Screen - Center Mouse Focused Screen - Center Top Mouse Focused Screen - Left Top From 21eb6c77915ce8bc9c27fc505f9fe13e4a54610f Mon Sep 17 00:00:00 2001 From: Vic <10308169+VictoriousRaptor@users.noreply.github.com> Date: Sat, 26 Nov 2022 12:02:17 +0800 Subject: [PATCH 0613/1125] Match text and illustration --- Flow.Launcher/Languages/en.xaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml index 54c82974e..01a3904d2 100644 --- a/Flow.Launcher/Languages/en.xaml +++ b/Flow.Launcher/Languages/en.xaml @@ -246,7 +246,7 @@ Custom Query Hotkey - Enter a custom hotkey to open Flow Laucher and input the specified query automatically. + Press a custom hotkey to open Flow Laucher and input the specified query automatically. Preview Hotkey is unavailable, please select a new hotkey Invalid plugin hotkey From ff63f6f6d7b8bbbdf66210c3bab7b352ce16d23e Mon Sep 17 00:00:00 2001 From: Vic <10308169+VictoriousRaptor@users.noreply.github.com> Date: Sat, 26 Nov 2022 12:08:21 +0800 Subject: [PATCH 0614/1125] Fix typo --- Flow.Launcher/Languages/en.xaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml index 01a3904d2..4af48132f 100644 --- a/Flow.Launcher/Languages/en.xaml +++ b/Flow.Launcher/Languages/en.xaml @@ -146,7 +146,7 @@ Show result selection hotkey with results. Custom Query Hotkey Custom Query Shortcut - Built-in Shortcuts + Built-in Shortcut Query Shortcut Expansion From 1f8eea76a44108cd46c0eb50f23970f6d24c5f52 Mon Sep 17 00:00:00 2001 From: DB p Date: Sat, 26 Nov 2022 14:58:07 +0900 Subject: [PATCH 0615/1125] Fix Aligns --- Flow.Launcher/CustomQueryHotkeySetting.xaml | 5 +++-- Flow.Launcher/CustomShortcutSetting.xaml | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Flow.Launcher/CustomQueryHotkeySetting.xaml b/Flow.Launcher/CustomQueryHotkeySetting.xaml index 2ac367206..1113cb24d 100644 --- a/Flow.Launcher/CustomQueryHotkeySetting.xaml +++ b/Flow.Launcher/CustomQueryHotkeySetting.xaml @@ -76,13 +76,13 @@ TextAlignment="Left" TextWrapping="WrapWithOverflow" /> - + @@ -135,6 +135,7 @@ LastChildFill="True"> + diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/CustomBrowserSetting.xaml.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/CustomBrowserSetting.xaml.cs index 0ac219962..816029182 100644 --- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/CustomBrowserSetting.xaml.cs +++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/CustomBrowserSetting.xaml.cs @@ -1,10 +1,8 @@ using Flow.Launcher.Plugin.BrowserBookmark.Models; -using Microsoft.Win32; -using System; using System.Windows; -using System.Windows.Controls; using System.Windows.Input; using System.Windows.Forms; +using System.Threading.Tasks; namespace Flow.Launcher.Plugin.BrowserBookmark.Views { @@ -25,20 +23,19 @@ namespace Flow.Launcher.Plugin.BrowserBookmark.Views BrowserType = browser.BrowserType, }; } - - private void ConfirmCancelEditCustomBrowser(object sender, RoutedEventArgs e) + + private void ConfirmEditCustomBrowser(object sender, RoutedEventArgs e) { - if (DataContext is CustomBrowser editBrowser && e.Source is System.Windows.Controls.Button button) - { - if (button.Name == "btnConfirm") - { - currentCustomBrowser.Name = editBrowser.Name; - currentCustomBrowser.DataDirectoryPath = editBrowser.DataDirectoryPath; - currentCustomBrowser.BrowserType = editBrowser.BrowserType; - Close(); - } - } + CustomBrowser editBrowser = (CustomBrowser)DataContext; + currentCustomBrowser.Name = editBrowser.Name; + currentCustomBrowser.DataDirectoryPath = editBrowser.DataDirectoryPath; + currentCustomBrowser.BrowserType = editBrowser.BrowserType; + _ = Task.Run(() => Main.ReloadAllBookmarks()); + Close(); + } + private void CancelEditCustomBrowser(object sender, RoutedEventArgs e) + { Close(); } @@ -46,7 +43,7 @@ namespace Flow.Launcher.Plugin.BrowserBookmark.Views { if (e.Key == Key.Enter) { - ConfirmCancelEditCustomBrowser(sender, e); + ConfirmEditCustomBrowser(sender, e); } } @@ -54,8 +51,8 @@ namespace Flow.Launcher.Plugin.BrowserBookmark.Views { var dialog = new FolderBrowserDialog(); dialog.ShowDialog(); - PathTextBox.Text = dialog.SelectedPath; - string folder = dialog.SelectedPath; + CustomBrowser editBrowser = (CustomBrowser)DataContext; + editBrowser.DataDirectoryPath = dialog.SelectedPath; } } } From 2677c6eb0841d62b41f2d5f3247642a1bd94098b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Feb 2023 22:37:32 +0000 Subject: [PATCH 1060/1125] Bump vedantmgoyal2009/winget-releaser from 1 to 2 Bumps [vedantmgoyal2009/winget-releaser](https://github.com/vedantmgoyal2009/winget-releaser) from 1 to 2. - [Release notes](https://github.com/vedantmgoyal2009/winget-releaser/releases) - [Commits](https://github.com/vedantmgoyal2009/winget-releaser/compare/v1...v2) --- updated-dependencies: - dependency-name: vedantmgoyal2009/winget-releaser dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/winget.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/winget.yml b/.github/workflows/winget.yml index fe1b5a5fc..b1d289091 100644 --- a/.github/workflows/winget.yml +++ b/.github/workflows/winget.yml @@ -9,7 +9,7 @@ jobs: # Action can only be run on windows runs-on: windows-latest steps: - - uses: vedantmgoyal2009/winget-releaser@v1 + - uses: vedantmgoyal2009/winget-releaser@v2 with: identifier: Flow-Launcher.Flow-Launcher token: ${{ secrets.WINGET_TOKEN }} From 39c4a2be2ea4bf55e2e2b8aa42058e4b8709e434 Mon Sep 17 00:00:00 2001 From: Vic <10308169+VictoriousRaptor@users.noreply.github.com> Date: Tue, 14 Feb 2023 16:35:06 +0800 Subject: [PATCH 1061/1125] Auto reload bookmarks when editing checkboxes --- .../Views/CustomBrowserSetting.xaml.cs | 3 +- .../Views/SettingsControl.xaml | 6 +- .../Views/SettingsControl.xaml.cs | 57 ++++++++++++++++--- 3 files changed, 52 insertions(+), 14 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/CustomBrowserSetting.xaml.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/CustomBrowserSetting.xaml.cs index 816029182..bdef5bf0f 100644 --- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/CustomBrowserSetting.xaml.cs +++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/CustomBrowserSetting.xaml.cs @@ -2,7 +2,6 @@ using System.Windows; using System.Windows.Input; using System.Windows.Forms; -using System.Threading.Tasks; namespace Flow.Launcher.Plugin.BrowserBookmark.Views { @@ -30,7 +29,7 @@ namespace Flow.Launcher.Plugin.BrowserBookmark.Views currentCustomBrowser.Name = editBrowser.Name; currentCustomBrowser.DataDirectoryPath = editBrowser.DataDirectoryPath; currentCustomBrowser.BrowserType = editBrowser.BrowserType; - _ = Task.Run(() => Main.ReloadAllBookmarks()); + DialogResult = true; Close(); } diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/SettingsControl.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/SettingsControl.xaml index 408256f45..014deff03 100644 --- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/SettingsControl.xaml +++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/SettingsControl.xaml @@ -18,15 +18,15 @@ + IsChecked="{Binding LoadChromeBookmark}" /> + IsChecked="{Binding LoadEdgeBookmark}" /> + IsChecked="{Binding LoadFirefoxBookmark}" />