Make GetPluginsForInterface private & Code quality

This commit is contained in:
Jack251970 2025-07-03 20:45:20 +08:00
parent b440aaab37
commit d3f5274b24
3 changed files with 37 additions and 22 deletions

View file

@ -24,9 +24,6 @@ namespace Flow.Launcher.Core.Plugin
{ {
private static readonly string ClassName = nameof(PluginManager); private static readonly string ClassName = nameof(PluginManager);
private static IEnumerable<PluginPair> _contextMenuPlugins;
private static IEnumerable<PluginPair> _homePlugins;
public static List<PluginPair> AllPlugins { get; private set; } public static List<PluginPair> AllPlugins { get; private set; }
public static readonly HashSet<PluginPair> GlobalPlugins = new(); public static readonly HashSet<PluginPair> GlobalPlugins = new();
public static readonly Dictionary<string, PluginPair> NonGlobalPlugins = new(); public static readonly Dictionary<string, PluginPair> NonGlobalPlugins = new();
@ -36,8 +33,12 @@ namespace Flow.Launcher.Core.Plugin
private static IPublicAPI API => api ??= Ioc.Default.GetRequiredService<IPublicAPI>(); private static IPublicAPI API => api ??= Ioc.Default.GetRequiredService<IPublicAPI>();
private static PluginsSettings Settings; private static PluginsSettings Settings;
private static List<PluginMetadata> _metadatas; private static readonly List<string> ModifiedPlugins = new();
private static readonly List<string> _modifiedPlugins = new();
private static IEnumerable<PluginPair> _contextMenuPlugins;
private static IEnumerable<PluginPair> _homePlugins;
private static IEnumerable<PluginPair> _resultUpdatePlugin;
private static IEnumerable<PluginPair> _translationPlugins;
/// <summary> /// <summary>
/// Directories that will hold Flow Launcher plugin directory /// Directories that will hold Flow Launcher plugin directory
@ -173,12 +174,18 @@ namespace Flow.Launcher.Core.Plugin
/// <param name="settings"></param> /// <param name="settings"></param>
public static void LoadPlugins(PluginsSettings settings) public static void LoadPlugins(PluginsSettings settings)
{ {
_metadatas = PluginConfig.Parse(Directories); var metadatas = PluginConfig.Parse(Directories);
Settings = settings; Settings = settings;
Settings.UpdatePluginSettings(_metadatas); Settings.UpdatePluginSettings(metadatas);
AllPlugins = PluginsLoader.Plugins(_metadatas, Settings); AllPlugins = PluginsLoader.Plugins(metadatas, Settings);
// Since dotnet plugins need to get assembly name first, we should update plugin directory after loading plugins // Since dotnet plugins need to get assembly name first, we should update plugin directory after loading plugins
UpdatePluginDirectory(_metadatas); UpdatePluginDirectory(metadatas);
// Initialize plugin enumerable after all plugins are initialized
_contextMenuPlugins = GetPluginsForInterface<IContextMenu>();
_homePlugins = GetPluginsForInterface<IAsyncHomeQuery>();
_resultUpdatePlugin = GetPluginsForInterface<IResultUpdated>();
_translationPlugins = GetPluginsForInterface<IPluginI18n>();
} }
private static void UpdatePluginDirectory(List<PluginMetadata> metadatas) private static void UpdatePluginDirectory(List<PluginMetadata> metadatas)
@ -248,9 +255,6 @@ namespace Flow.Launcher.Core.Plugin
await Task.WhenAll(InitTasks); await Task.WhenAll(InitTasks);
_contextMenuPlugins = GetPluginsForInterface<IContextMenu>();
_homePlugins = GetPluginsForInterface<IAsyncHomeQuery>();
foreach (var plugin in AllPlugins) foreach (var plugin in AllPlugins)
{ {
// set distinct on each plugin's action keywords helps only firing global(*) and action keywords once where a plugin // set distinct on each plugin's action keywords helps only firing global(*) and action keywords once where a plugin
@ -409,16 +413,26 @@ namespace Flow.Launcher.Core.Plugin
return AllPlugins.FirstOrDefault(o => o.Metadata.ID == id); return AllPlugins.FirstOrDefault(o => o.Metadata.ID == id);
} }
public static IEnumerable<PluginPair> GetPluginsForInterface<T>() where T : IFeatures private static IEnumerable<PluginPair> GetPluginsForInterface<T>() where T : IFeatures
{ {
// Handle scenario where this is called before all plugins are instantiated, e.g. language change on startup // Handle scenario where this is called before all plugins are instantiated, e.g. language change on startup
return AllPlugins?.Where(p => p.Plugin is T) ?? Array.Empty<PluginPair>(); return AllPlugins?.Where(p => p.Plugin is T) ?? Array.Empty<PluginPair>();
} }
public static IList<PluginPair> GetResultUpdatePlugin()
{
return _resultUpdatePlugin.Where(p => !PluginModified(p.Metadata.ID)).ToList();
}
public static IList<PluginPair> GetTranslationPlugins()
{
return _translationPlugins.Where(p => !PluginModified(p.Metadata.ID)).ToList();
}
public static List<Result> GetContextMenusForPlugin(Result result) public static List<Result> GetContextMenusForPlugin(Result result)
{ {
var results = new List<Result>(); var results = new List<Result>();
var pluginPair = _contextMenuPlugins.FirstOrDefault(o => o.Metadata.ID == result.PluginID); var pluginPair = _contextMenuPlugins.Where(p => !PluginModified(p.Metadata.ID)).FirstOrDefault(o => o.Metadata.ID == result.PluginID);
if (pluginPair != null) if (pluginPair != null)
{ {
var plugin = (IContextMenu)pluginPair.Plugin; var plugin = (IContextMenu)pluginPair.Plugin;
@ -446,7 +460,7 @@ namespace Flow.Launcher.Core.Plugin
public static bool IsHomePlugin(string id) public static bool IsHomePlugin(string id)
{ {
return _homePlugins.Any(p => p.Metadata.ID == id); return _homePlugins.Where(p => !PluginModified(p.Metadata.ID)).Any(p => p.Metadata.ID == id);
} }
public static bool ActionKeywordRegistered(string actionKeyword) public static bool ActionKeywordRegistered(string actionKeyword)
@ -544,14 +558,14 @@ namespace Flow.Launcher.Core.Plugin
public static bool PluginModified(string id) public static bool PluginModified(string id)
{ {
return _modifiedPlugins.Contains(id); return ModifiedPlugins.Contains(id);
} }
public static async Task UpdatePluginAsync(PluginMetadata existingVersion, UserPlugin newVersion, string zipFilePath) public static async Task UpdatePluginAsync(PluginMetadata existingVersion, UserPlugin newVersion, string zipFilePath)
{ {
InstallPlugin(newVersion, zipFilePath, checkModified:false); InstallPlugin(newVersion, zipFilePath, checkModified:false);
await UninstallPluginAsync(existingVersion, removePluginFromSettings:false, removePluginSettings:false, checkModified: false); await UninstallPluginAsync(existingVersion, removePluginFromSettings:false, removePluginSettings:false, checkModified: false);
_modifiedPlugins.Add(existingVersion.ID); ModifiedPlugins.Add(existingVersion.ID);
} }
public static void InstallPlugin(UserPlugin plugin, string zipFilePath) public static void InstallPlugin(UserPlugin plugin, string zipFilePath)
@ -638,7 +652,7 @@ namespace Flow.Launcher.Core.Plugin
if (checkModified) if (checkModified)
{ {
_modifiedPlugins.Add(plugin.ID); ModifiedPlugins.Add(plugin.ID);
} }
} }
@ -707,7 +721,7 @@ namespace Flow.Launcher.Core.Plugin
if (checkModified) if (checkModified)
{ {
_modifiedPlugins.Add(plugin.ID); ModifiedPlugins.Add(plugin.ID);
} }
} }

View file

@ -74,7 +74,7 @@ namespace Flow.Launcher.Core.Resource
private void AddPluginLanguageDirectories() private void AddPluginLanguageDirectories()
{ {
foreach (var plugin in PluginManager.GetPluginsForInterface<IPluginI18n>()) foreach (var plugin in PluginManager.GetTranslationPlugins())
{ {
var location = Assembly.GetAssembly(plugin.Plugin.GetType()).Location; var location = Assembly.GetAssembly(plugin.Plugin.GetType()).Location;
var dir = Path.GetDirectoryName(location); var dir = Path.GetDirectoryName(location);
@ -278,7 +278,8 @@ namespace Flow.Launcher.Core.Resource
private void UpdatePluginMetadataTranslations() private void UpdatePluginMetadataTranslations()
{ {
foreach (var p in PluginManager.GetPluginsForInterface<IPluginI18n>()) // Update plugin metadata name & description
foreach (var p in PluginManager.GetTranslationPlugins())
{ {
if (p.Plugin is not IPluginI18n pluginI18N) return; if (p.Plugin is not IPluginI18n pluginI18N) return;
try try

View file

@ -260,7 +260,7 @@ namespace Flow.Launcher.ViewModel
public void RegisterResultsUpdatedEvent() public void RegisterResultsUpdatedEvent()
{ {
foreach (var pair in PluginManager.GetPluginsForInterface<IResultUpdated>()) foreach (var pair in PluginManager.GetResultUpdatePlugin())
{ {
var plugin = (IResultUpdated)pair.Plugin; var plugin = (IResultUpdated)pair.Plugin;
plugin.ResultsUpdated += (s, e) => plugin.ResultsUpdated += (s, e) =>