mirror of
https://github.com/osukey/osukey.git
synced 2025-07-01 08:20:00 +09:00
Add ExpandingBar UI element
This commit is contained in:
101
osu.Game/Graphics/UserInterface/ExpandingBar.cs
Normal file
101
osu.Game/Graphics/UserInterface/ExpandingBar.cs
Normal file
@ -0,0 +1,101 @@
|
||||
// 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.
|
||||
|
||||
using osu.Framework.Graphics;
|
||||
using osu.Framework.Graphics.Shapes;
|
||||
using osuTK;
|
||||
|
||||
namespace osu.Game.Graphics.UserInterface
|
||||
{
|
||||
/// <summary>
|
||||
/// A rounded bar which can be expanded or collapsed.
|
||||
/// Generally used for tabs or breadcrumbs.
|
||||
/// </summary>
|
||||
public class ExpandingBar : Circle
|
||||
{
|
||||
private bool isCollapsed;
|
||||
|
||||
public bool IsCollapsed
|
||||
{
|
||||
get => isCollapsed;
|
||||
set
|
||||
{
|
||||
if (value == isCollapsed)
|
||||
return;
|
||||
|
||||
isCollapsed = value;
|
||||
updateState();
|
||||
}
|
||||
}
|
||||
|
||||
private float expandedSize = 4;
|
||||
|
||||
public float ExpandedSize
|
||||
{
|
||||
get => expandedSize;
|
||||
set
|
||||
{
|
||||
if (value == expandedSize)
|
||||
return;
|
||||
|
||||
expandedSize = value;
|
||||
updateState();
|
||||
}
|
||||
}
|
||||
|
||||
private float collapsedSize = 2;
|
||||
|
||||
public float CollapsedSize
|
||||
{
|
||||
get => collapsedSize;
|
||||
set
|
||||
{
|
||||
if (value == collapsedSize)
|
||||
return;
|
||||
|
||||
collapsedSize = value;
|
||||
updateState();
|
||||
}
|
||||
}
|
||||
|
||||
public override Axes RelativeSizeAxes
|
||||
{
|
||||
get => base.RelativeSizeAxes;
|
||||
set
|
||||
{
|
||||
base.RelativeSizeAxes = Axes.None;
|
||||
Size = Vector2.Zero;
|
||||
|
||||
base.RelativeSizeAxes = value;
|
||||
updateState();
|
||||
}
|
||||
}
|
||||
|
||||
public ExpandingBar()
|
||||
{
|
||||
RelativeSizeAxes = Axes.X;
|
||||
Origin = Anchor.Centre;
|
||||
}
|
||||
|
||||
protected override void LoadComplete()
|
||||
{
|
||||
base.LoadComplete();
|
||||
updateState();
|
||||
}
|
||||
|
||||
public void Collapse() => IsCollapsed = true;
|
||||
|
||||
public void Expand() => IsCollapsed = false;
|
||||
|
||||
private void updateState()
|
||||
{
|
||||
float newSize = IsCollapsed ? CollapsedSize : ExpandedSize;
|
||||
Easing easingType = IsCollapsed ? Easing.Out : Easing.OutElastic;
|
||||
|
||||
if (RelativeSizeAxes == Axes.X)
|
||||
this.ResizeHeightTo(newSize, 400, easingType);
|
||||
else
|
||||
this.ResizeWidthTo(newSize, 400, easingType);
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user