1
0
mirror of https://github.com/ppy/osu.git synced 2024-11-16 18:27:31 +08:00
osu-lazer/osu.Game/Graphics/UserInterfaceV2/OsuPopover.cs

108 lines
3.4 KiB
C#
Raw Normal View History

2023-06-23 00:37:25 +08:00
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
2021-06-21 01:31:24 +08:00
// See the LICENCE file in the repository root for full licence text.
using osu.Framework.Allocation;
using osu.Framework.Audio;
using osu.Framework.Audio.Sample;
using osu.Framework.Extensions;
2021-06-21 01:31:24 +08:00
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
2021-06-21 01:31:24 +08:00
using osu.Framework.Graphics.Effects;
using osu.Framework.Graphics.UserInterface;
using osu.Framework.Input.Bindings;
2021-09-16 17:26:12 +08:00
using osu.Framework.Input.Events;
using osu.Game.Input.Bindings;
2021-06-21 01:31:24 +08:00
using osu.Game.Overlays;
using osuTK;
using osuTK.Input;
2021-06-21 01:31:24 +08:00
namespace osu.Game.Graphics.UserInterfaceV2
{
2022-11-24 13:32:20 +08:00
public partial class OsuPopover : Popover, IKeyBindingHandler<GlobalAction>
2021-06-21 01:31:24 +08:00
{
private const float fade_duration = 250;
2021-07-14 22:23:44 +08:00
private const double scale_duration = 500;
2021-06-21 01:31:24 +08:00
private Sample? samplePopIn;
private Sample? samplePopOut;
protected virtual string PopInSampleName => "UI/overlay-pop-in";
protected virtual string PopOutSampleName => "UI/overlay-pop-out";
2023-08-24 17:20:36 +08:00
// required due to LoadAsyncComplete() in `VisibilityContainer` calling PopOut() during load - similar workaround to `OsuDropdownMenu`
private bool wasOpened;
2021-06-21 01:31:24 +08:00
public OsuPopover(bool withPadding = true)
{
Content.Padding = withPadding ? new MarginPadding(20) : new MarginPadding();
2021-07-14 22:23:44 +08:00
2021-06-21 01:31:24 +08:00
Body.Masking = true;
Body.CornerRadius = 10;
Body.Margin = new MarginPadding(10);
Body.EdgeEffect = new EdgeEffectParameters
{
Type = EdgeEffectType.Shadow,
Offset = new Vector2(0, 2),
Radius = 5,
Colour = Colour4.Black.Opacity(0.3f)
};
}
[BackgroundDependencyLoader(true)]
private void load(OverlayColourProvider? colourProvider, OsuColour colours, AudioManager audio)
2021-06-21 01:31:24 +08:00
{
Background.Colour = Arrow.Colour = colourProvider?.Background4 ?? colours.GreySeaFoamDarker;
samplePopIn = audio.Samples.Get(PopInSampleName);
samplePopOut = audio.Samples.Get(PopOutSampleName);
2021-06-21 01:31:24 +08:00
}
protected override Drawable CreateArrow() => Empty();
2021-07-14 22:23:44 +08:00
protected override void PopIn()
{
this.ScaleTo(1, scale_duration, Easing.OutElasticHalf);
this.FadeIn(fade_duration, Easing.OutQuint);
samplePopIn?.Play();
wasOpened = true;
2021-07-14 22:23:44 +08:00
}
protected override void PopOut()
{
this.ScaleTo(0.7f, scale_duration, Easing.OutQuint);
this.FadeOut(fade_duration, Easing.OutQuint);
if (wasOpened)
samplePopOut?.Play();
2021-07-14 22:23:44 +08:00
}
protected override bool OnKeyDown(KeyDownEvent e)
{
if (e.Key == Key.Escape)
return false; // disable the framework-level handling of escape key for conformity (we use GlobalAction.Back).
return base.OnKeyDown(e);
}
public virtual bool OnPressed(KeyBindingPressEvent<GlobalAction> e)
{
if (e.Repeat)
return false;
if (State.Value == Visibility.Hidden)
return false;
2021-09-16 17:26:12 +08:00
if (e.Action == GlobalAction.Back)
{
this.HidePopover();
return true;
}
return false;
}
2021-09-16 17:26:12 +08:00
public void OnReleased(KeyBindingReleaseEvent<GlobalAction> e)
{
}
2021-06-21 01:31:24 +08:00
}
}