diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs index fb81e4fd14..ae117d03d2 100644 --- a/osu.Game/OsuGame.cs +++ b/osu.Game/OsuGame.cs @@ -1140,10 +1140,8 @@ namespace osu.Game MenuCursorContainer.CanShowCursor = (ScreenStack.CurrentScreen as IOsuScreen)?.CursorVisible ?? false; } - protected virtual void ScreenChanged(IScreen current, IScreen newScreen) + private void screenChanged(IScreen current, IScreen newScreen) { - skinEditor.Reset(); - switch (newScreen) { case IntroScreen intro: @@ -1185,13 +1183,15 @@ namespace osu.Game else BackButton.Hide(); } + + skinEditor.SetTarget((Screen)newScreen); } - private void screenPushed(IScreen lastScreen, IScreen newScreen) => ScreenChanged(lastScreen, newScreen); + private void screenPushed(IScreen lastScreen, IScreen newScreen) => screenChanged(lastScreen, newScreen); private void screenExited(IScreen lastScreen, IScreen newScreen) { - ScreenChanged(lastScreen, newScreen); + screenChanged(lastScreen, newScreen); if (newScreen == null) Exit(); diff --git a/osu.Game/Skinning/Editor/SkinEditor.cs b/osu.Game/Skinning/Editor/SkinEditor.cs index 36b06f01d2..459fbf3be5 100644 --- a/osu.Game/Skinning/Editor/SkinEditor.cs +++ b/osu.Game/Skinning/Editor/SkinEditor.cs @@ -28,7 +28,7 @@ namespace osu.Game.Skinning.Editor protected override bool StartHidden => true; - private readonly Drawable targetScreen; + private Drawable targetScreen; private OsuTextFlowContainer headerText; @@ -42,11 +42,13 @@ namespace osu.Game.Skinning.Editor private bool hasBegunMutating; + private Container content; + public SkinEditor(Drawable targetScreen) { - this.targetScreen = targetScreen; - RelativeSizeAxes = Axes.Both; + + UpdateTargetScreen(targetScreen); } [BackgroundDependencyLoader] @@ -113,13 +115,9 @@ namespace osu.Game.Skinning.Editor Origin = Anchor.CentreLeft, RequestPlacement = placeComponent }, - new Container + content = new Container { RelativeSizeAxes = Axes.Both, - Children = new Drawable[] - { - new SkinBlueprintContainer(targetScreen), - } }, } } @@ -147,6 +145,21 @@ namespace osu.Game.Skinning.Editor }, true); } + public void UpdateTargetScreen(Drawable targetScreen) + { + this.targetScreen = targetScreen; + + Scheduler.AddOnce(loadBlueprintContainer); + + void loadBlueprintContainer() + { + content.Children = new Drawable[] + { + new SkinBlueprintContainer(targetScreen), + }; + } + } + private void skinChanged() { headerText.Clear(); diff --git a/osu.Game/Skinning/Editor/SkinEditorOverlay.cs b/osu.Game/Skinning/Editor/SkinEditorOverlay.cs index 61c363b019..abd8272633 100644 --- a/osu.Game/Skinning/Editor/SkinEditorOverlay.cs +++ b/osu.Game/Skinning/Editor/SkinEditorOverlay.cs @@ -1,6 +1,7 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. +using System.Diagnostics; using JetBrains.Annotations; using osu.Framework.Bindables; using osu.Framework.Graphics; @@ -8,6 +9,7 @@ using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Primitives; using osu.Framework.Input.Bindings; using osu.Framework.Input.Events; +using osu.Framework.Screens; using osu.Game.Graphics.Containers; using osu.Game.Input.Bindings; @@ -114,15 +116,36 @@ namespace osu.Game.Skinning.Editor } /// - /// Exit any existing skin editor due to the game state changing. + /// Set a new target screen which will be used to find skinnable components. /// - public void Reset() + public void SetTarget(Screen screen) { - skinEditor?.Save(); - skinEditor?.Hide(); - skinEditor?.Expire(); + if (skinEditor == null) return; - skinEditor = null; + skinEditor.Save(); + + // AddOnce with parameter will ensure the newest target is loaded if there is any overlap. + Scheduler.AddOnce(setTarget, screen); + } + + private void setTarget(Screen target) + { + Debug.Assert(skinEditor != null); + + if (!target.IsLoaded) + { + Scheduler.AddOnce(setTarget, target); + return; + } + + if (skinEditor.State.Value == Visibility.Visible) + skinEditor.UpdateTargetScreen(target); + else + { + skinEditor.Hide(); + skinEditor.Expire(); + skinEditor = null; + } } } }