// 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.Framework.Localisation; 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; /// /// Text to display in the header to inform the user of what they are selecting. /// public abstract LocalisableString HeaderText { get; } /// /// 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[] { new OsuSpriteText { Text = HeaderText, Font = OsuFont.Default.With(size: 40), Origin = Anchor.Centre, 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), true); base.LoadComplete(); } public override void OnSuspending(IScreen next) { base.OnSuspending(next); this.FadeOut(250); } } }