| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 | 
							- using System;
 
- using System.Collections.Generic;
 
- using System.Linq;
 
- using System.Windows;
 
- using System.Windows.Input;
 
- using KeyEventHandler = System.Windows.Input.KeyEventHandler;
 
- namespace InABox.WPF
 
- {
 
-     public enum HotKeyModifier
 
-     {
 
-         Ctrl,
 
-         Shift,
 
-         Alt
 
-     }
 
-     public static class HotKeyManager
 
-     {
 
-         private static readonly List<Tuple<Key, HotKeyModifier[], Func<bool>>> _hotkeys = new();
 
-         private static Tuple<Key, HotKeyModifier[], Func<bool>> FindHotKey(Key key, HotKeyModifier[] modifiers)
 
-         {
 
-             var m = modifiers != null ? modifiers : new HotKeyModifier[] { };
 
-             var existing = _hotkeys.FirstOrDefault(
 
-                 x => x.Item1 == key && x.Item2.Length == m.Length && x.Item2.Intersect(m).Count() == x.Item2.Length);
 
-             return existing;
 
-         }
 
-         public static void RegisterHotKey(Key key, Func<bool> action)
 
-         {
 
-             RegisterHotKey(key, new HotKeyModifier[] { }, action);
 
-         }
 
-         public static void RegisterHotKey(Key key, HotKeyModifier[] modifiers, Func<bool> action)
 
-         {
 
-             var existing = FindHotKey(key, modifiers);
 
-             if (existing != null)
 
-                 throw new Exception(string.Format("HotKey [{0}+{1}] is already registered!", string.Join("+", modifiers.Select(x => x)), key));
 
-             _hotkeys.Add(new Tuple<Key, HotKeyModifier[], Func<bool>>(key, modifiers, action));
 
-         }
 
-         public static void UnRegisterHotKey(Key key)
 
-         {
 
-             UnRegisterHotKey(key, new HotKeyModifier[] { });
 
-         }
 
-         public static void UnRegisterHotKey(Key key, HotKeyModifier[] modifiers)
 
-         {
 
-             var existing = FindHotKey(key, modifiers);
 
-             if (existing != null)
 
-                 _hotkeys.Remove(existing);
 
-         }
 
-         public static bool ProcessHotKey(Key key)
 
-         {
 
-             var modifiers = new List<HotKeyModifier>();
 
-             if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift))
 
-                 modifiers.Add(HotKeyModifier.Shift);
 
-             if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))
 
-                 modifiers.Add(HotKeyModifier.Ctrl);
 
-             if (Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt))
 
-                 modifiers.Add(HotKeyModifier.Alt);
 
-             var existing = FindHotKey(key, modifiers.ToArray());
 
-             if (existing != null)
 
-                 return existing.Item3.Invoke();
 
-             return false;
 
-         }
 
-         public static void Initialize()
 
-         {
 
-             EventManager.RegisterClassHandler(
 
-                 typeof(Window),
 
-                 Keyboard.KeyDownEvent,
 
-                 new KeyEventHandler(
 
-                     (o, args) =>
 
-                     {
 
-                         ProcessHotKey(args.Key);
 
-                         //args.Handled = args.Key == Key.Space ? true : ProcessHotKey(args.Key);
 
-                     }
 
-                 ),
 
-                 true
 
-             );
 
-         }
 
-     }
 
- }
 
 
  |