// Copyright (c) 2007-2017 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE using OpenTK.Graphics; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Sprites; using osu.Framework.Input; using osu.Game.Graphics.Backgrounds; namespace osu.Game.Overlays.SearchableList { public abstract class SearchableListOverlay : WaveOverlayContainer { public static readonly float WIDTH_PADDING = 80; } public abstract class SearchableListOverlay : SearchableListOverlay { private readonly Container scrollContainer; protected readonly SearchableListHeader Header; protected readonly SearchableListFilterControl Filter; protected readonly FillFlowContainer ScrollFlow; protected abstract Color4 BackgroundColour { get; } protected abstract Color4 TrianglesColourLight { get; } protected abstract Color4 TrianglesColourDark { get; } protected abstract SearchableListHeader CreateHeader(); protected abstract SearchableListFilterControl CreateFilterControl(); protected SearchableListOverlay() { RelativeSizeAxes = Axes.Both; Children = new Drawable[] { new Box { RelativeSizeAxes = Axes.Both, Colour = BackgroundColour, }, new Container { RelativeSizeAxes = Axes.Both, Masking = true, Children = new[] { new Triangles { RelativeSizeAxes = Axes.Both, TriangleScale = 5, ColourLight = TrianglesColourLight, ColourDark = TrianglesColourDark, }, }, }, scrollContainer = new Container { RelativeSizeAxes = Axes.Both, Children = new[] { new ScrollContainer { RelativeSizeAxes = Axes.Both, ScrollbarVisible = false, Children = new[] { ScrollFlow = new FillFlowContainer { RelativeSizeAxes = Axes.X, AutoSizeAxes = Axes.Y, Padding = new MarginPadding { Horizontal = WIDTH_PADDING }, Direction = FillDirection.Vertical, }, }, }, }, }, new FillFlowContainer { RelativeSizeAxes = Axes.X, AutoSizeAxes = Axes.Y, Direction = FillDirection.Vertical, AlwaysReceiveInput = true, Children = new Drawable[] { Header = CreateHeader(), Filter = CreateFilterControl(), }, }, }; Filter.Search.Exit = Hide; } protected override void Update() { base.Update(); scrollContainer.Padding = new MarginPadding { Top = Header.Height + Filter.Height }; } protected override void OnFocus(InputState state) { InputManager.ChangeFocus(Filter.Search); } protected override void PopIn() { base.PopIn(); Filter.Search.HoldFocus = true; } protected override void PopOut() { base.PopOut(); Filter.Search.HoldFocus = false; } } }