1
0
mirror of https://github.com/ppy/osu.git synced 2024-12-14 13:22:55 +08:00

Merge pull request #5096 from peppy/key-binding-fixes

Add buttons to clear or cancel key binding
This commit is contained in:
Dan Balasescu 2019-06-21 15:55:10 +09:00 committed by GitHub
commit 8cbea298d8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 72 additions and 28 deletions

View File

@ -1,17 +1,30 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence. // Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text. // See the LICENCE file in the repository root for full licence text.
using System;
using System.Collections.Generic;
using NUnit.Framework; using NUnit.Framework;
using osu.Game.Overlays; using osu.Game.Overlays;
using osu.Game.Overlays.KeyBinding;
namespace osu.Game.Tests.Visual.Settings namespace osu.Game.Tests.Visual.Settings
{ {
[TestFixture] [TestFixture]
public class TestSceneKeyConfiguration : OsuTestScene public class TestSceneKeyBindingPanel : OsuTestScene
{ {
private readonly KeyBindingPanel panel; private readonly KeyBindingPanel panel;
public TestSceneKeyConfiguration() public override IReadOnlyList<Type> RequiredTypes => new[]
{
typeof(KeyBindingRow),
typeof(GlobalKeyBindingsSection),
typeof(KeyBindingRow),
typeof(KeyBindingsSubsection),
typeof(RulesetBindingsSection),
typeof(VariantBindingsSubsection),
};
public TestSceneKeyBindingPanel()
{ {
Child = panel = new KeyBindingPanel(); Child = panel = new KeyBindingPanel();
} }

View File

@ -13,9 +13,10 @@ using osu.Framework.Graphics.Shapes;
using osu.Framework.Input.Bindings; using osu.Framework.Input.Bindings;
using osu.Framework.Input.Events; using osu.Framework.Input.Events;
using osu.Game.Graphics; using osu.Game.Graphics;
using osu.Game.Graphics.Containers;
using osu.Game.Graphics.Sprites; using osu.Game.Graphics.Sprites;
using osu.Game.Graphics.UserInterface;
using osu.Game.Input; using osu.Game.Input;
using osuTK;
using osuTK.Graphics; using osuTK.Graphics;
using osuTK.Input; using osuTK.Input;
@ -47,7 +48,7 @@ namespace osu.Game.Overlays.KeyBinding
public bool FilteringActive { get; set; } public bool FilteringActive { get; set; }
private OsuSpriteText text; private OsuSpriteText text;
private OsuTextFlowContainer pressAKey; private Drawable pressAKey;
private FillFlowContainer<KeyButton> buttons; private FillFlowContainer<KeyButton> buttons;
@ -80,7 +81,7 @@ namespace osu.Game.Overlays.KeyBinding
Hollow = true, Hollow = true,
}; };
Children = new Drawable[] Children = new[]
{ {
new Box new Box
{ {
@ -99,15 +100,19 @@ namespace osu.Game.Overlays.KeyBinding
Anchor = Anchor.TopRight, Anchor = Anchor.TopRight,
Origin = Anchor.TopRight Origin = Anchor.TopRight
}, },
pressAKey = new OsuTextFlowContainer pressAKey = new FillFlowContainer
{ {
Text = "Press a key to change binding, Shift+Delete to delete, Escape to cancel.", AutoSizeAxes = Axes.Both,
RelativeSizeAxes = Axes.X, Padding = new MarginPadding(padding) { Top = height + padding * 2 },
AutoSizeAxes = Axes.Y, Anchor = Anchor.TopRight,
Margin = new MarginPadding(padding), Origin = Anchor.TopRight,
Padding = new MarginPadding { Top = height },
Alpha = 0, Alpha = 0,
Colour = colours.YellowDark Spacing = new Vector2(5),
Children = new Drawable[]
{
new CancelButton { Action = finalise },
new ClearButton { Action = clear },
},
} }
}; };
@ -205,21 +210,6 @@ namespace osu.Game.Overlays.KeyBinding
if (!HasFocus) if (!HasFocus)
return false; return false;
switch (e.Key)
{
case Key.Delete:
{
if (e.ShiftPressed)
{
bindTarget.UpdateKeyCombination(InputKey.None);
finalise();
return true;
}
break;
}
}
bindTarget.UpdateKeyCombination(KeyCombination.FromInputState(e.CurrentState)); bindTarget.UpdateKeyCombination(KeyCombination.FromInputState(e.CurrentState));
if (!isModifier(e.Key)) finalise(); if (!isModifier(e.Key)) finalise();
@ -254,6 +244,12 @@ namespace osu.Game.Overlays.KeyBinding
return true; return true;
} }
private void clear()
{
bindTarget.UpdateKeyCombination(InputKey.None);
finalise();
}
private void finalise() private void finalise()
{ {
if (bindTarget != null) if (bindTarget != null)
@ -300,6 +296,41 @@ namespace osu.Game.Overlays.KeyBinding
if (bindTarget != null) bindTarget.IsBinding = true; if (bindTarget != null) bindTarget.IsBinding = true;
} }
private class CancelButton : TriangleButton
{
public CancelButton()
{
Text = "Cancel";
Size = new Vector2(80, 20);
}
}
private class ClearButton : TriangleButton
{
public ClearButton()
{
Text = "Clear";
Size = new Vector2(80, 20);
}
protected override bool OnMouseUp(MouseUpEvent e)
{
base.OnMouseUp(e);
// without this, the mouse up triggers a finalise (and deselection) of the current binding target.
return true;
}
[BackgroundDependencyLoader]
private void load(OsuColour colours)
{
BackgroundColour = colours.Pink;
Triangles.ColourDark = colours.PinkDark;
Triangles.ColourLight = colours.PinkLight;
}
}
private class KeyButton : Container private class KeyButton : Container
{ {
public readonly Framework.Input.Bindings.KeyBinding KeyBinding; public readonly Framework.Input.Bindings.KeyBinding KeyBinding;

View File

@ -60,7 +60,7 @@ namespace osu.Game.Overlays.KeyBinding
[BackgroundDependencyLoader] [BackgroundDependencyLoader]
private void load(OsuColour colours) private void load(OsuColour colours)
{ {
Text = "Reset"; Text = "Reset all bindings in section";
RelativeSizeAxes = Axes.X; RelativeSizeAxes = Axes.X;
Margin = new MarginPadding { Top = 5 }; Margin = new MarginPadding { Top = 5 };
Height = 20; Height = 20;