From 0107bfdd24b31f9202eed605574e83de9746239a Mon Sep 17 00:00:00 2001 From: Robert Date: Sat, 8 Apr 2023 18:56:42 +0200 Subject: [PATCH] UI - Fix hotkeybox keys being mangled up --- .../Controls/HotkeyBox.axaml.cs | 44 ++++++++++++------- .../DryIoc/ContainerExtensions.cs | 2 + src/Artemis.UI.Shared/Utilities.cs | 8 ++++ .../Services/Updating/UpdateService.cs | 7 ++- 4 files changed, 45 insertions(+), 16 deletions(-) create mode 100644 src/Artemis.UI.Shared/Utilities.cs diff --git a/src/Artemis.UI.Shared/Controls/HotkeyBox.axaml.cs b/src/Artemis.UI.Shared/Controls/HotkeyBox.axaml.cs index 0c50e69e4..9bfbe96b4 100644 --- a/src/Artemis.UI.Shared/Controls/HotkeyBox.axaml.cs +++ b/src/Artemis.UI.Shared/Controls/HotkeyBox.axaml.cs @@ -8,6 +8,8 @@ using Avalonia.Data; using Avalonia.Input; using Avalonia.Interactivity; using Avalonia.Markup.Xaml; +using Avalonia.Threading; +using DryIoc; using FluentAvalonia.Core; using Humanizer; using Material.Icons; @@ -19,6 +21,7 @@ namespace Artemis.UI.Shared; /// public class HotkeyBox : UserControl { + private readonly IInputService _inputService; private readonly TextBox _displayTextBox; /// @@ -26,39 +29,50 @@ public class HotkeyBox : UserControl /// public HotkeyBox() { - InitializeComponent(); + _inputService = UI.Locator.Resolve(); + InitializeComponent(); _displayTextBox = this.Find("DisplayTextBox"); - _displayTextBox.KeyDown += DisplayTextBoxOnKeyDown; - _displayTextBox.KeyUp += DisplayTextBoxOnKeyUp; UpdateDisplayTextBox(); } + protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e) + { + _inputService.KeyboardKeyDown += InputServiceOnKeyboardKeyDown; + _inputService.KeyboardKeyUp += InputServiceOnKeyboardKeyUp; + } + + protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e) + { + _inputService.KeyboardKeyDown -= InputServiceOnKeyboardKeyDown; + _inputService.KeyboardKeyUp -= InputServiceOnKeyboardKeyUp; + } + private static void HotkeyChanging(IAvaloniaObject sender, bool before) { ((HotkeyBox) sender).UpdateDisplayTextBox(); } - private void DisplayTextBoxOnKeyDown(object? sender, KeyEventArgs e) + private void InputServiceOnKeyboardKeyDown(object? sender, ArtemisKeyboardKeyEventArgs e) { - if (e.Key >= Key.LeftShift && e.Key <= Key.RightAlt) + if (e.Key >= KeyboardKey.LeftShift && e.Key <= KeyboardKey.RightAlt) return; Hotkey ??= new Hotkey(); - Hotkey.Key = (KeyboardKey?) e.Key; - Hotkey.Modifiers = (KeyboardModifierKey?) e.KeyModifiers; - UpdateDisplayTextBox(); - HotkeyChanged?.Invoke(this, EventArgs.Empty); + Hotkey.Key = e.Key; + Hotkey.Modifiers = e.Modifiers; - e.Handled = true; + Dispatcher.UIThread.Post(() => + { + UpdateDisplayTextBox(); + HotkeyChanged?.Invoke(this, EventArgs.Empty); + }); } - private void DisplayTextBoxOnKeyUp(object? sender, KeyEventArgs e) + private void InputServiceOnKeyboardKeyUp(object? sender, ArtemisKeyboardKeyEventArgs e) { - if (e.KeyModifiers == KeyModifiers.None) - FocusManager.Instance?.Focus(null); - - e.Handled = true; + if (e.Modifiers == KeyboardModifierKey.None) + Dispatcher.UIThread.Post(() => FocusManager.Instance?.Focus(null)); } private void UpdateDisplayTextBox() diff --git a/src/Artemis.UI.Shared/DryIoc/ContainerExtensions.cs b/src/Artemis.UI.Shared/DryIoc/ContainerExtensions.cs index 4c4711b02..1c86ecf84 100644 --- a/src/Artemis.UI.Shared/DryIoc/ContainerExtensions.cs +++ b/src/Artemis.UI.Shared/DryIoc/ContainerExtensions.cs @@ -17,5 +17,7 @@ public static class ContainerExtensions { Assembly artemisShared = typeof(IArtemisSharedUIService).GetAssembly(); container.RegisterMany(new[] { artemisShared }, type => type.IsAssignableTo(), Reuse.Singleton); + + UI.Locator = container; } } \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Utilities.cs b/src/Artemis.UI.Shared/Utilities.cs new file mode 100644 index 000000000..35abef7db --- /dev/null +++ b/src/Artemis.UI.Shared/Utilities.cs @@ -0,0 +1,8 @@ +using DryIoc; + +namespace Artemis.UI.Shared; + +internal static class UI +{ + public static IContainer Locator { get; set; } = null!; +} \ No newline at end of file diff --git a/src/Artemis.UI/Services/Updating/UpdateService.cs b/src/Artemis.UI/Services/Updating/UpdateService.cs index fee0b93b0..15e66985e 100644 --- a/src/Artemis.UI/Services/Updating/UpdateService.cs +++ b/src/Artemis.UI/Services/Updating/UpdateService.cs @@ -5,7 +5,6 @@ using System.Threading; using System.Threading.Tasks; using Artemis.Core; using Artemis.Core.Services; -using Artemis.Storage.Entities.General; using Artemis.Storage.Repositories; using Artemis.UI.Exceptions; using Artemis.UI.Shared.Services.MainWindow; @@ -110,6 +109,9 @@ public class UpdateService : IUpdateService private async void HandleAutoUpdateEvent(object? sender, EventArgs e) { + if (Constants.CurrentVersion == "local") + return; + // The event can trigger from multiple sources with a timer acting as a fallback, only actual perform an action once per max 59 minutes if (DateTime.UtcNow - _lastAutoUpdateCheck < TimeSpan.FromMinutes(59)) return; @@ -204,6 +206,9 @@ public class UpdateService : IUpdateService /// public bool Initialize() { + if (Constants.CurrentVersion == "local") + return false; + string? channelArgument = Constants.StartupArguments.FirstOrDefault(a => a.StartsWith("--channel=")); if (channelArgument != null) Channel = channelArgument.Split("=")[1];