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" />
+
+
+