// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. using osu.Framework.Graphics; using System.IO; using osu.Framework.Allocation; using osu.Game.Graphics; using osu.Game.Graphics.UserInterfaceV2; using osu.Game.Screens; using osuTK; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Shapes; using osu.Game.Graphics.Sprites; using osu.Game.Graphics.UserInterface; using osu.Framework.Screens; namespace osu.Game.Overlays.Settings.Sections.Maintenance { public abstract class DirectorySelectScreen : OsuScreen { private TriangleButton selectionButton; private DirectorySelector directorySelector; protected abstract OsuSpriteText CreateHeader(); /// /// Called upon selection of a directory by the user. /// /// The selected directory protected abstract void OnSelection(DirectoryInfo directory); /// /// Whether the current directory is considered to be valid and can be selected. /// /// The current directory. /// Whether the selected directory is considered valid. protected virtual bool IsValidDirectory(DirectoryInfo info) => true; /// /// The path at which to start selection from. /// protected virtual DirectoryInfo InitialPath => null; [BackgroundDependencyLoader] private void load(OsuColour colours) { InternalChild = new Container { Masking = true, CornerRadius = 10, RelativeSizeAxes = Axes.Both, Anchor = Anchor.Centre, Origin = Anchor.Centre, Size = new Vector2(0.5f, 0.8f), Children = new Drawable[] { new Box { RelativeSizeAxes = Axes.Both, Colour = colours.GreySeafoamDark }, new GridContainer { RelativeSizeAxes = Axes.Both, RowDimensions = new[] { new Dimension(), new Dimension(GridSizeMode.Relative, 0.8f), new Dimension(), }, Content = new[] { new Drawable[] { CreateHeader().With(header => { header.Origin = Anchor.Centre; header.Anchor = Anchor.Centre; }) }, new Drawable[] { directorySelector = new DirectorySelector { RelativeSizeAxes = Axes.Both, } }, new Drawable[] { selectionButton = new TriangleButton { Anchor = Anchor.Centre, Origin = Anchor.Centre, Width = 300, Text = "Select directory", Action = () => OnSelection(directorySelector.CurrentPath.Value) }, } } } } }; } protected override void LoadComplete() { if (InitialPath != null) directorySelector.CurrentPath.Value = InitialPath; directorySelector.CurrentPath.BindValueChanged(e => selectionButton.Enabled.Value = e.NewValue != null ? IsValidDirectory(e.NewValue) : false, true); base.LoadComplete(); } public override void OnSuspending(IScreen next) { base.OnSuspending(next); this.FadeOut(250); } } }