diff --git a/osu.Game/Overlays/Settings/Sections/Input/KeyBindingRow.cs b/osu.Game/Overlays/Settings/Sections/Input/KeyBindingRow.cs
index 6ce8a188e6..25ab8cfad2 100644
--- a/osu.Game/Overlays/Settings/Sections/Input/KeyBindingRow.cs
+++ b/osu.Game/Overlays/Settings/Sections/Input/KeyBindingRow.cs
@@ -33,6 +33,11 @@ namespace osu.Game.Overlays.Settings.Sections.Input
{
public class KeyBindingRow : Container, IFilterable
{
+ ///
+ /// Invoked when the binding of this row is updated with a change being written.
+ ///
+ public Action BindingUpdated { get; set; }
+
private readonly object action;
private readonly IEnumerable bindings;
@@ -153,7 +158,7 @@ namespace osu.Game.Overlays.Settings.Sections.Input
Spacing = new Vector2(5),
Children = new Drawable[]
{
- new CancelButton { Action = finalise },
+ new CancelButton { Action = () => finalise(false) },
new ClearButton { Action = clear },
},
},
@@ -240,7 +245,7 @@ namespace osu.Game.Overlays.Settings.Sections.Input
}
if (bindTarget.IsHovered)
- finalise();
+ finalise(false);
// prevent updating bind target before clear button's action
else if (!cancelAndClearButtons.Any(b => b.IsHovered))
updateBindTarget();
@@ -377,10 +382,10 @@ namespace osu.Game.Overlays.Settings.Sections.Input
return;
bindTarget.UpdateKeyCombination(InputKey.None);
- finalise();
+ finalise(false);
}
- private void finalise()
+ private void finalise(bool hasChanged = true)
{
if (bindTarget != null)
{
@@ -393,6 +398,8 @@ namespace osu.Game.Overlays.Settings.Sections.Input
{
// schedule to ensure we don't instantly get focus back on next OnMouseClick (see AcceptFocus impl.)
bindTarget = null;
+ if (hasChanged)
+ BindingUpdated?.Invoke(this);
});
}
@@ -417,7 +424,7 @@ namespace osu.Game.Overlays.Settings.Sections.Input
protected override void OnFocusLost(FocusLostEvent e)
{
- finalise();
+ finalise(false);
base.OnFocusLost(e);
}
diff --git a/osu.Game/Overlays/Settings/Sections/Input/KeyBindingsSubsection.cs b/osu.Game/Overlays/Settings/Sections/Input/KeyBindingsSubsection.cs
index 628fe08607..98d569948f 100644
--- a/osu.Game/Overlays/Settings/Sections/Input/KeyBindingsSubsection.cs
+++ b/osu.Game/Overlays/Settings/Sections/Input/KeyBindingsSubsection.cs
@@ -19,6 +19,12 @@ namespace osu.Game.Overlays.Settings.Sections.Input
{
public abstract class KeyBindingsSubsection : SettingsSubsection
{
+ ///
+ /// After a successful binding, automatically select the next binding row to make quickly
+ /// binding a large set of keys easier on the user.
+ ///
+ protected virtual bool AutoAdvanceTarget => false;
+
protected IEnumerable Defaults;
public RulesetInfo Ruleset { get; protected set; }
@@ -49,7 +55,8 @@ namespace osu.Game.Overlays.Settings.Sections.Input
Add(new KeyBindingRow(defaultGroup.Key, bindings.Where(b => b.ActionInt.Equals(intKey)).ToList())
{
AllowMainMouseButtons = Ruleset != null,
- Defaults = defaultGroup.Select(d => d.KeyCombination)
+ Defaults = defaultGroup.Select(d => d.KeyCombination),
+ BindingUpdated = onBindingUpdated
});
}
@@ -58,6 +65,16 @@ namespace osu.Game.Overlays.Settings.Sections.Input
Action = () => Children.OfType().ForEach(k => k.RestoreDefaults())
});
}
+
+ private void onBindingUpdated(KeyBindingRow sender)
+ {
+ if (AutoAdvanceTarget)
+ {
+ var next = Children.SkipWhile(c => c != sender).Skip(1).FirstOrDefault();
+ if (next != null)
+ GetContainingInputManager().ChangeFocus(next);
+ }
+ }
}
public class ResetButton : DangerousSettingsButton
diff --git a/osu.Game/Overlays/Settings/Sections/Input/VariantBindingsSubsection.cs b/osu.Game/Overlays/Settings/Sections/Input/VariantBindingsSubsection.cs
index a0f069b3bb..a6f6c28463 100644
--- a/osu.Game/Overlays/Settings/Sections/Input/VariantBindingsSubsection.cs
+++ b/osu.Game/Overlays/Settings/Sections/Input/VariantBindingsSubsection.cs
@@ -8,6 +8,8 @@ namespace osu.Game.Overlays.Settings.Sections.Input
{
public class VariantBindingsSubsection : KeyBindingsSubsection
{
+ protected override bool AutoAdvanceTarget => true;
+
protected override LocalisableString Header { get; }
public VariantBindingsSubsection(RulesetInfo ruleset, int variant)