// 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.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Shapes; using osu.Framework.Graphics.UserInterface; using osu.Framework.Input.Events; using osu.Game.Graphics; using osu.Game.Graphics.Sprites; using osu.Game.Graphics.UserInterface; using osuTK; using osuTK.Graphics; namespace osu.Game.Overlays { public abstract class OverlayTabControl<T> : OsuTabControl<T> { private readonly Box bar; protected float BarHeight { set => bar.Height = value; } public override Color4 AccentColour { get => base.AccentColour; set { base.AccentColour = value; bar.Colour = value; } } protected OverlayTabControl() { TabContainer.Masking = false; TabContainer.Spacing = new Vector2(20, 0); AddInternal(bar = new Box { RelativeSizeAxes = Axes.X, Anchor = Anchor.BottomLeft, Origin = Anchor.BottomLeft }); } [BackgroundDependencyLoader] private void load(OverlayColourProvider colourProvider) { AccentColour = colourProvider.Highlight1; } protected override Dropdown<T> CreateDropdown() => null; protected override TabItem<T> CreateTabItem(T value) => new OverlayTabItem(value); protected class OverlayTabItem : TabItem<T>, IHasAccentColour { protected readonly ExpandingBar Bar; protected readonly OsuSpriteText Text; private Color4 accentColour; public Color4 AccentColour { get => accentColour; set { if (accentColour == value) return; accentColour = value; Bar.Colour = value; updateState(); } } public OverlayTabItem(T value) : base(value) { AutoSizeAxes = Axes.X; RelativeSizeAxes = Axes.Y; Children = new Drawable[] { Text = new OsuSpriteText { Margin = new MarginPadding { Bottom = 10 }, Origin = Anchor.BottomLeft, Anchor = Anchor.BottomLeft, Font = OsuFont.GetFont(), }, Bar = new ExpandingBar { Anchor = Anchor.BottomCentre, ExpandedSize = 5f, CollapsedSize = 0 }, new HoverClickSounds(HoverSampleSet.TabSelect) }; } protected override bool OnHover(HoverEvent e) { base.OnHover(e); if (!Active.Value) HoverAction(); return true; } protected override void OnHoverLost(HoverLostEvent e) { base.OnHoverLost(e); if (!Active.Value) UnhoverAction(); } protected override void OnActivated() { HoverAction(); Text.Font = Text.Font.With(weight: FontWeight.Bold); Text.FadeColour(Color4.White, 120, Easing.InQuad); } protected override void OnDeactivated() { UnhoverAction(); Text.Font = Text.Font.With(weight: FontWeight.Medium); } private void updateState() { if (Active.Value) OnActivated(); else OnDeactivated(); } protected virtual void HoverAction() => Bar.Expand(); protected virtual void UnhoverAction() { Bar.Collapse(); Text.FadeColour(AccentColour, 120, Easing.InQuad); } } } }