Show dialogue only when there are unsaved changes
This commit is contained in:
committed by
abcdefg30
parent
780982dbe2
commit
d2819dca77
@@ -29,6 +29,8 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
|
|
||||||
int nextId;
|
int nextId;
|
||||||
|
|
||||||
|
public bool Modified;
|
||||||
|
|
||||||
public void WorldLoaded(World w, WorldRenderer wr)
|
public void WorldLoaded(World w, WorldRenderer wr)
|
||||||
{
|
{
|
||||||
Add(new OpenMapAction());
|
Add(new OpenMapAction());
|
||||||
@@ -36,6 +38,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
|
|
||||||
public void Add(IEditorAction editorAction)
|
public void Add(IEditorAction editorAction)
|
||||||
{
|
{
|
||||||
|
Modified = true;
|
||||||
editorAction.Execute();
|
editorAction.Execute();
|
||||||
|
|
||||||
if (undoStack.Count > 0)
|
if (undoStack.Count > 0)
|
||||||
@@ -55,6 +58,8 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
if (!HasUndos())
|
if (!HasUndos())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
Modified = true;
|
||||||
|
|
||||||
var editorAction = undoStack.Pop();
|
var editorAction = undoStack.Pop();
|
||||||
undoStack.Peek().Status = EditorActionStatus.Active;
|
undoStack.Peek().Status = EditorActionStatus.Active;
|
||||||
editorAction.Action.Undo();
|
editorAction.Action.Undo();
|
||||||
@@ -81,6 +86,8 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
if (!HasRedos())
|
if (!HasRedos())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
Modified = true;
|
||||||
|
|
||||||
var editorAction = redoStack.Pop();
|
var editorAction = redoStack.Pop();
|
||||||
|
|
||||||
editorAction.Status = EditorActionStatus.Active;
|
editorAction.Status = EditorActionStatus.Active;
|
||||||
@@ -114,6 +121,12 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
while (undoStack.Peek().Id != id)
|
while (undoStack.Peek().Id != id)
|
||||||
Redo();
|
Redo();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool HasUnsavedItems()
|
||||||
|
{
|
||||||
|
// Modified and last action isn't the OpenMapAction (+ no redos)
|
||||||
|
return Modified && !(undoStack.Peek().Action is OpenMapAction && !HasRedos());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum EditorActionStatus
|
public enum EditorActionStatus
|
||||||
|
|||||||
@@ -339,9 +339,10 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
|||||||
{
|
{
|
||||||
hideMenu = true;
|
hideMenu = true;
|
||||||
var editorActorLayer = world.WorldActor.Trait<EditorActorLayer>();
|
var editorActorLayer = world.WorldActor.Trait<EditorActorLayer>();
|
||||||
|
var actionManager = world.WorldActor.Trait<EditorActionManager>();
|
||||||
Ui.OpenWindow("SAVE_MAP_PANEL", new WidgetArgs()
|
Ui.OpenWindow("SAVE_MAP_PANEL", new WidgetArgs()
|
||||||
{
|
{
|
||||||
{ "onSave", (Action<string>)(_ => hideMenu = false) },
|
{ "onSave", (Action<string>)(_ => { hideMenu = false; actionManager.Modified = false; }) },
|
||||||
{ "onExit", () => hideMenu = false },
|
{ "onExit", () => hideMenu = false },
|
||||||
{ "map", world.Map },
|
{ "map", world.Map },
|
||||||
{ "playerDefinitions", editorActorLayer.Players.ToMiniYaml() },
|
{ "playerDefinitions", editorActorLayer.Players.ToMiniYaml() },
|
||||||
@@ -355,8 +356,13 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
|||||||
if (world.Type != WorldType.Editor)
|
if (world.Type != WorldType.Editor)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
var actionManager = world.WorldActor.Trait<EditorActionManager>();
|
||||||
var button = AddButton("EXIT_EDITOR", "Exit Map Editor");
|
var button = AddButton("EXIT_EDITOR", "Exit Map Editor");
|
||||||
|
|
||||||
|
// Show dialog only if updated since last save
|
||||||
button.OnClick = () =>
|
button.OnClick = () =>
|
||||||
|
{
|
||||||
|
if (actionManager.HasUnsavedItems())
|
||||||
{
|
{
|
||||||
hideMenu = true;
|
hideMenu = true;
|
||||||
ConfirmationDialogs.ButtonPrompt(
|
ConfirmationDialogs.ButtonPrompt(
|
||||||
@@ -364,6 +370,9 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
|||||||
text: "Exit and lose all unsaved changes?",
|
text: "Exit and lose all unsaved changes?",
|
||||||
onConfirm: OnQuit,
|
onConfirm: OnQuit,
|
||||||
onCancel: ShowMenu);
|
onCancel: ShowMenu);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
OnQuit();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user