Skip to content

Commit

Permalink
Merge pull request #17570 from peppy/fix-settings-textbox-focus
Browse files Browse the repository at this point in the history
Focus focus not being transferred correctly to parent settings panel on exiting nested panel
  • Loading branch information
smoogipoo authored Mar 31, 2022
2 parents 140eaa6 + 726b49f commit bc4d6a3
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 4 deletions.
57 changes: 55 additions & 2 deletions osu.Game.Tests/Visual/Settings/TestSceneSettingsPanel.cs
Original file line number Diff line number Diff line change
@@ -1,16 +1,21 @@
// Copyright (c) ppy Pty Ltd <[email protected]>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.

using System.Linq;
using NUnit.Framework;
using osu.Framework.Allocation;
using osu.Framework.Graphics.Containers;
using osu.Framework.Testing;
using osu.Game.Graphics.UserInterface;
using osu.Game.Overlays;
using osu.Game.Overlays.Settings.Sections;
using osu.Game.Overlays.Settings.Sections.Input;
using osuTK.Input;

namespace osu.Game.Tests.Visual.Settings
{
[TestFixture]
public class TestSceneSettingsPanel : OsuTestScene
public class TestSceneSettingsPanel : OsuManualInputManagerTestScene
{
private SettingsPanel settings;
private DialogOverlay dialogOverlay;
Expand All @@ -33,7 +38,55 @@ public void SetUpSteps()
public void ToggleVisibility()
{
AddWaitStep("wait some", 5);
AddToggleStep("toggle editor visibility", visible => settings.ToggleVisibility());
AddToggleStep("toggle visibility", visible => settings.ToggleVisibility());
}

[Test]
public void TestTextboxFocusAfterNestedPanelBackButton()
{
AddUntilStep("sections loaded", () => settings.SectionsContainer.Children.Count > 0);
AddUntilStep("top-level textbox focused", () => settings.SectionsContainer.ChildrenOfType<FocusedTextBox>().FirstOrDefault()?.HasFocus == true);

AddStep("open key binding subpanel", () =>
{
settings.SectionsContainer
.ChildrenOfType<InputSection>().FirstOrDefault()?
.ChildrenOfType<OsuButton>().FirstOrDefault()?
.TriggerClick();
});

AddUntilStep("binding panel textbox focused", () => settings
.ChildrenOfType<KeyBindingPanel>().FirstOrDefault()?
.ChildrenOfType<FocusedTextBox>().FirstOrDefault()?.HasFocus == true);

AddStep("Press back", () => settings
.ChildrenOfType<KeyBindingPanel>().FirstOrDefault()?
.ChildrenOfType<SettingsSubPanel.BackButton>().FirstOrDefault()?.TriggerClick());

AddUntilStep("top-level textbox focused", () => settings.SectionsContainer.ChildrenOfType<FocusedTextBox>().FirstOrDefault()?.HasFocus == true);
}

[Test]
public void TestTextboxFocusAfterNestedPanelEscape()
{
AddUntilStep("sections loaded", () => settings.SectionsContainer.Children.Count > 0);
AddUntilStep("top-level textbox focused", () => settings.SectionsContainer.ChildrenOfType<FocusedTextBox>().FirstOrDefault()?.HasFocus == true);

AddStep("open key binding subpanel", () =>
{
settings.SectionsContainer
.ChildrenOfType<InputSection>().FirstOrDefault()?
.ChildrenOfType<OsuButton>().FirstOrDefault()?
.TriggerClick();
});

AddUntilStep("binding panel textbox focused", () => settings
.ChildrenOfType<KeyBindingPanel>().FirstOrDefault()?
.ChildrenOfType<FocusedTextBox>().FirstOrDefault()?.HasFocus == true);

AddStep("Escape", () => InputManager.Key(Key.Escape));

AddUntilStep("top-level textbox focused", () => settings.SectionsContainer.ChildrenOfType<FocusedTextBox>().FirstOrDefault()?.HasFocus == true);
}

[BackgroundDependencyLoader]
Expand Down
2 changes: 1 addition & 1 deletion osu.Game/Graphics/UserInterface/FocusedTextBox.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public void TakeFocus()
if (!allowImmediateFocus)
return;

Scheduler.Add(() => GetContainingInputManager().ChangeFocus(this), false);
Scheduler.Add(() => GetContainingInputManager().ChangeFocus(this));
}

public new void KillFocus() => base.KillFocus();
Expand Down
2 changes: 1 addition & 1 deletion osu.Game/Overlays/SettingsSubPanel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ private void load()

protected override bool DimMainContent => false; // dimming is handled by main overlay

private class BackButton : SidebarButton
public class BackButton : SidebarButton
{
private Container content;

Expand Down

0 comments on commit bc4d6a3

Please sign in to comment.