mirror of
https://github.com/ppy/osu.git
synced 2024-12-15 02:42:54 +08:00
Add keyboard traversal support for first run dialog (and tidy up step traversal logic)
This commit is contained in:
parent
e67cc293b8
commit
6d534046ff
@ -60,13 +60,19 @@ namespace osu.Game.Tests.Visual.UserInterface
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[TestCase(false)]
|
||||||
public void TestOverlayRunsToFinish()
|
[TestCase(true)]
|
||||||
|
public void TestOverlayRunsToFinish(bool keyboard)
|
||||||
{
|
{
|
||||||
AddUntilStep("step through", () =>
|
AddUntilStep("step through", () =>
|
||||||
{
|
{
|
||||||
if (overlay.CurrentScreen?.IsLoaded != false)
|
if (overlay.CurrentScreen?.IsLoaded != false)
|
||||||
overlay.NextButton.TriggerClick();
|
{
|
||||||
|
if (keyboard)
|
||||||
|
InputManager.Key(Key.Enter);
|
||||||
|
else
|
||||||
|
overlay.NextButton.TriggerClick();
|
||||||
|
}
|
||||||
|
|
||||||
return overlay.State.Value == Visibility.Hidden;
|
return overlay.State.Value == Visibility.Hidden;
|
||||||
});
|
});
|
||||||
@ -80,8 +86,9 @@ namespace osu.Game.Tests.Visual.UserInterface
|
|||||||
AddUntilStep("back at start", () => overlay.CurrentScreen is ScreenWelcome);
|
AddUntilStep("back at start", () => overlay.CurrentScreen is ScreenWelcome);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[TestCase(false)]
|
||||||
public void TestBackButton()
|
[TestCase(true)]
|
||||||
|
public void TestBackButton(bool keyboard)
|
||||||
{
|
{
|
||||||
AddAssert("back button disabled", () => !overlay.BackButton.Enabled.Value);
|
AddAssert("back button disabled", () => !overlay.BackButton.Enabled.Value);
|
||||||
|
|
||||||
@ -98,12 +105,23 @@ namespace osu.Game.Tests.Visual.UserInterface
|
|||||||
AddUntilStep("step back to start", () =>
|
AddUntilStep("step back to start", () =>
|
||||||
{
|
{
|
||||||
if (overlay.CurrentScreen?.IsLoaded != false)
|
if (overlay.CurrentScreen?.IsLoaded != false)
|
||||||
overlay.BackButton.TriggerClick();
|
{
|
||||||
|
if (keyboard)
|
||||||
|
InputManager.Key(Key.Escape);
|
||||||
|
else
|
||||||
|
overlay.BackButton.TriggerClick();
|
||||||
|
}
|
||||||
|
|
||||||
return overlay.CurrentScreen is ScreenWelcome;
|
return overlay.CurrentScreen is ScreenWelcome;
|
||||||
});
|
});
|
||||||
|
|
||||||
AddAssert("back button disabled", () => !overlay.BackButton.Enabled.Value);
|
AddAssert("back button disabled", () => !overlay.BackButton.Enabled.Value);
|
||||||
|
|
||||||
|
if (keyboard)
|
||||||
|
{
|
||||||
|
AddStep("exit via keyboard", () => InputManager.Key(Key.Escape));
|
||||||
|
AddAssert("overlay dismissed", () => overlay.State.Value == Visibility.Hidden);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
@ -12,12 +12,14 @@ using osu.Framework.Graphics.Containers;
|
|||||||
using osu.Framework.Graphics.Effects;
|
using osu.Framework.Graphics.Effects;
|
||||||
using osu.Framework.Graphics.Shapes;
|
using osu.Framework.Graphics.Shapes;
|
||||||
using osu.Framework.Graphics.Sprites;
|
using osu.Framework.Graphics.Sprites;
|
||||||
|
using osu.Framework.Input.Events;
|
||||||
using osu.Framework.Localisation;
|
using osu.Framework.Localisation;
|
||||||
using osu.Framework.Screens;
|
using osu.Framework.Screens;
|
||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Graphics.Containers;
|
using osu.Game.Graphics.Containers;
|
||||||
using osu.Game.Graphics.Sprites;
|
using osu.Game.Graphics.Sprites;
|
||||||
using osu.Game.Graphics.UserInterface;
|
using osu.Game.Graphics.UserInterface;
|
||||||
|
using osu.Game.Input.Bindings;
|
||||||
using osu.Game.Localisation;
|
using osu.Game.Localisation;
|
||||||
using osu.Game.Overlays.FirstRunSetup;
|
using osu.Game.Overlays.FirstRunSetup;
|
||||||
using osu.Game.Overlays.Notifications;
|
using osu.Game.Overlays.Notifications;
|
||||||
@ -215,57 +217,30 @@ namespace osu.Game.Overlays
|
|||||||
performer.PerformFromScreen(_ => { Show(); }, new[] { typeof(MainMenu) });
|
performer.PerformFromScreen(_ => { Show(); }, new[] { typeof(MainMenu) });
|
||||||
}
|
}
|
||||||
|
|
||||||
private void showLastStep()
|
public override bool OnPressed(KeyBindingPressEvent<GlobalAction> e)
|
||||||
{
|
{
|
||||||
Debug.Assert(currentStepIndex > 0);
|
if (!e.Repeat)
|
||||||
Debug.Assert(stack != null);
|
|
||||||
|
|
||||||
stack.CurrentScreen.Exit();
|
|
||||||
currentStepIndex--;
|
|
||||||
|
|
||||||
BackButton.Enabled.Value = currentStepIndex != 0;
|
|
||||||
|
|
||||||
updateButtonText();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void showNextStep()
|
|
||||||
{
|
|
||||||
if (currentStepIndex == null)
|
|
||||||
{
|
{
|
||||||
stackContainer.Child = stack = new ScreenStack
|
switch (e.Action)
|
||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.Both,
|
case GlobalAction.Select:
|
||||||
};
|
NextButton.TriggerClick();
|
||||||
|
return true;
|
||||||
|
|
||||||
currentStepIndex = 0;
|
case GlobalAction.Back:
|
||||||
|
if (BackButton.Enabled.Value)
|
||||||
|
{
|
||||||
|
BackButton.TriggerClick();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If back button is disabled, we are at the first step.
|
||||||
|
// The base call will handle dismissal of the overlay.
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
currentStepIndex++;
|
|
||||||
|
|
||||||
Debug.Assert(currentStepIndex != null);
|
return base.OnPressed(e);
|
||||||
Debug.Assert(stack != null);
|
|
||||||
|
|
||||||
BackButton.Enabled.Value = currentStepIndex > 0;
|
|
||||||
|
|
||||||
if (currentStepIndex < steps.Length)
|
|
||||||
{
|
|
||||||
stack.Push((Screen)Activator.CreateInstance(steps[currentStepIndex.Value].ScreenType));
|
|
||||||
updateButtonText();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
currentStepIndex = null;
|
|
||||||
Hide();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateButtonText()
|
|
||||||
{
|
|
||||||
Debug.Assert(currentStepIndex != null);
|
|
||||||
|
|
||||||
NextButton.Text = currentStepIndex + 1 < steps.Length
|
|
||||||
? FirstRunSetupOverlayStrings.Next(steps[currentStepIndex.Value + 1].Description)
|
|
||||||
: CommonStrings.Finish;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void PopIn()
|
protected override void PopIn()
|
||||||
@ -278,7 +253,7 @@ namespace osu.Game.Overlays
|
|||||||
this.FadeIn(400, Easing.OutQuint);
|
this.FadeIn(400, Easing.OutQuint);
|
||||||
|
|
||||||
if (currentStepIndex == null)
|
if (currentStepIndex == null)
|
||||||
showNextStep();
|
showFirstStep();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void PopOut()
|
protected override void PopOut()
|
||||||
@ -308,6 +283,64 @@ namespace osu.Game.Overlays
|
|||||||
this.FadeOut(200, Easing.OutQuint);
|
this.FadeOut(200, Easing.OutQuint);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void showFirstStep()
|
||||||
|
{
|
||||||
|
Debug.Assert(currentStepIndex == null);
|
||||||
|
|
||||||
|
stackContainer.Child = stack = new ScreenStack
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.Both,
|
||||||
|
};
|
||||||
|
|
||||||
|
currentStepIndex = -1;
|
||||||
|
showNextStep();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showLastStep()
|
||||||
|
{
|
||||||
|
if (currentStepIndex == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Debug.Assert(stack != null);
|
||||||
|
|
||||||
|
stack.CurrentScreen.Exit();
|
||||||
|
currentStepIndex--;
|
||||||
|
|
||||||
|
BackButton.Enabled.Value = currentStepIndex != 0;
|
||||||
|
|
||||||
|
updateButtonText();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showNextStep()
|
||||||
|
{
|
||||||
|
Debug.Assert(currentStepIndex != null);
|
||||||
|
Debug.Assert(stack != null);
|
||||||
|
|
||||||
|
currentStepIndex++;
|
||||||
|
|
||||||
|
BackButton.Enabled.Value = currentStepIndex > 0;
|
||||||
|
|
||||||
|
if (currentStepIndex < steps.Length)
|
||||||
|
{
|
||||||
|
stack.Push((Screen)Activator.CreateInstance(steps[currentStepIndex.Value].ScreenType));
|
||||||
|
updateButtonText();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
currentStepIndex = null;
|
||||||
|
Hide();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateButtonText()
|
||||||
|
{
|
||||||
|
Debug.Assert(currentStepIndex != null);
|
||||||
|
|
||||||
|
NextButton.Text = currentStepIndex + 1 < steps.Length
|
||||||
|
? FirstRunSetupOverlayStrings.Next(steps[currentStepIndex.Value + 1].Description)
|
||||||
|
: CommonStrings.Finish;
|
||||||
|
}
|
||||||
|
|
||||||
private class FirstRunStep
|
private class FirstRunStep
|
||||||
{
|
{
|
||||||
public readonly Type ScreenType;
|
public readonly Type ScreenType;
|
||||||
|
Loading…
Reference in New Issue
Block a user