mirror of
https://github.com/Flow-Launcher/Flow.Launcher.git
synced 2026-03-11 08:54:32 +00:00
Implement initialization model for plugin hotkeys
This commit is contained in:
parent
2259d742f8
commit
3231b1d32f
1 changed files with 439 additions and 70 deletions
|
|
@ -26,37 +26,165 @@ internal static class HotKeyMapper
|
|||
private static Settings _settings;
|
||||
private static MainViewModel _mainViewModel;
|
||||
|
||||
private static readonly Dictionary<HotkeyModel, ICommand> _windowHotkeyEvents = new();
|
||||
// Registered hotkeys for ActionContext
|
||||
private static List<RegisteredHotkeyData> _actionContextRegisteredHotkeys;
|
||||
|
||||
#region Initializatin
|
||||
|
||||
internal static void Initialize()
|
||||
{
|
||||
_mainViewModel = Ioc.Default.GetRequiredService<MainViewModel>();
|
||||
_settings = Ioc.Default.GetService<Settings>();
|
||||
|
||||
SetHotkey(_settings.Hotkey, OnToggleHotkey);
|
||||
LoadCustomPluginHotkey();
|
||||
LoadGlobalPluginHotkey();
|
||||
LoadWindowPluginHotkey();
|
||||
InitializeRegisteredHotkeys();
|
||||
|
||||
foreach (var hotkey in _settings.RegisteredHotkeys)
|
||||
{
|
||||
SetHotkey(hotkey);
|
||||
}
|
||||
}
|
||||
|
||||
private static void InitializeRegisteredHotkeys()
|
||||
{
|
||||
// Fixed hotkeys for ActionContext
|
||||
_actionContextRegisteredHotkeys = new List<RegisteredHotkeyData>
|
||||
{
|
||||
new(RegisteredHotkeyType.CtrlShiftEnter, HotkeyType.SearchWindow, "Ctrl+Shift+Enter", "HotkeyCtrlShiftEnterDesc", _mainViewModel.OpenResultCommand),
|
||||
new(RegisteredHotkeyType.CtrlEnter, HotkeyType.SearchWindow, "Ctrl+Enter", "OpenContainFolderHotkey", _mainViewModel.OpenResultCommand),
|
||||
new(RegisteredHotkeyType.AltEnter, HotkeyType.SearchWindow, "Alt+Enter", "HotkeyOpenResult", _mainViewModel.OpenResultCommand),
|
||||
};
|
||||
|
||||
// Fixed hotkeys & Editable hotkeys
|
||||
var list = new List<RegisteredHotkeyData>
|
||||
{
|
||||
// System default window hotkeys
|
||||
new(RegisteredHotkeyType.Up, HotkeyType.SearchWindow, "Up", "HotkeyLeftRightDesc", null),
|
||||
new(RegisteredHotkeyType.Down, HotkeyType.SearchWindow, "Down", "HotkeyLeftRightDesc", null),
|
||||
new(RegisteredHotkeyType.Left, HotkeyType.SearchWindow, "Left", "HotkeyUpDownDesc", null),
|
||||
new(RegisteredHotkeyType.Right, HotkeyType.SearchWindow, "Right", "HotkeyUpDownDesc", null),
|
||||
|
||||
// Flow Launcher window hotkeys
|
||||
new(RegisteredHotkeyType.Esc, HotkeyType.SearchWindow, "Escape", "HotkeyESCDesc", _mainViewModel.EscCommand),
|
||||
new(RegisteredHotkeyType.Reload, HotkeyType.SearchWindow, "F5", "ReloadPluginHotkey", _mainViewModel.ReloadPluginDataCommand),
|
||||
new(RegisteredHotkeyType.SelectFirstResult, HotkeyType.SearchWindow, "Alt+Home", "HotkeySelectFirstResult", _mainViewModel.SelectFirstResultCommand),
|
||||
new(RegisteredHotkeyType.SelectLastResult, HotkeyType.SearchWindow, "Alt+End", "HotkeySelectLastResult", _mainViewModel.SelectLastResultCommand),
|
||||
new(RegisteredHotkeyType.ReQuery, HotkeyType.SearchWindow, "Ctrl+R", "HotkeyRequery", _mainViewModel.ReQueryCommand),
|
||||
new(RegisteredHotkeyType.IncreaseWidth, HotkeyType.SearchWindow, "Ctrl+OemCloseBrackets", "QuickWidthHotkey", _mainViewModel.IncreaseWidthCommand),
|
||||
new(RegisteredHotkeyType.DecreaseWidth, HotkeyType.SearchWindow, "Ctrl+OemOpenBrackets", "QuickWidthHotkey", _mainViewModel.DecreaseWidthCommand),
|
||||
new(RegisteredHotkeyType.IncreaseMaxResult, HotkeyType.SearchWindow, "Ctrl+OemPlus", "QuickHeightHotkey", _mainViewModel.IncreaseMaxResultCommand),
|
||||
new(RegisteredHotkeyType.DecreaseMaxResult, HotkeyType.SearchWindow, "Ctrl+OemMinus", "QuickHeightHotkey", _mainViewModel.DecreaseMaxResultCommand),
|
||||
new(RegisteredHotkeyType.ShiftEnter, HotkeyType.SearchWindow, "Shift+Enter", "OpenContextMenuHotkey", _mainViewModel.LoadContextMenuCommand),
|
||||
new(RegisteredHotkeyType.Enter, HotkeyType.SearchWindow, "Enter", "HotkeyRunDesc", _mainViewModel.OpenResultCommand),
|
||||
new(RegisteredHotkeyType.ToggleGameMode, HotkeyType.SearchWindow, "Ctrl+F12", "ToggleGameModeHotkey", _mainViewModel.ToggleGameModeCommand),
|
||||
new(RegisteredHotkeyType.CopyFilePath, HotkeyType.SearchWindow, "Ctrl+Shift+C", "CopyFilePathHotkey", _mainViewModel.CopyAlternativeCommand),
|
||||
new(RegisteredHotkeyType.OpenResultN1, HotkeyType.SearchWindow, $"{_settings.OpenResultModifiers}+D1", "HotkeyOpenResultN", 1, _mainViewModel.OpenResultCommand, 0),
|
||||
new(RegisteredHotkeyType.OpenResultN2, HotkeyType.SearchWindow, $"{_settings.OpenResultModifiers}+D2", "HotkeyOpenResultN", 2, _mainViewModel.OpenResultCommand, 1),
|
||||
new(RegisteredHotkeyType.OpenResultN3, HotkeyType.SearchWindow, $"{_settings.OpenResultModifiers}+D3", "HotkeyOpenResultN", 3, _mainViewModel.OpenResultCommand, 2),
|
||||
new(RegisteredHotkeyType.OpenResultN4, HotkeyType.SearchWindow, $"{_settings.OpenResultModifiers}+D4", "HotkeyOpenResultN", 4, _mainViewModel.OpenResultCommand, 3),
|
||||
new(RegisteredHotkeyType.OpenResultN5, HotkeyType.SearchWindow, $"{_settings.OpenResultModifiers}+D5", "HotkeyOpenResultN", 5, _mainViewModel.OpenResultCommand, 4),
|
||||
new(RegisteredHotkeyType.OpenResultN6, HotkeyType.SearchWindow, $"{_settings.OpenResultModifiers}+D6", "HotkeyOpenResultN", 6, _mainViewModel.OpenResultCommand, 5),
|
||||
new(RegisteredHotkeyType.OpenResultN7, HotkeyType.SearchWindow, $"{_settings.OpenResultModifiers}+D7", "HotkeyOpenResultN", 7, _mainViewModel.OpenResultCommand, 6),
|
||||
new(RegisteredHotkeyType.OpenResultN8, HotkeyType.SearchWindow, $"{_settings.OpenResultModifiers}+D8", "HotkeyOpenResultN", 8, _mainViewModel.OpenResultCommand, 7),
|
||||
new(RegisteredHotkeyType.OpenResultN9, HotkeyType.SearchWindow, $"{_settings.OpenResultModifiers}+D9", "HotkeyOpenResultN", 9, _mainViewModel.OpenResultCommand, 8),
|
||||
new(RegisteredHotkeyType.OpenResultN10, HotkeyType.SearchWindow, $"{_settings.OpenResultModifiers}+D0", "HotkeyOpenResultN", 10, _mainViewModel.OpenResultCommand, 9),
|
||||
|
||||
// Flow Launcher global hotkeys
|
||||
new(RegisteredHotkeyType.Toggle, HotkeyType.Global, _settings.Hotkey, "flowlauncherHotkey", _mainViewModel.CheckAndToggleFlowLauncherCommand, null, () => _settings.Hotkey = ""),
|
||||
|
||||
// Flow Launcher window hotkeys
|
||||
new(RegisteredHotkeyType.Preview, HotkeyType.SearchWindow, _settings.PreviewHotkey, "previewHotkey", _mainViewModel.TogglePreviewCommand, null, () => _settings.PreviewHotkey = ""),
|
||||
new(RegisteredHotkeyType.AutoComplete, HotkeyType.SearchWindow, _settings.AutoCompleteHotkey, "autoCompleteHotkey", _mainViewModel.AutocompleteQueryCommand, null, () => _settings.AutoCompleteHotkey = ""),
|
||||
new(RegisteredHotkeyType.AutoComplete2, HotkeyType.SearchWindow, _settings.AutoCompleteHotkey2, "autoCompleteHotkey", _mainViewModel.AutocompleteQueryCommand, null, () => _settings.AutoCompleteHotkey2 = ""),
|
||||
new(RegisteredHotkeyType.SelectNextItem, HotkeyType.SearchWindow, _settings.SelectNextItemHotkey, "SelectNextItemHotkey", _mainViewModel.SelectNextItemCommand, null, () => _settings.SelectNextItemHotkey = ""),
|
||||
new(RegisteredHotkeyType.SelectNextItem2, HotkeyType.SearchWindow, _settings.SelectNextItemHotkey2, "SelectNextItemHotkey", _mainViewModel.SelectNextItemCommand, null, () => _settings.SelectNextItemHotkey2 = ""),
|
||||
new(RegisteredHotkeyType.SelectPrevItem, HotkeyType.SearchWindow, _settings.SelectPrevItemHotkey, "SelectPrevItemHotkey", _mainViewModel.SelectPrevItemCommand, null, () => _settings.SelectPrevItemHotkey = ""),
|
||||
new(RegisteredHotkeyType.SelectPrevItem2, HotkeyType.SearchWindow, _settings.SelectPrevItemHotkey2, "SelectPrevItemHotkey", _mainViewModel.SelectPrevItemCommand, null, () => _settings.SelectPrevItemHotkey2 = ""),
|
||||
new(RegisteredHotkeyType.SettingWindow, HotkeyType.SearchWindow, _settings.SettingWindowHotkey, "SettingWindowHotkey", _mainViewModel.OpenSettingCommand, null, () => _settings.SettingWindowHotkey = ""),
|
||||
new(RegisteredHotkeyType.OpenHistory, HotkeyType.SearchWindow, _settings.OpenHistoryHotkey, "OpenHistoryHotkey", _mainViewModel.LoadHistoryCommand, null, () => _settings.OpenHistoryHotkey = ""),
|
||||
new(RegisteredHotkeyType.OpenContextMenu, HotkeyType.SearchWindow, _settings.OpenContextMenuHotkey, "OpenContextMenuHotkey", _mainViewModel.LoadContextMenuCommand, null, () => _settings.OpenContextMenuHotkey = ""),
|
||||
new(RegisteredHotkeyType.SelectNextPage, HotkeyType.SearchWindow, _settings.SelectNextPageHotkey, "SelectNextPageHotkey", _mainViewModel.SelectNextPageCommand, null, () => _settings.SelectNextPageHotkey = ""),
|
||||
new(RegisteredHotkeyType.SelectPrevPage, HotkeyType.SearchWindow, _settings.SelectPrevPageHotkey, "SelectPrevPageHotkey", _mainViewModel.SelectPrevPageCommand, null, () => _settings.SelectPrevPageHotkey = ""),
|
||||
new(RegisteredHotkeyType.CycleHistoryUp, HotkeyType.SearchWindow, _settings.CycleHistoryUpHotkey, "CycleHistoryUpHotkey", _mainViewModel.ReverseHistoryCommand, null, () => _settings.CycleHistoryUpHotkey = ""),
|
||||
new(RegisteredHotkeyType.CycleHistoryDown, HotkeyType.SearchWindow, _settings.CycleHistoryDownHotkey, "CycleHistoryDownHotkey", _mainViewModel.ForwardHistoryCommand, null, () => _settings.CycleHistoryDownHotkey = "")
|
||||
};
|
||||
|
||||
// Custom query global hotkeys
|
||||
if (_settings.CustomPluginHotkeys != null)
|
||||
{
|
||||
foreach (var customPluginHotkey in _settings.CustomPluginHotkeys)
|
||||
{
|
||||
list.Add(new(RegisteredHotkeyType.CustomQuery, HotkeyType.Global, customPluginHotkey.Hotkey, "customQueryHotkey", CustomQueryHotkeyCommand, customPluginHotkey, () => customPluginHotkey.Hotkey = ""));
|
||||
}
|
||||
}
|
||||
|
||||
// Plugin hotkeys
|
||||
// Global plugin hotkeys
|
||||
var pluginHotkeyInfos = PluginManager.GetPluginHotkeyInfo();
|
||||
foreach (var info in pluginHotkeyInfos)
|
||||
{
|
||||
var pluginPair = info.Key;
|
||||
var hotkeyInfo = info.Value;
|
||||
var metadata = pluginPair.Metadata;
|
||||
foreach (var hotkey in hotkeyInfo)
|
||||
{
|
||||
if (hotkey.HotkeyType == HotkeyType.Global && hotkey is GlobalPluginHotkey globalHotkey)
|
||||
{
|
||||
var hotkeyStr = metadata.PluginHotkeys.Find(h => h.Id == hotkey.Id)?.Hotkey ?? hotkey.DefaultHotkey;
|
||||
// TODO: Support removeAction
|
||||
Action removeHotkeyAction = hotkey.Editable ?
|
||||
/*() => metadata.PluginHotkeys.RemoveAll(h => h.Id == hotkey.Id) :*/ null:
|
||||
null;
|
||||
// TODO: Handle pluginGlobalHotkey & get translation from PluginManager
|
||||
list.Add(new(RegisteredHotkeyType.PluginGlobalHotkey, HotkeyType.Global, hotkeyStr, "pluginGlobalHotkey", GlobalPluginHotkeyCommand, new GlobalPluginHotkeyPair(metadata, globalHotkey), () => { }));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Window plugin hotkeys
|
||||
var windowPluginHotkeys = PluginManager.GetWindowPluginHotkeys();
|
||||
foreach (var hotkey in windowPluginHotkeys)
|
||||
{
|
||||
var hotkeyModel = hotkey.Key;
|
||||
var windowHotkeys = hotkey.Value;
|
||||
// TODO: Support removeAction
|
||||
Action removeHotkeysAction = windowHotkeys.All(h => h.SearchWindowPluginHotkey.Editable) ?
|
||||
/*() => hotkeyModel.Metadata.PluginWindowHotkeys.RemoveAll(h => h.SearchWindowPluginHotkey.Editable) :*/ null :
|
||||
null;
|
||||
// TODO: Handle pluginWindowHotkey & get translation from PluginManager
|
||||
list.Add(new(RegisteredHotkeyType.PluginWindowHotkey, HotkeyType.SearchWindow, hotkeyModel, "pluginWindowHotkey", WindowPluginHotkeyCommand, new WindowPluginHotkeyPair(windowHotkeys)));
|
||||
}
|
||||
|
||||
// Add registered hotkeys
|
||||
foreach (var hotkey in list)
|
||||
{
|
||||
_settings.RegisteredHotkeys.Add(hotkey);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
// TODO: Deprecated
|
||||
internal static void OnToggleHotkey(object sender, HotkeyEventArgs args)
|
||||
{
|
||||
if (!_mainViewModel.ShouldIgnoreHotkeys())
|
||||
_mainViewModel.ToggleFlowLauncher();
|
||||
}
|
||||
|
||||
// TODO: Deprecated
|
||||
internal static void OnToggleHotkeyWithChefKeys()
|
||||
{
|
||||
if (!_mainViewModel.ShouldIgnoreHotkeys())
|
||||
_mainViewModel.ToggleFlowLauncher();
|
||||
}
|
||||
|
||||
// TODO: Deprecated
|
||||
private static void SetHotkey(string hotkeyStr, EventHandler<HotkeyEventArgs> action)
|
||||
{
|
||||
var hotkey = new HotkeyModel(hotkeyStr);
|
||||
SetHotkey(hotkey, action);
|
||||
}
|
||||
|
||||
// TODO: Deprecated
|
||||
private static void SetWithChefKeys(string hotkeyStr)
|
||||
{
|
||||
try
|
||||
|
|
@ -76,8 +204,14 @@ internal static class HotKeyMapper
|
|||
}
|
||||
}
|
||||
|
||||
// TODO: Deprecated
|
||||
internal static void SetHotkey(HotkeyModel hotkey, EventHandler<HotkeyEventArgs> action)
|
||||
{
|
||||
if (hotkey.IsEmpty)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
string hotkeyStr = hotkey.ToString();
|
||||
try
|
||||
{
|
||||
|
|
@ -102,6 +236,7 @@ internal static class HotKeyMapper
|
|||
}
|
||||
}
|
||||
|
||||
// TODO: Deprecated
|
||||
internal static void RemoveHotkey(string hotkeyStr)
|
||||
{
|
||||
try
|
||||
|
|
@ -127,26 +262,279 @@ internal static class HotKeyMapper
|
|||
}
|
||||
}
|
||||
|
||||
// TODO: Deprecated
|
||||
private static void RemoveWithChefKeys(string hotkeyStr)
|
||||
{
|
||||
ChefKeysManager.UnregisterHotkey(hotkeyStr);
|
||||
ChefKeysManager.Stop();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Custom Query Hotkeys (Global)
|
||||
/// </summary>
|
||||
internal static void LoadCustomPluginHotkey()
|
||||
{
|
||||
if (_settings.CustomPluginHotkeys == null)
|
||||
return;
|
||||
#region Hotkey Setting
|
||||
|
||||
foreach (CustomPluginHotkey hotkey in _settings.CustomPluginHotkeys)
|
||||
private static void SetHotkey(RegisteredHotkeyData hotkeyData)
|
||||
{
|
||||
if (hotkeyData is null || // Hotkey data is invalid
|
||||
hotkeyData.Hotkey.IsEmpty || // Hotkey is none
|
||||
hotkeyData.Command is null) // No need to set - it is a system command
|
||||
{
|
||||
SetCustomQueryHotkey(hotkey);
|
||||
return;
|
||||
}
|
||||
|
||||
if (hotkeyData.Type == HotkeyType.Global)
|
||||
{
|
||||
SetGlobalHotkey(hotkeyData);
|
||||
}
|
||||
else if (hotkeyData.Type == HotkeyType.SearchWindow)
|
||||
{
|
||||
SetWindowHotkey(hotkeyData);
|
||||
}
|
||||
}
|
||||
|
||||
private static void RemoveHotkey(RegisteredHotkeyData hotkeyData)
|
||||
{
|
||||
if (hotkeyData is null || // Hotkey data is invalid
|
||||
hotkeyData.Hotkey.IsEmpty || // Hotkey is none
|
||||
hotkeyData.Command is null) // No need to set - it is a system command
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (hotkeyData.Type == HotkeyType.Global)
|
||||
{
|
||||
RemoveGlobalHotkey(hotkeyData);
|
||||
}
|
||||
else if (hotkeyData.Type == HotkeyType.SearchWindow)
|
||||
{
|
||||
RemoveWindowHotkey(hotkeyData);
|
||||
}
|
||||
}
|
||||
|
||||
private static void SetGlobalHotkey(RegisteredHotkeyData hotkeyData)
|
||||
{
|
||||
var hotkey = hotkeyData.Hotkey;
|
||||
var hotkeyStr = hotkey.ToString();
|
||||
var hotkeyCommand = hotkeyData.Command;
|
||||
var hotkeyCommandParameter = hotkeyData.CommandParameter;
|
||||
try
|
||||
{
|
||||
if (hotkeyStr == "LWin" || hotkeyStr == "RWin")
|
||||
{
|
||||
SetGlobalHotkeyWithChefKeys(hotkeyData);
|
||||
return;
|
||||
}
|
||||
|
||||
HotkeyManager.Current.AddOrReplace(
|
||||
hotkeyStr, hotkey.CharKey, hotkey.ModifierKeys,
|
||||
(s, e) => hotkeyCommand.Execute(hotkeyCommandParameter));
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
App.API.LogError(ClassName, $"Error registering hotkey {hotkeyStr}: {e.Message} \nStackTrace:{e.StackTrace}");
|
||||
var errorMsg = string.Format(App.API.GetTranslation("registerHotkeyFailed"), hotkeyStr);
|
||||
var errorMsgTitle = App.API.GetTranslation("MessageBoxTitle");
|
||||
App.API.ShowMsgBox(errorMsg, errorMsgTitle);
|
||||
}
|
||||
}
|
||||
|
||||
private static void SetGlobalHotkeyWithChefKeys(RegisteredHotkeyData hotkeyData)
|
||||
{
|
||||
var hotkey = hotkeyData.Hotkey;
|
||||
if (hotkey.IsEmpty)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var hotkeyStr = hotkey.ToString();
|
||||
try
|
||||
{
|
||||
ChefKeysManager.RegisterHotkey(hotkeyStr, hotkeyStr, OnToggleHotkeyWithChefKeys);
|
||||
ChefKeysManager.Start();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
App.API.LogError(ClassName,
|
||||
string.Format("Error registering hotkey: {0} \nStackTrace:{1}",
|
||||
e.Message,
|
||||
e.StackTrace));
|
||||
string errorMsg = string.Format(App.API.GetTranslation("registerHotkeyFailed"), hotkeyStr);
|
||||
string errorMsgTitle = App.API.GetTranslation("MessageBoxTitle");
|
||||
App.API.ShowMsgBox(errorMsg, errorMsgTitle);
|
||||
}
|
||||
}
|
||||
|
||||
private static void SetWindowHotkey(RegisteredHotkeyData hotkeyData)
|
||||
{
|
||||
var hotkey = hotkeyData.Hotkey;
|
||||
var hotkeyCommand = hotkeyData.Command;
|
||||
var hotkeyCommandParameter = hotkeyData.CommandParameter;
|
||||
try
|
||||
{
|
||||
if (Application.Current?.MainWindow is MainWindow window)
|
||||
{
|
||||
// Check if the hotkey already exists
|
||||
var keyGesture = hotkey.ToKeyGesture();
|
||||
var existingBinding = window.InputBindings
|
||||
.OfType<KeyBinding>()
|
||||
.FirstOrDefault(kb =>
|
||||
kb.Gesture is KeyGesture keyGesture1 &&
|
||||
keyGesture.Key == keyGesture1.Key &&
|
||||
keyGesture.Modifiers == keyGesture1.Modifiers);
|
||||
if (existingBinding != null)
|
||||
{
|
||||
throw new InvalidOperationException($"Windows key {hotkey} already exists");
|
||||
}
|
||||
|
||||
// Add the new hotkey binding
|
||||
var keyBinding = new KeyBinding()
|
||||
{
|
||||
Gesture = keyGesture,
|
||||
Command = hotkeyCommand,
|
||||
CommandParameter = hotkeyCommandParameter
|
||||
};
|
||||
window.InputBindings.Add(keyBinding);
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
App.API.LogError(ClassName, $"Error registering window hotkey {hotkey}: {e.Message} \nStackTrace:{e.StackTrace}");
|
||||
var errorMsg = string.Format(App.API.GetTranslation("registerWindowHotkeyFailed"), hotkey);
|
||||
var errorMsgTitle = App.API.GetTranslation("MessageBoxTitle");
|
||||
App.API.ShowMsgBox(errorMsg, errorMsgTitle);
|
||||
}
|
||||
}
|
||||
|
||||
private static void RemoveGlobalHotkey(RegisteredHotkeyData hotkeyData)
|
||||
{
|
||||
var hotkey = hotkeyData.Hotkey;
|
||||
var hotkeyStr = hotkey.ToString();
|
||||
try
|
||||
{
|
||||
if (hotkeyStr == "LWin" || hotkeyStr == "RWin")
|
||||
{
|
||||
RemoveGlobalHotkeyWithChefKeys(hotkeyData);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(hotkeyStr))
|
||||
HotkeyManager.Current.Remove(hotkeyStr);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
App.API.LogError(ClassName, $"Error removing hotkey: {e.Message} \nStackTrace:{e.StackTrace}");
|
||||
var errorMsg = string.Format(App.API.GetTranslation("unregisterHotkeyFailed"), hotkeyStr);
|
||||
var errorMsgTitle = App.API.GetTranslation("MessageBoxTitle");
|
||||
App.API.ShowMsgBox(errorMsg, errorMsgTitle);
|
||||
}
|
||||
}
|
||||
|
||||
private static void RemoveGlobalHotkeyWithChefKeys(RegisteredHotkeyData hotkeyData)
|
||||
{
|
||||
var hotkey = hotkeyData.Hotkey;
|
||||
var hotkeyStr = hotkey.ToString();
|
||||
try
|
||||
{
|
||||
ChefKeysManager.UnregisterHotkey(hotkeyStr);
|
||||
ChefKeysManager.Stop();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
App.API.LogError(ClassName, $"Error removing hotkey: {e.Message} \nStackTrace:{e.StackTrace}");
|
||||
var errorMsg = string.Format(App.API.GetTranslation("unregisterHotkeyFailed"), hotkeyStr);
|
||||
var errorMsgTitle = App.API.GetTranslation("MessageBoxTitle");
|
||||
App.API.ShowMsgBox(errorMsg, errorMsgTitle);
|
||||
}
|
||||
}
|
||||
|
||||
private static void RemoveWindowHotkey(RegisteredHotkeyData hotkeyData)
|
||||
{
|
||||
var hotkey = hotkeyData.Hotkey;
|
||||
try
|
||||
{
|
||||
if (Application.Current?.MainWindow is MainWindow window)
|
||||
{
|
||||
// Remove the key binding
|
||||
var keyGesture = hotkey.ToKeyGesture();
|
||||
var existingBinding = window.InputBindings
|
||||
.OfType<KeyBinding>()
|
||||
.FirstOrDefault(kb =>
|
||||
kb.Gesture is KeyGesture keyGesture1 &&
|
||||
keyGesture.Key == keyGesture1.Key &&
|
||||
keyGesture.Modifiers == keyGesture1.Modifiers);
|
||||
if (existingBinding != null)
|
||||
{
|
||||
window.InputBindings.Remove(existingBinding);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
App.API.LogError(ClassName, $"Error removing window hotkey: {e.Message} \nStackTrace:{e.StackTrace}");
|
||||
var errorMsg = string.Format(App.API.GetTranslation("unregisterWindowHotkeyFailed"), hotkey);
|
||||
var errorMsgTitle = App.API.GetTranslation("MessageBoxTitle");
|
||||
App.API.ShowMsgBox(errorMsg, errorMsgTitle);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Commands
|
||||
|
||||
private static RelayCommand<CustomPluginHotkey> _customQueryHotkeyCommand;
|
||||
private static IRelayCommand CustomQueryHotkeyCommand => _customQueryHotkeyCommand ??= new RelayCommand<CustomPluginHotkey>(CustomQueryHotkey);
|
||||
|
||||
private static RelayCommand<GlobalPluginHotkeyPair> _globalPluginHotkeyCommand;
|
||||
private static IRelayCommand GlobalPluginHotkeyCommand => _globalPluginHotkeyCommand ??= new RelayCommand<GlobalPluginHotkeyPair>(GlobalPluginHotkey);
|
||||
|
||||
private static RelayCommand<WindowPluginHotkeyPair> _windowPluginHotkeyCommand;
|
||||
private static IRelayCommand WindowPluginHotkeyCommand => _windowPluginHotkeyCommand ??= new RelayCommand<WindowPluginHotkeyPair>(WindowPluginHotkey);
|
||||
|
||||
private static void CustomQueryHotkey(CustomPluginHotkey customPluginHotkey)
|
||||
{
|
||||
if (_mainViewModel.ShouldIgnoreHotkeys())
|
||||
return;
|
||||
|
||||
App.API.ShowMainWindow();
|
||||
App.API.ChangeQuery(customPluginHotkey.ActionKeyword, true);
|
||||
}
|
||||
|
||||
private static void GlobalPluginHotkey(GlobalPluginHotkeyPair pair)
|
||||
{
|
||||
if (_mainViewModel.ShouldIgnoreHotkeys() || pair.Metadata.Disabled)
|
||||
return;
|
||||
|
||||
pair.GlobalPluginHotkey.Action?.Invoke();
|
||||
}
|
||||
|
||||
private static void WindowPluginHotkey(WindowPluginHotkeyPair pair)
|
||||
{
|
||||
// Get selected result
|
||||
var selectedResult = _mainViewModel.GetSelectedResults().SelectedItem?.Result;
|
||||
|
||||
// Check result nullability
|
||||
if (selectedResult != null)
|
||||
{
|
||||
var pluginId = selectedResult.PluginID;
|
||||
foreach (var hotkeyModel in pair.HotkeyModels)
|
||||
{
|
||||
var metadata = hotkeyModel.Metadata;
|
||||
var pluginHotkey = hotkeyModel.PluginHotkey;
|
||||
|
||||
if (metadata.ID != pluginId || // Check plugin ID match
|
||||
metadata.Disabled || // Check plugin enabled state
|
||||
!selectedResult.HotkeyIds.Contains(pluginHotkey.Id) || // Check hotkey supported state
|
||||
pluginHotkey.Action == null) // Check action nullability
|
||||
continue;
|
||||
|
||||
// TODO: Remove return to skip other commands & Organize main window hotkeys
|
||||
if (pluginHotkey.Action.Invoke(selectedResult))
|
||||
App.API.HideMainWindow();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
// TODO: Deprecated
|
||||
internal static void SetCustomQueryHotkey(CustomPluginHotkey hotkey)
|
||||
{
|
||||
SetHotkey(hotkey.Hotkey, (s, e) =>
|
||||
|
|
@ -159,34 +547,14 @@ internal static class HotKeyMapper
|
|||
});
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Global Plugin Hotkeys (Global)
|
||||
/// </summary>
|
||||
internal static void LoadGlobalPluginHotkey()
|
||||
{
|
||||
var pluginHotkeyInfos = PluginManager.GetPluginHotkeyInfo();
|
||||
foreach (var info in pluginHotkeyInfos)
|
||||
{
|
||||
var pluginPair = info.Key;
|
||||
var hotkeyInfo = info.Value;
|
||||
var metadata = pluginPair.Metadata;
|
||||
foreach (var hotkey in hotkeyInfo)
|
||||
{
|
||||
if (hotkey.HotkeyType == HotkeyType.Global && hotkey is GlobalPluginHotkey globalHotkey)
|
||||
{
|
||||
var hotkeyStr = metadata.PluginHotkeys.Find(h => h.Id == hotkey.Id)?.Hotkey ?? hotkey.DefaultHotkey;
|
||||
SetGlobalPluginHotkey(globalHotkey, metadata, hotkeyStr);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: Deprecated
|
||||
internal static void SetGlobalPluginHotkey(GlobalPluginHotkey globalHotkey, PluginMetadata metadata, string hotkeyStr)
|
||||
{
|
||||
var hotkey = new HotkeyModel(hotkeyStr);
|
||||
SetGlobalPluginHotkey(globalHotkey, metadata, hotkey);
|
||||
}
|
||||
|
||||
// TODO: Deprecated
|
||||
internal static void SetGlobalPluginHotkey(GlobalPluginHotkey globalHotkey, PluginMetadata metadata, HotkeyModel hotkey)
|
||||
{
|
||||
var hotkeyStr = hotkey.ToString();
|
||||
|
|
@ -199,18 +567,7 @@ internal static class HotKeyMapper
|
|||
});
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Plugin Window Hotkeys (Window)
|
||||
/// </summary>
|
||||
internal static void LoadWindowPluginHotkey()
|
||||
{
|
||||
var windowPluginHotkeys = PluginManager.GetWindowPluginHotkeys();
|
||||
foreach (var hotkey in windowPluginHotkeys)
|
||||
{
|
||||
SetWindowHotkey(hotkey.Key, hotkey.Value);
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: Deprecated
|
||||
internal static void SetWindowHotkey(HotkeyModel hotkey, List<(PluginMetadata Metadata, SearchWindowPluginHotkey PluginHotkey)> hotkeyModels)
|
||||
{
|
||||
try
|
||||
|
|
@ -228,16 +585,7 @@ internal static class HotKeyMapper
|
|||
keyGesture.Modifiers == keyGesture1.Modifiers);
|
||||
if (existingBinding != null)
|
||||
{
|
||||
// If the hotkey exists, remove the old command
|
||||
if (_windowHotkeyEvents.ContainsKey(hotkey))
|
||||
{
|
||||
window.InputBindings.Remove(existingBinding);
|
||||
}
|
||||
// If the hotkey does not exist, save the old command
|
||||
else
|
||||
{
|
||||
_windowHotkeyEvents[hotkey] = existingBinding.Command;
|
||||
}
|
||||
throw new InvalidOperationException($"Key binding {hotkey} already exists");
|
||||
}
|
||||
|
||||
// Create and add the new key binding
|
||||
|
|
@ -259,6 +607,7 @@ internal static class HotKeyMapper
|
|||
}
|
||||
}
|
||||
|
||||
// TODO: Deprecated
|
||||
private static ICommand BuildCommand(HotkeyModel hotkey, List<(PluginMetadata Metadata, SearchWindowPluginHotkey PluginHotkey)> hotkeyModels)
|
||||
{
|
||||
return new RelayCommand(() =>
|
||||
|
|
@ -297,14 +646,10 @@ internal static class HotKeyMapper
|
|||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (_windowHotkeyEvents.TryGetValue(hotkey, out var existingCommand))
|
||||
{
|
||||
existingCommand.Execute(null);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// TODO: Deprecated
|
||||
internal static void RemoveWindowHotkey(HotkeyModel hotkey)
|
||||
{
|
||||
try
|
||||
|
|
@ -323,13 +668,6 @@ internal static class HotKeyMapper
|
|||
{
|
||||
window.InputBindings.Remove(existingBinding);
|
||||
}
|
||||
|
||||
// Restore the command if it exists
|
||||
if (_windowHotkeyEvents.TryGetValue(hotkey, out var command))
|
||||
{
|
||||
var keyBinding = new KeyBinding(command, keyGesture);
|
||||
window.InputBindings.Add(keyBinding);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
|
|
@ -344,6 +682,8 @@ internal static class HotKeyMapper
|
|||
}
|
||||
}
|
||||
|
||||
#region Check Hotkey
|
||||
|
||||
internal static bool CheckAvailability(HotkeyModel currentHotkey)
|
||||
{
|
||||
try
|
||||
|
|
@ -362,4 +702,33 @@ internal static class HotKeyMapper
|
|||
|
||||
return false;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Private Classes
|
||||
|
||||
private class GlobalPluginHotkeyPair
|
||||
{
|
||||
public PluginMetadata Metadata { get; }
|
||||
|
||||
public GlobalPluginHotkey GlobalPluginHotkey { get; }
|
||||
|
||||
public GlobalPluginHotkeyPair(PluginMetadata metadata, GlobalPluginHotkey globalPluginHotkey)
|
||||
{
|
||||
Metadata = metadata;
|
||||
GlobalPluginHotkey = globalPluginHotkey;
|
||||
}
|
||||
}
|
||||
|
||||
private class WindowPluginHotkeyPair
|
||||
{
|
||||
public List<(PluginMetadata Metadata, SearchWindowPluginHotkey PluginHotkey)> HotkeyModels { get; }
|
||||
|
||||
public WindowPluginHotkeyPair(List<(PluginMetadata Metadata, SearchWindowPluginHotkey PluginHotkey)> hotkeys)
|
||||
{
|
||||
HotkeyModels = hotkeys;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue