From ec6cb0abb4b7669895b6e96fd7581c93b5abd691 Mon Sep 17 00:00:00 2001
From: Mary Guillemard <mary@mary.zone>
Date: Sat, 2 Mar 2024 12:51:05 +0100
Subject: infra: Make Avalonia the default UI  (#6375)

* misc: Move Ryujinx project to Ryujinx.Gtk3

This breaks release CI for now but that's fine.

Signed-off-by: Mary Guillemard <mary@mary.zone>

* misc: Move Ryujinx.Ava project to Ryujinx

This breaks CI for now, but it's fine.

Signed-off-by: Mary Guillemard <mary@mary.zone>

* infra: Make Avalonia the default UI

Should fix CI after the previous changes.

GTK3 isn't build by the release job anymore, only by PR CI.

This also ensure that the test-ava update package is still generated to
allow update from the old testing channel.

Signed-off-by: Mary Guillemard <mary@mary.zone>

* Fix missing copy in create_app_bundle.sh

Signed-off-by: Mary Guillemard <mary@mary.zone>

* Fix syntax error

Signed-off-by: Mary Guillemard <mary@mary.zone>

---------

Signed-off-by: Mary Guillemard <mary@mary.zone>
---
 src/Ryujinx/UI/Helpers/ButtonKeyAssigner.cs | 118 ++++++++++++++++++++++++++++
 1 file changed, 118 insertions(+)
 create mode 100644 src/Ryujinx/UI/Helpers/ButtonKeyAssigner.cs

(limited to 'src/Ryujinx/UI/Helpers/ButtonKeyAssigner.cs')

diff --git a/src/Ryujinx/UI/Helpers/ButtonKeyAssigner.cs b/src/Ryujinx/UI/Helpers/ButtonKeyAssigner.cs
new file mode 100644
index 00000000..7e8ba734
--- /dev/null
+++ b/src/Ryujinx/UI/Helpers/ButtonKeyAssigner.cs
@@ -0,0 +1,118 @@
+using Avalonia.Controls;
+using Avalonia.Controls.Primitives;
+using Avalonia.LogicalTree;
+using Avalonia.Threading;
+using Ryujinx.Input;
+using Ryujinx.Input.Assigner;
+using System;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace Ryujinx.Ava.UI.Helpers
+{
+    internal class ButtonKeyAssigner
+    {
+        internal class ButtonAssignedEventArgs : EventArgs
+        {
+            public ToggleButton Button { get; }
+            public bool IsAssigned { get; }
+
+            public ButtonAssignedEventArgs(ToggleButton button, bool isAssigned)
+            {
+                Button = button;
+                IsAssigned = isAssigned;
+            }
+        }
+
+        public ToggleButton ToggledButton { get; set; }
+
+        private bool _isWaitingForInput;
+        private bool _shouldUnbind;
+        public event EventHandler<ButtonAssignedEventArgs> ButtonAssigned;
+
+        public ButtonKeyAssigner(ToggleButton toggleButton)
+        {
+            ToggledButton = toggleButton;
+        }
+
+        public async void GetInputAndAssign(IButtonAssigner assigner, IKeyboard keyboard = null)
+        {
+            Dispatcher.UIThread.Post(() =>
+            {
+                ToggledButton.IsChecked = true;
+            });
+
+            if (_isWaitingForInput)
+            {
+                Dispatcher.UIThread.Post(() =>
+                {
+                    Cancel();
+                });
+
+                return;
+            }
+
+            _isWaitingForInput = true;
+
+            assigner.Initialize();
+
+            await Task.Run(async () =>
+            {
+                while (true)
+                {
+                    if (!_isWaitingForInput)
+                    {
+                        return;
+                    }
+
+                    await Task.Delay(10);
+
+                    assigner.ReadInput();
+
+                    if (assigner.HasAnyButtonPressed() || assigner.ShouldCancel() || (keyboard != null && keyboard.IsPressed(Key.Escape)))
+                    {
+                        break;
+                    }
+                }
+            });
+
+            await Dispatcher.UIThread.InvokeAsync(() =>
+            {
+                string pressedButton = assigner.GetPressedButton();
+
+                if (_shouldUnbind)
+                {
+                    SetButtonText(ToggledButton, "Unbound");
+                }
+                else if (pressedButton != "")
+                {
+                    SetButtonText(ToggledButton, pressedButton);
+                }
+
+                _shouldUnbind = false;
+                _isWaitingForInput = false;
+
+                ToggledButton.IsChecked = false;
+
+                ButtonAssigned?.Invoke(this, new ButtonAssignedEventArgs(ToggledButton, pressedButton != null));
+
+                static void SetButtonText(ToggleButton button, string text)
+                {
+                    ILogical textBlock = button.GetLogicalDescendants().First(x => x is TextBlock);
+
+                    if (textBlock != null && textBlock is TextBlock block)
+                    {
+                        block.Text = text;
+                    }
+                }
+            });
+        }
+
+        public void Cancel(bool shouldUnbind = false)
+        {
+            _isWaitingForInput = false;
+            ToggledButton.IsChecked = false;
+            _shouldUnbind = shouldUnbind;
+        }
+    }
+}
-- 
cgit v1.2.3-70-g09d2