Merge branch 'master' into expand-number-piece-on-old-skins

This commit is contained in:
smoogipoo 2020-08-07 16:36:58 +09:00
commit 3c3756e42d
22 changed files with 198 additions and 80 deletions

View File

@ -52,6 +52,6 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="ppy.osu.Game.Resources" Version="2020.731.0" /> <PackageReference Include="ppy.osu.Game.Resources" Version="2020.731.0" />
<PackageReference Include="ppy.osu.Framework.Android" Version="2020.804.0" /> <PackageReference Include="ppy.osu.Framework.Android" Version="2020.806.0" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -17,32 +17,58 @@ namespace osu.Game.Rulesets.Osu.Tests
{ {
private int depthIndex; private int depthIndex;
public TestSceneSpinner() private TestDrawableSpinner drawableSpinner;
[TestCase(false)]
[TestCase(true)]
public void TestVariousSpinners(bool autoplay)
{ {
AddStep("Miss Big", () => SetContents(() => testSingle(2))); string term = autoplay ? "Hit" : "Miss";
AddStep("Miss Medium", () => SetContents(() => testSingle(5))); AddStep($"{term} Big", () => SetContents(() => testSingle(2, autoplay)));
AddStep("Miss Small", () => SetContents(() => testSingle(7))); AddStep($"{term} Medium", () => SetContents(() => testSingle(5, autoplay)));
AddStep("Hit Big", () => SetContents(() => testSingle(2, true))); AddStep($"{term} Small", () => SetContents(() => testSingle(7, autoplay)));
AddStep("Hit Medium", () => SetContents(() => testSingle(5, true)));
AddStep("Hit Small", () => SetContents(() => testSingle(7, true)));
} }
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 }); spinner.ApplyDefaults(new ControlPointInfo(), new BeatmapDifficulty { CircleSize = circleSize });
var drawable = new TestDrawableSpinner(spinner, auto) drawableSpinner = new TestDrawableSpinner(spinner, auto)
{ {
Anchor = Anchor.Centre, Anchor = Anchor.Centre,
Depth = depthIndex++ Depth = depthIndex++
}; };
foreach (var mod in SelectedMods.Value.OfType<IApplicableToDrawableHitObjects>()) foreach (var mod in SelectedMods.Value.OfType<IApplicableToDrawableHitObjects>())
mod.ApplyToDrawableHitObjects(new[] { drawable }); mod.ApplyToDrawableHitObjects(new[] { drawableSpinner });
return drawable; return drawableSpinner;
} }
private class TestDrawableSpinner : DrawableSpinner private class TestDrawableSpinner : DrawableSpinner

View File

@ -175,7 +175,18 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
/// <summary> /// <summary>
/// The completion progress of this spinner from 0..1 (clamped). /// The completion progress of this spinner from 0..1 (clamped).
/// </summary> /// </summary>
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) protected override void CheckForResult(bool userTriggered, double timeOffset)
{ {

View File

@ -1,7 +1,6 @@
// 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 osu.Game.Beatmaps; using osu.Game.Beatmaps;
using osu.Game.Beatmaps.ControlPoints; using osu.Game.Beatmaps.ControlPoints;
using osu.Game.Rulesets.Judgements; 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); 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); MaximumBonusSpins = (int)((maximum_rotations_per_second - minimumRotationsPerSecond) * secondsDuration);
} }

View File

@ -23,7 +23,8 @@ namespace osu.Game.Rulesets.Osu.UI
{ {
public class OsuPlayfield : Playfield public class OsuPlayfield : Playfield
{ {
private readonly ApproachCircleProxyContainer approachCircles; private readonly ProxyContainer approachCircles;
private readonly ProxyContainer spinnerProxies;
private readonly JudgementContainer<DrawableOsuJudgement> judgementLayer; private readonly JudgementContainer<DrawableOsuJudgement> judgementLayer;
private readonly FollowPointRenderer followPoints; private readonly FollowPointRenderer followPoints;
private readonly OrderedHitPolicy hitPolicy; private readonly OrderedHitPolicy hitPolicy;
@ -38,6 +39,10 @@ namespace osu.Game.Rulesets.Osu.UI
{ {
InternalChildren = new Drawable[] InternalChildren = new Drawable[]
{ {
spinnerProxies = new ProxyContainer
{
RelativeSizeAxes = Axes.Both
},
followPoints = new FollowPointRenderer followPoints = new FollowPointRenderer
{ {
RelativeSizeAxes = Axes.Both, RelativeSizeAxes = Axes.Both,
@ -54,7 +59,7 @@ namespace osu.Game.Rulesets.Osu.UI
{ {
Child = HitObjectContainer, Child = HitObjectContainer,
}, },
approachCircles = new ApproachCircleProxyContainer approachCircles = new ProxyContainer
{ {
RelativeSizeAxes = Axes.Both, RelativeSizeAxes = Axes.Both,
Depth = -1, Depth = -1,
@ -76,6 +81,9 @@ namespace osu.Game.Rulesets.Osu.UI
h.OnNewResult += onNewResult; h.OnNewResult += onNewResult;
h.OnLoadComplete += d => h.OnLoadComplete += d =>
{ {
if (d is DrawableSpinner)
spinnerProxies.Add(d.CreateProxy());
if (d is IDrawableHitObjectWithProxiedApproach c) if (d is IDrawableHitObjectWithProxiedApproach c)
approachCircles.Add(c.ProxiedLayer.CreateProxy()); approachCircles.Add(c.ProxiedLayer.CreateProxy());
}; };
@ -113,9 +121,9 @@ namespace osu.Game.Rulesets.Osu.UI
public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => HitObjectContainer.ReceivePositionalInputAt(screenSpacePos); 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<DrawableOsuJudgement> private class DrawableJudgementPool : DrawablePool<DrawableOsuJudgement>

View File

@ -67,8 +67,6 @@ namespace osu.Game
[NotNull] [NotNull]
private readonly NotificationOverlay notifications = new NotificationOverlay(); private readonly NotificationOverlay notifications = new NotificationOverlay();
private NowPlayingOverlay nowPlaying;
private BeatmapListingOverlay beatmapListing; private BeatmapListingOverlay beatmapListing;
private DashboardOverlay dashboard; private DashboardOverlay dashboard;
@ -650,7 +648,7 @@ namespace osu.Game
Origin = Anchor.TopRight, Origin = Anchor.TopRight,
}, rightFloatingOverlayContent.Add, true); }, rightFloatingOverlayContent.Add, true);
loadComponentSingleFile(nowPlaying = new NowPlayingOverlay loadComponentSingleFile(new NowPlayingOverlay
{ {
GetToolbarHeight = () => ToolbarOffset, GetToolbarHeight = () => ToolbarOffset,
Anchor = Anchor.TopRight, Anchor = Anchor.TopRight,
@ -862,18 +860,6 @@ namespace osu.Game
switch (action) 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: case GlobalAction.ResetInputSettings:
var sensitivity = frameworkConfig.GetBindable<double>(FrameworkSetting.CursorSensitivity); var sensitivity = frameworkConfig.GetBindable<double>(FrameworkSetting.CursorSensitivity);
@ -889,18 +875,6 @@ namespace osu.Game
Toolbar.ToggleVisibility(); Toolbar.ToggleVisibility();
return true; 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: case GlobalAction.ToggleGameplayMouseButtons:
LocalConfig.Set(OsuSetting.MouseDisableButtons, !LocalConfig.Get<bool>(OsuSetting.MouseDisableButtons)); LocalConfig.Set(OsuSetting.MouseDisableButtons, !LocalConfig.Get<bool>(OsuSetting.MouseDisableButtons));
return true; return true;

View File

@ -67,7 +67,28 @@ namespace osu.Game.Overlays
protected override void LoadComplete() protected override void LoadComplete()
{ {
base.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() public void ShowFrontPage()

View File

@ -3,6 +3,7 @@
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Game.Graphics; using osu.Game.Graphics;
using osu.Game.Input.Bindings;
namespace osu.Game.Overlays.Toolbar namespace osu.Game.Overlays.Toolbar
{ {
@ -11,6 +12,10 @@ namespace osu.Game.Overlays.Toolbar
public ToolbarBeatmapListingButton() public ToolbarBeatmapListingButton()
{ {
SetIcon(OsuIcon.ChevronDownCircle); SetIcon(OsuIcon.ChevronDownCircle);
TooltipMain = "Beatmap listing";
TooltipSub = "Browse for new beatmaps";
Hotkey = GlobalAction.ToggleDirect;
} }
[BackgroundDependencyLoader(true)] [BackgroundDependencyLoader(true)]

View File

@ -1,27 +1,34 @@
// 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 osu.Framework.Allocation;
using osu.Framework.Caching;
using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics; using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Effects; using osu.Framework.Graphics.Effects;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Graphics.Sprites; using osu.Framework.Graphics.Sprites;
using osu.Framework.Input.Bindings;
using osu.Framework.Input.Events;
using osu.Game.Graphics; using osu.Game.Graphics;
using osu.Game.Graphics.Backgrounds; using osu.Game.Graphics.Backgrounds;
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.Bindings;
using osuTK; using osuTK;
using osuTK.Graphics; 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 namespace osu.Game.Overlays.Toolbar
{ {
public class ToolbarButton : OsuClickableContainer public abstract class ToolbarButton : OsuClickableContainer, IKeyBindingHandler<GlobalAction>
{ {
public const float WIDTH = Toolbar.HEIGHT * 1.4f; public const float WIDTH = Toolbar.HEIGHT * 1.4f;
protected GlobalAction? Hotkey { get; set; }
public void SetIcon(Drawable icon) public void SetIcon(Drawable icon)
{ {
IconContainer.Icon = icon; IconContainer.Icon = icon;
@ -66,9 +73,13 @@ namespace osu.Game.Overlays.Toolbar
private readonly FillFlowContainer tooltipContainer; private readonly FillFlowContainer tooltipContainer;
private readonly SpriteText tooltip1; private readonly SpriteText tooltip1;
private readonly SpriteText tooltip2; private readonly SpriteText tooltip2;
private readonly SpriteText keyBindingTooltip;
protected FillFlowContainer Flow; protected FillFlowContainer Flow;
public ToolbarButton() [Resolved]
private KeyBindingStore keyBindings { get; set; }
protected ToolbarButton()
: base(HoverSampleSet.Loud) : base(HoverSampleSet.Loud)
{ {
Width = WIDTH; Width = WIDTH;
@ -123,7 +134,7 @@ namespace osu.Game.Overlays.Toolbar
Origin = TooltipAnchor, Origin = TooltipAnchor,
Position = new Vector2(TooltipAnchor.HasFlag(Anchor.x0) ? 5 : -5, 5), Position = new Vector2(TooltipAnchor.HasFlag(Anchor.x0) ? 5 : -5, 5),
Alpha = 0, Alpha = 0,
Children = new[] Children = new Drawable[]
{ {
tooltip1 = new OsuSpriteText tooltip1 = new OsuSpriteText
{ {
@ -132,17 +143,44 @@ namespace osu.Game.Overlays.Toolbar
Shadow = true, Shadow = true,
Font = OsuFont.GetFont(size: 22, weight: FontWeight.Bold), Font = OsuFont.GetFont(size: 22, weight: FontWeight.Bold),
}, },
tooltip2 = new OsuSpriteText new FillFlowContainer
{ {
AutoSizeAxes = Axes.Both,
Anchor = TooltipAnchor, Anchor = TooltipAnchor,
Origin = 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 OnMouseDown(MouseDownEvent e) => true;
protected override bool OnClick(ClickEvent e) protected override bool OnClick(ClickEvent e)
@ -154,6 +192,8 @@ namespace osu.Game.Overlays.Toolbar
protected override bool OnHover(HoverEvent e) protected override bool OnHover(HoverEvent e)
{ {
updateKeyBindingTooltip();
HoverBackground.FadeIn(200); HoverBackground.FadeIn(200);
tooltipContainer.FadeIn(100); tooltipContainer.FadeIn(100);
return base.OnHover(e); return base.OnHover(e);
@ -164,6 +204,21 @@ namespace osu.Game.Overlays.Toolbar
HoverBackground.FadeOut(200); HoverBackground.FadeOut(200);
tooltipContainer.FadeOut(100); 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 public class OpaqueBackground : Container

View File

@ -11,6 +11,8 @@ namespace osu.Game.Overlays.Toolbar
public ToolbarChangelogButton() public ToolbarChangelogButton()
{ {
SetIcon(FontAwesome.Solid.Bullhorn); SetIcon(FontAwesome.Solid.Bullhorn);
TooltipMain = "Changelog";
TooltipSub = "Track recent dev updates in the osu! ecosystem";
} }
[BackgroundDependencyLoader(true)] [BackgroundDependencyLoader(true)]

View File

@ -3,6 +3,7 @@
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Graphics.Sprites; using osu.Framework.Graphics.Sprites;
using osu.Game.Input.Bindings;
namespace osu.Game.Overlays.Toolbar namespace osu.Game.Overlays.Toolbar
{ {
@ -11,6 +12,10 @@ namespace osu.Game.Overlays.Toolbar
public ToolbarChatButton() public ToolbarChatButton()
{ {
SetIcon(FontAwesome.Solid.Comments); SetIcon(FontAwesome.Solid.Comments);
TooltipMain = "Chat";
TooltipSub = "Join the real-time discussion";
Hotkey = GlobalAction.ToggleChat;
} }
[BackgroundDependencyLoader(true)] [BackgroundDependencyLoader(true)]

View File

@ -2,33 +2,19 @@
// 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 osu.Framework.Graphics.Sprites; using osu.Framework.Graphics.Sprites;
using osu.Framework.Input.Bindings;
using osu.Game.Input.Bindings; using osu.Game.Input.Bindings;
namespace osu.Game.Overlays.Toolbar namespace osu.Game.Overlays.Toolbar
{ {
public class ToolbarHomeButton : ToolbarButton, IKeyBindingHandler<GlobalAction> public class ToolbarHomeButton : ToolbarButton
{ {
public ToolbarHomeButton() public ToolbarHomeButton()
{ {
Icon = FontAwesome.Solid.Home; Icon = FontAwesome.Solid.Home;
TooltipMain = "Home"; TooltipMain = "Home";
TooltipSub = "Return to the main menu"; TooltipSub = "Return to the main menu";
}
public bool OnPressed(GlobalAction action) Hotkey = GlobalAction.Home;
{
if (action == GlobalAction.Home)
{
Click();
return true;
}
return false;
}
public void OnReleased(GlobalAction action)
{
} }
} }
} }

View File

@ -2,15 +2,23 @@
// 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 osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Sprites; using osu.Framework.Graphics.Sprites;
using osu.Game.Input.Bindings;
namespace osu.Game.Overlays.Toolbar namespace osu.Game.Overlays.Toolbar
{ {
public class ToolbarMusicButton : ToolbarOverlayToggleButton public class ToolbarMusicButton : ToolbarOverlayToggleButton
{ {
protected override Anchor TooltipAnchor => Anchor.TopRight;
public ToolbarMusicButton() public ToolbarMusicButton()
{ {
Icon = FontAwesome.Solid.Music; Icon = FontAwesome.Solid.Music;
TooltipMain = "Now playing";
TooltipSub = "Manage the currently playing track";
Hotkey = GlobalAction.ToggleNowPlaying;
} }
[BackgroundDependencyLoader(true)] [BackgroundDependencyLoader(true)]

View File

@ -11,6 +11,8 @@ namespace osu.Game.Overlays.Toolbar
public ToolbarNewsButton() public ToolbarNewsButton()
{ {
Icon = FontAwesome.Solid.Newspaper; Icon = FontAwesome.Solid.Newspaper;
TooltipMain = "News";
TooltipSub = "Get up-to-date on community happenings";
} }
[BackgroundDependencyLoader(true)] [BackgroundDependencyLoader(true)]

View File

@ -9,6 +9,7 @@ using osu.Framework.Graphics.Shapes;
using osu.Framework.Graphics.Sprites; using osu.Framework.Graphics.Sprites;
using osu.Game.Graphics; using osu.Game.Graphics;
using osu.Game.Graphics.Sprites; using osu.Game.Graphics.Sprites;
using osu.Game.Input.Bindings;
using osuTK; using osuTK;
using osuTK.Graphics; using osuTK.Graphics;
@ -28,6 +29,8 @@ namespace osu.Game.Overlays.Toolbar
TooltipMain = "Notifications"; TooltipMain = "Notifications";
TooltipSub = "Waiting for 'ya"; TooltipSub = "Waiting for 'ya";
Hotkey = GlobalAction.ToggleNotifications;
Add(countDisplay = new CountCircle Add(countDisplay = new CountCircle
{ {
Alpha = 0, Alpha = 0,

View File

@ -11,6 +11,8 @@ namespace osu.Game.Overlays.Toolbar
public ToolbarRankingsButton() public ToolbarRankingsButton()
{ {
SetIcon(FontAwesome.Regular.ChartBar); SetIcon(FontAwesome.Regular.ChartBar);
TooltipMain = "Ranking";
TooltipSub = "Find out who's the best right now";
} }
[BackgroundDependencyLoader(true)] [BackgroundDependencyLoader(true)]

View File

@ -3,6 +3,7 @@
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Graphics.Sprites; using osu.Framework.Graphics.Sprites;
using osu.Game.Input.Bindings;
namespace osu.Game.Overlays.Toolbar namespace osu.Game.Overlays.Toolbar
{ {
@ -13,6 +14,8 @@ namespace osu.Game.Overlays.Toolbar
Icon = FontAwesome.Solid.Cog; Icon = FontAwesome.Solid.Cog;
TooltipMain = "Settings"; TooltipMain = "Settings";
TooltipSub = "Change your settings"; TooltipSub = "Change your settings";
Hotkey = GlobalAction.ToggleSettings;
} }
[BackgroundDependencyLoader(true)] [BackgroundDependencyLoader(true)]

View File

@ -3,6 +3,7 @@
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Graphics.Sprites; using osu.Framework.Graphics.Sprites;
using osu.Game.Input.Bindings;
namespace osu.Game.Overlays.Toolbar namespace osu.Game.Overlays.Toolbar
{ {
@ -11,6 +12,10 @@ namespace osu.Game.Overlays.Toolbar
public ToolbarSocialButton() public ToolbarSocialButton()
{ {
Icon = FontAwesome.Solid.Users; Icon = FontAwesome.Solid.Users;
TooltipMain = "Friends";
TooltipSub = "Interact with those close to you";
Hotkey = GlobalAction.ToggleSocial;
} }
[BackgroundDependencyLoader(true)] [BackgroundDependencyLoader(true)]

View File

@ -117,6 +117,8 @@ namespace osu.Game.Rulesets.UI
public void RemoveAdjustment(AdjustableProperty type, BindableNumber<double> adjustBindable) => throw new NotSupportedException(); public void RemoveAdjustment(AdjustableProperty type, BindableNumber<double> adjustBindable) => throw new NotSupportedException();
public void RemoveAllAdjustments(AdjustableProperty type) => throw new NotSupportedException();
public BindableNumber<double> Volume => throw new NotSupportedException(); public BindableNumber<double> Volume => throw new NotSupportedException();
public BindableNumber<double> Balance => throw new NotSupportedException(); public BindableNumber<double> Balance => throw new NotSupportedException();

View File

@ -4,6 +4,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Audio;
using osu.Framework.Audio.Track; using osu.Framework.Audio.Track;
using osu.Framework.Bindables; using osu.Framework.Bindables;
using osu.Framework.Extensions.IEnumerableExtensions; using osu.Framework.Extensions.IEnumerableExtensions;
@ -149,28 +150,28 @@ namespace osu.Game.Skinning
/// Smoothly adjusts <see cref="Volume"/> over time. /// Smoothly adjusts <see cref="Volume"/> over time.
/// </summary> /// </summary>
/// <returns>A <see cref="TransformSequence{T}"/> to which further transforms can be added.</returns> /// <returns>A <see cref="TransformSequence{T}"/> to which further transforms can be added.</returns>
public TransformSequence<DrawableAudioWrapper> VolumeTo(double newVolume, double duration = 0, Easing easing = Easing.None) => public TransformSequence<AudioContainer<DrawableSample>> VolumeTo(double newVolume, double duration = 0, Easing easing = Easing.None) =>
samplesContainer.VolumeTo(newVolume, duration, easing); samplesContainer.VolumeTo(newVolume, duration, easing);
/// <summary> /// <summary>
/// Smoothly adjusts <see cref="Balance"/> over time. /// Smoothly adjusts <see cref="Balance"/> over time.
/// </summary> /// </summary>
/// <returns>A <see cref="TransformSequence{T}"/> to which further transforms can be added.</returns> /// <returns>A <see cref="TransformSequence{T}"/> to which further transforms can be added.</returns>
public TransformSequence<DrawableAudioWrapper> BalanceTo(double newBalance, double duration = 0, Easing easing = Easing.None) => public TransformSequence<AudioContainer<DrawableSample>> BalanceTo(double newBalance, double duration = 0, Easing easing = Easing.None) =>
samplesContainer.BalanceTo(newBalance, duration, easing); samplesContainer.BalanceTo(newBalance, duration, easing);
/// <summary> /// <summary>
/// Smoothly adjusts <see cref="Frequency"/> over time. /// Smoothly adjusts <see cref="Frequency"/> over time.
/// </summary> /// </summary>
/// <returns>A <see cref="TransformSequence{T}"/> to which further transforms can be added.</returns> /// <returns>A <see cref="TransformSequence{T}"/> to which further transforms can be added.</returns>
public TransformSequence<DrawableAudioWrapper> FrequencyTo(double newFrequency, double duration = 0, Easing easing = Easing.None) => public TransformSequence<AudioContainer<DrawableSample>> FrequencyTo(double newFrequency, double duration = 0, Easing easing = Easing.None) =>
samplesContainer.FrequencyTo(newFrequency, duration, easing); samplesContainer.FrequencyTo(newFrequency, duration, easing);
/// <summary> /// <summary>
/// Smoothly adjusts <see cref="Tempo"/> over time. /// Smoothly adjusts <see cref="Tempo"/> over time.
/// </summary> /// </summary>
/// <returns>A <see cref="TransformSequence{T}"/> to which further transforms can be added.</returns> /// <returns>A <see cref="TransformSequence{T}"/> to which further transforms can be added.</returns>
public TransformSequence<DrawableAudioWrapper> TempoTo(double newTempo, double duration = 0, Easing easing = Easing.None) => public TransformSequence<AudioContainer<DrawableSample>> TempoTo(double newTempo, double duration = 0, Easing easing = Easing.None) =>
samplesContainer.TempoTo(newTempo, duration, easing); samplesContainer.TempoTo(newTempo, duration, easing);
#endregion #endregion

View File

@ -24,7 +24,7 @@
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="2.2.6" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="2.2.6" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Core" Version="2.2.6" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Core" Version="2.2.6" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
<PackageReference Include="ppy.osu.Framework" Version="2020.804.0" /> <PackageReference Include="ppy.osu.Framework" Version="2020.806.0" />
<PackageReference Include="ppy.osu.Game.Resources" Version="2020.731.0" /> <PackageReference Include="ppy.osu.Game.Resources" Version="2020.731.0" />
<PackageReference Include="Sentry" Version="2.1.5" /> <PackageReference Include="Sentry" Version="2.1.5" />
<PackageReference Include="SharpCompress" Version="0.26.0" /> <PackageReference Include="SharpCompress" Version="0.26.0" />

View File

@ -70,7 +70,7 @@
<Reference Include="System.Net.Http" /> <Reference Include="System.Net.Http" />
</ItemGroup> </ItemGroup>
<ItemGroup Label="Package References"> <ItemGroup Label="Package References">
<PackageReference Include="ppy.osu.Framework.iOS" Version="2020.804.0" /> <PackageReference Include="ppy.osu.Framework.iOS" Version="2020.806.0" />
<PackageReference Include="ppy.osu.Game.Resources" Version="2020.731.0" /> <PackageReference Include="ppy.osu.Game.Resources" Version="2020.731.0" />
</ItemGroup> </ItemGroup>
<!-- Xamarin.iOS does not automatically handle transitive dependencies from NuGet packages. --> <!-- Xamarin.iOS does not automatically handle transitive dependencies from NuGet packages. -->
@ -80,7 +80,7 @@
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="2.2.6" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="2.2.6" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Core" Version="2.2.6" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Core" Version="2.2.6" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
<PackageReference Include="ppy.osu.Framework" Version="2020.804.0" /> <PackageReference Include="ppy.osu.Framework" Version="2020.806.0" />
<PackageReference Include="SharpCompress" Version="0.26.0" /> <PackageReference Include="SharpCompress" Version="0.26.0" />
<PackageReference Include="NUnit" Version="3.12.0" /> <PackageReference Include="NUnit" Version="3.12.0" />
<PackageReference Include="SharpRaven" Version="2.4.0" /> <PackageReference Include="SharpRaven" Version="2.4.0" />