diff --git a/src/Ryujinx/Systems/AppHost.cs b/src/Ryujinx/Systems/AppHost.cs index 801677cb2..fef287f93 100644 --- a/src/Ryujinx/Systems/AppHost.cs +++ b/src/Ryujinx/Systems/AppHost.cs @@ -1484,9 +1484,12 @@ namespace Ryujinx.Ava.Systems { try { - var overlayWindow = new UI.Windows.ControllerOverlayWindow(_topLevel as Avalonia.Controls.Window); - overlayWindow.ShowControllerBindings(inputConfigs); - overlayWindow.Show(); + // Access the overlay through the MainWindow via the ViewModel + if (_viewModel?.Window?.ControllerOverlay != null) + { + int duration = ConfigurationState.Instance.ControllerOverlayInputCycleDuration.Value; + _viewModel.Window.ControllerOverlay.ShowControllerBindings(inputConfigs, duration); + } } catch (Exception ex) { diff --git a/src/Ryujinx/UI/Windows/ControllerOverlayWindow.axaml b/src/Ryujinx/UI/Controls/ControllerOverlay.axaml similarity index 65% rename from src/Ryujinx/UI/Windows/ControllerOverlayWindow.axaml rename to src/Ryujinx/UI/Controls/ControllerOverlay.axaml index d5c205667..0208e8853 100644 --- a/src/Ryujinx/UI/Windows/ControllerOverlayWindow.axaml +++ b/src/Ryujinx/UI/Controls/ControllerOverlay.axaml @@ -1,20 +1,15 @@ - + IsVisible="False" + Name="ControllerOverlayControl"> - - - - \ No newline at end of file + + + + diff --git a/src/Ryujinx/UI/Windows/ControllerOverlayWindow.axaml.cs b/src/Ryujinx/UI/Controls/ControllerOverlay.axaml.cs similarity index 78% rename from src/Ryujinx/UI/Windows/ControllerOverlayWindow.axaml.cs rename to src/Ryujinx/UI/Controls/ControllerOverlay.axaml.cs index e70b8239e..8799050ef 100644 --- a/src/Ryujinx/UI/Windows/ControllerOverlayWindow.axaml.cs +++ b/src/Ryujinx/UI/Controls/ControllerOverlay.axaml.cs @@ -7,46 +7,21 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -namespace Ryujinx.Ava.UI.Windows +namespace Ryujinx.Ava.UI.Controls { - public partial class ControllerOverlayWindow : StyleableWindow + public partial class ControllerOverlay : UserControl { - private const int AutoHideDelayMs = 4000; // 4 seconds - public ControllerOverlayWindow() + public ControllerOverlay() { InitializeComponent(); - - TransparencyLevelHint = [WindowTransparencyLevel.Transparent]; - SystemDecorations = SystemDecorations.None; - ExtendClientAreaTitleBarHeightHint = 0; Background = Brushes.Transparent; - CanResize = false; - ShowInTaskbar = false; + HorizontalAlignment = Avalonia.Layout.HorizontalAlignment.Right; + VerticalAlignment = Avalonia.Layout.VerticalAlignment.Top; + Margin = new Avalonia.Thickness(0, 50, 20, 0); } - public ControllerOverlayWindow(Window owner) : this() - { - if (owner != null) - { - // Position the overlay in the top-right corner of the owner window - WindowStartupLocation = WindowStartupLocation.Manual; - - // Set position after the window is loaded - Loaded += (s, e) => - { - if (owner.WindowState != WindowState.Minimized) - { - Position = new Avalonia.PixelPoint( - (int)(owner.Position.X + owner.Width - Width - 20), - (int)(owner.Position.Y + 50) - ); - } - }; - } - } - - public void ShowControllerBindings(List inputConfigs) + public void ShowControllerBindings(List inputConfigs, int durationSeconds = 3) { // Clear existing bindings PlayerBindings.Children.Clear(); @@ -118,13 +93,21 @@ namespace Ryujinx.Ava.UI.Windows PlayerBindings.Children.Add(playerPanel); } + // Update duration text + DurationText.Text = durationSeconds == 1 + ? "This overlay will disappear in 1 second" + : $"This overlay will disappear in {durationSeconds} seconds"; + + // Show the overlay + IsVisible = true; + // Auto-hide after delay _ = Task.Run(async () => { - await Task.Delay(AutoHideDelayMs); + await Task.Delay(durationSeconds * 1000); await Dispatcher.UIThread.InvokeAsync(() => { - Close(); + IsVisible = false; }); }); } diff --git a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs index 83dcc7882..20b09c775 100644 --- a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs @@ -1710,9 +1710,8 @@ namespace Ryujinx.Ava.UI.ViewModels // Only show overlay if there are actual controller configurations for players 1-4 if (inputConfigs?.Any(c => c.PlayerIndex <= PlayerIndex.Player4) == true) { - var overlay = new Windows.ControllerOverlayWindow(Window); - overlay.ShowControllerBindings(inputConfigs); - overlay.Show(); + int duration = ConfigurationState.Instance.ControllerOverlayGameStartDuration.Value; + Window.ControllerOverlay.ShowControllerBindings(inputConfigs, duration); } } catch (Exception ex) diff --git a/src/Ryujinx/UI/Windows/MainWindow.axaml b/src/Ryujinx/UI/Windows/MainWindow.axaml index 498b77100..8085ffe93 100644 --- a/src/Ryujinx/UI/Windows/MainWindow.axaml +++ b/src/Ryujinx/UI/Windows/MainWindow.axaml @@ -10,6 +10,7 @@ xmlns:controls="clr-namespace:Ryujinx.Ava.UI.Controls" xmlns:main="clr-namespace:Ryujinx.Ava.UI.Views.Main" xmlns:viewsMisc="clr-namespace:Ryujinx.Ava.UI.Views.Misc" + xmlns:overlayControls="clr-namespace:Ryujinx.Ava.UI.Controls" Cursor="{Binding Cursor}" Title="{Binding Title}" WindowState="{Binding WindowState}" @@ -178,5 +179,10 @@ Name="StatusBarView" Grid.Row="2" /> + + +