diff --git a/osu.Game/Input/Bindings/GlobalActionContainer.cs b/osu.Game/Input/Bindings/GlobalActionContainer.cs
index 69ea6b00ca..3da5f3212e 100644
--- a/osu.Game/Input/Bindings/GlobalActionContainer.cs
+++ b/osu.Game/Input/Bindings/GlobalActionContainer.cs
@@ -80,6 +80,7 @@ namespace osu.Game.Input.Bindings
new KeyBinding(new[] { InputKey.K }, GlobalAction.EditorNudgeRight),
new KeyBinding(new[] { InputKey.G }, GlobalAction.EditorCycleGridDisplayMode),
new KeyBinding(new[] { InputKey.F5 }, GlobalAction.EditorTestGameplay),
+ new KeyBinding(new[] { InputKey.T }, GlobalAction.EditorTapForBPM),
new KeyBinding(new[] { InputKey.Control, InputKey.H }, GlobalAction.EditorFlipHorizontally),
new KeyBinding(new[] { InputKey.Control, InputKey.J }, GlobalAction.EditorFlipVertically),
new KeyBinding(new[] { InputKey.Control, InputKey.Alt, InputKey.MouseWheelDown }, GlobalAction.EditorDecreaseDistanceSpacing),
@@ -322,5 +323,8 @@ namespace osu.Game.Input.Bindings
[LocalisableDescription(typeof(GlobalActionKeyBindingStrings), nameof(GlobalActionKeyBindingStrings.DeselectAllMods))]
DeselectAllMods,
+
+ [LocalisableDescription(typeof(GlobalActionKeyBindingStrings), nameof(GlobalActionKeyBindingStrings.EditorTapForBPM))]
+ EditorTapForBPM,
}
}
diff --git a/osu.Game/Localisation/GlobalActionKeyBindingStrings.cs b/osu.Game/Localisation/GlobalActionKeyBindingStrings.cs
index e392ae619f..586e29a432 100644
--- a/osu.Game/Localisation/GlobalActionKeyBindingStrings.cs
+++ b/osu.Game/Localisation/GlobalActionKeyBindingStrings.cs
@@ -174,6 +174,11 @@ namespace osu.Game.Localisation
///
public static LocalisableString EditorTimingMode => new TranslatableString(getKey(@"editor_timing_mode"), @"Timing mode");
+ ///
+ /// "Tap for BPM"
+ ///
+ public static LocalisableString EditorTapForBPM => new TranslatableString(getKey(@"editor_tap_for_bpm"), @"Tap for BPM");
+
///
/// "Cycle grid display mode"
///
diff --git a/osu.Game/Screens/Edit/Timing/TapButton.cs b/osu.Game/Screens/Edit/Timing/TapButton.cs
index d18f65c2eb..614e7aecde 100644
--- a/osu.Game/Screens/Edit/Timing/TapButton.cs
+++ b/osu.Game/Screens/Edit/Timing/TapButton.cs
@@ -15,18 +15,21 @@ using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Effects;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Graphics.UserInterface;
+using osu.Framework.Input.Bindings;
using osu.Framework.Input.Events;
using osu.Framework.Threading;
using osu.Game.Beatmaps.ControlPoints;
using osu.Game.Graphics;
using osu.Game.Graphics.Sprites;
+using osu.Game.Input.Bindings;
using osu.Game.Overlays;
using osuTK;
using osuTK.Graphics;
+using osuTK.Input;
namespace osu.Game.Screens.Edit.Timing
{
- internal class TapButton : CircularContainer
+ internal class TapButton : CircularContainer, IKeyBindingHandler
{
public const float SIZE = 140;
@@ -57,6 +60,8 @@ namespace osu.Game.Screens.Edit.Timing
private const int light_count = 6;
+ private readonly List tapTimings = new List();
+
[BackgroundDependencyLoader]
private void load()
{
@@ -257,7 +262,23 @@ namespace osu.Game.Screens.Edit.Timing
base.OnMouseUp(e);
}
- private readonly List tapTimings = new List();
+ public bool OnPressed(KeyBindingPressEvent e)
+ {
+ if (e.Action == GlobalAction.EditorTapForBPM && !e.Repeat)
+ {
+ // Direct through mouse handling to achieve animation
+ OnMouseDown(new MouseDownEvent(e.CurrentState, MouseButton.Left));
+ return true;
+ }
+
+ return false;
+ }
+
+ public void OnReleased(KeyBindingReleaseEvent e)
+ {
+ if (e.Action == GlobalAction.EditorTapForBPM)
+ OnMouseUp(new MouseUpEvent(e.CurrentState, MouseButton.Left));
+ }
private void reset()
{