mirror of
https://github.com/ppy/osu.git
synced 2024-11-11 11:37:28 +08:00
c087578e01
On cursor sizes below 0.3x it becomes exceedingly difficult to quickly locate and then accurately click the resume cursor on the pause overlay as it could as big as a handful of pixels. This clamps the minimum cursor size to 1x for the resume overlay, which is way more comfortable and more closely resembles stable.
127 lines
3.8 KiB
C#
127 lines
3.8 KiB
C#
// 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.
|
|
|
|
#nullable disable
|
|
|
|
using System;
|
|
using osu.Framework.Allocation;
|
|
using osu.Framework.Graphics;
|
|
using osu.Framework.Graphics.Containers;
|
|
using osu.Framework.Graphics.Cursor;
|
|
using osu.Framework.Input.Bindings;
|
|
using osu.Framework.Input.Events;
|
|
using osu.Framework.Localisation;
|
|
using osu.Game.Rulesets.Osu.UI.Cursor;
|
|
using osu.Game.Screens.Play;
|
|
using osuTK.Graphics;
|
|
|
|
namespace osu.Game.Rulesets.Osu.UI
|
|
{
|
|
public partial class OsuResumeOverlay : ResumeOverlay
|
|
{
|
|
private Container cursorScaleContainer;
|
|
private OsuClickToResumeCursor clickToResumeCursor;
|
|
|
|
private OsuCursorContainer localCursorContainer;
|
|
|
|
public override CursorContainer LocalCursor => State.Value == Visibility.Visible ? localCursorContainer : null;
|
|
|
|
protected override LocalisableString Message => "Click the orange cursor to resume";
|
|
|
|
[BackgroundDependencyLoader]
|
|
private void load()
|
|
{
|
|
Add(cursorScaleContainer = new Container
|
|
{
|
|
Child = clickToResumeCursor = new OsuClickToResumeCursor { ResumeRequested = Resume }
|
|
});
|
|
}
|
|
|
|
protected override void PopIn()
|
|
{
|
|
base.PopIn();
|
|
|
|
GameplayCursor.ActiveCursor.Hide();
|
|
cursorScaleContainer.Position = ToLocalSpace(GameplayCursor.ActiveCursor.ScreenSpaceDrawQuad.Centre);
|
|
clickToResumeCursor.Appear();
|
|
|
|
if (localCursorContainer == null)
|
|
Add(localCursorContainer = new OsuCursorContainer());
|
|
}
|
|
|
|
protected override void PopOut()
|
|
{
|
|
base.PopOut();
|
|
|
|
localCursorContainer?.Expire();
|
|
localCursorContainer = null;
|
|
GameplayCursor?.ActiveCursor.Show();
|
|
}
|
|
|
|
protected override bool OnHover(HoverEvent e) => true;
|
|
|
|
public partial class OsuClickToResumeCursor : OsuCursor, IKeyBindingHandler<OsuAction>
|
|
{
|
|
public override bool HandlePositionalInput => true;
|
|
|
|
public Action ResumeRequested;
|
|
|
|
public OsuClickToResumeCursor()
|
|
{
|
|
RelativePositionAxes = Axes.Both;
|
|
}
|
|
|
|
protected override float CalculateCursorScale()
|
|
{
|
|
// Force minimum cursor size so it's easily clickable
|
|
return Math.Max(1f, base.CalculateCursorScale());
|
|
}
|
|
|
|
protected override bool OnHover(HoverEvent e)
|
|
{
|
|
updateColour();
|
|
return base.OnHover(e);
|
|
}
|
|
|
|
protected override void OnHoverLost(HoverLostEvent e)
|
|
{
|
|
updateColour();
|
|
base.OnHoverLost(e);
|
|
}
|
|
|
|
public bool OnPressed(KeyBindingPressEvent<OsuAction> e)
|
|
{
|
|
switch (e.Action)
|
|
{
|
|
case OsuAction.LeftButton:
|
|
case OsuAction.RightButton:
|
|
if (!IsHovered)
|
|
return false;
|
|
|
|
this.ScaleTo(2, TRANSITION_TIME, Easing.OutQuint);
|
|
|
|
ResumeRequested?.Invoke();
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public void OnReleased(KeyBindingReleaseEvent<OsuAction> e)
|
|
{
|
|
}
|
|
|
|
public void Appear() => Schedule(() =>
|
|
{
|
|
updateColour();
|
|
this.ScaleTo(4).Then().ScaleTo(1, 1000, Easing.OutQuint);
|
|
});
|
|
|
|
private void updateColour()
|
|
{
|
|
this.FadeColour(IsHovered ? Color4.White : Color4.Orange, 400, Easing.OutQuint);
|
|
}
|
|
}
|
|
}
|
|
}
|