From c2ff04f0adea82902decfa08d437c15a070191ab Mon Sep 17 00:00:00 2001
From: Hongtao Zhang
Date: Mon, 18 Dec 2023 00:30:18 -0600
Subject: [PATCH 001/390] add a safety check for getproperty
---
.../ChromiumBookmarkLoader.cs | 44 ++++++++++++-------
1 file changed, 28 insertions(+), 16 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs
index 14b791c48..1e4f3f9ac 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs
@@ -2,12 +2,14 @@
using System.Collections.Generic;
using System.IO;
using System.Text.Json;
+using Flow.Launcher.Infrastructure.Logger;
namespace Flow.Launcher.Plugin.BrowserBookmark
{
public abstract class ChromiumBookmarkLoader : IBookmarkLoader
{
public abstract List GetBookmarks();
+
protected List LoadBookmarks(string browserDataPath, string name)
{
var bookmarks = new List();
@@ -19,53 +21,63 @@ namespace Flow.Launcher.Plugin.BrowserBookmark
var bookmarkPath = Path.Combine(profile, "Bookmarks");
if (!File.Exists(bookmarkPath))
continue;
-
+
Main.RegisterBookmarkFile(bookmarkPath);
var source = name + (Path.GetFileName(profile) == "Default" ? "" : $" ({Path.GetFileName(profile)})");
bookmarks.AddRange(LoadBookmarksFromFile(bookmarkPath, source));
}
+
return bookmarks;
}
protected List LoadBookmarksFromFile(string path, string source)
{
if (!File.Exists(path))
- return new();
+ return new List();
var bookmarks = new List();
using var jsonDocument = JsonDocument.Parse(File.ReadAllText(path));
if (!jsonDocument.RootElement.TryGetProperty("roots", out var rootElement))
- return new();
+ return new List();
foreach (var folder in rootElement.EnumerateObject())
{
if (folder.Value.ValueKind == JsonValueKind.Object)
EnumerateFolderBookmark(folder.Value, bookmarks, source);
}
+
return bookmarks;
}
- private void EnumerateFolderBookmark(JsonElement folderElement, List bookmarks, string source)
+ private void EnumerateFolderBookmark(JsonElement folderElement, ICollection bookmarks,
+ string source)
{
if (!folderElement.TryGetProperty("children", out var childrenElement))
return;
foreach (var subElement in childrenElement.EnumerateArray())
{
- switch (subElement.GetProperty("type").GetString())
+ if (subElement.TryGetProperty("type", out var type))
{
- case "folder":
- case "workspace": // Edge Workspace
- EnumerateFolderBookmark(subElement, bookmarks, source);
- break;
- default:
- bookmarks.Add(new Bookmark(
- subElement.GetProperty("name").GetString(),
- subElement.GetProperty("url").GetString(),
- source));
- break;
+ switch (type.GetString())
+ {
+ case "folder":
+ case "workspace": // Edge Workspace
+ EnumerateFolderBookmark(subElement, bookmarks, source);
+ break;
+ default:
+ bookmarks.Add(new Bookmark(
+ subElement.GetProperty("name").GetString(),
+ subElement.GetProperty("url").GetString(),
+ source));
+ break;
+ }
+ }
+ else
+ {
+ Log.Error(
+ $"ChromiumBookmarkLoader: EnumerateFolderBookmark: type property not found for {subElement.GetString()}");
}
}
-
}
}
}
From 2b8e46611f3259313423fb660418969773e8126e Mon Sep 17 00:00:00 2001
From: Florian Grabmeier
Date: Wed, 3 Jan 2024 09:52:12 +0100
Subject: [PATCH 002/390] Add translation keys for sys commands
Signed-off-by: Florian Grabmeier
---
.../Languages/en.xaml | 21 ++++++++++
Plugins/Flow.Launcher.Plugin.Sys/Main.cs | 38 +++++++++----------
2 files changed, 40 insertions(+), 19 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml
index a9aae930a..7399a55e7 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml
@@ -7,6 +7,27 @@
Command
Description
+ Shutdown
+ Restart
+ Restart With Advanced Boot Options
+ Log Off
+ Lock
+ Sleep
+ Hibernate
+ Index Option
+ Empty Recycle Bin
+ Open Recycle Bin
+ Exit
+ Save Settings
+ Restart Flow Launcher"
+ Settings
+ Reload Plugin Data
+ Check For Update
+ Open Log Location
+ Flow Launcher Tips
+ Flow Launcher UserData Folder
+
+
Shutdown Computer
Restart Computer
Restart the computer with Advanced Boot Options for Safe and Debugging modes, as well as other options
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Main.cs b/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
index 43f293f74..293fe5869 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
@@ -89,7 +89,7 @@ namespace Flow.Launcher.Plugin.Sys
{
new Result
{
- Title = "Shutdown",
+ Title = context.API.GetTranslation("flowlauncher_plugin_sys_shutdown_computer_cmd"),
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_shutdown_computer"),
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xe7e8"),
IcoPath = "Images\\shutdown.png",
@@ -109,7 +109,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = "Restart",
+ Title = context.API.GetTranslation("flowlauncher_plugin_sys_restart_computer_cmd"),
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_restart_computer"),
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xe777"),
IcoPath = "Images\\restart.png",
@@ -129,7 +129,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = "Restart With Advanced Boot Options",
+ Title = context.API.GetTranslation("flowlauncher_plugin_sys_restart_advanced_cmd"),
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_restart_advanced"),
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xecc5"),
IcoPath = "Images\\restart_advanced.png",
@@ -148,7 +148,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = "Log Off",
+ Title = context.API.GetTranslation("flowlauncher_plugin_sys_log_off_cmd"),
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_log_off"),
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xe77b"),
IcoPath = "Images\\logoff.png",
@@ -167,7 +167,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = "Lock",
+ Title = context.API.GetTranslation("flowlauncher_plugin_sys_lock_cmd"),
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_lock"),
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xe72e"),
IcoPath = "Images\\lock.png",
@@ -179,7 +179,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = "Sleep",
+ Title = context.API.GetTranslation("flowlauncher_plugin_sys_sleep_cmd"),
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_sleep"),
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xec46"),
IcoPath = "Images\\sleep.png",
@@ -187,7 +187,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = "Hibernate",
+ Title = context.API.GetTranslation("flowlauncher_plugin_sys_hibernate_cmd"),
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_hibernate"),
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xe945"),
IcoPath = "Images\\hibernate.png",
@@ -204,7 +204,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = "Index Option",
+ Title = context.API.GetTranslation("flowlauncher_plugin_sys_restart_explorer_cmd"),
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_indexoption"),
IcoPath = "Images\\indexoption.png",
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xe773"),
@@ -219,7 +219,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = "Empty Recycle Bin",
+ Title = context.API.GetTranslation("flowlauncher_plugin_sys_emptyrecyclebin_cmd"),
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_emptyrecyclebin"),
IcoPath = "Images\\recyclebin.png",
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xe74d"),
@@ -242,7 +242,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = "Open Recycle Bin",
+ Title = context.API.GetTranslation("flowlauncher_plugin_sys_openrecyclebin_cmd"),
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_openrecyclebin"),
IcoPath = "Images\\openrecyclebin.png",
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xe74d"),
@@ -257,7 +257,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = "Exit",
+ Title = context.API.GetTranslation("flowlauncher_plugin_sys_exit_cmd"),
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_exit"),
IcoPath = "Images\\app.png",
Action = c =>
@@ -268,7 +268,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = "Save Settings",
+ Title = context.API.GetTranslation("flowlauncher_plugin_sys_save_all_settings_cmd"),
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_save_all_settings"),
IcoPath = "Images\\app.png",
Action = c =>
@@ -281,7 +281,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = "Restart Flow Launcher",
+ Title = context.API.GetTranslation("flowlauncher_plugin_sys_restart_cmd"),
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_restart"),
IcoPath = "Images\\app.png",
Action = c =>
@@ -292,7 +292,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = "Settings",
+ Title = context.API.GetTranslation("flowlauncher_plugin_sys_setting_cmd"),
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_setting"),
IcoPath = "Images\\app.png",
Action = c =>
@@ -303,7 +303,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = "Reload Plugin Data",
+ Title = context.API.GetTranslation("flowlauncher_plugin_sys_reload_plugin_data_cmd"),
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_reload_plugin_data"),
IcoPath = "Images\\app.png",
Action = c =>
@@ -323,7 +323,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = "Check For Update",
+ Title = context.API.GetTranslation("flowlauncher_plugin_sys_check_for_update_cmd"),
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_check_for_update"),
IcoPath = "Images\\checkupdate.png",
Action = c =>
@@ -335,7 +335,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = "Open Log Location",
+ Title = context.API.GetTranslation("flowlauncher_plugin_sys_open_log_location_cmd"),
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_open_log_location"),
IcoPath = "Images\\app.png",
Action = c =>
@@ -347,7 +347,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = "Flow Launcher Tips",
+ Title = context.API.GetTranslation("flowlauncher_plugin_sys_open_docs_tips_cmd"),
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_open_docs_tips"),
IcoPath = "Images\\app.png",
Action = c =>
@@ -358,7 +358,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = "Flow Launcher UserData Folder",
+ Title = context.API.GetTranslation("flowlauncher_plugin_sys_open_userdata_location_cmd"),
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_open_userdata_location"),
IcoPath = "Images\\app.png",
Action = c =>
From 570b2029e625e7edd7bcfa4648e106bbb08d45e6 Mon Sep 17 00:00:00 2001
From: Florian Grabmeier
Date: Wed, 3 Jan 2024 10:05:39 +0100
Subject: [PATCH 003/390] Update wrong key translation
Signed-off-by: Florian Grabmeier
---
Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml
index 7399a55e7..446290347 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml
@@ -10,7 +10,7 @@
Shutdown
Restart
Restart With Advanced Boot Options
- Log Off
+ Log Off/Sign Out
Lock
Sleep
Hibernate
From d5622367ccb82485e35e7956bc048dd7ae933f4f Mon Sep 17 00:00:00 2001
From: Hongtao Zhang
Date: Sat, 13 Jan 2024 23:49:08 -0600
Subject: [PATCH 004/390] ignore null datetimes for pluginstoreitem
---
.../ExternalPlugins/CommunityPluginSource.cs | 19 +++++++++++++++----
.../ExternalPlugins/UserPlugin.cs | 4 ++--
2 files changed, 17 insertions(+), 6 deletions(-)
diff --git a/Flow.Launcher.Core/ExternalPlugins/CommunityPluginSource.cs b/Flow.Launcher.Core/ExternalPlugins/CommunityPluginSource.cs
index d3ee4695c..68be746f2 100644
--- a/Flow.Launcher.Core/ExternalPlugins/CommunityPluginSource.cs
+++ b/Flow.Launcher.Core/ExternalPlugins/CommunityPluginSource.cs
@@ -5,6 +5,8 @@ using System.Collections.Generic;
using System.Net;
using System.Net.Http;
using System.Net.Http.Json;
+using System.Text.Json;
+using System.Text.Json.Serialization;
using System.Threading;
using System.Threading.Tasks;
@@ -16,6 +18,11 @@ namespace Flow.Launcher.Core.ExternalPlugins
private List plugins = new();
+ private static JsonSerializerOptions PluginStoreItemSerializationOption = new JsonSerializerOptions()
+ {
+ DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault
+ };
+
///
/// Fetch and deserialize the contents of a plugins.json file found at .
/// We use conditional http requests to keep repeat requests fast.
@@ -32,12 +39,15 @@ namespace Flow.Launcher.Core.ExternalPlugins
request.Headers.Add("If-None-Match", latestEtag);
- using var response = await Http.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, token).ConfigureAwait(false);
+ using var response = await Http.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, token)
+ .ConfigureAwait(false);
if (response.StatusCode == HttpStatusCode.OK)
{
- this.plugins = await response.Content.ReadFromJsonAsync>(cancellationToken: token).ConfigureAwait(false);
- this.latestEtag = response.Headers.ETag.Tag;
+ this.plugins = await response.Content
+ .ReadFromJsonAsync>(PluginStoreItemSerializationOption, cancellationToken: token)
+ .ConfigureAwait(false);
+ this.latestEtag = response.Headers.ETag?.Tag;
Log.Info(nameof(CommunityPluginSource), $"Loaded {this.plugins.Count} plugins from {ManifestFileUrl}");
return this.plugins;
@@ -49,7 +59,8 @@ namespace Flow.Launcher.Core.ExternalPlugins
}
else
{
- Log.Warn(nameof(CommunityPluginSource), $"Failed to load resource {ManifestFileUrl} with response {response.StatusCode}");
+ Log.Warn(nameof(CommunityPluginSource),
+ $"Failed to load resource {ManifestFileUrl} with response {response.StatusCode}");
throw new Exception($"Failed to load resource {ManifestFileUrl} with response {response.StatusCode}");
}
}
diff --git a/Flow.Launcher.Core/ExternalPlugins/UserPlugin.cs b/Flow.Launcher.Core/ExternalPlugins/UserPlugin.cs
index bb1279b2c..64c4cd627 100644
--- a/Flow.Launcher.Core/ExternalPlugins/UserPlugin.cs
+++ b/Flow.Launcher.Core/ExternalPlugins/UserPlugin.cs
@@ -14,8 +14,8 @@ namespace Flow.Launcher.Core.ExternalPlugins
public string UrlDownload { get; set; }
public string UrlSourceCode { get; set; }
public string IcoPath { get; set; }
- public DateTime LatestReleaseDate { get; set; }
- public DateTime DateAdded { get; set; }
+ public DateTime? LatestReleaseDate { get; set; }
+ public DateTime? DateAdded { get; set; }
}
}
From ad22a5340e0b33b86ed84656ba825de6b974f9b4 Mon Sep 17 00:00:00 2001
From: NoPlagiarism <37241775+NoPlagiarism@users.noreply.github.com>
Date: Mon, 15 Jan 2024 17:19:10 +0500
Subject: [PATCH 005/390] [no ci] README: fix appwrite logo, md improvements
---
README.md | 84 ++++++++++++++++++++++++++++---------------------------
1 file changed, 43 insertions(+), 41 deletions(-)
diff --git a/README.md b/README.md
index 2f28495c3..bb1144e66 100644
--- a/README.md
+++ b/README.md
@@ -22,9 +22,10 @@ Dedicated to making your workflow flow more seamless. Search everything from app
-
## 🎅 New Features🤶
+
### Preview Panel
+
- Use the F1 key to open/hide the preview panel.
@@ -34,6 +35,7 @@ Dedicated to making your workflow flow more seamless. Search everything from app
- This feature is currently in its early stages.
### Everything Plugin Merged Into Explorer
+
- Switch easily between Everything and Windows Search to take advantage of both search engines (remember to remove existing Everything plugin).
@@ -46,6 +48,7 @@ Dedicated to making your workflow flow more seamless. Search everything from app
- Display the date and time when the search window is triggered.
### Drag & Drop
+
- Drag an item to Discord or computer location.
@@ -59,24 +62,28 @@ Dedicated to making your workflow flow more seamless. Search everything from app
- New shortcut functionality to set additional action keywords or search terms.
### Improved Program Plugin
+
- PATH is now indexed
- Support for .url files, flow can now search installed steam/epic games.
- Improved UWP indexing.
### Improved Memory Usage
+
- Fixed a memory leak and reduced overall memory usage.
### Improved Plugin / Plugin Store
+
- Search plugins in the Plugin Store and existing plugin tab.
- Categorised sections in Plugin Store to easily see new and updated plugins.
### Improved Non-C# Plugin's Panel Design
+
- The design has been adjusted to align to the overall look and feel of flow.
- Simplified the information displayed on buttons
-🚂Full Changelogs
+🚂[Full Changelogs](https://github.com/Flow-Launcher/Flow.Launcher/releases)
@@ -105,7 +112,7 @@ Dedicated to making your workflow flow more seamless. Search everything from app
> When installing for the first time Windows may raise an issue about security due to code not being signed, if you downloaded from this repo then you are good to continue the set up.
-And you can download early access version.
+And you can download [early access version](https://github.com/Flow-Launcher/Prereleases/releases).
@@ -115,12 +122,10 @@ And you can download
-
- Search for apps, files or file contents.
-
- Support search using environment variable paths.
### Web Searches & URLs
@@ -129,8 +134,6 @@ And you can download
-
-
### Browser Bookmarks
@@ -140,7 +143,7 @@ And you can download
- Provides system related commands. shutdown, lock, settings, etc.
-- System command list
+- [System command list](#system-command-list)
### Calculator
@@ -152,7 +155,6 @@ And you can download
-
- Run batch and PowerShell commands as Administrator or a different user.
- Ctrl+Enter to Run as Administrator.
@@ -168,7 +170,6 @@ And you can download
@@ -224,16 +225,19 @@ And you can download
### [Steam Search](https://github.com/Garulf/Steam-Search)
+
-
### [Clipboard History](https://github.com/liberize/Flow.Launcher.Plugin.ClipboardHistory)
+
### [Home Assistant Commander](https://github.com/Garulf/HA-Commander)
+
### [Colors](https://github.com/Flow-Launcher/Flow.Launcher.Plugin.Color)
@@ -241,49 +245,48 @@ And you can download
### [GitHub](https://github.com/JohnTheGr8/Flow.Plugin.Github)
+
### [Window Walker](https://github.com/taooceros/Flow.Plugin.WindowWalker)
+
-......and more!
+......and [more!](https://flowlauncher.com/docs/#/plugins)
### 🛒 Plugin Store
-
- You can view the full plugin list or quickly install a plugin via the Plugin Store menu inside Settings
- or type `pm` `install`/`uninstall`/`update` + the plugin name in the search window,
-
## ⌨️ Hotkeys
-| Hotkey | Description |
-| ------------------------------------------------------------ | -------------------------------------------- |
-| Alt+ Space | Open search window (default and configurable)|
-| Enter | Execute |
-| Ctrl+Shift+Enter | Run as admin |
-| ↑↓ | Scroll up & down |
-| ←→ | Back to result / Open Context Menu |
-| Ctrl +O , Shift +Enter | Open Context Menu |
-| Tab | Autocomplete |
-| F1 | Toggle Preview Panel (default and configurable)|
-| Esc | Back to results / hide search window |
-| Ctrl +C | Copy the actual folder / file |
-| Ctrl +I | Open flow's settings |
-| Ctrl +R | Run the current query again (refresh results)|
-| F5 | Reload all plugin data |
-| Ctrl + F12 | Toggle Game Mode when in search window |
-| Ctrl + +,- | Quickly change maximum results shown |
-| Ctrl + [,] | Quickly change search window width |
-| Ctrl + H | Open search history |
-| Ctrl + Backspace | Back to previous directory |
-
+| Hotkey | Description |
+| ------------------------------------------------------------------ | ---------------------------------------------- |
+| Alt+ Space | Open search window (default and configurable) |
+| Enter | Execute |
+| Ctrl+Shift+Enter | Run as admin |
+| ↑↓ | Scroll up & down |
+| ←→ | Back to result / Open Context Menu |
+| Ctrl +O , Shift +Enter | Open Context Menu |
+| Tab | Autocomplete |
+| F1 | Toggle Preview Panel (default and configurable)|
+| Esc | Back to results / hide search window |
+| Ctrl +C | Copy the actual folder / file |
+| Ctrl +I | Open flow's settings |
+| Ctrl +R | Run the current query again (refresh results) |
+| F5 | Reload all plugin data |
+| Ctrl + F12 | Toggle Game Mode when in search window |
+| Ctrl + +,- | Quickly change maximum results shown |
+| Ctrl + [,] | Quickly change search window width |
+| Ctrl + H | Open search history |
+| Ctrl + Backspace | Back to previous directory |
## System Command List
@@ -320,7 +323,7 @@ And you can download
-
+
@@ -336,16 +339,15 @@ And you can download
-
-
### Mentions
-- Why I Chose to Support Flow-Launcher - Appwrite
-- Softpedia Editor's Pick
+
+- [Why I Chose to Support Flow-Launcher](https://dev.to/appwrite/appwrite-loves-open-source-why-i-chose-to-support-flow-launcher-54pj) - Appwrite
+- [Softpedia Editor's Pick](https://www.softpedia.com/get/System/Launchers-Shutdown-Tools/Flow-Launcher.shtml)
@@ -377,7 +379,7 @@ Get in touch if you like to join the Flow-Launcher Team and help build this grea
- Install Visual Studio 2022
-- Install .Net 7 SDK
+- Install .Net 7 SDK
- via Visual Studio installer
- via winget `winget install Microsoft.DotNet.SDK.7`
- Manually from [here](https://dotnet.microsoft.com/en-us/download/dotnet/7.0)
From 224dab70a96b75c9de81a47a12b921bced2cb2e3 Mon Sep 17 00:00:00 2001
From: Florian Grabmeier
Date: Mon, 15 Jan 2024 16:16:07 +0100
Subject: [PATCH 006/390] Add dynamic title
Signed-off-by: Florian Grabmeier
---
Plugins/Flow.Launcher.Plugin.Sys/Main.cs | 90 ++++++++++++++++++------
1 file changed, 67 insertions(+), 23 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Main.cs b/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
index 293fe5869..37ea6b7ea 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
@@ -2,11 +2,13 @@
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
+using System.Linq;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Forms;
using System.Windows.Interop;
using Flow.Launcher.Infrastructure;
+using Flow.Launcher.Infrastructure.Logger;
using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Plugin.SharedCommands;
using Application = System.Windows.Application;
@@ -19,6 +21,7 @@ namespace Flow.Launcher.Plugin.Sys
public class Main : IPlugin, ISettingProvider, IPluginI18n
{
private PluginInitContext context;
+ private Dictionary KeywordTitleMappings = new Dictionary();
#region DllImport
@@ -59,6 +62,8 @@ namespace Flow.Launcher.Plugin.Sys
var results = new List();
foreach (var c in commands)
{
+ c.Title = GetDynamicTitle(query, c);
+
var titleMatch = StringMatcher.FuzzySearch(query.Search, c.Title);
var subTitleMatch = StringMatcher.FuzzySearch(query.Search, c.SubTitle);
@@ -77,9 +82,48 @@ namespace Flow.Launcher.Plugin.Sys
return results;
}
+ private string GetDynamicTitle(Query query, Result result)
+ {
+ var pair = KeywordTitleMappings
+ .Where(kvp => kvp.Key == result.Title && kvp.Key != kvp.Value)
+ .FirstOrDefault();
+
+ if (pair.Equals(default))
+ {
+ Log.Error($"Dynamic Title not found for: {result.Title}");
+ return "Title Not Found";
+ }
+
+ var englishTitleMatch = StringMatcher.FuzzySearch(query.Search, pair.Key);
+ var translatedTitleMatch = StringMatcher.FuzzySearch(query.Search, pair.Value);
+
+ return englishTitleMatch.Score >= translatedTitleMatch.Score ? pair.Key : pair.Value;
+ }
+
public void Init(PluginInitContext context)
{
this.context = context;
+ KeywordTitleMappings = new Dictionary{
+ {"Shutdown", context.API.GetTranslation("flowlauncher_plugin_sys_shutdown_computer_cmd")},
+ {"Restart", context.API.GetTranslation("flowlauncher_plugin_sys_restart_computer_cmd")},
+ {"Restart With Advanced Boot Options", context.API.GetTranslation("flowlauncher_plugin_sys_restart_advanced_cmd")},
+ {"Log Off/Sign Out", context.API.GetTranslation("flowlauncher_plugin_sys_log_off_cmd")},
+ {"Lock", context.API.GetTranslation("flowlauncher_plugin_sys_lock_cmd")},
+ {"Sleep", context.API.GetTranslation("flowlauncher_plugin_sys_sleep_cmd")},
+ {"Hibernate", context.API.GetTranslation("flowlauncher_plugin_sys_hibernate_cmd")},
+ {"Index Option", context.API.GetTranslation("flowlauncher_plugin_sys_indexoption_cmd")},
+ {"Empty Recycle Bin", context.API.GetTranslation("flowlauncher_plugin_sys_emptyrecyclebin_cmd")},
+ {"Open Recycle Bin", context.API.GetTranslation("flowlauncher_plugin_sys_openrecyclebin_cmd")},
+ {"Exit", context.API.GetTranslation("flowlauncher_plugin_sys_exit_cmd")},
+ {"Save Settings", context.API.GetTranslation("flowlauncher_plugin_sys_save_all_settings_cmd")},
+ {"Restart Flow Launcher", context.API.GetTranslation("flowlauncher_plugin_sys_restart_cmd")},
+ {"Settings", context.API.GetTranslation("flowlauncher_plugin_sys_setting_cmd")},
+ {"Reload Plugin Data", context.API.GetTranslation("flowlauncher_plugin_sys_reload_plugin_data_cmd")},
+ {"Check For Update", context.API.GetTranslation("flowlauncher_plugin_sys_check_for_update_cmd")},
+ {"Open Log Location", context.API.GetTranslation("flowlauncher_plugin_sys_open_log_location_cmd")},
+ {"Flow Launcher Tips", context.API.GetTranslation("flowlauncher_plugin_sys_open_docs_tips_cmd")},
+ {"Flow Launcher UserData Folder", context.API.GetTranslation("flowlauncher_plugin_sys_open_userdata_location_cmd")}
+ };
}
private List Commands()
@@ -89,7 +133,7 @@ namespace Flow.Launcher.Plugin.Sys
{
new Result
{
- Title = context.API.GetTranslation("flowlauncher_plugin_sys_shutdown_computer_cmd"),
+ Title = "Shutdown",
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_shutdown_computer"),
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xe7e8"),
IcoPath = "Images\\shutdown.png",
@@ -109,7 +153,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = context.API.GetTranslation("flowlauncher_plugin_sys_restart_computer_cmd"),
+ Title = "Restart",
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_restart_computer"),
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xe777"),
IcoPath = "Images\\restart.png",
@@ -129,7 +173,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = context.API.GetTranslation("flowlauncher_plugin_sys_restart_advanced_cmd"),
+ Title = "Restart With Advanced Boot Options",
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_restart_advanced"),
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xecc5"),
IcoPath = "Images\\restart_advanced.png",
@@ -139,7 +183,7 @@ namespace Flow.Launcher.Plugin.Sys
context.API.GetTranslation("flowlauncher_plugin_sys_dlgtext_restart_computer_advanced"),
context.API.GetTranslation("flowlauncher_plugin_sys_restart_computer"),
MessageBoxButton.YesNo, MessageBoxImage.Warning);
-
+
if (result == MessageBoxResult.Yes)
Process.Start("shutdown", "/r /o /t 0");
@@ -148,7 +192,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = context.API.GetTranslation("flowlauncher_plugin_sys_log_off_cmd"),
+ Title = "Log Off/Sign Out",
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_log_off"),
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xe77b"),
IcoPath = "Images\\logoff.png",
@@ -158,7 +202,7 @@ namespace Flow.Launcher.Plugin.Sys
context.API.GetTranslation("flowlauncher_plugin_sys_dlgtext_logoff_computer"),
context.API.GetTranslation("flowlauncher_plugin_sys_log_off"),
MessageBoxButton.YesNo, MessageBoxImage.Warning);
-
+
if (result == MessageBoxResult.Yes)
ExitWindowsEx(EWX_LOGOFF, 0);
@@ -167,7 +211,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = context.API.GetTranslation("flowlauncher_plugin_sys_lock_cmd"),
+ Title = "Lock",
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_lock"),
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xe72e"),
IcoPath = "Images\\lock.png",
@@ -179,7 +223,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = context.API.GetTranslation("flowlauncher_plugin_sys_sleep_cmd"),
+ Title = "Sleep",
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_sleep"),
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xec46"),
IcoPath = "Images\\sleep.png",
@@ -187,7 +231,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = context.API.GetTranslation("flowlauncher_plugin_sys_hibernate_cmd"),
+ Title = "Hibernate",
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_hibernate"),
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xe945"),
IcoPath = "Images\\hibernate.png",
@@ -198,13 +242,13 @@ namespace Flow.Launcher.Plugin.Sys
info.UseShellExecute = true;
ShellCommand.Execute(info);
-
+
return true;
}
},
new Result
{
- Title = context.API.GetTranslation("flowlauncher_plugin_sys_restart_explorer_cmd"),
+ Title = "Index Option",
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_indexoption"),
IcoPath = "Images\\indexoption.png",
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xe773"),
@@ -219,7 +263,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = context.API.GetTranslation("flowlauncher_plugin_sys_emptyrecyclebin_cmd"),
+ Title = "Empty Recycle Bin",
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_emptyrecyclebin"),
IcoPath = "Images\\recyclebin.png",
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xe74d"),
@@ -242,7 +286,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = context.API.GetTranslation("flowlauncher_plugin_sys_openrecyclebin_cmd"),
+ Title = "Open Recycle Bin",
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_openrecyclebin"),
IcoPath = "Images\\openrecyclebin.png",
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xe74d"),
@@ -257,7 +301,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = context.API.GetTranslation("flowlauncher_plugin_sys_exit_cmd"),
+ Title = "Exit",
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_exit"),
IcoPath = "Images\\app.png",
Action = c =>
@@ -268,7 +312,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = context.API.GetTranslation("flowlauncher_plugin_sys_save_all_settings_cmd"),
+ Title = "Save Settings",
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_save_all_settings"),
IcoPath = "Images\\app.png",
Action = c =>
@@ -281,7 +325,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = context.API.GetTranslation("flowlauncher_plugin_sys_restart_cmd"),
+ Title = "Restart Flow Launcher",
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_restart"),
IcoPath = "Images\\app.png",
Action = c =>
@@ -292,7 +336,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = context.API.GetTranslation("flowlauncher_plugin_sys_setting_cmd"),
+ Title = "Settings",
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_setting"),
IcoPath = "Images\\app.png",
Action = c =>
@@ -303,7 +347,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = context.API.GetTranslation("flowlauncher_plugin_sys_reload_plugin_data_cmd"),
+ Title = "Reload Plugin Data",
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_reload_plugin_data"),
IcoPath = "Images\\app.png",
Action = c =>
@@ -317,13 +361,13 @@ namespace Flow.Launcher.Plugin.Sys
context.API.GetTranslation(
"flowlauncher_plugin_sys_dlgtext_all_applicableplugins_reloaded")),
System.Threading.Tasks.TaskScheduler.Current);
-
+
return true;
}
},
new Result
{
- Title = context.API.GetTranslation("flowlauncher_plugin_sys_check_for_update_cmd"),
+ Title = "Check For Update",
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_check_for_update"),
IcoPath = "Images\\checkupdate.png",
Action = c =>
@@ -335,7 +379,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = context.API.GetTranslation("flowlauncher_plugin_sys_open_log_location_cmd"),
+ Title = "Open Log Location",
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_open_log_location"),
IcoPath = "Images\\app.png",
Action = c =>
@@ -347,7 +391,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = context.API.GetTranslation("flowlauncher_plugin_sys_open_docs_tips_cmd"),
+ Title = "Flow Launcher Tips",
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_open_docs_tips"),
IcoPath = "Images\\app.png",
Action = c =>
@@ -358,7 +402,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = context.API.GetTranslation("flowlauncher_plugin_sys_open_userdata_location_cmd"),
+ Title = "Flow Launcher UserData Folder",
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_open_userdata_location"),
IcoPath = "Images\\app.png",
Action = c =>
From 9d5f74ca8f3126d277580905a90aad4605c8e069 Mon Sep 17 00:00:00 2001
From: Florian Grabmeier
Date: Mon, 15 Jan 2024 20:33:53 +0100
Subject: [PATCH 007/390] Add sound effect volume
Signed-off-by: Florian Grabmeier
---
.../UserSettings/Settings.cs | 2 +
Flow.Launcher/Languages/en.xaml | 2 +
Flow.Launcher/MainWindow.xaml.cs | 7 +-
Flow.Launcher/Resources/open.wav | Bin 80116 -> 105884 bytes
Flow.Launcher/SettingWindow.xaml | 78 +++++++++++++++---
.../ViewModel/SettingWindowViewModel.cs | 9 ++
6 files changed, 83 insertions(+), 15 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
index ca1674315..274f88dc6 100644
--- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
+++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
@@ -54,6 +54,8 @@ namespace Flow.Launcher.Infrastructure.UserSettings
public bool UseGlyphIcons { get; set; } = true;
public bool UseAnimation { get; set; } = true;
public bool UseSound { get; set; } = true;
+ public double SoundVolume { get; set; } = 50;
+
public bool UseClock { get; set; } = true;
public bool UseDate { get; set; } = false;
public string TimeFormat { get; set; } = "hh:mm tt";
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index d36a49538..4bc79ccb3 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -156,6 +156,8 @@
Dark
Sound Effect
Play a small sound when the search window opens
+ Sound Effect Volume
+ Adjust the volume of the sound effect
Animation
Use Animation in UI
Animation Speed
diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs
index 3a914d488..70765c1dc 100644
--- a/Flow.Launcher/MainWindow.xaml.cs
+++ b/Flow.Launcher/MainWindow.xaml.cs
@@ -23,8 +23,7 @@ using System.Windows.Threading;
using System.Windows.Data;
using ModernWpf.Controls;
using Key = System.Windows.Input.Key;
-using System.Media;
-using static Flow.Launcher.ViewModel.SettingWindowViewModel;
+using System.Windows.Media;
namespace Flow.Launcher
{
@@ -39,7 +38,7 @@ namespace Flow.Launcher
private ContextMenu contextMenu;
private MainViewModel _viewModel;
private bool _animating;
- SoundPlayer animationSound = new SoundPlayer(AppDomain.CurrentDomain.BaseDirectory + "Resources\\open.wav");
+ MediaPlayer animationSound = new MediaPlayer();
#endregion
@@ -113,6 +112,8 @@ namespace Flow.Launcher
{
if (_settings.UseSound)
{
+ animationSound.Open(new Uri(AppDomain.CurrentDomain.BaseDirectory + "Resources\\open.wav"));
+ animationSound.Volume = _settings.SoundVolume / 100.0;
animationSound.Play();
}
UpdatePosition();
diff --git a/Flow.Launcher/Resources/open.wav b/Flow.Launcher/Resources/open.wav
index 4f13724f7093ad2d66c595cf8a672b6dabf008ba..0f692c75b377aec4a8682fc978d5d821ee39247b 100644
GIT binary patch
literal 105884
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