diff --git a/Artemis/Artemis/Artemis.csproj b/Artemis/Artemis/Artemis.csproj index e46fc944c..8baeec089 100644 --- a/Artemis/Artemis/Artemis.csproj +++ b/Artemis/Artemis/Artemis.csproj @@ -354,6 +354,7 @@ + diff --git a/Artemis/Artemis/Managers/KeybindManager.cs b/Artemis/Artemis/Managers/KeybindManager.cs new file mode 100644 index 000000000..65c7e37dc --- /dev/null +++ b/Artemis/Artemis/Managers/KeybindManager.cs @@ -0,0 +1,85 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using System.Windows.Input; +using Artemis.Utilities.Keyboard; +using MahApps.Metro.Controls; +using KeyEventArgs = System.Windows.Forms.KeyEventArgs; + +namespace Artemis.Managers +{ + public static class KeybindManager + { + private static readonly Dictionary HotKeys; + + static KeybindManager() + { + KeyboardHook.KeyDownCallback += KeyboardHookOnKeyDownCallback; + HotKeys = new Dictionary(); + } + + private static void KeyboardHookOnKeyDownCallback(KeyEventArgs e) + { + // Don't trigger if none of the modifiers are held down + if (!e.Alt && !e.Control && !e.Shift) + return; + + // Don't trigger if the key itself is a modifier + if (e.KeyCode == Keys.LShiftKey || e.KeyCode == Keys.RShiftKey || + e.KeyCode == Keys.LControlKey || e.KeyCode == Keys.RControlKey || + e.KeyCode == Keys.LMenu || e.KeyCode == Keys.RMenu) + return; + + // Create a WPF ModifierKeys enum + var modifiers = ModifierKeys.None; + if (e.Alt) + modifiers = ModifierKeys.Alt; + if (e.Control) + if (modifiers == ModifierKeys.None) + modifiers = ModifierKeys.Control; + else + modifiers |= ModifierKeys.Control; + if (e.Shift) + if (modifiers == ModifierKeys.None) + modifiers = ModifierKeys.Shift; + else + modifiers |= ModifierKeys.Shift; + + // Create a HotKey object for comparison + var hotKey = new HotKey(KeyInterop.KeyFromVirtualKey(e.KeyValue), modifiers); + + // If the hotkey is present, invoke the action related to it + if (HotKeys.ContainsKey(hotKey)) + HotKeys[hotKey].Invoke(); + } + + /// + /// Registers a hotkey and executes the provided action when the hotkey is pressed + /// + /// The hotkey to register + /// The action to invoke on press + /// Returns true if key registed, false if already in use + public static bool RegisterHotkey(HotKey hotKey, Action action) + { + if (HotKeys.ContainsKey(hotKey)) + return false; + + HotKeys.Add(hotKey, action); + return true; + } + + /// + /// Unregister the given hotkey + /// + /// The hotkey to unregister + /// Returns true if unregistered, false if not found + public static bool UnregisterHotkey(HotKey hotKey) + { + if (!HotKeys.ContainsKey(hotKey)) + return false; + + HotKeys.Remove(hotKey); + return true; + } + } +} \ No newline at end of file diff --git a/Artemis/Artemis/Managers/MainManager.cs b/Artemis/Artemis/Managers/MainManager.cs index dba3b4657..5870984c5 100644 --- a/Artemis/Artemis/Managers/MainManager.cs +++ b/Artemis/Artemis/Managers/MainManager.cs @@ -39,7 +39,6 @@ namespace Artemis.Managers _processTimer.Start(); ProgramEnabled = false; - Running = false; // Create and start the web server GameStateWebServer = gameStateWebServer; @@ -71,7 +70,6 @@ namespace Artemis.Managers public PipeServer PipeServer { get; set; } public GameStateWebServer GameStateWebServer { get; set; } public bool ProgramEnabled { get; private set; } - public bool Running { get; private set; } public void Dispose() { diff --git a/Artemis/Artemis/Settings/GeneralSettings.cs b/Artemis/Artemis/Settings/GeneralSettings.cs index f56dbf807..b304c114d 100644 --- a/Artemis/Artemis/Settings/GeneralSettings.cs +++ b/Artemis/Artemis/Settings/GeneralSettings.cs @@ -73,11 +73,12 @@ namespace Artemis.Settings public void Save() { SettingsProvider.Save(this); + + Logging.SetupLogging(LogLevel); ApplyAutorun(); ApplyTheme(); ApplyGamestatePort(); ApplyScreenCaptureFPS(); - Logging.SetupLogging(LogLevel); } public void Reset(bool save = false) diff --git a/Artemis/Artemis/Utilities/Keyboard/KeyboardHook.cs b/Artemis/Artemis/Utilities/Keyboard/KeyboardHook.cs index 0fabc9f6a..7579c942a 100644 --- a/Artemis/Artemis/Utilities/Keyboard/KeyboardHook.cs +++ b/Artemis/Artemis/Utilities/Keyboard/KeyboardHook.cs @@ -18,10 +18,10 @@ namespace Artemis.Utilities.Keyboard } private static async void VirtualKeyboardOnKeyDown(object sender, KeyEventArgs keyEventArgs) - { + { await Task.Factory.StartNew(() => { KeyDownCallback?.Invoke(keyEventArgs); }); } - + public static event KeyDownCallbackHandler KeyDownCallback; } } \ No newline at end of file diff --git a/Artemis/Artemis/ViewModels/Profiles/LayerConditionViewModel.cs b/Artemis/Artemis/ViewModels/Profiles/LayerConditionViewModel.cs index d20f93dfc..b70d8792c 100644 --- a/Artemis/Artemis/ViewModels/Profiles/LayerConditionViewModel.cs +++ b/Artemis/Artemis/ViewModels/Profiles/LayerConditionViewModel.cs @@ -15,6 +15,19 @@ namespace Artemis.ViewModels.Profiles private readonly LayerEditorViewModel _editorViewModel; + private readonly NamedOperator[] _hotkeyOperators = + { + new NamedOperator("Pressed", "enable"), + new NamedOperator("Held down", "disable") + }; + + private readonly GeneralHelpers.PropertyCollection[] _hotkeyProperties = + { + new GeneralHelpers.PropertyCollection {Display = "Enable when hotkey", Type = "hotkeyEnable"}, + new GeneralHelpers.PropertyCollection {Display = "Disable when hotkey", Type = "hotkeyDisable"}, + new GeneralHelpers.PropertyCollection {Display = "Toggle when hotkey", Type = "hotkeyToggle"} + }; + private readonly NamedOperator[] _int32Operators = { new NamedOperator("Lower than", "<"), @@ -41,6 +54,7 @@ namespace Artemis.ViewModels.Profiles }; private bool _enumValueIsVisible; + private bool _keybindIsVisible; private GeneralHelpers.PropertyCollection _selectedDataModelProp; private string _selectedEnum; private NamedOperator _selectedOperator; @@ -52,9 +66,10 @@ namespace Artemis.ViewModels.Profiles _editorViewModel = editorViewModel; ConditionModel = conditionModel; - DataModelProps = editorViewModel.DataModelProps; Operators = new BindableCollection(); Enums = new BindableCollection(); + DataModelProps = new BindableCollection(_hotkeyProperties); + DataModelProps.AddRange(editorViewModel.DataModelProps); PropertyChanged += MapViewToModel; MapModelToView(); @@ -112,6 +127,17 @@ namespace Artemis.ViewModels.Profiles } } + public bool KeybindIsVisible + { + get { return _keybindIsVisible; } + set + { + if (value == _keybindIsVisible) return; + _keybindIsVisible = value; + NotifyOfPropertyChange(); + } + } + public NamedOperator SelectedOperator { get { return _selectedOperator; } @@ -190,6 +216,15 @@ namespace Artemis.ViewModels.Profiles Operators.AddRange(_stringOperators); UserValueIsVisible = true; break; + case "hotkeyEnable": + case "hotkeyDisable": + Operators.AddRange(_hotkeyOperators); + KeybindIsVisible = true; + break; + case "hotkeyToggle": + Operators.Add(_hotkeyOperators[0]); + KeybindIsVisible = true; + break; default: Operators.AddRange(_operators); UserValueIsVisible = true; @@ -207,7 +242,7 @@ namespace Artemis.ViewModels.Profiles Operators.Add(new NamedOperator("Increased", "increased")); } } - + SetupUserValueInput(); } @@ -215,13 +250,21 @@ namespace Artemis.ViewModels.Profiles { UserValueIsVisible = false; EnumValueIsVisible = false; + KeybindIsVisible = false; + // Event operators don't have any form of input if (SelectedOperator.Value == "changed" || SelectedOperator.Value == "decreased" || SelectedOperator.Value == "increased") return; - if (SelectedDataModelProp.Type == "Boolean") + if (SelectedDataModelProp.Type.Contains("hotkey")) + { + KeybindIsVisible = true; + } + else if (SelectedDataModelProp.Type == "Boolean") + { EnumValueIsVisible = true; + } else if (SelectedDataModelProp.EnumValues != null) { Enums.Clear(); @@ -229,7 +272,9 @@ namespace Artemis.ViewModels.Profiles EnumValueIsVisible = true; } else + { UserValueIsVisible = true; + } } /// diff --git a/Artemis/Artemis/Views/Profiles/LayerConditionView.xaml b/Artemis/Artemis/Views/Profiles/LayerConditionView.xaml index 0b62d71cc..77ea18a79 100644 --- a/Artemis/Artemis/Views/Profiles/LayerConditionView.xaml +++ b/Artemis/Artemis/Views/Profiles/LayerConditionView.xaml @@ -5,6 +5,7 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:cal="http://www.caliburnproject.org" xmlns:utilities="clr-namespace:Artemis.Utilities" + xmlns:controls="http://metro.mahapps.com/winfx/xaml/controls" mc:Ignorable="d" d:DesignWidth="613.296" Height="46"> @@ -50,8 +51,11 @@ + + + - +