// Copyright (c) 2007-2018 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE using System; using OpenTK; using osu.Framework; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.UserInterface; using System.Linq; namespace osu.Game.Graphics.UserInterface { public class BreadcrumbControl : OsuTabControl { private const float padding = 10; private const float item_chevron_size = 10; protected override TabItem CreateTabItem(T value) => new BreadcrumbTabItem(value) { AccentColour = AccentColour, }; protected override float StripWidth() => base.StripWidth() - (padding + item_chevron_size); public BreadcrumbControl() { Height = 32; TabContainer.Spacing = new Vector2(padding, 0f); Current.ValueChanged += tab => { foreach (var t in TabContainer.Children.OfType()) { var tIndex = TabContainer.IndexOf(t); var tabIndex = TabContainer.IndexOf(TabMap[tab]); t.State = tIndex < tabIndex ? Visibility.Hidden : Visibility.Visible; t.Chevron.FadeTo(tIndex <= tabIndex ? 0f : 1f, 500, Easing.OutQuint); } }; } private class BreadcrumbTabItem : OsuTabItem, IStateful { public event Action StateChanged; public readonly SpriteIcon Chevron; //don't allow clicking between transitions and don't make the chevron clickable public override bool ReceiveMouseInputAt(Vector2 screenSpacePos) => Alpha == 1f && Text.ReceiveMouseInputAt(screenSpacePos); public override bool HandleKeyboardInput => State == Visibility.Visible; public override bool HandleMouseInput => State == Visibility.Visible; public override bool IsRemovable => true; private Visibility state; public Visibility State { get { return state; } set { if (value == state) return; state = value; const float transition_duration = 500; if (State == Visibility.Visible) { this.FadeIn(transition_duration, Easing.OutQuint); this.ScaleTo(new Vector2(1f), transition_duration, Easing.OutQuint); } else { this.FadeOut(transition_duration, Easing.OutQuint); this.ScaleTo(new Vector2(0.8f, 1f), transition_duration, Easing.OutQuint); } StateChanged?.Invoke(State); } } public BreadcrumbTabItem(T value) : base(value) { Text.TextSize = 18; Text.Margin = new MarginPadding { Vertical = 8 }; Padding = new MarginPadding { Right = padding + item_chevron_size }; Add(Chevron = new SpriteIcon { Anchor = Anchor.CentreRight, Origin = Anchor.CentreLeft, Size = new Vector2(item_chevron_size), Icon = FontAwesome.fa_chevron_right, Margin = new MarginPadding { Left = padding }, Alpha = 0f, }); } } } }