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.Rulesets.Osu.Tests/TestSceneSpinner.cs b/osu.Game.Rulesets.Osu.Tests/TestSceneSpinner.cs
index b57561f3e1..47b3926ceb 100644
--- a/osu.Game.Rulesets.Osu.Tests/TestSceneSpinner.cs
+++ b/osu.Game.Rulesets.Osu.Tests/TestSceneSpinner.cs
@@ -17,32 +17,58 @@ namespace osu.Game.Rulesets.Osu.Tests
{
private int depthIndex;
- public TestSceneSpinner()
+ private TestDrawableSpinner drawableSpinner;
+
+ [TestCase(false)]
+ [TestCase(true)]
+ public void TestVariousSpinners(bool autoplay)
{
- AddStep("Miss Big", () => SetContents(() => testSingle(2)));
- AddStep("Miss Medium", () => SetContents(() => testSingle(5)));
- AddStep("Miss Small", () => SetContents(() => testSingle(7)));
- AddStep("Hit Big", () => SetContents(() => testSingle(2, true)));
- AddStep("Hit Medium", () => SetContents(() => testSingle(5, true)));
- AddStep("Hit Small", () => SetContents(() => testSingle(7, true)));
+ string term = autoplay ? "Hit" : "Miss";
+ AddStep($"{term} Big", () => SetContents(() => testSingle(2, autoplay)));
+ AddStep($"{term} Medium", () => SetContents(() => testSingle(5, autoplay)));
+ AddStep($"{term} Small", () => SetContents(() => testSingle(7, autoplay)));
}
- private Drawable testSingle(float circleSize, bool auto = false)
+ [TestCase(false)]
+ [TestCase(true)]
+ public void TestLongSpinner(bool autoplay)
{
- var spinner = new Spinner { StartTime = Time.Current + 2000, EndTime = Time.Current + 5000 };
+ AddStep("Very short spinner", () => SetContents(() => testSingle(5, autoplay, 2000)));
+ AddUntilStep("Wait for completion", () => drawableSpinner.Result.HasResult);
+ AddUntilStep("Check correct progress", () => drawableSpinner.Progress == (autoplay ? 1 : 0));
+ }
+
+ [TestCase(false)]
+ [TestCase(true)]
+ public void TestSuperShortSpinner(bool autoplay)
+ {
+ AddStep("Very short spinner", () => SetContents(() => testSingle(5, autoplay, 200)));
+ AddUntilStep("Wait for completion", () => drawableSpinner.Result.HasResult);
+ AddUntilStep("Short spinner implicitly completes", () => drawableSpinner.Progress == 1);
+ }
+
+ private Drawable testSingle(float circleSize, bool auto = false, double length = 3000)
+ {
+ const double delay = 2000;
+
+ var spinner = new Spinner
+ {
+ StartTime = Time.Current + delay,
+ EndTime = Time.Current + delay + length
+ };
spinner.ApplyDefaults(new ControlPointInfo(), new BeatmapDifficulty { CircleSize = circleSize });
- var drawable = new TestDrawableSpinner(spinner, auto)
+ drawableSpinner = new TestDrawableSpinner(spinner, auto)
{
Anchor = Anchor.Centre,
Depth = depthIndex++
};
foreach (var mod in SelectedMods.Value.OfType())
- mod.ApplyToDrawableHitObjects(new[] { drawable });
+ mod.ApplyToDrawableHitObjects(new[] { drawableSpinner });
- return drawable;
+ return drawableSpinner;
}
private class TestDrawableSpinner : DrawableSpinner
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
index 68516bedf8..7363da0de8 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
@@ -175,7 +175,18 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
///
/// The completion progress of this spinner from 0..1 (clamped).
///
- public float Progress => Math.Clamp(RotationTracker.CumulativeRotation / 360 / Spinner.SpinsRequired, 0, 1);
+ public float Progress
+ {
+ get
+ {
+ if (Spinner.SpinsRequired == 0)
+ // some spinners are so short they can't require an integer spin count.
+ // these become implicitly hit.
+ return 1;
+
+ return Math.Clamp(RotationTracker.CumulativeRotation / 360 / Spinner.SpinsRequired, 0, 1);
+ }
+ }
protected override void CheckForResult(bool userTriggered, double timeOffset)
{
diff --git a/osu.Game.Rulesets.Osu/Objects/Spinner.cs b/osu.Game.Rulesets.Osu/Objects/Spinner.cs
index 619b49926e..1658a4e7c2 100644
--- a/osu.Game.Rulesets.Osu/Objects/Spinner.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Spinner.cs
@@ -1,7 +1,6 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
-using System;
using osu.Game.Beatmaps;
using osu.Game.Beatmaps.ControlPoints;
using osu.Game.Rulesets.Judgements;
@@ -45,7 +44,7 @@ namespace osu.Game.Rulesets.Osu.Objects
double minimumRotationsPerSecond = stable_matching_fudge * BeatmapDifficulty.DifficultyRange(difficulty.OverallDifficulty, 3, 5, 7.5);
- SpinsRequired = (int)Math.Max(1, (secondsDuration * minimumRotationsPerSecond));
+ SpinsRequired = (int)(secondsDuration * minimumRotationsPerSecond);
MaximumBonusSpins = (int)((maximum_rotations_per_second - minimumRotationsPerSecond) * secondsDuration);
}
diff --git a/osu.Game.Rulesets.Osu/UI/OsuPlayfield.cs b/osu.Game.Rulesets.Osu/UI/OsuPlayfield.cs
index 600efefca3..4ef9bbe091 100644
--- a/osu.Game.Rulesets.Osu/UI/OsuPlayfield.cs
+++ b/osu.Game.Rulesets.Osu/UI/OsuPlayfield.cs
@@ -23,7 +23,8 @@ namespace osu.Game.Rulesets.Osu.UI
{
public class OsuPlayfield : Playfield
{
- private readonly ApproachCircleProxyContainer approachCircles;
+ private readonly ProxyContainer approachCircles;
+ private readonly ProxyContainer spinnerProxies;
private readonly JudgementContainer judgementLayer;
private readonly FollowPointRenderer followPoints;
private readonly OrderedHitPolicy hitPolicy;
@@ -38,6 +39,10 @@ namespace osu.Game.Rulesets.Osu.UI
{
InternalChildren = new Drawable[]
{
+ spinnerProxies = new ProxyContainer
+ {
+ RelativeSizeAxes = Axes.Both
+ },
followPoints = new FollowPointRenderer
{
RelativeSizeAxes = Axes.Both,
@@ -54,7 +59,7 @@ namespace osu.Game.Rulesets.Osu.UI
{
Child = HitObjectContainer,
},
- approachCircles = new ApproachCircleProxyContainer
+ approachCircles = new ProxyContainer
{
RelativeSizeAxes = Axes.Both,
Depth = -1,
@@ -76,6 +81,9 @@ namespace osu.Game.Rulesets.Osu.UI
h.OnNewResult += onNewResult;
h.OnLoadComplete += d =>
{
+ if (d is DrawableSpinner)
+ spinnerProxies.Add(d.CreateProxy());
+
if (d is IDrawableHitObjectWithProxiedApproach c)
approachCircles.Add(c.ProxiedLayer.CreateProxy());
};
@@ -113,9 +121,9 @@ namespace osu.Game.Rulesets.Osu.UI
public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => HitObjectContainer.ReceivePositionalInputAt(screenSpacePos);
- private class ApproachCircleProxyContainer : LifetimeManagementContainer
+ private class ProxyContainer : LifetimeManagementContainer
{
- public void Add(Drawable approachCircleProxy) => AddInternal(approachCircleProxy);
+ public void Add(Drawable proxy) => AddInternal(proxy);
}
private class DrawableJudgementPool : DrawablePool
diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs
index 26f7c3b93b..b5752214bd 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;
@@ -650,7 +648,7 @@ namespace osu.Game
Origin = Anchor.TopRight,
}, rightFloatingOverlayContent.Add, true);
- loadComponentSingleFile(nowPlaying = new NowPlayingOverlay
+ loadComponentSingleFile(new NowPlayingOverlay
{
GetToolbarHeight = () => ToolbarOffset,
Anchor = Anchor.TopRight,
@@ -862,18 +860,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);
@@ -889,18 +875,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/NewsOverlay.cs b/osu.Game/Overlays/NewsOverlay.cs
index a5687b77e2..09fb445b1f 100644
--- a/osu.Game/Overlays/NewsOverlay.cs
+++ b/osu.Game/Overlays/NewsOverlay.cs
@@ -67,7 +67,28 @@ namespace osu.Game.Overlays
protected override void LoadComplete()
{
base.LoadComplete();
- article.BindValueChanged(onArticleChanged, true);
+
+ // should not be run until first pop-in to avoid requesting data before user views.
+ article.BindValueChanged(onArticleChanged);
+ }
+
+ private bool displayUpdateRequired = true;
+
+ protected override void PopIn()
+ {
+ base.PopIn();
+
+ if (displayUpdateRequired)
+ {
+ article.TriggerChange();
+ displayUpdateRequired = false;
+ }
+ }
+
+ protected override void PopOutComplete()
+ {
+ base.PopOutComplete();
+ displayUpdateRequired = true;
}
public void ShowFrontPage()
diff --git a/osu.Game/Overlays/Toolbar/ToolbarBeatmapListingButton.cs b/osu.Game/Overlays/Toolbar/ToolbarBeatmapListingButton.cs
index eecb368ee9..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
{
@@ -11,6 +12,10 @@ namespace osu.Game.Overlays.Toolbar
public ToolbarBeatmapListingButton()
{
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/ToolbarChangelogButton.cs b/osu.Game/Overlays/Toolbar/ToolbarChangelogButton.cs
index 84210e27a4..c88b418853 100644
--- a/osu.Game/Overlays/Toolbar/ToolbarChangelogButton.cs
+++ b/osu.Game/Overlays/Toolbar/ToolbarChangelogButton.cs
@@ -11,6 +11,8 @@ namespace osu.Game.Overlays.Toolbar
public ToolbarChangelogButton()
{
SetIcon(FontAwesome.Solid.Bullhorn);
+ TooltipMain = "Changelog";
+ TooltipSub = "Track recent dev updates in the osu! ecosystem";
}
[BackgroundDependencyLoader(true)]
diff --git a/osu.Game/Overlays/Toolbar/ToolbarChatButton.cs b/osu.Game/Overlays/Toolbar/ToolbarChatButton.cs
index ad0e5be551..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
{
@@ -11,6 +12,10 @@ namespace osu.Game.Overlays.Toolbar
public ToolbarChatButton()
{
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 b29aec5842..f9aa2de497 100644
--- a/osu.Game/Overlays/Toolbar/ToolbarMusicButton.cs
+++ b/osu.Game/Overlays/Toolbar/ToolbarMusicButton.cs
@@ -2,15 +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/ToolbarNewsButton.cs b/osu.Game/Overlays/Toolbar/ToolbarNewsButton.cs
index e813a3f4cb..106c67a041 100644
--- a/osu.Game/Overlays/Toolbar/ToolbarNewsButton.cs
+++ b/osu.Game/Overlays/Toolbar/ToolbarNewsButton.cs
@@ -11,6 +11,8 @@ namespace osu.Game.Overlays.Toolbar
public ToolbarNewsButton()
{
Icon = FontAwesome.Solid.Newspaper;
+ TooltipMain = "News";
+ TooltipSub = "Get up-to-date on community happenings";
}
[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/ToolbarRankingsButton.cs b/osu.Game/Overlays/Toolbar/ToolbarRankingsButton.cs
index cbd097696d..c026ce99fe 100644
--- a/osu.Game/Overlays/Toolbar/ToolbarRankingsButton.cs
+++ b/osu.Game/Overlays/Toolbar/ToolbarRankingsButton.cs
@@ -11,6 +11,8 @@ namespace osu.Game.Overlays.Toolbar
public ToolbarRankingsButton()
{
SetIcon(FontAwesome.Regular.ChartBar);
+ TooltipMain = "Ranking";
+ TooltipSub = "Find out who's the best right now";
}
[BackgroundDependencyLoader(true)]
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 f6646eb81d..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
{
@@ -11,6 +12,10 @@ namespace osu.Game.Overlays.Toolbar
public ToolbarSocialButton()
{
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 168e937256..83a1077d70 100644
--- a/osu.Game/Rulesets/UI/DrawableRulesetDependencies.cs
+++ b/osu.Game/Rulesets/UI/DrawableRulesetDependencies.cs
@@ -117,6 +117,8 @@ namespace osu.Game.Rulesets.UI
public void RemoveAdjustment(AdjustableProperty type, BindableNumber adjustBindable) => throw new NotSupportedException();
+ public void RemoveAllAdjustments(AdjustableProperty type) => throw new NotSupportedException();
+
public BindableNumber Volume => throw new NotSupportedException();
public BindableNumber Balance => throw new NotSupportedException();
diff --git a/osu.Game/Skinning/SkinnableSound.cs b/osu.Game/Skinning/SkinnableSound.cs
index 27f6c37895..f19aaee821 100644
--- a/osu.Game/Skinning/SkinnableSound.cs
+++ b/osu.Game/Skinning/SkinnableSound.cs
@@ -4,6 +4,7 @@
using System.Collections.Generic;
using System.Linq;
using osu.Framework.Allocation;
+using osu.Framework.Audio;
using osu.Framework.Audio.Track;
using osu.Framework.Bindables;
using osu.Framework.Extensions.IEnumerableExtensions;
@@ -149,28 +150,28 @@ namespace osu.Game.Skinning
/// Smoothly adjusts over time.
///
/// A to which further transforms can be added.
- public TransformSequence VolumeTo(double newVolume, double duration = 0, Easing easing = Easing.None) =>
+ public TransformSequence> VolumeTo(double newVolume, double duration = 0, Easing easing = Easing.None) =>
samplesContainer.VolumeTo(newVolume, duration, easing);
///
/// Smoothly adjusts over time.
///
/// A to which further transforms can be added.
- public TransformSequence BalanceTo(double newBalance, double duration = 0, Easing easing = Easing.None) =>
+ public TransformSequence> BalanceTo(double newBalance, double duration = 0, Easing easing = Easing.None) =>
samplesContainer.BalanceTo(newBalance, duration, easing);
///
/// Smoothly adjusts over time.
///
/// A to which further transforms can be added.
- public TransformSequence FrequencyTo(double newFrequency, double duration = 0, Easing easing = Easing.None) =>
+ public TransformSequence> FrequencyTo(double newFrequency, double duration = 0, Easing easing = Easing.None) =>
samplesContainer.FrequencyTo(newFrequency, duration, easing);
///
/// Smoothly adjusts over time.
///
/// A to which further transforms can be added.
- public TransformSequence TempoTo(double newTempo, double duration = 0, Easing easing = Easing.None) =>
+ public TransformSequence> TempoTo(double newTempo, double duration = 0, Easing easing = Easing.None) =>
samplesContainer.TempoTo(newTempo, duration, easing);
#endregion
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 @@
-
+