diff --git a/Source/Core/Editing/CopyPasteManager.cs b/Source/Core/Editing/CopyPasteManager.cs index 7aeb848ce77fe2f7b6093e479e9d636900eb3008..59b92c03a6cc7d8afa62b99278dc88373f72504f 100755 --- a/Source/Core/Editing/CopyPasteManager.cs +++ b/Source/Core/Editing/CopyPasteManager.cs @@ -238,6 +238,8 @@ namespace CodeImp.DoomBuilder.Editing // that need to be copied. if(General.Editing.Mode.OnCopyBegin()) { + bool oldmapischanged = General.Map.IsChanged; + General.MainWindow.DisplayStatus(StatusType.Action, desc); // Copy the marked geometry @@ -269,6 +271,12 @@ namespace CodeImp.DoomBuilder.Editing return false; } + // General.Map.Map.CloneMarked will set General.Map.IsChanged to true, since it recreated the map. But since this + // creation happens in another MapSet, the currently opened map is actually not changed. Force the IsChanged property + // to false if the map wasn't changed before doing the copying + if (oldmapischanged == false) + General.Map.ForceMapIsChangedFalse(); + // Done memstream.Dispose(); General.Editing.Mode.OnCopyEnd(); diff --git a/Source/Core/General/MapManager.cs b/Source/Core/General/MapManager.cs index bc8792ca693353f2f65fc9cae1213e41574ea855..1ff0fd3bee7ebd3663ed5a58c7cfe9fe39975481 100755 --- a/Source/Core/General/MapManager.cs +++ b/Source/Core/General/MapManager.cs @@ -2708,6 +2708,17 @@ namespace CodeImp.DoomBuilder renderer2d.GridVisibilityChanged(); } + /// <summary> + /// This forces the "changed" variable to "false", which is normally not possible when setting the "IsChanged" property. + /// USE WITH CARE! This should only be used in very specific circumstances, where the "IsChanged" property is set to true + /// because of internal behavior + /// </summary> + internal void ForceMapIsChangedFalse() + { + changed = false; + General.MainWindow.UpdateMapChangedStatus(); + } + #endregion } } \ No newline at end of file diff --git a/Source/Core/Windows/LinedefEditForm.cs b/Source/Core/Windows/LinedefEditForm.cs index 5fff6c6c68bb28ec1ebfca539756f6ac4984506e..c47c002c50114dce32f49ea770b5273c149372c9 100755 --- a/Source/Core/Windows/LinedefEditForm.cs +++ b/Source/Core/Windows/LinedefEditForm.cs @@ -42,6 +42,7 @@ namespace CodeImp.DoomBuilder.Windows private List<LinedefProperties> linedefprops; //mxd private bool preventchanges; private bool undocreated; //mxd + private bool oldmapischanged; private struct LinedefProperties //mxd { @@ -151,6 +152,7 @@ namespace CodeImp.DoomBuilder.Windows public void Setup(ICollection<Linedef> lines) { preventchanges = true; + oldmapischanged = General.Map.IsChanged; argscontrol.Reset(); undocreated = false; @@ -464,7 +466,16 @@ namespace CodeImp.DoomBuilder.Windows private void cancel_Click(object sender, EventArgs e) { //mxd. Let's pretend nothing of this really happened... - if(undocreated) General.Map.UndoRedo.WithdrawUndo(); + if (undocreated) + { + General.Map.UndoRedo.WithdrawUndo(); + + // Changing certain properties of the linedef, like textures will set General.Map.IsChanged to true. + // But if cancel is pressed and the changes are discarded, and the map was not changed before, we have to force + // General.Map.IsChanged back to false + if (General.Map.IsChanged && oldmapischanged == false) + General.Map.ForceMapIsChangedFalse(); + } // Be gone this.DialogResult = DialogResult.Cancel; diff --git a/Source/Core/Windows/LinedefEditFormUDMF.cs b/Source/Core/Windows/LinedefEditFormUDMF.cs index 7b626a0e87700f717b9e08d2bf3c32e66b6765cf..faab9d4e16019619865f8ef26a150b7a78211a44 100755 --- a/Source/Core/Windows/LinedefEditFormUDMF.cs +++ b/Source/Core/Windows/LinedefEditFormUDMF.cs @@ -47,6 +47,7 @@ namespace CodeImp.DoomBuilder.Windows private readonly List<int> keynumbers; //mxd private readonly List<PairedFieldsControl> frontUdmfControls; //mxd private readonly List<PairedFieldsControl> backUdmfControls; //mxd + private bool oldmapischanged; private struct LinedefProperties //mxd { @@ -259,6 +260,7 @@ namespace CodeImp.DoomBuilder.Windows } preventchanges = true; + oldmapischanged = General.Map.IsChanged; undocreated = false; argscontrol.Reset(); tagsselector.Reset(); @@ -768,7 +770,16 @@ namespace CodeImp.DoomBuilder.Windows private void cancel_Click(object sender, EventArgs e) { //mxd. Let's pretend nothing of this really happened... - if(undocreated) General.Map.UndoRedo.WithdrawUndo(); + if (undocreated) + { + General.Map.UndoRedo.WithdrawUndo(); + + // Changing certain properties of the linedef, like textures will set General.Map.IsChanged to true. + // But if cancel is pressed and the changes are discarded, and the map was not changed before, we have to force + // General.Map.IsChanged back to false + if (General.Map.IsChanged && oldmapischanged == false) + General.Map.ForceMapIsChangedFalse(); + } // Be gone this.DialogResult = DialogResult.Cancel; diff --git a/Source/Core/Windows/SectorEditForm.cs b/Source/Core/Windows/SectorEditForm.cs index 234eca0495a4cb2c9947902e1a08f434a9b8a380..989b9d12de0d9c91fd41980a3072f44f8469b31f 100755 --- a/Source/Core/Windows/SectorEditForm.cs +++ b/Source/Core/Windows/SectorEditForm.cs @@ -41,6 +41,7 @@ namespace CodeImp.DoomBuilder.Windows private List<SectorProperties> sectorprops; //mxd private bool preventchanges; //mxd private bool undocreated; //mxd + private bool oldmapischanged; private struct SectorProperties //mxd { @@ -90,7 +91,8 @@ namespace CodeImp.DoomBuilder.Windows public void Setup(ICollection<Sector> sectors) { preventchanges = true; //mxd - undocreated = false; + oldmapischanged = General.Map.IsChanged; + undocreated = false; // Keep this list this.sectors = sectors; if(sectors.Count > 1) this.Text = "Edit Sectors (" + sectors.Count + ")"; @@ -345,7 +347,16 @@ namespace CodeImp.DoomBuilder.Windows private void cancel_Click(object sender, EventArgs e) { //mxd. perform undo - if(undocreated) General.Map.UndoRedo.WithdrawUndo(); + if (undocreated) + { + General.Map.UndoRedo.WithdrawUndo(); + + // Changing certain properties of the sector, like floor/ceiling textures will set General.Map.IsChanged to true. + // But if cancel is pressed and the changes are discarded, and the map was not changed before, we have to force + // General.Map.IsChanged back to false + if (General.Map.IsChanged && oldmapischanged == false) + General.Map.ForceMapIsChangedFalse(); + } // And be gone this.DialogResult = DialogResult.Cancel; diff --git a/Source/Core/Windows/SectorEditFormUDMF.cs b/Source/Core/Windows/SectorEditFormUDMF.cs index eaa8727f2400937b2d553ccdd308a8fd50d0757f..1005790d172599ae329c1a53eb3841a93e7ecf21 100755 --- a/Source/Core/Windows/SectorEditFormUDMF.cs +++ b/Source/Core/Windows/SectorEditFormUDMF.cs @@ -43,6 +43,8 @@ namespace CodeImp.DoomBuilder.Windows private Vector2D globalslopepivot; private Dictionary<Sector, Vector2D> slopepivots; + private bool oldmapischanged; + #endregion #region ================== Structs @@ -306,7 +308,8 @@ namespace CodeImp.DoomBuilder.Windows public void Setup(ICollection<Sector> sectors) { preventchanges = true; //mxd - undocreated = false; + oldmapischanged = General.Map.IsChanged; + undocreated = false; // Keep this list this.sectors = sectors; if(sectors.Count > 1) this.Text = "Edit Sectors (" + sectors.Count + ")"; @@ -942,7 +945,16 @@ namespace CodeImp.DoomBuilder.Windows private void cancel_Click(object sender, EventArgs e) { //mxd. Let's pretend nothing of this really happened... - if(undocreated) General.Map.UndoRedo.WithdrawUndo(); + if (undocreated) + { + General.Map.UndoRedo.WithdrawUndo(); + + // Changing certain properties of the sector, like floor/ceiling textures will set General.Map.IsChanged to true. + // But if cancel is pressed and the changes are discarded, and the map was not changed before, we have to force + // General.Map.IsChanged back to false + if (General.Map.IsChanged && oldmapischanged == false) + General.Map.ForceMapIsChangedFalse(); + } // Be gone this.DialogResult = DialogResult.Cancel; diff --git a/Source/Core/Windows/ThingEditForm.cs b/Source/Core/Windows/ThingEditForm.cs index 3d506560b6b7283a28f6da86f41173a6a456b514..9fb9832730743ce75ed240ea0622e1cb6158d0f7 100755 --- a/Source/Core/Windows/ThingEditForm.cs +++ b/Source/Core/Windows/ThingEditForm.cs @@ -51,6 +51,7 @@ namespace CodeImp.DoomBuilder.Windows private static bool useabsoluteheight; //mxd private List<ThingProperties> thingprops; //mxd private Dictionary<string, string> flagsrename; //mxd + private bool oldmapischanged; private struct ThingProperties //mxd { @@ -141,6 +142,7 @@ namespace CodeImp.DoomBuilder.Windows public void Setup(ICollection<Thing> things) { preventchanges = true; + oldmapischanged = General.Map.IsChanged; undocreated = false; argscontrol.Reset(); @@ -466,7 +468,16 @@ namespace CodeImp.DoomBuilder.Windows private void cancel_Click(object sender, EventArgs e) { //mxd. Perform undo? - if(undocreated) General.Map.UndoRedo.WithdrawUndo(); + if (undocreated) + { + General.Map.UndoRedo.WithdrawUndo(); + + // Changing certain properties of the thing, like its type, will set General.Map.IsChanged to true. + // But if cancel is pressed and the changes are discarded, and the map was not changed before, we have to force + // General.Map.IsChanged back to false + if (General.Map.IsChanged && oldmapischanged == false) + General.Map.ForceMapIsChangedFalse(); + } // Be gone this.DialogResult = DialogResult.Cancel; diff --git a/Source/Core/Windows/ThingEditFormUDMF.cs b/Source/Core/Windows/ThingEditFormUDMF.cs index 4da13896c242243e11f6f59d4e6c3ca47b1b8da1..44fe79febc00ed9b5e6a27405b8c2346361367b9 100755 --- a/Source/Core/Windows/ThingEditFormUDMF.cs +++ b/Source/Core/Windows/ThingEditFormUDMF.cs @@ -51,6 +51,7 @@ namespace CodeImp.DoomBuilder.Windows private List<ThingProperties> thingprops; //mxd private readonly string[] renderstyles; //mxd private Dictionary<string, string> flagsrename; //mxd + private bool oldmapischanged; //mxd. Persistent settings private bool useabsoluteheight; @@ -164,6 +165,7 @@ namespace CodeImp.DoomBuilder.Windows public void Setup(ICollection<Thing> things) { preventchanges = true; + oldmapischanged = General.Map.IsChanged; undocreated = false; argscontrol.Reset(); @@ -589,7 +591,16 @@ namespace CodeImp.DoomBuilder.Windows private void cancel_Click(object sender, EventArgs e) { //mxd. Perform undo? - if(undocreated) General.Map.UndoRedo.WithdrawUndo(); + if (undocreated) + { + General.Map.UndoRedo.WithdrawUndo(); + + // Changing certain properties of the sector, like its type, will set General.Map.IsChanged to true. + // But if cancel is pressed and the changes are discarded, and the map was not changed before, we have to force + // General.Map.IsChanged back to false + if (General.Map.IsChanged && oldmapischanged == false) + General.Map.ForceMapIsChangedFalse(); + } // Be gone this.DialogResult = DialogResult.Cancel; diff --git a/Source/Core/Windows/VertexEditForm.cs b/Source/Core/Windows/VertexEditForm.cs index 3b6e2fe70bbcaf531b51ccb921f76d8ac70dad41..8c051f2fee2cfb1e5c64ae7998114c99d6de9d54 100755 --- a/Source/Core/Windows/VertexEditForm.cs +++ b/Source/Core/Windows/VertexEditForm.cs @@ -47,6 +47,7 @@ namespace CodeImp.DoomBuilder.Windows private bool preventchanges; //mxd private bool undocreated; //mxd private List<VertexProperties> vertexprops; //mxd + private bool oldmapischanged; private struct VertexProperties //mxd { @@ -118,6 +119,7 @@ namespace CodeImp.DoomBuilder.Windows public void Setup(ICollection<Vertex> vertices, bool allowPositionChange) { preventchanges = true; //mxd + oldmapischanged = General.Map.IsChanged; // Keep this list this.vertices = vertices; @@ -356,7 +358,16 @@ namespace CodeImp.DoomBuilder.Windows private void cancel_Click(object sender, EventArgs e) { //mxd. Perform undo if required - if(undocreated) General.Map.UndoRedo.WithdrawUndo(); + if (undocreated) + { + General.Map.UndoRedo.WithdrawUndo(); + + // Changing certain properties of the vertex, like the position, will set General.Map.IsChanged to true. + // But if cancel is pressed and the changes are discarded, and the map was not changed before, we have to force + // General.Map.IsChanged back to false + if (General.Map.IsChanged && oldmapischanged == false) + General.Map.ForceMapIsChangedFalse(); + } // And close this.DialogResult = DialogResult.Cancel;