Support multiple action keywords

This commit is contained in:
Jack251970 2025-02-21 12:59:56 +08:00
parent e1f1b97b7e
commit abfeee1423
4 changed files with 39 additions and 16 deletions

View file

@ -340,7 +340,12 @@ namespace Flow.Launcher.Core.Plugin
return results; return results;
} }
public static bool ActionKeywordRegistered(string actionKeyword) public static bool ActionKeywordRegistered(IReadOnlyList<string> actionKeywords)
{
return actionKeywords.Any(ActionKeywordRegistered);
}
private static bool ActionKeywordRegistered(string actionKeyword)
{ {
// this method is only checking for action keywords (defined as not '*') registration // this method is only checking for action keywords (defined as not '*') registration
// hence the actionKeyword != Query.GlobalPluginWildcardSign logic // hence the actionKeyword != Query.GlobalPluginWildcardSign logic
@ -385,19 +390,31 @@ namespace Flow.Launcher.Core.Plugin
if (oldActionkeyword != Query.GlobalPluginWildcardSign) if (oldActionkeyword != Query.GlobalPluginWildcardSign)
NonGlobalPlugins.Remove(oldActionkeyword); NonGlobalPlugins.Remove(oldActionkeyword);
plugin.Metadata.ActionKeywords.Remove(oldActionkeyword); plugin.Metadata.ActionKeywords.Remove(oldActionkeyword);
} }
public static void ReplaceActionKeyword(string id, string oldActionKeyword, string newActionKeyword) public static void ReplaceActionKeyword(string id, IReadOnlyList<string> oldActionKeyword, IReadOnlyList<string> newActionKeyword)
{ {
if (oldActionKeyword != newActionKeyword) if (CheckActionKeywordChanged(oldActionKeyword, newActionKeyword))
{ {
AddActionKeyword(id, newActionKeyword); foreach (var actionKeyword in newActionKeyword)
RemoveActionKeyword(id, oldActionKeyword); {
AddActionKeyword(id, actionKeyword);
}
foreach (var actionKeyword in oldActionKeyword)
{
RemoveActionKeyword(id, actionKeyword);
}
} }
} }
private static bool CheckActionKeywordChanged(IReadOnlyList<string> oldActionKeyword, IReadOnlyList<string> newActionKeyword)
{
if (oldActionKeyword.Count != newActionKeyword.Count)
return true;
return oldActionKeyword.Where((t, i) => t != newActionKeyword[i]).Any();
}
private static string GetContainingFolderPathAfterUnzip(string unzippedParentFolderPath) private static string GetContainingFolderPathAfterUnzip(string unzippedParentFolderPath)
{ {
var unzippedFolderCount = Directory.GetDirectories(unzippedParentFolderPath).Length; var unzippedFolderCount = Directory.GetDirectories(unzippedParentFolderPath).Length;

View file

@ -39,9 +39,9 @@ namespace Flow.Launcher.Plugin
public const string TermSeparator = " "; public const string TermSeparator = " ";
/// <summary> /// <summary>
/// User can set multiple action keywords seperated by ';' /// User can set multiple action keywords seperated by whitespace
/// </summary> /// </summary>
public const string ActionKeywordSeparator = ";"; public const string ActionKeywordSeparator = TermSeparator;
/// <summary> /// <summary>
/// Wildcard action keyword. Plugins using this value will be queried on every search. /// Wildcard action keyword. Plugins using this value will be queried on every search.

View file

@ -3,6 +3,7 @@ using Flow.Launcher.Core.Resource;
using Flow.Launcher.Plugin; using Flow.Launcher.Plugin;
using Flow.Launcher.ViewModel; using Flow.Launcher.ViewModel;
using Flow.Launcher.Core; using Flow.Launcher.Core;
using System.Linq;
namespace Flow.Launcher namespace Flow.Launcher
{ {
@ -32,13 +33,17 @@ namespace Flow.Launcher
private void btnDone_OnClick(object sender, RoutedEventArgs _) private void btnDone_OnClick(object sender, RoutedEventArgs _)
{ {
var oldActionKeyword = plugin.Metadata.ActionKeywords[0]; var oldActionKeywords = plugin.Metadata.ActionKeywords;
var newActionKeyword = tbAction.Text.Trim();
newActionKeyword = newActionKeyword.Length > 0 ? newActionKeyword : "*";
if (!PluginViewModel.IsActionKeywordRegistered(newActionKeyword)) var newActionKeywords = tbAction.Text.Split(Query.ActionKeywordSeparator).ToList();
newActionKeywords.RemoveAll(string.IsNullOrEmpty);
newActionKeywords = newActionKeywords.Distinct().ToList();
newActionKeywords = newActionKeywords.Count > 0 ? newActionKeywords : new() { Query.GlobalPluginWildcardSign };
if (!PluginViewModel.IsActionKeywordRegistered(newActionKeywords))
{ {
pluginViewModel.ChangeActionKeyword(newActionKeyword, oldActionKeyword); pluginViewModel.ChangeActionKeyword(newActionKeywords, oldActionKeywords);
Close(); Close();
} }
else else

View file

@ -8,6 +8,7 @@ using System.Windows.Controls;
using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Input;
using Flow.Launcher.Core.Resource; using Flow.Launcher.Core.Resource;
using Flow.Launcher.Resources.Controls; using Flow.Launcher.Resources.Controls;
using System.Collections.Generic;
namespace Flow.Launcher.ViewModel namespace Flow.Launcher.ViewModel
{ {
@ -109,9 +110,9 @@ namespace Flow.Launcher.ViewModel
public int Priority => PluginPair.Metadata.Priority; public int Priority => PluginPair.Metadata.Priority;
public Infrastructure.UserSettings.Plugin PluginSettingsObject { get; set; } public Infrastructure.UserSettings.Plugin PluginSettingsObject { get; set; }
public void ChangeActionKeyword(string newActionKeyword, string oldActionKeyword) public void ChangeActionKeyword(IReadOnlyList<string> newActionKeywords, IReadOnlyList<string> oldActionKeywords)
{ {
PluginManager.ReplaceActionKeyword(PluginPair.Metadata.ID, oldActionKeyword, newActionKeyword); PluginManager.ReplaceActionKeyword(PluginPair.Metadata.ID, oldActionKeywords, newActionKeywords);
OnPropertyChanged(nameof(ActionKeywordsText)); OnPropertyChanged(nameof(ActionKeywordsText));
} }
@ -150,7 +151,7 @@ namespace Flow.Launcher.ViewModel
PluginManager.API.ShowMainWindow(); PluginManager.API.ShowMainWindow();
} }
public static bool IsActionKeywordRegistered(string newActionKeyword) => PluginManager.ActionKeywordRegistered(newActionKeyword); public static bool IsActionKeywordRegistered(IReadOnlyList<string> newActionKeywords) => PluginManager.ActionKeywordRegistered(newActionKeywords);
[RelayCommand] [RelayCommand]
private void SetActionKeywords() private void SetActionKeywords()