Skip to content

Commit c23eb50

Browse files
authored
Merge branch 'dev' into plugin_store_item_vm_null
2 parents 052bbb9 + 4fcc12d commit c23eb50

File tree

6 files changed

+82
-21
lines changed

6 files changed

+82
-21
lines changed

Flow.Launcher.Core/Plugin/PluginManager.cs

Lines changed: 38 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,6 @@ public static class PluginManager
2424
{
2525
private static readonly string ClassName = nameof(PluginManager);
2626

27-
private static IEnumerable<PluginPair> _contextMenuPlugins;
28-
private static IEnumerable<PluginPair> _homePlugins;
29-
3027
public static List<PluginPair> AllPlugins { get; private set; }
3128
public static readonly HashSet<PluginPair> GlobalPlugins = new();
3229
public static readonly Dictionary<string, PluginPair> NonGlobalPlugins = new();
@@ -36,8 +33,12 @@ public static class PluginManager
3633
private static IPublicAPI API => api ??= Ioc.Default.GetRequiredService<IPublicAPI>();
3734

3835
private static PluginsSettings Settings;
39-
private static List<PluginMetadata> _metadatas;
40-
private static readonly List<string> _modifiedPlugins = new();
36+
private static readonly ConcurrentBag<string> ModifiedPlugins = new();
37+
38+
private static IEnumerable<PluginPair> _contextMenuPlugins;
39+
private static IEnumerable<PluginPair> _homePlugins;
40+
private static IEnumerable<PluginPair> _resultUpdatePlugin;
41+
private static IEnumerable<PluginPair> _translationPlugins;
4142

4243
/// <summary>
4344
/// Directories that will hold Flow Launcher plugin directory
@@ -173,12 +174,18 @@ static PluginManager()
173174
/// <param name="settings"></param>
174175
public static void LoadPlugins(PluginsSettings settings)
175176
{
176-
_metadatas = PluginConfig.Parse(Directories);
177+
var metadatas = PluginConfig.Parse(Directories);
177178
Settings = settings;
178-
Settings.UpdatePluginSettings(_metadatas);
179-
AllPlugins = PluginsLoader.Plugins(_metadatas, Settings);
179+
Settings.UpdatePluginSettings(metadatas);
180+
AllPlugins = PluginsLoader.Plugins(metadatas, Settings);
180181
// Since dotnet plugins need to get assembly name first, we should update plugin directory after loading plugins
181-
UpdatePluginDirectory(_metadatas);
182+
UpdatePluginDirectory(metadatas);
183+
184+
// Initialize plugin enumerable after all plugins are initialized
185+
_contextMenuPlugins = GetPluginsForInterface<IContextMenu>();
186+
_homePlugins = GetPluginsForInterface<IAsyncHomeQuery>();
187+
_resultUpdatePlugin = GetPluginsForInterface<IResultUpdated>();
188+
_translationPlugins = GetPluginsForInterface<IPluginI18n>();
182189
}
183190

184191
private static void UpdatePluginDirectory(List<PluginMetadata> metadatas)
@@ -248,9 +255,6 @@ public static async Task InitializePluginsAsync()
248255

249256
await Task.WhenAll(InitTasks);
250257

251-
_contextMenuPlugins = GetPluginsForInterface<IContextMenu>();
252-
_homePlugins = GetPluginsForInterface<IAsyncHomeQuery>();
253-
254258
foreach (var plugin in AllPlugins)
255259
{
256260
// set distinct on each plugin's action keywords helps only firing global(*) and action keywords once where a plugin
@@ -409,16 +413,26 @@ public static PluginPair GetPluginForId(string id)
409413
return AllPlugins.FirstOrDefault(o => o.Metadata.ID == id);
410414
}
411415

412-
public static IEnumerable<PluginPair> GetPluginsForInterface<T>() where T : IFeatures
416+
private static IEnumerable<PluginPair> GetPluginsForInterface<T>() where T : IFeatures
413417
{
414418
// Handle scenario where this is called before all plugins are instantiated, e.g. language change on startup
415419
return AllPlugins?.Where(p => p.Plugin is T) ?? Array.Empty<PluginPair>();
416420
}
417421

422+
public static IList<PluginPair> GetResultUpdatePlugin()
423+
{
424+
return _resultUpdatePlugin.Where(p => !PluginModified(p.Metadata.ID)).ToList();
425+
}
426+
427+
public static IList<PluginPair> GetTranslationPlugins()
428+
{
429+
return _translationPlugins.Where(p => !PluginModified(p.Metadata.ID)).ToList();
430+
}
431+
418432
public static List<Result> GetContextMenusForPlugin(Result result)
419433
{
420434
var results = new List<Result>();
421-
var pluginPair = _contextMenuPlugins.FirstOrDefault(o => o.Metadata.ID == result.PluginID);
435+
var pluginPair = _contextMenuPlugins.Where(p => !PluginModified(p.Metadata.ID)).FirstOrDefault(o => o.Metadata.ID == result.PluginID);
422436
if (pluginPair != null)
423437
{
424438
var plugin = (IContextMenu)pluginPair.Plugin;
@@ -446,7 +460,7 @@ public static List<Result> GetContextMenusForPlugin(Result result)
446460

447461
public static bool IsHomePlugin(string id)
448462
{
449-
return _homePlugins.Any(p => p.Metadata.ID == id);
463+
return _homePlugins.Where(p => !PluginModified(p.Metadata.ID)).Any(p => p.Metadata.ID == id);
450464
}
451465

452466
public static bool ActionKeywordRegistered(string actionKeyword)
@@ -544,7 +558,7 @@ private static bool SameOrLesserPluginVersionExists(string metadataPath)
544558

545559
public static bool PluginModified(string id)
546560
{
547-
return _modifiedPlugins.Contains(id);
561+
return ModifiedPlugins.Contains(id);
548562
}
549563

550564
public static async Task<bool> UpdatePluginAsync(PluginMetadata existingVersion, UserPlugin newVersion, string zipFilePath)
@@ -655,7 +669,7 @@ internal static bool InstallPlugin(UserPlugin plugin, string zipFilePath, bool c
655669

656670
if (checkModified)
657671
{
658-
_modifiedPlugins.Add(plugin.ID);
672+
ModifiedPlugins.Add(plugin.ID);
659673
}
660674

661675
return true;
@@ -721,14 +735,20 @@ internal static async Task<bool> UninstallPluginAsync(PluginMetadata plugin, boo
721735
}
722736
Settings.RemovePluginSettings(plugin.ID);
723737
AllPlugins.RemoveAll(p => p.Metadata.ID == plugin.ID);
738+
GlobalPlugins.RemoveWhere(p => p.Metadata.ID == plugin.ID);
739+
var keysToRemove = NonGlobalPlugins.Where(p => p.Value.Metadata.ID == plugin.ID).Select(p => p.Key).ToList();
740+
foreach (var key in keysToRemove)
741+
{
742+
NonGlobalPlugins.Remove(key);
743+
}
724744
}
725745

726746
// Marked for deletion. Will be deleted on next start up
727747
using var _ = File.CreateText(Path.Combine(plugin.PluginDirectory, "NeedDelete.txt"));
728748

729749
if (checkModified)
730750
{
731-
_modifiedPlugins.Add(plugin.ID);
751+
ModifiedPlugins.Add(plugin.ID);
732752
}
733753

734754
return true;

Flow.Launcher.Core/Resource/Internationalization.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public static void InitSystemLanguageCode()
7474

7575
private void AddPluginLanguageDirectories()
7676
{
77-
foreach (var plugin in PluginManager.GetPluginsForInterface<IPluginI18n>())
77+
foreach (var plugin in PluginManager.GetTranslationPlugins())
7878
{
7979
var location = Assembly.GetAssembly(plugin.Plugin.GetType()).Location;
8080
var dir = Path.GetDirectoryName(location);
@@ -278,7 +278,8 @@ public static string GetTranslation(string key)
278278

279279
private void UpdatePluginMetadataTranslations()
280280
{
281-
foreach (var p in PluginManager.GetPluginsForInterface<IPluginI18n>())
281+
// Update plugin metadata name & description
282+
foreach (var p in PluginManager.GetTranslationPlugins())
282283
{
283284
if (p.Plugin is not IPluginI18n pluginI18N) return;
284285
try

Flow.Launcher.Infrastructure/Win32Helper.cs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -791,5 +791,41 @@ public static unsafe void OpenFolderAndSelectFile(string filePath)
791791
}
792792

793793
#endregion
794+
795+
#region Win32 Dark Mode
796+
797+
/*
798+
* Inspired by https://github.com/ysc3839/win32-darkmode
799+
*/
800+
801+
[DllImport("uxtheme.dll", EntryPoint = "#135", SetLastError = true)]
802+
private static extern int SetPreferredAppMode(int appMode);
803+
804+
public static void EnableWin32DarkMode(string colorScheme)
805+
{
806+
try
807+
{
808+
// Undocumented API from Windows 10 1809
809+
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows) &&
810+
Environment.OSVersion.Version.Build >= 17763)
811+
{
812+
var flag = colorScheme switch
813+
{
814+
Constant.Light => 3, // ForceLight
815+
Constant.Dark => 2, // ForceDark
816+
Constant.System => 1, // AllowDark
817+
_ => 0 // Default
818+
};
819+
_ = SetPreferredAppMode(flag);
820+
}
821+
822+
}
823+
catch
824+
{
825+
// Ignore errors on unsupported OS
826+
}
827+
}
828+
829+
#endregion
794830
}
795831
}

Flow.Launcher/App.xaml.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,9 @@ await API.StopwatchLogInfoAsync(ClassName, "Startup cost", async () =>
188188

189189
Notification.Install();
190190

191+
// Enable Win32 dark mode if the system is in dark mode before creating all windows
192+
Win32Helper.EnableWin32DarkMode(_settings.ColorScheme);
193+
191194
Ioc.Default.GetRequiredService<Portable>().PreStartCleanUpAfterPortabilityUpdate();
192195

193196
API.LogInfo(ClassName, "Begin Flow Launcher startup ----------------------------------------------------");

Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ public string ColorScheme
136136
};
137137
Settings.ColorScheme = value;
138138
_ = _theme.RefreshFrameAsync();
139+
Win32Helper.EnableWin32DarkMode(value);
139140
}
140141
}
141142

Flow.Launcher/ViewModel/MainViewModel.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ void continueAction(Task t)
273273

274274
public void RegisterResultsUpdatedEvent()
275275
{
276-
foreach (var pair in PluginManager.GetPluginsForInterface<IResultUpdated>())
276+
foreach (var pair in PluginManager.GetResultUpdatePlugin())
277277
{
278278
var plugin = (IResultUpdated)pair.Plugin;
279279
plugin.ResultsUpdated += (s, e) =>

0 commit comments

Comments
 (0)