mirror of
https://github.com/Artemis-RGB/Artemis
synced 2025-12-13 05:48:35 +00:00
Added LUA keybind module
This commit is contained in:
parent
0e1c7d9e3b
commit
b53e08fdcb
@ -548,6 +548,7 @@
|
||||
<Compile Include="Profiles\Lua\Modules\LuaBrushesModule.cs" />
|
||||
<Compile Include="Profiles\Lua\LuaModule.cs" />
|
||||
<Compile Include="Profiles\Lua\Modules\Brushes\LuaSolidColorBrush.cs" />
|
||||
<Compile Include="Profiles\Lua\Modules\LuaKeybindModule.cs" />
|
||||
<Compile Include="Profiles\Lua\Modules\LuaKeyboardModule.cs" />
|
||||
<Compile Include="Profiles\Lua\Modules\LuaLayerModule.cs" />
|
||||
<Compile Include="Profiles\Lua\Modules\LuaMouseModule.cs" />
|
||||
|
||||
@ -1,60 +1,60 @@
|
||||
using System.Linq;
|
||||
using Artemis.Modules.Abstract;
|
||||
using Artemis.Profiles.Layers.Interfaces;
|
||||
using Artemis.Profiles.Layers.Models;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace Artemis.Profiles.Layers.Conditions
|
||||
{
|
||||
public class EventCondition : ILayerCondition
|
||||
{
|
||||
[JsonIgnore]
|
||||
public bool HotKeyMet { get;set; }
|
||||
|
||||
public bool ConditionsMet(LayerModel layerModel, ModuleDataModel dataModel)
|
||||
{
|
||||
lock (layerModel.Properties.Conditions)
|
||||
{
|
||||
var checkConditions = layerModel.Properties.Conditions.Where(c => !c.Field.Contains("hotkey"));
|
||||
var conditionsMet = false;
|
||||
switch (layerModel.Properties.ConditionType)
|
||||
{
|
||||
case ConditionType.AnyMet:
|
||||
conditionsMet = HotKeyMet || checkConditions.Any(cm => cm.ConditionMet(dataModel));
|
||||
break;
|
||||
case ConditionType.AllMet:
|
||||
conditionsMet = HotKeyMet && checkConditions.All(cm => cm.ConditionMet(dataModel));
|
||||
break;
|
||||
case ConditionType.NoneMet:
|
||||
conditionsMet = !HotKeyMet && !checkConditions.Any(cm => cm.ConditionMet(dataModel));
|
||||
break;
|
||||
}
|
||||
|
||||
layerModel.EventProperties.Update(layerModel, conditionsMet);
|
||||
|
||||
if (conditionsMet)
|
||||
using System.Linq;
|
||||
using Artemis.Modules.Abstract;
|
||||
using Artemis.Profiles.Layers.Interfaces;
|
||||
using Artemis.Profiles.Layers.Models;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace Artemis.Profiles.Layers.Conditions
|
||||
{
|
||||
public class EventCondition : ILayerCondition
|
||||
{
|
||||
[JsonIgnore]
|
||||
public bool HotKeyMet { get;set; }
|
||||
|
||||
public bool ConditionsMet(LayerModel layerModel, ModuleDataModel dataModel)
|
||||
{
|
||||
lock (layerModel.Properties.Conditions)
|
||||
{
|
||||
var checkConditions = layerModel.Properties.Conditions.Where(c => !c.Field.Contains("hotkey"));
|
||||
var conditionsMet = false;
|
||||
switch (layerModel.Properties.ConditionType)
|
||||
{
|
||||
case ConditionType.AnyMet:
|
||||
conditionsMet = HotKeyMet || checkConditions.Any(cm => cm.ConditionMet(dataModel));
|
||||
break;
|
||||
case ConditionType.AllMet:
|
||||
conditionsMet = HotKeyMet && checkConditions.All(cm => cm.ConditionMet(dataModel));
|
||||
break;
|
||||
case ConditionType.NoneMet:
|
||||
conditionsMet = !HotKeyMet && !checkConditions.Any(cm => cm.ConditionMet(dataModel));
|
||||
break;
|
||||
}
|
||||
|
||||
layerModel.EventProperties.Update(layerModel, conditionsMet);
|
||||
|
||||
if (conditionsMet)
|
||||
layerModel.EventProperties.TriggerEvent(layerModel);
|
||||
if (layerModel.EventProperties.MustStop(layerModel))
|
||||
HotKeyMet = false;
|
||||
|
||||
return layerModel.EventProperties.MustDraw;
|
||||
}
|
||||
}
|
||||
|
||||
public void KeybindTask(LayerConditionModel condition)
|
||||
{
|
||||
switch (condition.Field)
|
||||
{
|
||||
case "hotkeyEnable":
|
||||
HotKeyMet = true;
|
||||
break;
|
||||
case "hotkeyDisable":
|
||||
HotKeyMet = false;
|
||||
break;
|
||||
case "hotkeyToggle":
|
||||
HotKeyMet = !HotKeyMet;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (layerModel.EventProperties.MustStop(layerModel))
|
||||
HotKeyMet = false;
|
||||
|
||||
return layerModel.EventProperties.MustDraw;
|
||||
}
|
||||
}
|
||||
|
||||
public void KeybindTask(LayerConditionModel condition)
|
||||
{
|
||||
switch (condition.Field)
|
||||
{
|
||||
case "hotkeyEnable":
|
||||
HotKeyMet = true;
|
||||
break;
|
||||
case "hotkeyDisable":
|
||||
HotKeyMet = false;
|
||||
break;
|
||||
case "hotkeyToggle":
|
||||
HotKeyMet = !HotKeyMet;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
91
Artemis/Artemis/Profiles/Lua/Modules/LuaKeybindModule.cs
Normal file
91
Artemis/Artemis/Profiles/Lua/Modules/LuaKeybindModule.cs
Normal file
@ -0,0 +1,91 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Windows.Input;
|
||||
using Artemis.Managers;
|
||||
using Artemis.Models;
|
||||
using MahApps.Metro.Controls;
|
||||
using MoonSharp.Interpreter;
|
||||
|
||||
namespace Artemis.Profiles.Lua.Modules
|
||||
{
|
||||
[MoonSharpUserData]
|
||||
public class LuaKeybindModule : LuaModule
|
||||
{
|
||||
private readonly List<KeybindModel> _keybindModels;
|
||||
|
||||
public LuaKeybindModule(LuaManager luaManager) : base(luaManager)
|
||||
{
|
||||
_keybindModels = new List<KeybindModel>();
|
||||
LuaManager.ProfileModel.OnProfileUpdatedEvent += ProfileModelOnOnProfileUpdatedEvent;
|
||||
}
|
||||
|
||||
public override string ModuleName => "Keybind";
|
||||
|
||||
private void ProfileModelOnOnProfileUpdatedEvent(object sender, EventArgs e)
|
||||
{
|
||||
foreach (var keybindModel in _keybindModels)
|
||||
KeybindManager.AddOrUpdate(keybindModel);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets a keybind to call the provided function
|
||||
/// </summary>
|
||||
/// <param name="name">Name of the keybind</param>
|
||||
/// <param name="hotKey">Hotkey in string format, per example: ALT+CTRL+SHIFT+D</param>
|
||||
/// <param name="function">LUA function to call</param>
|
||||
/// <param name="args">Optional arguments for the passed function</param>
|
||||
public void SetKeybind(string name, string hotKey, DynValue function, params DynValue[] args)
|
||||
{
|
||||
var modifierKeys = ModifierKeys.None;
|
||||
var key = Key.System;
|
||||
var hotKeyParts = hotKey.Split('+').Select(p => p.Trim());
|
||||
foreach (var hotKeyPart in hotKeyParts)
|
||||
if (hotKeyPart == "ALT")
|
||||
modifierKeys |= ModifierKeys.Alt;
|
||||
else if (hotKeyPart == "CTRL")
|
||||
modifierKeys |= ModifierKeys.Control;
|
||||
else if (hotKeyPart == "SHIFT")
|
||||
modifierKeys |= ModifierKeys.Shift;
|
||||
else
|
||||
Enum.TryParse(hotKeyPart, true, out key);
|
||||
|
||||
if (key == Key.System)
|
||||
throw new ScriptRuntimeException($"Hotkey '{hotKey}' couldn't be parsed.");
|
||||
|
||||
var hk = new HotKey(key, modifierKeys);
|
||||
var model = args != null
|
||||
? new KeybindModel("LUA-" + name, hk, () => LuaManager.Call(function, args))
|
||||
: new KeybindModel("LUA-" + name, hk, () => LuaManager.Call(function));
|
||||
|
||||
KeybindManager.AddOrUpdate(model);
|
||||
|
||||
var existing = _keybindModels.FirstOrDefault(k => k.Name == model.Name);
|
||||
if (existing != null)
|
||||
_keybindModels.Remove(existing);
|
||||
|
||||
_keybindModels.Add(model);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// If found, removes a keybind with the given name
|
||||
/// </summary>
|
||||
/// <param name="name"></param>
|
||||
public void RemoveKeybind(string name)
|
||||
{
|
||||
var existing = _keybindModels.FirstOrDefault(k => k.Name == name);
|
||||
if (existing != null)
|
||||
_keybindModels.Remove(existing);
|
||||
|
||||
KeybindManager.Remove(name);
|
||||
}
|
||||
|
||||
public override void Dispose()
|
||||
{
|
||||
foreach (var keybindModel in _keybindModels)
|
||||
KeybindManager.Remove(keybindModel);
|
||||
|
||||
LuaManager.ProfileModel.OnProfileUpdatedEvent -= ProfileModelOnOnProfileUpdatedEvent;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,7 +1,5 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Windows;
|
||||
@ -13,12 +11,8 @@ using Artemis.Models;
|
||||
using Artemis.Modules.Abstract;
|
||||
using Artemis.Profiles.Layers.Interfaces;
|
||||
using Artemis.Profiles.Layers.Models;
|
||||
using Artemis.Utilities;
|
||||
using Artemis.Utilities.ParentChild;
|
||||
using Newtonsoft.Json;
|
||||
using Color = System.Windows.Media.Color;
|
||||
using Point = System.Windows.Point;
|
||||
using Size = System.Windows.Size;
|
||||
|
||||
namespace Artemis.Profiles
|
||||
{
|
||||
@ -30,6 +24,7 @@ namespace Artemis.Profiles
|
||||
{
|
||||
_invalidFileNameChars = Path.GetInvalidFileNameChars();
|
||||
Layers = new ChildItemCollection<ProfileModel, LayerModel>(this);
|
||||
OnProfileUpdatedEvent += OnOnProfileUpdatedEvent;
|
||||
}
|
||||
|
||||
public ChildItemCollection<ProfileModel, LayerModel> Layers { get; }
|
||||
@ -44,8 +39,14 @@ namespace Artemis.Profiles
|
||||
[JsonIgnore]
|
||||
public string Slug => new string(Name.Where(ch => !_invalidFileNameChars.Contains(ch)).ToArray());
|
||||
|
||||
private void OnOnProfileUpdatedEvent(object sender, EventArgs e)
|
||||
{
|
||||
ApplyKeybinds();
|
||||
}
|
||||
|
||||
public event EventHandler<ProfileDeviceEventsArg> OnDeviceUpdatedEvent;
|
||||
public event EventHandler<ProfileDeviceEventsArg> OnDeviceDrawnEvent;
|
||||
public event EventHandler<EventArgs> OnProfileUpdatedEvent;
|
||||
|
||||
public void FixOrder()
|
||||
{
|
||||
@ -133,14 +134,17 @@ namespace Artemis.Profiles
|
||||
|
||||
private void RaiseDeviceUpdatedEvent(ProfileDeviceEventsArg e)
|
||||
{
|
||||
var handler = OnDeviceUpdatedEvent;
|
||||
handler?.Invoke(this, e);
|
||||
OnDeviceUpdatedEvent?.Invoke(this, e);
|
||||
}
|
||||
|
||||
public void RaiseDeviceDrawnEvent(ProfileDeviceEventsArg e)
|
||||
{
|
||||
var handler = OnDeviceDrawnEvent;
|
||||
handler?.Invoke(this, e);
|
||||
OnDeviceDrawnEvent?.Invoke(this, e);
|
||||
}
|
||||
|
||||
public virtual void OnOnProfileUpdatedEvent()
|
||||
{
|
||||
OnProfileUpdatedEvent?.Invoke(this, EventArgs.Empty);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -216,7 +220,6 @@ namespace Artemis.Profiles
|
||||
public void ApplyKeybinds()
|
||||
{
|
||||
foreach (var layerModel in Layers)
|
||||
{
|
||||
for (var index = 0; index < layerModel.Properties.Conditions.Count; index++)
|
||||
{
|
||||
var condition = layerModel.Properties.Conditions[index];
|
||||
@ -228,7 +231,6 @@ namespace Artemis.Profiles
|
||||
var kb = new KeybindModel($"{GameName}-{Name}-{layerModel.Name}-{index}", condition.HotKey, action);
|
||||
KeybindManager.AddOrUpdate(kb);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#region Compare
|
||||
|
||||
@ -319,9 +319,7 @@ namespace Artemis.ViewModels
|
||||
{
|
||||
Thread.Sleep(100);
|
||||
SelectedLayer = selectModel;
|
||||
|
||||
// Let the profile reapply keybinds after messing with layers
|
||||
SelectedProfile.ApplyKeybinds();
|
||||
SelectedProfile?.OnOnProfileUpdatedEvent();
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user