From 118bda42a7d2277d4e825e78b0ad01af94225250 Mon Sep 17 00:00:00 2001
From: MaxED <j.maxed@gmail.com>
Date: Wed, 16 Sep 2015 20:22:20 +0000
Subject: [PATCH] Changed, Drag Things mode: things position is now snapped to
 integers after finishing dragging. Also removed some unneeded update code.
 Fixed a crash when deleting sectors (introduced in R2399).

---
 Source/Core/Map/Linedef.cs                    |  3 +
 Source/Core/Map/Sector.cs                     |  3 +
 Source/Core/Map/Sidedef.cs                    |  3 +
 Source/Core/Map/Thing.cs                      |  3 -
 Source/Core/Map/Vertex.cs                     |  3 +
 .../ClassicModes/DragThingsMode.cs            | 69 ++++++++-----------
 6 files changed, 41 insertions(+), 43 deletions(-)

diff --git a/Source/Core/Map/Linedef.cs b/Source/Core/Map/Linedef.cs
index 713cae99a..713e1802c 100644
--- a/Source/Core/Map/Linedef.cs
+++ b/Source/Core/Map/Linedef.cs
@@ -170,6 +170,9 @@ namespace CodeImp.DoomBuilder.Map
 				back = null;
 				map = null;
 
+				//mxd. Restore isdisposed so base classes can do their disposal job
+				isdisposed = false;
+
 				// Clean up base
 				base.Dispose();
 			}
diff --git a/Source/Core/Map/Sector.cs b/Source/Core/Map/Sector.cs
index de64a4b53..8406b0b65 100644
--- a/Source/Core/Map/Sector.cs
+++ b/Source/Core/Map/Sector.cs
@@ -188,6 +188,9 @@ namespace CodeImp.DoomBuilder.Map
 				// Clean up
 				sidedefs = null;
 				map = null;
+
+				//mxd. Restore isdisposed so base classes can do their disposal job
+				isdisposed = false;
 				
 				// Dispose base
 				base.Dispose();
diff --git a/Source/Core/Map/Sidedef.cs b/Source/Core/Map/Sidedef.cs
index 9ed486ef4..faba9b7d8 100644
--- a/Source/Core/Map/Sidedef.cs
+++ b/Source/Core/Map/Sidedef.cs
@@ -145,6 +145,9 @@ namespace CodeImp.DoomBuilder.Map
 				map = null;
 				sector = null;
 
+				//mxd. Restore isdisposed so base classes can do their disposal job
+				isdisposed = false;
+
 				// Dispose base
 				base.Dispose();
 			}
diff --git a/Source/Core/Map/Thing.cs b/Source/Core/Map/Thing.cs
index 3a5aabe88..88d7de223 100644
--- a/Source/Core/Map/Thing.cs
+++ b/Source/Core/Map/Thing.cs
@@ -149,9 +149,6 @@ namespace CodeImp.DoomBuilder.Map
 			// Not already disposed?
 			if(!isdisposed)
 			{
-				// Already set isdisposed so that changes can be prohibited
-				isdisposed = true;
-
 				if(map == General.Map.Map)
 					General.Map.UndoRedo.RecRemThing(this);
 
diff --git a/Source/Core/Map/Vertex.cs b/Source/Core/Map/Vertex.cs
index 9ce8a5327..dbcbe55f4 100644
--- a/Source/Core/Map/Vertex.cs
+++ b/Source/Core/Map/Vertex.cs
@@ -139,6 +139,9 @@ namespace CodeImp.DoomBuilder.Map
 				linedefs = null;
 				map = null;
 
+				//mxd. Restore isdisposed so base classes can do their disposal job
+				isdisposed = false;
+
 				// Dispose base
 				base.Dispose();
 			}
diff --git a/Source/Plugins/BuilderModes/ClassicModes/DragThingsMode.cs b/Source/Plugins/BuilderModes/ClassicModes/DragThingsMode.cs
index c709a06a8..d12a5b4c4 100644
--- a/Source/Plugins/BuilderModes/ClassicModes/DragThingsMode.cs
+++ b/Source/Plugins/BuilderModes/ClassicModes/DragThingsMode.cs
@@ -66,9 +66,9 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		//mxd
 		private class AlignData
 		{
-			public int InitialAngle;
+			public readonly int InitialAngle;
 			public int CurrentAngle;
-			public float InitialHeight;
+			public readonly float InitialHeight;
 			public float CurrentHeight;
 			public PointF Position = PointF.Empty;
 			public bool Active;
@@ -80,7 +80,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
 			}
 		}
 
-		private AlignData alignData;
+		private AlignData aligndata;
 
 		// List of selected items
 		private readonly ICollection<Thing> selectedthings;
@@ -105,8 +105,6 @@ namespace CodeImp.DoomBuilder.BuilderModes
 
 		// Just keep the base mode button checked
 		public override string EditModeButtonName { get { return basemode.GetType().Name; } }
-
-		//internal EditMode BaseMode { get { return basemode; } }
 		
 		#endregion
 
@@ -185,7 +183,6 @@ namespace CodeImp.DoomBuilder.BuilderModes
 			}
 			
 			Vector2D oldpos = dragitem.Position;
-			Thing nearest;
 			Vector2D tl, br;
 
 			// don't move if the offset contains invalid data
@@ -205,7 +202,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
 			if(snapnearest)
 			{
 				// Find nearest unselected item within selection range
-				nearest = MapSet.NearestThingSquareRange(unselectedthings, mousemappos, BuilderPlug.Me.StitchRange / renderer.Scale);
+				Thing nearest = MapSet.NearestThingSquareRange(unselectedthings, mousemappos, BuilderPlug.Me.StitchRange / renderer.Scale);
 				if(nearest != null)
 				{
 					// Move the dragged item
@@ -364,36 +361,34 @@ namespace CodeImp.DoomBuilder.BuilderModes
 				// Move geometry back to original position
 				MoveThingsRelative(new Vector2D(0f, 0f), false, false, false, false);
 
-				if(alignData != null && alignData.Active)
+				//mxd. Revert aligning
+				if(aligndata != null && aligndata.Active)
 				{
-					alignData.CurrentAngle = dragitem.AngleDoom; //mxd
-					dragitem.Rotate(alignData.InitialAngle);
-					alignData.CurrentHeight = dragitem.Position.z; //mxd
-					dragitem.Move(dragitem.Position.x, dragitem.Position.y, alignData.InitialHeight);
+					aligndata.CurrentAngle = dragitem.AngleDoom; //mxd
+					dragitem.Rotate(aligndata.InitialAngle);
+					aligndata.CurrentHeight = dragitem.Position.z; //mxd
+					dragitem.Move(dragitem.Position.x, dragitem.Position.y, aligndata.InitialHeight);
 				}
 
 				// Make undo for the dragging
 				General.Map.UndoRedo.CreateUndo("Drag things");
 
 				// Move selected geometry to final position
-				if(alignData != null && alignData.Active) //mxd
+				if(aligndata != null && aligndata.Active) //mxd. Apply aligning
 				{
-					if(!alignData.Position.IsEmpty) 
-						dragitem.Move(alignData.Position.X, alignData.Position.Y, alignData.CurrentHeight);
+					if(!aligndata.Position.IsEmpty) 
+						dragitem.Move(aligndata.Position.X, aligndata.Position.Y, aligndata.CurrentHeight);
 					else
-						dragitem.Move(dragitem.Position.x, dragitem.Position.y, alignData.CurrentHeight);
-					dragitem.Rotate(alignData.CurrentAngle);
+						dragitem.Move(dragitem.Position.x, dragitem.Position.y, aligndata.CurrentHeight);
+					dragitem.Rotate(aligndata.CurrentAngle);
 				} 
 				else 
 				{
 					MoveThingsRelative(mousemappos - dragstartmappos, snaptogrid, snaptogridincrement, snaptonearest, snaptocardinaldirection);
 				}
 
-				// Snap to map format accuracy
-				General.Map.Map.SnapAllToAccuracy();
-				
-				// Update cached values
-				General.Map.Map.Update(false, false);
+				//mxd. Snap selected things to map format accuracy
+				foreach(Thing thing in selectedthings) thing.SnapToAccuracy(false);
 
 				// Map is changed
 				General.Map.IsChanged = true;
@@ -433,37 +428,34 @@ namespace CodeImp.DoomBuilder.BuilderModes
 			if(selectedthings.Count == 1 && dragitem.IsModel && snaptonearest && !snaptocardinaldirection && MoveThingsRelative(mousemappos - dragstartmappos, snaptogrid, snaptogridincrement, false, false)) 
 			{
 				Linedef l = General.Map.Map.NearestLinedefRange(oldpositions[0] + mousemappos - dragstartmappos, BuilderPlug.Me.StitchRange / renderer.Scale);
-				bool restoreSettings = false;
-
-				if(alignData == null) alignData = new AlignData(dragitem);
+				bool restoresettings = false;
+				if(aligndata == null) aligndata = new AlignData(dragitem);
 
 				if(l != null) 
 				{
 					if(Tools.TryAlignThingToLine(dragitem, l)) 
 					{
-						dragitem.SnapToAccuracy();
-						alignData.Position = new PointF(dragitem.Position.x, dragitem.Position.y);
-						alignData.Active = true;
+						aligndata.Position = new PointF(dragitem.Position.x, dragitem.Position.y);
+						aligndata.Active = true;
 					} 
-					else if(dragitem.AngleDoom != alignData.InitialAngle) //restore initial angle?
+					else if(dragitem.AngleDoom != aligndata.InitialAngle) //restore initial angle?
 					{ 
-						restoreSettings = true;
+						restoresettings = true;
 					}
 
 				} 
-				else if(dragitem.AngleDoom != alignData.InitialAngle) //restore initial angle?
+				else if(dragitem.AngleDoom != aligndata.InitialAngle) //restore initial angle?
 				{ 
-					restoreSettings = true;
+					restoresettings = true;
 				}
 
-				if(restoreSettings) 
+				if(restoresettings) 
 				{
-					alignData.Position = PointF.Empty;
-					alignData.Active = false;
-					dragitem.Rotate(alignData.InitialAngle);
+					aligndata.Position = PointF.Empty;
+					aligndata.Active = false;
+					dragitem.Rotate(aligndata.InitialAngle);
 				}
 
-				General.Map.Map.Update(); // Update cached values
 				UpdateRedraw();// Redraw
 				renderer.Present();
 
@@ -473,9 +465,6 @@ namespace CodeImp.DoomBuilder.BuilderModes
 			// Move selected geometry
 			if(MoveThingsRelative(mousemappos - dragstartmappos, snaptogrid, snaptogridincrement, snaptonearest, snaptocardinaldirection))
 			{
-				// Update cached values
-				General.Map.Map.Update();
-
 				// Redraw
 				UpdateRedraw();
 				renderer.Present();
-- 
GitLab