// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. using System; using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Shapes; using osu.Framework.Graphics.Sprites; using osu.Game.Graphics; using osu.Game.Graphics.Containers; using osu.Game.Graphics.Sprites; using osu.Game.Graphics.UserInterface; using osu.Game.Overlays; using osu.Game.Resources.Localisation.Web; using osuTK; namespace osu.Game.Collections { public partial class ManageCollectionsDialog : OsuFocusedOverlayContainer { private const double enter_duration = 500; private const double exit_duration = 200; protected override string PopInSampleName => @"UI/overlay-big-pop-in"; protected override string PopOutSampleName => @"UI/overlay-big-pop-out"; private IDisposable? duckOperation; private BasicSearchTextBox searchTextBox = null!; private DrawableCollectionList list = null!; [Resolved] private MusicController? musicController { get; set; } public ManageCollectionsDialog() { Anchor = Anchor.Centre; Origin = Anchor.Centre; RelativeSizeAxes = Axes.Both; Size = new Vector2(0.5f, 0.8f); Masking = true; CornerRadius = 10; } [BackgroundDependencyLoader] private void load(OsuColour colours) { Children = new Drawable[] { new Box { Colour = colours.GreySeaFoamDark, RelativeSizeAxes = Axes.Both, }, new Container { RelativeSizeAxes = Axes.Both, Child = new GridContainer { RelativeSizeAxes = Axes.Both, RowDimensions = new[] { new Dimension(GridSizeMode.AutoSize), }, Content = new[] { new Drawable[] { new Container { RelativeSizeAxes = Axes.X, AutoSizeAxes = Axes.Y, Children = new Drawable[] { new OsuSpriteText { Anchor = Anchor.Centre, Origin = Anchor.Centre, Text = "Manage collections", Font = OsuFont.GetFont(size: 30), Padding = new MarginPadding { Vertical = 10 }, }, new IconButton { Anchor = Anchor.CentreRight, Origin = Anchor.CentreRight, Icon = FontAwesome.Solid.Times, Colour = colours.GreySeaFoamDarker, Scale = new Vector2(0.8f), X = -10, Action = () => State.Value = Visibility.Hidden } } } }, new Drawable[] { new Container { RelativeSizeAxes = Axes.Both, Children = new Drawable[] { new Box { RelativeSizeAxes = Axes.Both, Colour = colours.GreySeaFoamDarker }, new Container { RelativeSizeAxes = Axes.Both, Padding = new MarginPadding(10), Children = new Drawable[] { searchTextBox = new BasicSearchTextBox { RelativeSizeAxes = Axes.X, Y = 10, Height = 40, ReleaseFocusOnCommit = false, HoldFocus = true, PlaceholderText = HomeStrings.SearchPlaceholder, }, list = new DrawableCollectionList { Padding = new MarginPadding { Top = 60, }, RelativeSizeAxes = Axes.Both, } } }, } } }, } } } }; } protected override void LoadComplete() { base.LoadComplete(); searchTextBox.Current.BindValueChanged(_ => { list.SearchTerm = searchTextBox.Current.Value; }); } protected override void Dispose(bool isDisposing) { base.Dispose(isDisposing); duckOperation?.Dispose(); } protected override void PopIn() { duckOperation = musicController?.Duck(new DuckParameters { DuckVolumeTo = 1, DuckDuration = 100, RestoreDuration = 100, }); this.FadeIn(enter_duration, Easing.OutQuint); this.ScaleTo(0.9f).Then().ScaleTo(1f, enter_duration, Easing.OutQuint); } protected override void PopOut() { base.PopOut(); duckOperation?.Dispose(); this.FadeOut(exit_duration, Easing.OutQuint); this.ScaleTo(0.9f, exit_duration); // Ensure that textboxes commit GetContainingFocusManager()?.TriggerFocusContention(this); } } }