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