Fixed a regression where editing map elements did not preserve the selection order, but used the index order instead. Fixes #791

This commit is contained in:
biwa 2022-09-20 23:52:41 +02:00 committed by spherallic
parent f3cb854bbd
commit 53ca8efc6a
8 changed files with 51 additions and 52 deletions

View File

@ -57,7 +57,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
#region ================== Constructor / Disposer
// Constructor to start dragging immediately
public DragLinedefsMode(Vector2D dragstartmappos, List<Linedef> lines)
public DragLinedefsMode(Vector2D dragstartmappos, ICollection<Linedef> lines)
{
// Mark what we are dragging
General.Map.Map.ClearAllMarks(false);

View File

@ -57,7 +57,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
#region ================== Constructor / Disposer
// Constructor to start dragging immediately
public DragSectorsMode(Vector2D dragstartmappos, List<Sector> sectors)
public DragSectorsMode(Vector2D dragstartmappos, ICollection<Sector> sectors)
{
// Mark what we are dragging
General.Map.Map.ClearAllMarks(false);

View File

@ -114,7 +114,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
#region ================== Constructor / Disposer
// Constructor to start dragging immediately
public DragThingsMode(EditMode basemode, Vector2D dragstartmappos, List<Thing> things, bool makeundo)
public DragThingsMode(EditMode basemode, Vector2D dragstartmappos, ICollection<Thing> things, bool makeundo)
{
// Initialize
this.dragstartmappos = dragstartmappos;

View File

@ -54,7 +54,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
#region ================== Constructor / Disposer
// Constructor to start dragging immediately
public DragVerticesMode(Vector2D dragstartmappos, List<Vertex> vertices)
public DragVerticesMode(Vector2D dragstartmappos, ICollection<Vertex> vertices)
{
// Mark what we are dragging
General.Map.Map.ClearAllMarks(false);

View File

@ -75,6 +75,9 @@ namespace CodeImp.DoomBuilder.BuilderModes
// Stores sizes of the text for text labels so that they only have to be computed once
private Dictionary<string, float> textlabelsizecache;
// Linedefs that will be edited
ICollection<Linedef> editlines;
#endregion
#region ================== Properties
@ -858,21 +861,20 @@ namespace CodeImp.DoomBuilder.BuilderModes
// Edit pressed in this mode
editpressed = true;
// We use the marks to determine what to edit/drag, so clear it first
General.Map.Map.ClearMarkedLinedefs(false);
// Highlighted item not selected?
if(!highlighted.Selected)
{
// Make this the only selection
General.Map.Map.ClearSelectedLinedefs();
highlighted.Marked = true;
editlines = new List<Linedef> { highlighted };
UpdateSelectionInfo(); //mxd
General.Interface.RedrawDisplay();
}
else
{
General.Map.Map.MarkSelectedLinedefs(true, true);
editlines = General.Map.Map.GetSelectedLinedefs(true);
}
// Update display
@ -909,10 +911,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
// Edit pressed in this mode?
if(editpressed)
{
// Anything selected?
ICollection<Linedef> editlines = General.Map.Map.GetMarkedLinedefs(true);
if(editlines.Count > 0)
if(editlines?.Count > 0)
{
if(General.Interface.IsActiveWindow)
{
@ -1111,19 +1110,19 @@ namespace CodeImp.DoomBuilder.BuilderModes
// Anything highlighted?
if((highlighted != null) && !highlighted.IsDisposed)
{
List<Linedef> draglines = new List<Linedef>();
ICollection<Linedef> draglines;
// Highlighted item not selected?
if(!highlighted.Selected)
{
// Select only this linedef for dragging
General.Map.Map.ClearSelectedLinedefs();
draglines.Add(highlighted);
draglines = new List<Linedef> { highlighted };
}
else
{
// Add all selected linedefs to the linedefs we want to drag
draglines.AddRange(General.Map.Map.GetSelectedLinedefs(true));
draglines = General.Map.Map.GetSelectedLinedefs(true);
}
// Start dragging the selection

View File

@ -80,6 +80,9 @@ namespace CodeImp.DoomBuilder.BuilderModes
// Stores sizes of the text for text labels so that they only have to be computed once
private Dictionary<string, float> textlabelsizecache;
// Sectors that will be edited
private ICollection<Sector> editsectors;
#endregion
#region ================== Properties
@ -1041,24 +1044,23 @@ namespace CodeImp.DoomBuilder.BuilderModes
// Edit pressed in this mode
editpressed = true;
// We use the marks to determine what to edit/drag, so clear it first
General.Map.Map.ClearMarkedSectors(false);
// Highlighted item not selected?
if (!highlighted.Selected)
{
// Make this the only selection
General.Map.Map.ClearSelectedSectors();
General.Map.Map.ClearSelectedLinedefs();
highlighted.Marked = true;
editsectors = new List<Sector> { highlighted };
UpdateSelectedLabels(); //mxd
UpdateOverlaySurfaces(); //mxd
UpdateSelectionInfo(); //mxd
General.Interface.RedrawDisplay();
}
else
else // Highlight is selected, so take all selected sectors
{
General.Map.Map.MarkSelectedSectors(true, true);
editsectors = General.Map.Map.GetSelectedSectors(true);
}
// Update display
@ -1093,10 +1095,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
// Edit pressed in this mode?
if(editpressed)
{
// Anything selected?
ICollection<Sector> editsectors = General.Map.Map.GetMarkedSectors(true);
if(editsectors.Count > 0)
if(editsectors?.Count > 0)
{
if(General.Interface.IsActiveWindow)
{
@ -1300,19 +1299,19 @@ namespace CodeImp.DoomBuilder.BuilderModes
// Anything highlighted?
if((highlighted != null) && !highlighted.IsDisposed)
{
List<Sector> dragsectors = new List<Sector>();
ICollection<Sector> dragsectors;
// Highlighted item not selected?
if (!highlighted.Selected)
{
// Select only this sector for dragging
General.Map.Map.ClearSelectedSectors();
dragsectors.Add(highlighted);
dragsectors = new List<Sector> { highlighted };
UpdateOverlaySurfaces(); //mxd
}
else
{
dragsectors.AddRange(General.Map.Map.GetSelectedSectors(true));
dragsectors = General.Map.Map.GetSelectedSectors(true);
}
// Start dragging the selection

View File

@ -77,6 +77,9 @@ namespace CodeImp.DoomBuilder.BuilderModes
// Stores sizes of the text for text labels so that they only have to be computed once
private Dictionary<string, float> textlabelsizecache;
// Things that will be edited
private ICollection<Thing> editthings;
#endregion
#region ================== Properties
@ -482,22 +485,21 @@ namespace CodeImp.DoomBuilder.BuilderModes
{
// Edit pressed in this mode
editpressed = true;
// We use the marks to determine what do edit/drag, so clear it first
General.Map.Map.ClearMarkedThings(false);
// Highlighted item not selected?
if(!highlighted.Selected)
{
// Make this the only selection
General.Map.Map.ClearSelectedThings();
highlighted.Marked = true;
editthings = new List<Thing> { highlighted };
UpdateSelectionInfo(); //mxd
General.Interface.RedrawDisplay();
}
else
{
General.Map.Map.MarkSelectedThings(true, true);
editthings = General.Map.Map.GetSelectedThings(true);
}
// Update display
@ -527,7 +529,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
{
General.Map.Map.ClearSelectedThings();
General.Map.Map.ClearMarkedThings(false);
t.Marked = true;
editthings = new List<Thing> { t };
Highlight(t);
General.Interface.RedrawDisplay();
}
@ -542,10 +544,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
// Edit pressed in this mode?
if(editpressed)
{
// Anything selected?
ICollection<Thing> editthings = General.Map.Map.GetMarkedThings(true);
if(editthings.Count > 0)
if(editthings?.Count > 0)
{
if(General.Interface.IsActiveWindow)
{
@ -733,19 +732,19 @@ namespace CodeImp.DoomBuilder.BuilderModes
// Anything highlighted?
if((highlighted != null) && !highlighted.IsDisposed)
{
List<Thing> dragthings = new List<Thing>();
ICollection<Thing> dragthings;
// Highlighted item not selected?
if(!highlighted.Selected)
{
// Select only this thing for dragging
General.Map.Map.ClearSelectedThings();
dragthings.Add(highlighted);
dragthings = new List<Thing> { highlighted };
}
else
{
// Add all selected things to the things we want to drag
dragthings.AddRange(General.Map.Map.GetSelectedThings(true));
dragthings = General.Map.Map.GetSelectedThings(true);
}
// Start dragging the selection
@ -755,7 +754,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
bool thingscloned = false;
if(General.Interface.ShiftState)
{
List<Thing> clonedthings = new List<Thing>(dragthings.Count);
ICollection<Thing> clonedthings = new List<Thing>(dragthings.Count);
if(dragthings.Count > 0)
{
// Make undo

View File

@ -58,6 +58,9 @@ namespace CodeImp.DoomBuilder.BuilderModes
// The blockmap makes is used to make finding lines faster
BlockMap<BlockEntry> blockmap;
// Vertices that will be edited
ICollection<Vertex> editvertices;
#endregion
#region ================== Properties
@ -305,13 +308,15 @@ namespace CodeImp.DoomBuilder.BuilderModes
{
// Make this the only selection
General.Map.Map.ClearSelectedVertices();
highlighted.Marked = true;
editvertices = new List<Vertex> { highlighted };
UpdateSelectionInfo(); //mxd
General.Interface.RedrawDisplay();
}
else
{
General.Map.Map.MarkSelectedVertices(true, true);
editvertices = General.Map.Map.GetSelectedVertices(true);
}
// Update display
@ -408,10 +413,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
// Edit pressed in this mode?
if(editpressed)
{
// Anything selected?
ICollection<Vertex> editvertices = General.Map.Map.GetMarkedVertices(true);
if(editvertices.Count > 0)
if(editvertices?.Count > 0)
{
if(General.Interface.IsActiveWindow)
{
@ -619,19 +621,19 @@ namespace CodeImp.DoomBuilder.BuilderModes
// Anything highlighted?
if((highlighted != null) && !highlighted.IsDisposed)
{
List<Vertex> dragvertices = new List<Vertex>();
ICollection<Vertex> dragvertices;
// Highlighted item not selected?
if(!highlighted.Selected)
{
// Select only this vertex for dragging
General.Map.Map.ClearSelectedVertices();
dragvertices.Add(highlighted);
dragvertices = new List<Vertex> { highlighted };
}
else
{
// Add all selected vertices to the vertices we want to drag
dragvertices.AddRange(General.Map.Map.GetSelectedVertices(true));
dragvertices = General.Map.Map.GetSelectedVertices(true);
}
// Start dragging the selection