mirror of
https://github.com/ppy/osu.git
synced 2025-01-10 07:02:58 +08:00
Merge pull request #30454 from lukektx/key-reversion-conflict
Prevent key bind conflict popup when default key is assigned to secondary binding
This commit is contained in:
commit
1868549a3f
@ -414,11 +414,7 @@ namespace osu.Game.Tests.Visual.Settings
|
|||||||
});
|
});
|
||||||
AddStep("move mouse to centre", () => InputManager.MoveMouseTo(panel.ScreenSpaceDrawQuad.Centre));
|
AddStep("move mouse to centre", () => InputManager.MoveMouseTo(panel.ScreenSpaceDrawQuad.Centre));
|
||||||
scrollToAndStartBinding("Left (centre)");
|
scrollToAndStartBinding("Left (centre)");
|
||||||
AddStep("clear binding", () =>
|
clearBinding();
|
||||||
{
|
|
||||||
var row = panel.ChildrenOfType<KeyBindingRow>().First(r => r.ChildrenOfType<OsuSpriteText>().Any(s => s.Text.ToString() == "Left (centre)"));
|
|
||||||
row.ChildrenOfType<KeyBindingRow.ClearButton>().Single().TriggerClick();
|
|
||||||
});
|
|
||||||
scrollToAndStartBinding("Left (rim)");
|
scrollToAndStartBinding("Left (rim)");
|
||||||
AddStep("bind M1", () => InputManager.Click(MouseButton.Left));
|
AddStep("bind M1", () => InputManager.Click(MouseButton.Left));
|
||||||
|
|
||||||
@ -431,6 +427,45 @@ namespace osu.Game.Tests.Visual.Settings
|
|||||||
AddUntilStep("conflict popover not shown", () => panel.ChildrenOfType<KeyBindingConflictPopover>().SingleOrDefault(), () => Is.Null);
|
AddUntilStep("conflict popover not shown", () => panel.ChildrenOfType<KeyBindingConflictPopover>().SingleOrDefault(), () => Is.Null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestResettingRowCannotConflictWithItself()
|
||||||
|
{
|
||||||
|
AddStep("reset taiko section to default", () =>
|
||||||
|
{
|
||||||
|
var section = panel.ChildrenOfType<VariantBindingsSubsection>().First(section => new TaikoRuleset().RulesetInfo.Equals(section.Ruleset));
|
||||||
|
section.ChildrenOfType<ResetButton>().Single().TriggerClick();
|
||||||
|
});
|
||||||
|
AddStep("move mouse to centre", () => InputManager.MoveMouseTo(panel.ScreenSpaceDrawQuad.Centre));
|
||||||
|
|
||||||
|
scrollToAndStartBinding("Left (centre)");
|
||||||
|
clearBinding();
|
||||||
|
scrollToAndStartBinding("Left (centre)", 1);
|
||||||
|
clearBinding();
|
||||||
|
|
||||||
|
scrollToAndStartBinding("Left (centre)");
|
||||||
|
AddStep("bind F", () => InputManager.Key(Key.F));
|
||||||
|
scrollToAndStartBinding("Left (centre)", 1);
|
||||||
|
AddStep("bind M1", () => InputManager.Click(MouseButton.Left));
|
||||||
|
|
||||||
|
AddStep("revert row to default", () =>
|
||||||
|
{
|
||||||
|
var row = panel.ChildrenOfType<KeyBindingRow>().First(r => r.ChildrenOfType<OsuSpriteText>().Any(s => s.Text.ToString() == "Left (centre)"));
|
||||||
|
InputManager.MoveMouseTo(row.ChildrenOfType<RevertToDefaultButton<bool>>().Single());
|
||||||
|
InputManager.Click(MouseButton.Left);
|
||||||
|
});
|
||||||
|
AddWaitStep("wait a bit", 3);
|
||||||
|
AddUntilStep("conflict popover not shown", () => panel.ChildrenOfType<KeyBindingConflictPopover>().SingleOrDefault(), () => Is.Null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void clearBinding()
|
||||||
|
{
|
||||||
|
AddStep("clear binding", () =>
|
||||||
|
{
|
||||||
|
var row = panel.ChildrenOfType<KeyBindingRow>().First(r => r.ChildrenOfType<OsuSpriteText>().Any(s => s.Text.ToString() == "Left (centre)"));
|
||||||
|
row.ChildrenOfType<KeyBindingRow.ClearButton>().Single().TriggerClick();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
private void checkBinding(string name, string keyName)
|
private void checkBinding(string name, string keyName)
|
||||||
{
|
{
|
||||||
AddAssert($"Check {name} is bound to {keyName}", () =>
|
AddAssert($"Check {name} is bound to {keyName}", () =>
|
||||||
@ -442,23 +477,23 @@ namespace osu.Game.Tests.Visual.Settings
|
|||||||
}, () => Is.EqualTo(keyName));
|
}, () => Is.EqualTo(keyName));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void scrollToAndStartBinding(string name)
|
private void scrollToAndStartBinding(string name, int bindingIndex = 0)
|
||||||
{
|
{
|
||||||
KeyBindingRow.KeyButton firstButton = null;
|
KeyBindingRow.KeyButton targetButton = null;
|
||||||
|
|
||||||
AddStep($"Scroll to {name}", () =>
|
AddStep($"Scroll to {name}", () =>
|
||||||
{
|
{
|
||||||
var firstRow = panel.ChildrenOfType<KeyBindingRow>().First(r => r.ChildrenOfType<OsuSpriteText>().Any(s => s.Text.ToString() == name));
|
var firstRow = panel.ChildrenOfType<KeyBindingRow>().First(r => r.ChildrenOfType<OsuSpriteText>().Any(s => s.Text.ToString() == name));
|
||||||
firstButton = firstRow.ChildrenOfType<KeyBindingRow.KeyButton>().First();
|
targetButton = firstRow.ChildrenOfType<KeyBindingRow.KeyButton>().ElementAt(bindingIndex);
|
||||||
|
|
||||||
panel.ChildrenOfType<SettingsPanel.SettingsSectionsContainer>().First().ScrollTo(firstButton);
|
panel.ChildrenOfType<SettingsPanel.SettingsSectionsContainer>().First().ScrollTo(targetButton);
|
||||||
});
|
});
|
||||||
|
|
||||||
AddWaitStep("wait for scroll", 5);
|
AddWaitStep("wait for scroll", 5);
|
||||||
|
|
||||||
AddStep("click to bind", () =>
|
AddStep("click to bind", () =>
|
||||||
{
|
{
|
||||||
InputManager.MoveMouseTo(firstButton);
|
InputManager.MoveMouseTo(targetButton);
|
||||||
InputManager.Click(MouseButton.Left);
|
InputManager.Click(MouseButton.Left);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -222,7 +222,7 @@ namespace osu.Game.Overlays.Settings.Sections.Input
|
|||||||
var button = buttons[i++];
|
var button = buttons[i++];
|
||||||
button.UpdateKeyCombination(d);
|
button.UpdateKeyCombination(d);
|
||||||
|
|
||||||
tryPersistKeyBinding(button.KeyBinding.Value, advanceToNextBinding: false);
|
tryPersistKeyBinding(button.KeyBinding.Value, advanceToNextBinding: false, restoringDefaults: true);
|
||||||
}
|
}
|
||||||
|
|
||||||
isDefault.Value = true;
|
isDefault.Value = true;
|
||||||
@ -489,12 +489,25 @@ namespace osu.Game.Overlays.Settings.Sections.Input
|
|||||||
base.OnFocusLost(e);
|
base.OnFocusLost(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void tryPersistKeyBinding(RealmKeyBinding keyBinding, bool advanceToNextBinding)
|
private bool isConflictingBinding(RealmKeyBinding first, RealmKeyBinding second, bool restoringDefaults)
|
||||||
|
{
|
||||||
|
if (first.ID == second.ID)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// ignore conflicts with same action bindings during revert. the assumption is that the other binding will be reverted subsequently in the same higher-level operation.
|
||||||
|
// this happens if the bindings for an action are rebound to the same keys, but the ordering of the bindings itself is different.
|
||||||
|
if (restoringDefaults && first.ActionInt == second.ActionInt)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return first.KeyCombination.Equals(second.KeyCombination);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void tryPersistKeyBinding(RealmKeyBinding keyBinding, bool advanceToNextBinding, bool restoringDefaults = false)
|
||||||
{
|
{
|
||||||
List<RealmKeyBinding> bindings = GetAllSectionBindings();
|
List<RealmKeyBinding> bindings = GetAllSectionBindings();
|
||||||
RealmKeyBinding? existingBinding = keyBinding.KeyCombination.Equals(new KeyCombination(InputKey.None))
|
RealmKeyBinding? existingBinding = keyBinding.KeyCombination.Equals(new KeyCombination(InputKey.None))
|
||||||
? null
|
? null
|
||||||
: bindings.FirstOrDefault(other => other.ID != keyBinding.ID && other.KeyCombination.Equals(keyBinding.KeyCombination));
|
: bindings.FirstOrDefault(other => isConflictingBinding(keyBinding, other, restoringDefaults));
|
||||||
|
|
||||||
if (existingBinding == null)
|
if (existingBinding == null)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user