diff --git a/osu.Android.props b/osu.Android.props
index 924e9c4a16..e5fed09c07 100644
--- a/osu.Android.props
+++ b/osu.Android.props
@@ -52,6 +52,6 @@
-
+
diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs
index cf4610793c..877a453cec 100644
--- a/osu.Game/OsuGame.cs
+++ b/osu.Game/OsuGame.cs
@@ -67,8 +67,6 @@ namespace osu.Game
[NotNull]
private readonly NotificationOverlay notifications = new NotificationOverlay();
- private NowPlayingOverlay nowPlaying;
-
private BeatmapListingOverlay beatmapListing;
private DashboardOverlay dashboard;
@@ -632,7 +630,7 @@ namespace osu.Game
Origin = Anchor.TopRight,
}, rightFloatingOverlayContent.Add, true);
- loadComponentSingleFile(nowPlaying = new NowPlayingOverlay
+ loadComponentSingleFile(new NowPlayingOverlay
{
GetToolbarHeight = () => ToolbarOffset,
Anchor = Anchor.TopRight,
@@ -844,18 +842,6 @@ namespace osu.Game
switch (action)
{
- case GlobalAction.ToggleNowPlaying:
- nowPlaying.ToggleVisibility();
- return true;
-
- case GlobalAction.ToggleChat:
- chatOverlay.ToggleVisibility();
- return true;
-
- case GlobalAction.ToggleSocial:
- dashboard.ToggleVisibility();
- return true;
-
case GlobalAction.ResetInputSettings:
var sensitivity = frameworkConfig.GetBindable(FrameworkSetting.CursorSensitivity);
@@ -871,18 +857,6 @@ namespace osu.Game
Toolbar.ToggleVisibility();
return true;
- case GlobalAction.ToggleSettings:
- Settings.ToggleVisibility();
- return true;
-
- case GlobalAction.ToggleDirect:
- beatmapListing.ToggleVisibility();
- return true;
-
- case GlobalAction.ToggleNotifications:
- notifications.ToggleVisibility();
- return true;
-
case GlobalAction.ToggleGameplayMouseButtons:
LocalConfig.Set(OsuSetting.MouseDisableButtons, !LocalConfig.Get(OsuSetting.MouseDisableButtons));
return true;
diff --git a/osu.Game/Overlays/Toolbar/ToolbarBeatmapListingButton.cs b/osu.Game/Overlays/Toolbar/ToolbarBeatmapListingButton.cs
index 64430c77ac..cde305fffd 100644
--- a/osu.Game/Overlays/Toolbar/ToolbarBeatmapListingButton.cs
+++ b/osu.Game/Overlays/Toolbar/ToolbarBeatmapListingButton.cs
@@ -3,6 +3,7 @@
using osu.Framework.Allocation;
using osu.Game.Graphics;
+using osu.Game.Input.Bindings;
namespace osu.Game.Overlays.Toolbar
{
@@ -13,6 +14,8 @@ namespace osu.Game.Overlays.Toolbar
SetIcon(OsuIcon.ChevronDownCircle);
TooltipMain = "Beatmap listing";
TooltipSub = "Browse for new beatmaps";
+
+ Hotkey = GlobalAction.ToggleDirect;
}
[BackgroundDependencyLoader(true)]
diff --git a/osu.Game/Overlays/Toolbar/ToolbarButton.cs b/osu.Game/Overlays/Toolbar/ToolbarButton.cs
index 86a3f5d8aa..0afc6642b2 100644
--- a/osu.Game/Overlays/Toolbar/ToolbarButton.cs
+++ b/osu.Game/Overlays/Toolbar/ToolbarButton.cs
@@ -1,27 +1,34 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
+using osu.Framework.Allocation;
+using osu.Framework.Caching;
using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Effects;
+using osu.Framework.Graphics.Shapes;
using osu.Framework.Graphics.Sprites;
+using osu.Framework.Input.Bindings;
+using osu.Framework.Input.Events;
using osu.Game.Graphics;
using osu.Game.Graphics.Backgrounds;
+using osu.Game.Graphics.Containers;
using osu.Game.Graphics.Sprites;
+using osu.Game.Graphics.UserInterface;
+using osu.Game.Input;
+using osu.Game.Input.Bindings;
using osuTK;
using osuTK.Graphics;
-using osu.Framework.Graphics.Shapes;
-using osu.Framework.Input.Events;
-using osu.Game.Graphics.Containers;
-using osu.Game.Graphics.UserInterface;
namespace osu.Game.Overlays.Toolbar
{
- public class ToolbarButton : OsuClickableContainer
+ public abstract class ToolbarButton : OsuClickableContainer, IKeyBindingHandler
{
public const float WIDTH = Toolbar.HEIGHT * 1.4f;
+ protected GlobalAction? Hotkey { get; set; }
+
public void SetIcon(Drawable icon)
{
IconContainer.Icon = icon;
@@ -66,9 +73,13 @@ namespace osu.Game.Overlays.Toolbar
private readonly FillFlowContainer tooltipContainer;
private readonly SpriteText tooltip1;
private readonly SpriteText tooltip2;
+ private readonly SpriteText keyBindingTooltip;
protected FillFlowContainer Flow;
- public ToolbarButton()
+ [Resolved]
+ private KeyBindingStore keyBindings { get; set; }
+
+ protected ToolbarButton()
: base(HoverSampleSet.Loud)
{
Width = WIDTH;
@@ -123,7 +134,7 @@ namespace osu.Game.Overlays.Toolbar
Origin = TooltipAnchor,
Position = new Vector2(TooltipAnchor.HasFlag(Anchor.x0) ? 5 : -5, 5),
Alpha = 0,
- Children = new[]
+ Children = new Drawable[]
{
tooltip1 = new OsuSpriteText
{
@@ -132,17 +143,44 @@ namespace osu.Game.Overlays.Toolbar
Shadow = true,
Font = OsuFont.GetFont(size: 22, weight: FontWeight.Bold),
},
- tooltip2 = new OsuSpriteText
+ new FillFlowContainer
{
+ AutoSizeAxes = Axes.Both,
Anchor = TooltipAnchor,
Origin = TooltipAnchor,
- Shadow = true,
+ Direction = FillDirection.Horizontal,
+ Children = new[]
+ {
+ tooltip2 = new OsuSpriteText { Shadow = true },
+ keyBindingTooltip = new OsuSpriteText { Shadow = true }
+ }
}
}
}
};
}
+ private readonly Cached tooltipKeyBinding = new Cached();
+
+ [BackgroundDependencyLoader]
+ private void load()
+ {
+ keyBindings.KeyBindingChanged += () => tooltipKeyBinding.Invalidate();
+ updateKeyBindingTooltip();
+ }
+
+ private void updateKeyBindingTooltip()
+ {
+ if (tooltipKeyBinding.IsValid)
+ return;
+
+ var binding = keyBindings.Query().Find(b => (GlobalAction)b.Action == Hotkey);
+ var keyBindingString = binding?.KeyCombination.ReadableString();
+ keyBindingTooltip.Text = !string.IsNullOrEmpty(keyBindingString) ? $" ({keyBindingString})" : string.Empty;
+
+ tooltipKeyBinding.Validate();
+ }
+
protected override bool OnMouseDown(MouseDownEvent e) => true;
protected override bool OnClick(ClickEvent e)
@@ -154,6 +192,8 @@ namespace osu.Game.Overlays.Toolbar
protected override bool OnHover(HoverEvent e)
{
+ updateKeyBindingTooltip();
+
HoverBackground.FadeIn(200);
tooltipContainer.FadeIn(100);
return base.OnHover(e);
@@ -164,6 +204,21 @@ namespace osu.Game.Overlays.Toolbar
HoverBackground.FadeOut(200);
tooltipContainer.FadeOut(100);
}
+
+ public bool OnPressed(GlobalAction action)
+ {
+ if (action == Hotkey)
+ {
+ Click();
+ return true;
+ }
+
+ return false;
+ }
+
+ public void OnReleased(GlobalAction action)
+ {
+ }
}
public class OpaqueBackground : Container
diff --git a/osu.Game/Overlays/Toolbar/ToolbarChatButton.cs b/osu.Game/Overlays/Toolbar/ToolbarChatButton.cs
index ec7da54571..dee4be0c1f 100644
--- a/osu.Game/Overlays/Toolbar/ToolbarChatButton.cs
+++ b/osu.Game/Overlays/Toolbar/ToolbarChatButton.cs
@@ -3,6 +3,7 @@
using osu.Framework.Allocation;
using osu.Framework.Graphics.Sprites;
+using osu.Game.Input.Bindings;
namespace osu.Game.Overlays.Toolbar
{
@@ -13,6 +14,8 @@ namespace osu.Game.Overlays.Toolbar
SetIcon(FontAwesome.Solid.Comments);
TooltipMain = "Chat";
TooltipSub = "Join the real-time discussion";
+
+ Hotkey = GlobalAction.ToggleChat;
}
[BackgroundDependencyLoader(true)]
diff --git a/osu.Game/Overlays/Toolbar/ToolbarHomeButton.cs b/osu.Game/Overlays/Toolbar/ToolbarHomeButton.cs
index e642f0c453..4845c9a99f 100644
--- a/osu.Game/Overlays/Toolbar/ToolbarHomeButton.cs
+++ b/osu.Game/Overlays/Toolbar/ToolbarHomeButton.cs
@@ -2,33 +2,19 @@
// See the LICENCE file in the repository root for full licence text.
using osu.Framework.Graphics.Sprites;
-using osu.Framework.Input.Bindings;
using osu.Game.Input.Bindings;
namespace osu.Game.Overlays.Toolbar
{
- public class ToolbarHomeButton : ToolbarButton, IKeyBindingHandler
+ public class ToolbarHomeButton : ToolbarButton
{
public ToolbarHomeButton()
{
Icon = FontAwesome.Solid.Home;
TooltipMain = "Home";
TooltipSub = "Return to the main menu";
- }
- public bool OnPressed(GlobalAction action)
- {
- if (action == GlobalAction.Home)
- {
- Click();
- return true;
- }
-
- return false;
- }
-
- public void OnReleased(GlobalAction action)
- {
+ Hotkey = GlobalAction.Home;
}
}
}
diff --git a/osu.Game/Overlays/Toolbar/ToolbarMusicButton.cs b/osu.Game/Overlays/Toolbar/ToolbarMusicButton.cs
index 712da12208..f9aa2de497 100644
--- a/osu.Game/Overlays/Toolbar/ToolbarMusicButton.cs
+++ b/osu.Game/Overlays/Toolbar/ToolbarMusicButton.cs
@@ -2,17 +2,23 @@
// See the LICENCE file in the repository root for full licence text.
using osu.Framework.Allocation;
+using osu.Framework.Graphics;
using osu.Framework.Graphics.Sprites;
+using osu.Game.Input.Bindings;
namespace osu.Game.Overlays.Toolbar
{
public class ToolbarMusicButton : ToolbarOverlayToggleButton
{
+ protected override Anchor TooltipAnchor => Anchor.TopRight;
+
public ToolbarMusicButton()
{
Icon = FontAwesome.Solid.Music;
TooltipMain = "Now playing";
TooltipSub = "Manage the currently playing track";
+
+ Hotkey = GlobalAction.ToggleNowPlaying;
}
[BackgroundDependencyLoader(true)]
diff --git a/osu.Game/Overlays/Toolbar/ToolbarNotificationButton.cs b/osu.Game/Overlays/Toolbar/ToolbarNotificationButton.cs
index dbd6c557d3..a699fd907f 100644
--- a/osu.Game/Overlays/Toolbar/ToolbarNotificationButton.cs
+++ b/osu.Game/Overlays/Toolbar/ToolbarNotificationButton.cs
@@ -9,6 +9,7 @@ using osu.Framework.Graphics.Shapes;
using osu.Framework.Graphics.Sprites;
using osu.Game.Graphics;
using osu.Game.Graphics.Sprites;
+using osu.Game.Input.Bindings;
using osuTK;
using osuTK.Graphics;
@@ -28,6 +29,8 @@ namespace osu.Game.Overlays.Toolbar
TooltipMain = "Notifications";
TooltipSub = "Waiting for 'ya";
+ Hotkey = GlobalAction.ToggleNotifications;
+
Add(countDisplay = new CountCircle
{
Alpha = 0,
diff --git a/osu.Game/Overlays/Toolbar/ToolbarSettingsButton.cs b/osu.Game/Overlays/Toolbar/ToolbarSettingsButton.cs
index 79942012f9..ed2a23ec2a 100644
--- a/osu.Game/Overlays/Toolbar/ToolbarSettingsButton.cs
+++ b/osu.Game/Overlays/Toolbar/ToolbarSettingsButton.cs
@@ -3,6 +3,7 @@
using osu.Framework.Allocation;
using osu.Framework.Graphics.Sprites;
+using osu.Game.Input.Bindings;
namespace osu.Game.Overlays.Toolbar
{
@@ -13,6 +14,8 @@ namespace osu.Game.Overlays.Toolbar
Icon = FontAwesome.Solid.Cog;
TooltipMain = "Settings";
TooltipSub = "Change your settings";
+
+ Hotkey = GlobalAction.ToggleSettings;
}
[BackgroundDependencyLoader(true)]
diff --git a/osu.Game/Overlays/Toolbar/ToolbarSocialButton.cs b/osu.Game/Overlays/Toolbar/ToolbarSocialButton.cs
index 0dbb552c15..6faa58c559 100644
--- a/osu.Game/Overlays/Toolbar/ToolbarSocialButton.cs
+++ b/osu.Game/Overlays/Toolbar/ToolbarSocialButton.cs
@@ -3,6 +3,7 @@
using osu.Framework.Allocation;
using osu.Framework.Graphics.Sprites;
+using osu.Game.Input.Bindings;
namespace osu.Game.Overlays.Toolbar
{
@@ -13,6 +14,8 @@ namespace osu.Game.Overlays.Toolbar
Icon = FontAwesome.Solid.Users;
TooltipMain = "Friends";
TooltipSub = "Interact with those close to you";
+
+ Hotkey = GlobalAction.ToggleSocial;
}
[BackgroundDependencyLoader(true)]
diff --git a/osu.Game/Rulesets/UI/DrawableRulesetDependencies.cs b/osu.Game/Rulesets/UI/DrawableRulesetDependencies.cs
index 3f7dc957fb..83a1077d70 100644
--- a/osu.Game/Rulesets/UI/DrawableRulesetDependencies.cs
+++ b/osu.Game/Rulesets/UI/DrawableRulesetDependencies.cs
@@ -117,7 +117,7 @@ namespace osu.Game.Rulesets.UI
public void RemoveAdjustment(AdjustableProperty type, BindableNumber adjustBindable) => throw new NotSupportedException();
- public void RemoveAllAdjustments(AdjustableProperty type) => throw new NotImplementedException();
+ public void RemoveAllAdjustments(AdjustableProperty type) => throw new NotSupportedException();
public BindableNumber Volume => throw new NotSupportedException();
diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj
index 627c2f3d33..18c3052ca3 100644
--- a/osu.Game/osu.Game.csproj
+++ b/osu.Game/osu.Game.csproj
@@ -24,7 +24,7 @@
-
+
diff --git a/osu.iOS.props b/osu.iOS.props
index f443937017..b034253d88 100644
--- a/osu.iOS.props
+++ b/osu.iOS.props
@@ -70,7 +70,7 @@
-
+
@@ -80,7 +80,7 @@
-
+