// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. using System.Linq; using osu.Framework.Extensions.IEnumerableExtensions; using osu.Framework.Screens; namespace osu.Game.Graphics.UserInterface { /// /// A which follows the active screen (and allows navigation) in a stack. /// public class ScreenBreadcrumbControl : BreadcrumbControl { private Screen last; public ScreenBreadcrumbControl(Screen initialScreen) { Current.ValueChanged += newScreen => { if (last != newScreen && !newScreen.IsCurrentScreen) newScreen.MakeCurrent(); }; onPushed(initialScreen); } private void screenChanged(Screen newScreen) { if (newScreen == null) return; if (last != null) { last.Exited -= screenChanged; last.ModePushed -= onPushed; } last = newScreen; newScreen.Exited += screenChanged; newScreen.ModePushed += onPushed; Current.Value = newScreen; } private void onPushed(Screen screen) { Items.ToList().SkipWhile(i => i != Current.Value).Skip(1).ForEach(RemoveItem); AddItem(screen); screenChanged(screen); } } }