Skip to content

Commit f5a97e9

Browse files
authored
Merge pull request #34205 from bdach/skin-external-edit-safety
Improve safety of external skin edit operation in several scenarios
2 parents 9dc9ec3 + 0d58b2d commit f5a97e9

File tree

2 files changed

+30
-3
lines changed

2 files changed

+30
-3
lines changed

osu.Game/Overlays/SkinEditor/ExternalEditOverlay.cs

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using osu.Framework.Allocation;
99
using osu.Framework.Extensions;
1010
using osu.Framework.Extensions.Color4Extensions;
11+
using osu.Framework.Extensions.ObjectExtensions;
1112
using osu.Framework.Graphics;
1213
using osu.Framework.Graphics.Containers;
1314
using osu.Framework.Graphics.Shapes;
@@ -47,6 +48,7 @@ public partial class ExternalEditOverlay : OsuFocusedOverlayContainer
4748

4849
private ExternalEditOperation<SkinInfo>? editOperation;
4950
private TaskCompletionSource? taskCompletionSource;
51+
private bool finishingEdit;
5052

5153
protected override bool DimMainContent => false;
5254

@@ -95,6 +97,8 @@ private void load()
9597
}
9698
}
9799
};
100+
101+
gameHost.ExitRequested += tryFinishOnExit;
98102
}
99103

100104
public async Task<Task> Begin(SkinInfo skinInfo)
@@ -179,8 +183,19 @@ private void openDirectory()
179183
gameHost.OpenFileExternally(editOperation.MountedPath.TrimDirectorySeparator() + Path.DirectorySeparatorChar);
180184
}
181185

186+
private void tryFinishOnExit()
187+
{
188+
if (editOperation != null && !finishingEdit)
189+
finish().FireAndForget(onSuccess: () => Schedule(() => finishingEdit = false));
190+
}
191+
182192
private async Task finish()
183193
{
194+
if (finishingEdit)
195+
return;
196+
197+
finishingEdit = true;
198+
184199
Debug.Assert(taskCompletionSource != null);
185200

186201
showSpinner("Cleaning up...");
@@ -236,6 +251,7 @@ protected override void PopOut()
236251
{
237252
// Set everything to a clean state
238253
editOperation = null;
254+
finishingEdit = false;
239255
flow.Children = Array.Empty<Drawable>();
240256
});
241257
}
@@ -249,7 +265,8 @@ public override bool OnPressed(KeyBindingPressEvent<GlobalAction> e)
249265
{
250266
case GlobalAction.Back:
251267
case GlobalAction.Select:
252-
if (editOperation == null) return base.OnPressed(e);
268+
if (editOperation == null)
269+
return false;
253270

254271
finish().FireAndForget();
255272
return true;
@@ -280,5 +297,13 @@ private void showSpinner(string text)
280297
},
281298
};
282299
}
300+
301+
protected override void Dispose(bool isDisposing)
302+
{
303+
if (gameHost.IsNotNull())
304+
gameHost.ExitRequested -= tryFinishOnExit;
305+
306+
base.Dispose(isDisposing);
307+
}
283308
}
284309
}

osu.Game/Overlays/SkinEditor/SkinEditorOverlay.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,8 @@ private void updateComponentVisibility()
249249
Scheduler.AddOnce(updateScreenSizing);
250250

251251
game.Toolbar.Hide();
252-
game.CloseAllOverlays();
252+
if (externalEditOverlay.State.Value != Visibility.Visible)
253+
game.CloseAllOverlays();
253254
}
254255
else
255256
{
@@ -298,7 +299,8 @@ private void setTarget(OsuScreen? target)
298299

299300
if (skinEditor.State.Value == Visibility.Visible)
300301
{
301-
skinEditor.Save(false);
302+
if (externalEditOverlay.State.Value != Visibility.Visible)
303+
skinEditor.Save(false);
302304
skinEditor.UpdateTargetScreen(target);
303305
disableNestedInputManagers();
304306
}

0 commit comments

Comments
 (0)