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 @@
+
+
+
-
+