diff --git a/scripts/UI/AudioSettings.cs b/scripts/UI/AudioSettings.cs index 7826d59..c1f35eb 100644 --- a/scripts/UI/AudioSettings.cs +++ b/scripts/UI/AudioSettings.cs @@ -16,19 +16,44 @@ public partial class AudioSettings : Control public override void _Ready() { + MasterVolumeSlider.FocusMode = Control.FocusModeEnum.All; + MusicVolumeSlider.FocusMode = Control.FocusModeEnum.All; + SfxVolumeSlider.FocusMode = Control.FocusModeEnum.All; + Initialize(); MasterVolumeSlider.ValueChanged += OnMasterVolumeChanged; MusicVolumeSlider.ValueChanged += OnMusicVolumeChanged; SfxVolumeSlider.ValueChanged += OnSfxVolumeChanged; LoadSettings(); + + if (InputDeviceManager.Instance != null) + InputDeviceManager.Instance.DeviceChanged += OnDeviceChanged; + AudioSettingsControl.VisibilityChanged += OnVisibilityChanged; } public override void _ExitTree() { + if (InputDeviceManager.Instance != null) + InputDeviceManager.Instance.DeviceChanged -= OnDeviceChanged; SaveSettings(); } + private void OnVisibilityChanged() + { + if (AudioSettingsControl.IsVisibleInTree() && InputDeviceManager.Instance?.IsPointerless == true) + GrabFirstFocus(); + } + + private void OnDeviceChanged(int device) + { + var d = (InputDeviceManager.InputDevice)device; + if (d != InputDeviceManager.InputDevice.Mouse && AudioSettingsControl.IsVisibleInTree()) + GrabFirstFocus(); + } + + private void GrabFirstFocus() => MasterVolumeSlider.GrabFocus(); + public override void _UnhandledInput(InputEvent @event) { if (!@event.IsActionReleased("ui_cancel")) return; diff --git a/scripts/UI/GameOverScreen.cs b/scripts/UI/GameOverScreen.cs index a0ddd01..7f82ba4 100644 --- a/scripts/UI/GameOverScreen.cs +++ b/scripts/UI/GameOverScreen.cs @@ -13,8 +13,27 @@ public partial class GameOverScreen : Control public override void _Ready() { + RestartButton.FocusMode = Control.FocusModeEnum.All; + MainMenuButton.FocusMode = Control.FocusModeEnum.All; + RestartButton.Pressed += OnRestartClicked; MainMenuButton.Pressed += OnMainMenuClicked; + + if (InputDeviceManager.Instance != null) + InputDeviceManager.Instance.DeviceChanged += OnDeviceChanged; + } + + public override void _ExitTree() + { + if (InputDeviceManager.Instance != null) + InputDeviceManager.Instance.DeviceChanged -= OnDeviceChanged; + } + + private void OnDeviceChanged(int device) + { + var d = (InputDeviceManager.InputDevice)device; + if (d != InputDeviceManager.InputDevice.Mouse && GameOverPanel.IsVisibleInTree()) + RestartButton.GrabFocus(); } private void OnMainMenuClicked() @@ -33,5 +52,7 @@ public partial class GameOverScreen : Control if (GameStateStore.Instance?.Player.Lives != 0) return; GameOverPanel.Show(); + if (InputDeviceManager.Instance?.IsPointerless == true) + RestartButton.GrabFocus(); } } \ No newline at end of file diff --git a/scripts/UI/MainMenu.cs b/scripts/UI/MainMenu.cs index 4bf47e3..5f3c6d1 100644 --- a/scripts/UI/MainMenu.cs +++ b/scripts/UI/MainMenu.cs @@ -21,6 +21,11 @@ public partial class MainMenu : Control public override void _Ready() { + NewGameButton.FocusMode = Control.FocusModeEnum.All; + ContinueButton.FocusMode = Control.FocusModeEnum.All; + SettingsButton.FocusMode = Control.FocusModeEnum.All; + CreditsButton.FocusMode = Control.FocusModeEnum.All; + ExitButton.FocusMode = Control.FocusModeEnum.All; NewGameButton.Pressed += OnNewGamePressed; ContinueButton.Pressed += OnContinuePressed; @@ -31,6 +36,34 @@ public partial class MainMenu : Control VersionLabel.Text = $"v. {ProjectSettings.GetSetting("application/config/version")}"; ContinueButton.Disabled = !SaveSystem.CheckSaveExists(); + if (InputDeviceManager.Instance != null) + InputDeviceManager.Instance.DeviceChanged += OnDeviceChanged; + VisibilityChanged += OnVisibilityChanged; + + GrabFirstFocus(); + } + + public override void _ExitTree() + { + if (InputDeviceManager.Instance != null) + InputDeviceManager.Instance.DeviceChanged -= OnDeviceChanged; + } + + private void OnVisibilityChanged() + { + if (IsVisibleInTree() && InputDeviceManager.Instance?.IsPointerless == true) + GrabFirstFocus(); + } + + private void OnDeviceChanged(int device) + { + var d = (InputDeviceManager.InputDevice)device; + if (d != InputDeviceManager.InputDevice.Mouse && IsVisibleInTree()) + GrabFirstFocus(); + } + + private void GrabFirstFocus() + { if (SaveSystem.CheckSaveExists()) ContinueButton.GrabFocus(); else diff --git a/scripts/UI/PauseMenu.cs b/scripts/UI/PauseMenu.cs index 5b92a2f..061f78e 100644 --- a/scripts/UI/PauseMenu.cs +++ b/scripts/UI/PauseMenu.cs @@ -18,6 +18,10 @@ public partial class PauseMenu : Control public override void _Ready() { + ResumeButton.FocusMode = Control.FocusModeEnum.All; + MainMenuButton.FocusMode = Control.FocusModeEnum.All; + QuitButton.FocusMode = Control.FocusModeEnum.All; + SettingsButton.FocusMode = Control.FocusModeEnum.All; ResumeButton.Pressed += OnResumePressed; MainMenuButton.Pressed += OnMainMenuPressed; @@ -25,8 +29,33 @@ public partial class PauseMenu : Control SettingsButton.Pressed += OnSettingsPressed; PauseMenuControl.Hide(); + + if (InputDeviceManager.Instance != null) + InputDeviceManager.Instance.DeviceChanged += OnDeviceChanged; + PauseMenuControl.VisibilityChanged += OnVisibilityChanged; } + public override void _ExitTree() + { + if (InputDeviceManager.Instance != null) + InputDeviceManager.Instance.DeviceChanged -= OnDeviceChanged; + } + + private void OnVisibilityChanged() + { + if (PauseMenuControl.IsVisibleInTree() && InputDeviceManager.Instance?.IsPointerless == true) + GrabFirstFocus(); + } + + private void OnDeviceChanged(int device) + { + var d = (InputDeviceManager.InputDevice)device; + if (d != InputDeviceManager.InputDevice.Mouse && PauseMenuControl.IsVisibleInTree()) + GrabFirstFocus(); + } + + private void GrabFirstFocus() => ResumeButton.GrabFocus(); + public override void _UnhandledInput(InputEvent @event) { if (!@event.IsActionPressed("pause")) return; diff --git a/scripts/UI/SettingsMenu.cs b/scripts/UI/SettingsMenu.cs index 37bf3c4..6283e94 100644 --- a/scripts/UI/SettingsMenu.cs +++ b/scripts/UI/SettingsMenu.cs @@ -19,6 +19,10 @@ public partial class SettingsMenu : Control public override void _Ready() { + InputSettingsButton.FocusMode = Control.FocusModeEnum.All; + AudioSettingsButton.FocusMode = Control.FocusModeEnum.All; + DisplaySettingsButton.FocusMode = Control.FocusModeEnum.All; + GameplaySettingsButton.FocusMode = Control.FocusModeEnum.All; InputSettingsButton.Pressed += OnInputSettingsPressed; AudioSettingsButton.Pressed += OnAudioSettingsPressed; @@ -29,8 +33,33 @@ public partial class SettingsMenu : Control AudioSettingsControl?.Hide(); DisplaySettingsControl?.Hide(); GameplaySettingsControl?.Hide(); + + if (InputDeviceManager.Instance != null) + InputDeviceManager.Instance.DeviceChanged += OnDeviceChanged; + VisibilityChanged += OnVisibilityChanged; } + public override void _ExitTree() + { + if (InputDeviceManager.Instance != null) + InputDeviceManager.Instance.DeviceChanged -= OnDeviceChanged; + } + + private void OnVisibilityChanged() + { + if (IsVisibleInTree() && InputDeviceManager.Instance?.IsPointerless == true) + GrabFirstFocus(); + } + + private void OnDeviceChanged(int device) + { + var d = (InputDeviceManager.InputDevice)device; + if (d != InputDeviceManager.InputDevice.Mouse && IsVisibleInTree()) + GrabFirstFocus(); + } + + private void GrabFirstFocus() => InputSettingsButton.GrabFocus(); + public override void _UnhandledInput(InputEvent @event) { if (!@event.IsActionPressed("ui_cancel")) return;