// 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.Graphics; using osu.Framework.Graphics.Shapes; namespace osu.Game.Overlays.Changelog.Components { /// /// A simple rounded expandable line. Set its /// property to the center of the edge it's meant stick with. By default, /// takes up the full parent's axis defined by . /// public class LineBadge : Circle { public float UncollapsedSize; public float CollapsedSize; public bool IsCollapsed { get; private set; } private bool isHorizontal; /// /// Automatically sets the RelativeSizeAxes and switches X and Y size components when changed. /// public bool IsHorizontal { get => isHorizontal; set { if (value == isHorizontal) return; if (IsLoaded) { FinishTransforms(); var height = Height; var width = Width; RelativeSizeAxes = value ? Axes.X : Axes.Y; Width = height; Height = width; } else RelativeSizeAxes = value ? Axes.X : Axes.Y; isHorizontal = value; } } /// Whether to initialize with the /// or the . public LineBadge(bool startCollapsed = true) { IsCollapsed = startCollapsed; RelativeSizeAxes = Axes.X; isHorizontal = true; Origin = Anchor.Centre; } protected override void LoadComplete() { if (isHorizontal) Height = IsCollapsed ? CollapsedSize : UncollapsedSize; else Width = IsCollapsed ? CollapsedSize : UncollapsedSize; base.LoadComplete(); } public void Collapse(float transitionDuration = 400, Easing easing = Easing.Out) { IsCollapsed = true; if (IsHorizontal) this.ResizeHeightTo(CollapsedSize, transitionDuration, easing); else this.ResizeWidthTo(CollapsedSize, transitionDuration, easing); } public void Uncollapse(float transitionDuration = 400, Easing easing = Easing.OutElastic) { IsCollapsed = false; if (IsHorizontal) this.ResizeHeightTo(UncollapsedSize, transitionDuration, easing); else this.ResizeWidthTo(UncollapsedSize, transitionDuration, easing); } } }