Things/Linedefs/Sectors/Vertices Modes: standardized how editing and selection works:

- editing a highlighted, not selected map element will deselect other selected map elements, then start editing the highlighted map element
- dragging a highlighted, not selected map element will deselect other selected map elements, then start dragging the highlighted map element
- dragging a single map element will keep its selection state. I.e. dragging a selected map element will not deselect it after dragging anymore
  - dragging a highlighted, not selected thing will not select it after dragging
- dragging a highlighted, not selected sector, while other sectors are selected, will only drag the highlighted sector, and not the selected sector (and deselect the selected sectors)
This commit is contained in:
biwa 2022-09-18 16:54:09 +02:00
parent 7f09ac752b
commit 179f72068f
8 changed files with 172 additions and 238 deletions

View file

@ -45,8 +45,8 @@ namespace CodeImp.DoomBuilder.BuilderModes
#region ================== Variables #region ================== Variables
private ICollection<Linedef> selectedlines; private ICollection<Linedef> draglines;
private ICollection<Linedef> unselectedlines; private ICollection<Linedef> unmovinglines;
#endregion #endregion
@ -57,21 +57,27 @@ namespace CodeImp.DoomBuilder.BuilderModes
#region ================== Constructor / Disposer #region ================== Constructor / Disposer
// Constructor to start dragging immediately // Constructor to start dragging immediately
public DragLinedefsMode(Vector2D dragstartmappos) public DragLinedefsMode(Vector2D dragstartmappos, List<Linedef> lines)
{ {
// Mark what we are dragging // Mark what we are dragging
General.Map.Map.ClearAllMarks(false); General.Map.Map.ClearAllMarks(false);
General.Map.Map.MarkSelectedLinedefs(true, true);
draglines = new List<Linedef>(lines.Count);
foreach(Linedef ld in lines)
{
ld.Marked = true;
draglines.Add(ld);
}
ICollection<Vertex> verts = General.Map.Map.GetVerticesFromLinesMarks(true); ICollection<Vertex> verts = General.Map.Map.GetVerticesFromLinesMarks(true);
foreach(Vertex v in verts) v.Marked = true; foreach (Vertex v in verts) v.Marked = true;
// Get line collections // Get line collections
selectedlines = General.Map.Map.GetSelectedLinedefs(true); unmovinglines = General.Map.Map.GetSelectedLinedefs(false);
unselectedlines = General.Map.Map.GetSelectedLinedefs(false);
// Initialize // Initialize
base.StartDrag(dragstartmappos); base.StartDrag(dragstartmappos);
undodescription = (selectedlines.Count == 1 ? "Drag linedef" : "Drag " + selectedlines.Count + " linedefs"); //mxd undodescription = (draglines.Count == 1 ? "Drag linedef" : "Drag " + draglines.Count + " linedefs"); //mxd
// We have no destructor // We have no destructor
GC.SuppressFinalize(this); GC.SuppressFinalize(this);
@ -94,28 +100,6 @@ namespace CodeImp.DoomBuilder.BuilderModes
#region ================== Methods #region ================== Methods
// Disenagaging
public override void OnDisengage()
{
// Select vertices from lines selection
General.Map.Map.ClearSelectedVertices();
ICollection<Vertex> verts = General.Map.Map.GetVerticesFromLinesMarks(true);
foreach(Vertex v in verts) v.Selected = true;
// Perform normal disengage
base.OnDisengage();
// Clear vertex selection
General.Map.Map.ClearSelectedVertices();
// When not cancelled
if(!cancelled)
{
// If only a single linedef was selected, deselect it now
if(selectedlines.Count == 1) General.Map.Map.ClearSelectedLinedefs();
}
}
// This redraws the display // This redraws the display
public override void OnRedrawDisplay() public override void OnRedrawDisplay()
{ {
@ -143,8 +127,16 @@ namespace CodeImp.DoomBuilder.BuilderModes
if(renderer.StartPlotter(true)) if(renderer.StartPlotter(true))
{ {
// Render lines and vertices // Render lines and vertices
renderer.PlotLinedefSet(unselectedlines); renderer.PlotLinedefSet(unmovinglines);
renderer.PlotLinedefSet(selectedlines);
foreach (Linedef ld in draglines)
{
if (ld.Selected)
renderer.PlotLinedef(ld, General.Colors.Selection);
else
renderer.PlotLinedef(ld, General.Colors.Highlight);
}
renderer.PlotVerticesSet(General.Map.Map.Vertices); renderer.PlotVerticesSet(General.Map.Map.Vertices);
// Draw the dragged item highlighted // Draw the dragged item highlighted

View file

@ -45,8 +45,8 @@ namespace CodeImp.DoomBuilder.BuilderModes
#region ================== Variables #region ================== Variables
private ICollection<Linedef> selectedlines; private ICollection<Linedef> draglines;
private ICollection<Sector> selectedsectors; private ICollection<Sector> dragsectors;
#endregion #endregion
@ -57,21 +57,27 @@ namespace CodeImp.DoomBuilder.BuilderModes
#region ================== Constructor / Disposer #region ================== Constructor / Disposer
// Constructor to start dragging immediately // Constructor to start dragging immediately
public DragSectorsMode(Vector2D dragstartmappos) public DragSectorsMode(Vector2D dragstartmappos, List<Sector> sectors)
{ {
// Mark what we are dragging // Mark what we are dragging
General.Map.Map.ClearAllMarks(false); General.Map.Map.ClearAllMarks(false);
General.Map.Map.MarkSelectedLinedefs(true, true);
ICollection<Vertex> verts = General.Map.Map.GetVerticesFromLinesMarks(true);
foreach(Vertex v in verts) v.Marked = true;
// Get selected lines // Get geometry to drag
selectedlines = General.Map.Map.GetSelectedLinedefs(true); dragsectors = new List<Sector>(sectors);
selectedsectors = General.Map.Map.GetSelectedSectors(true); draglines = new HashSet<Linedef>();
foreach (Sector s in sectors)
{
foreach (Sidedef sd in s.Sidedefs)
{
draglines.Add(sd.Line);
sd.Line.Start.Marked = true;
sd.Line.End.Marked = true;
}
}
// Initialize // Initialize
base.StartDrag(dragstartmappos); base.StartDrag(dragstartmappos);
undodescription = (selectedsectors.Count == 1 ? "Drag sector" : "Drag " + selectedsectors.Count + " sectors"); //mxd undodescription = (dragsectors.Count == 1 ? "Drag sector" : "Drag " + dragsectors.Count + " sectors"); //mxd
// We have no destructor // We have no destructor
GC.SuppressFinalize(this); GC.SuppressFinalize(this);
@ -101,40 +107,6 @@ namespace CodeImp.DoomBuilder.BuilderModes
renderer.SetPresentation(Presentation.Standard); renderer.SetPresentation(Presentation.Standard);
} }
// Disenagaging
public override void OnDisengage()
{
// Select vertices from lines selection
General.Map.Map.ClearSelectedVertices();
ICollection<Vertex> verts = General.Map.Map.GetVerticesFromLinesMarks(true);
foreach(Vertex v in verts) v.Selected = true;
// Perform normal disengage
base.OnDisengage();
// Clear vertex selection
General.Map.Map.ClearSelectedVertices();
// When not cancelled
if(!cancelled)
{
// If only a single sector was selected, deselect it now
if(selectedsectors.Count == 1)
{
General.Map.Map.ClearSelectedSectors();
General.Map.Map.ClearSelectedLinedefs();
//mxd. Also (de)select things?
if(BuilderPlug.Me.SyncronizeThingEdit)
{
Sector s = General.GetByIndex(selectedsectors, 0);
foreach(Thing t in General.Map.Map.Things)
if(t.Sector == s && t.Selected) t.Selected = false;
}
}
}
}
// This redraws the display // This redraws the display
public override void OnRedrawDisplay() public override void OnRedrawDisplay()
{ {
@ -164,7 +136,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
// Render lines and vertices // Render lines and vertices
renderer.PlotLinedefSet(snaptolines); renderer.PlotLinedefSet(snaptolines);
renderer.PlotLinedefSet(unstablelines); renderer.PlotLinedefSet(unstablelines);
renderer.PlotLinedefSet(selectedlines); renderer.PlotLinedefSet(draglines);
renderer.PlotVerticesSet(General.Map.Map.Vertices); renderer.PlotVerticesSet(General.Map.Map.Vertices);
// Draw the dragged item highlighted // Draw the dragged item highlighted

View file

@ -86,10 +86,10 @@ namespace CodeImp.DoomBuilder.BuilderModes
private AlignData aligndata; private AlignData aligndata;
// List of selected items // List of selected items
private readonly ICollection<Thing> selectedthings; private readonly ICollection<Thing> dragthings;
// List of non-selected items // List of non-selected items
private readonly ICollection<Thing> unselectedthings; private readonly ICollection<Thing> unmovingthings;
// Keep track of view changes // Keep track of view changes
private double lastoffsetx; private double lastoffsetx;
@ -114,7 +114,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
#region ================== Constructor / Disposer #region ================== Constructor / Disposer
// Constructor to start dragging immediately // Constructor to start dragging immediately
public DragThingsMode(EditMode basemode, Vector2D dragstartmappos, bool makeundo) public DragThingsMode(EditMode basemode, Vector2D dragstartmappos, List<Thing> things, bool makeundo)
{ {
// Initialize // Initialize
this.dragstartmappos = dragstartmappos; this.dragstartmappos = dragstartmappos;
@ -125,20 +125,24 @@ namespace CodeImp.DoomBuilder.BuilderModes
// Mark what we are dragging // Mark what we are dragging
General.Map.Map.ClearAllMarks(false); General.Map.Map.ClearAllMarks(false);
General.Map.Map.MarkSelectedThings(true, true); dragthings = new List<Thing>();
foreach (Thing t in things)
{
t.Marked = true;
dragthings.Add(t);
}
// Get selected things // Get things we're not dragging
selectedthings = General.Map.Map.GetMarkedThings(true); unmovingthings = new List<Thing>();
unselectedthings = new List<Thing>(); foreach(Thing t in General.Map.ThingsFilter.VisibleThings) if(!t.Marked) unmovingthings.Add(t);
foreach(Thing t in General.Map.ThingsFilter.VisibleThings) if(!t.Marked) unselectedthings.Add(t);
// Get the nearest thing for snapping // Get the nearest thing for snapping
dragitem = MapSet.NearestThing(selectedthings, dragstartmappos); dragitem = MapSet.NearestThing(dragthings, dragstartmappos);
// Make old positions list // Make old positions list
// We will use this as reference to move the vertices, or to move them back on cancel // We will use this as reference to move the vertices, or to move them back on cancel
oldpositions = new List<Vector2D>(selectedthings.Count); oldpositions = new List<Vector2D>(dragthings.Count);
foreach(Thing t in selectedthings) oldpositions.Add(t.Position); foreach(Thing t in dragthings) oldpositions.Add(t.Position);
// Also keep old position of the dragged item // Also keep old position of the dragged item
dragitemposition = dragitem.Position; dragitemposition = dragitem.Position;
@ -206,7 +210,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
if(snapnearest) if(snapnearest)
{ {
// Find nearest unselected item within selection range // Find nearest unselected item within selection range
Thing nearest = MapSet.NearestThingSquareRange(unselectedthings, mousemappos, BuilderPlug.Me.StitchRange / renderer.Scale); Thing nearest = MapSet.NearestThingSquareRange(unmovingthings, mousemappos, BuilderPlug.Me.StitchRange / renderer.Scale);
if(nearest != null) if(nearest != null)
{ {
// Move the dragged item // Move the dragged item
@ -253,7 +257,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
int i = 0; int i = 0;
// Move selected geometry // Move selected geometry
foreach(Thing t in selectedthings) foreach(Thing t in dragthings)
{ {
// Move vertex from old position relative to the // Move vertex from old position relative to the
// mouse position change since drag start // mouse position change since drag start
@ -314,8 +318,8 @@ namespace CodeImp.DoomBuilder.BuilderModes
{ {
// Render things // Render things
renderer.RenderThingSet(General.Map.ThingsFilter.HiddenThings, General.Settings.HiddenThingsAlpha); renderer.RenderThingSet(General.Map.ThingsFilter.HiddenThings, General.Settings.HiddenThingsAlpha);
renderer.RenderThingSet(unselectedthings, General.Settings.ActiveThingsAlpha); renderer.RenderThingSet(unmovingthings, General.Settings.ActiveThingsAlpha);
renderer.RenderThingSet(selectedthings, General.Settings.ActiveThingsAlpha); renderer.RenderThingSet(dragthings, General.Settings.ActiveThingsAlpha);
// Draw the dragged item highlighted // Draw the dragged item highlighted
// This is important to know, because this item is used // This is important to know, because this item is used
@ -334,7 +338,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
MoveThingsRelative(new Vector2D(0f, 0f), false, false, false, false); MoveThingsRelative(new Vector2D(0f, 0f), false, false, false, false);
// If only a single vertex was selected, deselect it now // If only a single vertex was selected, deselect it now
if(selectedthings.Count == 1) General.Map.Map.ClearSelectedThings(); //if(dragthings.Count == 1) General.Map.Map.ClearSelectedThings();
// Update cached values // Update cached values
General.Map.Map.Update(); General.Map.Map.Update();
@ -376,7 +380,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
// Make undo for the dragging // Make undo for the dragging
if(makeundo) //mxd if(makeundo) //mxd
General.Map.UndoRedo.CreateUndo((selectedthings.Count == 1 ? "Drag thing" : "Drag " + selectedthings.Count + " things")); General.Map.UndoRedo.CreateUndo((dragthings.Count == 1 ? "Drag thing" : "Drag " + dragthings.Count + " things"));
// Move selected geometry to final position // Move selected geometry to final position
if(aligndata != null && aligndata.Active) //mxd. Apply aligning if(aligndata != null && aligndata.Active) //mxd. Apply aligning
@ -393,7 +397,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
} }
//mxd. Snap selected things to map format accuracy //mxd. Snap selected things to map format accuracy
foreach(Thing thing in selectedthings) thing.SnapToAccuracy(false); foreach(Thing thing in dragthings) thing.SnapToAccuracy(false);
// Map is changed // Map is changed
General.Map.IsChanged = true; General.Map.IsChanged = true;
@ -430,7 +434,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
snaptogridincrement = (!snaptocardinaldirection && General.Interface.AltState); //mxd snaptogridincrement = (!snaptocardinaldirection && General.Interface.AltState); //mxd
//mxd. Snap to nearest linedef //mxd. Snap to nearest linedef
if(selectedthings.Count == 1 && snaptonearest && !snaptocardinaldirection if(dragthings.Count == 1 && snaptonearest && !snaptocardinaldirection
&& Thing.AlignableRenderModes.Contains(dragitem.RenderMode) && Thing.AlignableRenderModes.Contains(dragitem.RenderMode)
&& MoveThingsRelative(mousemappos - dragstartmappos, snaptogrid, snaptogridincrement, false, false)) && MoveThingsRelative(mousemappos - dragstartmappos, snaptogrid, snaptogridincrement, false, false))
{ {

View file

@ -59,11 +59,12 @@ namespace CodeImp.DoomBuilder.BuilderModes
#region ================== Constructor / Disposer #region ================== Constructor / Disposer
// Constructor to start dragging immediately // Constructor to start dragging immediately
public DragVerticesMode(Vector2D dragstartmappos) public DragVerticesMode(Vector2D dragstartmappos, List<Vertex> vertices)
{ {
// Mark what we are dragging // Mark what we are dragging
General.Map.Map.ClearAllMarks(false); General.Map.Map.ClearAllMarks(false);
General.Map.Map.MarkSelectedVertices(true, true); foreach (Vertex v in vertices)
v.Marked = true;
// Initialize // Initialize
base.StartDrag(dragstartmappos); base.StartDrag(dragstartmappos);
@ -90,24 +91,6 @@ namespace CodeImp.DoomBuilder.BuilderModes
#region ================== Methods #region ================== Methods
// Disenagaging
public override void OnDisengage()
{
// Select vertices from marks
General.Map.Map.ClearSelectedVertices();
General.Map.Map.SelectMarkedVertices(true, true);
// Perform normal disengage
base.OnDisengage();
// When not cancelled
if(!cancelled)
{
// If only a single vertex was selected, deselect it now
if(selectedverts.Count == 1) General.Map.Map.ClearSelectedVertices();
}
}
// This redraws the display // This redraws the display
public override void OnRedrawDisplay() public override void OnRedrawDisplay()
{ {

View file

@ -64,7 +64,6 @@ namespace CodeImp.DoomBuilder.BuilderModes
// Interface // Interface
new private bool editpressed; new private bool editpressed;
private bool selectionfromhighlight; //mxd
// The blockmap makes is used to make finding lines faster // The blockmap makes is used to make finding lines faster
BlockMap<BlockEntry> blockmap; BlockMap<BlockEntry> blockmap;
@ -438,13 +437,6 @@ namespace CodeImp.DoomBuilder.BuilderModes
{ {
// Dispose old labels // Dispose old labels
foreach(SelectionLabel l in labels.Values) l.Dispose(); foreach(SelectionLabel l in labels.Values) l.Dispose();
// Don't show lables for selected-from-highlight item
if(selectionfromhighlight)
{
labels.Clear();
return;
}
} }
// Make text labels for selected linedefs // Make text labels for selected linedefs
@ -785,22 +777,28 @@ namespace CodeImp.DoomBuilder.BuilderModes
// Edit pressed in this mode // Edit pressed in this mode
editpressed = true; 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? // Highlighted item not selected?
if(!highlighted.Selected && (BuilderPlug.Me.AutoClearSelection || (General.Map.Map.SelectedLinedefsCount == 0))) if(!highlighted.Selected)
{ {
// Make this the only selection // Make this the only selection
selectionfromhighlight = true; //mxd
General.Map.Map.ClearSelectedLinedefs(); General.Map.Map.ClearSelectedLinedefs();
highlighted.Selected = true; highlighted.Marked = true;
UpdateSelectionInfo(); //mxd UpdateSelectionInfo(); //mxd
General.Interface.RedrawDisplay(); General.Interface.RedrawDisplay();
} }
else
{
General.Map.Map.MarkSelectedLinedefs(true, true);
}
// Update display // Update display
if(renderer.StartPlotter(false)) if(renderer.StartPlotter(false))
{ {
// Redraw highlight to show selection // Redraw highlight to show selection
renderer.PlotLinedef(highlighted, renderer.DetermineLinedefColor(highlighted)); renderer.PlotLinedef(highlighted, General.Colors.Highlight);
renderer.PlotVertex(highlighted.Start, renderer.DetermineVertexColor(highlighted.Start)); renderer.PlotVertex(highlighted.Start, renderer.DetermineVertexColor(highlighted.Start));
renderer.PlotVertex(highlighted.End, renderer.DetermineVertexColor(highlighted.End)); renderer.PlotVertex(highlighted.End, renderer.DetermineVertexColor(highlighted.End));
renderer.Finish(); renderer.Finish();
@ -831,28 +829,19 @@ namespace CodeImp.DoomBuilder.BuilderModes
if(editpressed) if(editpressed)
{ {
// Anything selected? // Anything selected?
ICollection<Linedef> selected = General.Map.Map.GetSelectedLinedefs(true); ICollection<Linedef> editlines = General.Map.Map.GetMarkedLinedefs(true);
if(selected.Count > 0)
if(editlines.Count > 0)
{ {
if(General.Interface.IsActiveWindow) if(General.Interface.IsActiveWindow)
{ {
// Show line edit dialog // Show line edit dialog
General.Interface.OnEditFormValuesChanged += linedefEditForm_OnValuesChanged; General.Interface.OnEditFormValuesChanged += linedefEditForm_OnValuesChanged;
DialogResult result = General.Interface.ShowEditLinedefs(selected); DialogResult result = General.Interface.ShowEditLinedefs(editlines);
General.Interface.OnEditFormValuesChanged -= linedefEditForm_OnValuesChanged; General.Interface.OnEditFormValuesChanged -= linedefEditForm_OnValuesChanged;
General.Map.Map.Update(); General.Map.Map.Update();
// When a single line was selected, deselect it now
if(selected.Count == 1 && selectionfromhighlight)
{
General.Map.Map.ClearSelectedLinedefs();
}
else if(result == DialogResult.Cancel) //mxd. Restore selection...
{
foreach(Linedef l in selected) l.Selected = true;
}
// Update entire display // Update entire display
SetupSectorLabels(); SetupSectorLabels();
General.Map.Renderer2D.UpdateExtraFloorFlag(); //mxd General.Map.Renderer2D.UpdateExtraFloorFlag(); //mxd
@ -863,7 +852,6 @@ namespace CodeImp.DoomBuilder.BuilderModes
} }
editpressed = false; editpressed = false;
selectionfromhighlight = false; //mxd
base.OnEditEnd(); base.OnEditEnd();
} }
@ -1075,17 +1063,24 @@ namespace CodeImp.DoomBuilder.BuilderModes
// Anything highlighted? // Anything highlighted?
if((highlighted != null) && !highlighted.IsDisposed) if((highlighted != null) && !highlighted.IsDisposed)
{ {
List<Linedef> draglines = new List<Linedef>();
// Highlighted item not selected? // Highlighted item not selected?
if(!highlighted.Selected) if(!highlighted.Selected)
{ {
// Select only this linedef for dragging // Select only this linedef for dragging
General.Map.Map.ClearSelectedLinedefs(); General.Map.Map.ClearSelectedLinedefs();
highlighted.Selected = true; draglines.Add(highlighted);
}
else
{
// Add all selected linedefs to the linedefs we want to drag
draglines.AddRange(General.Map.Map.GetSelectedLinedefs(true));
} }
// Start dragging the selection // Start dragging the selection
if(!BuilderPlug.Me.DontMoveGeometryOutsideMapBoundary || CanDrag()) //mxd if(!BuilderPlug.Me.DontMoveGeometryOutsideMapBoundary || CanDrag()) //mxd
General.Editing.ChangeMode(new DragLinedefsMode(mousedownmappos)); General.Editing.ChangeMode(new DragLinedefsMode(mousedownmappos, draglines));
} }
} }
} }

View file

@ -61,7 +61,6 @@ namespace CodeImp.DoomBuilder.BuilderModes
// Interface // Interface
new private bool editpressed; new private bool editpressed;
private bool selectionfromhighlight; //mxd
// Labels // Labels
private Dictionary<Sector, TextLabel[]> labels; private Dictionary<Sector, TextLabel[]> labels;
@ -631,9 +630,6 @@ namespace CodeImp.DoomBuilder.BuilderModes
// This updates labels from the selected sectors // This updates labels from the selected sectors
private void UpdateSelectedLabels() private void UpdateSelectedLabels()
{ {
// Don't show lables for selected-from-highlight item
if(selectionfromhighlight) return;
// Go for all labels in all selected sectors // Go for all labels in all selected sectors
ICollection<Sector> orderedselection = General.Map.Map.GetSelectedSectors(true); ICollection<Sector> orderedselection = General.Map.Map.GetSelectedSectors(true);
PixelColor c = (General.Settings.UseHighlight ? General.Colors.Highlight : General.Colors.Selection); //mxd PixelColor c = (General.Settings.UseHighlight ? General.Colors.Highlight : General.Colors.Selection); //mxd
@ -1060,25 +1056,31 @@ namespace CodeImp.DoomBuilder.BuilderModes
// Edit pressed in this mode // Edit pressed in this mode
editpressed = true; 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? // Highlighted item not selected?
if(!highlighted.Selected && (BuilderPlug.Me.AutoClearSelection || (General.Map.Map.SelectedSectorsCount == 0))) if (!highlighted.Selected)
{ {
// Make this the only selection // Make this the only selection
selectionfromhighlight = true; //mxd
General.Map.Map.ClearSelectedSectors(); General.Map.Map.ClearSelectedSectors();
General.Map.Map.ClearSelectedLinedefs(); General.Map.Map.ClearSelectedLinedefs();
SelectSector(highlighted, true, false); highlighted.Marked = true;
UpdateSelectedLabels(); //mxd UpdateSelectedLabels(); //mxd
UpdateOverlaySurfaces(); //mxd UpdateOverlaySurfaces(); //mxd
UpdateSelectionInfo(); //mxd UpdateSelectionInfo(); //mxd
General.Interface.RedrawDisplay(); General.Interface.RedrawDisplay();
} }
else
{
General.Map.Map.MarkSelectedSectors(true, true);
}
// Update display // Update display
if(renderer.StartPlotter(false)) if(renderer.StartPlotter(false))
{ {
// Redraw highlight to show selection // Redraw highlight to show selection
renderer.PlotSector(highlighted); renderer.PlotSector(highlighted, General.Colors.Highlight);
renderer.Finish(); renderer.Finish();
renderer.Present(); renderer.Present();
} }
@ -1107,40 +1109,19 @@ namespace CodeImp.DoomBuilder.BuilderModes
if(editpressed) if(editpressed)
{ {
// Anything selected? // Anything selected?
ICollection<Sector> selected = General.Map.Map.GetSelectedSectors(true); ICollection<Sector> editsectors = General.Map.Map.GetMarkedSectors(true);
if(selected.Count > 0)
if(editsectors.Count > 0)
{ {
if(General.Interface.IsActiveWindow) if(General.Interface.IsActiveWindow)
{ {
//mxd. Show realtime vertex edit dialog //mxd. Show realtime vertex edit dialog
General.Interface.OnEditFormValuesChanged += sectorEditForm_OnValuesChanged; General.Interface.OnEditFormValuesChanged += sectorEditForm_OnValuesChanged;
DialogResult result = General.Interface.ShowEditSectors(selected); DialogResult result = General.Interface.ShowEditSectors(editsectors);
General.Interface.OnEditFormValuesChanged -= sectorEditForm_OnValuesChanged; General.Interface.OnEditFormValuesChanged -= sectorEditForm_OnValuesChanged;
General.Map.Renderer2D.UpdateExtraFloorFlag(); //mxd General.Map.Renderer2D.UpdateExtraFloorFlag(); //mxd
// When a single sector was selected, deselect it now
if(selected.Count == 1 && selectionfromhighlight)
{
General.Map.Map.ClearSelectedSectors();
General.Map.Map.ClearSelectedLinedefs();
//mxd. Also deselect things?
if(BuilderPlug.Me.SyncronizeThingEdit)
{
Sector s = General.GetByIndex(selected, 0);
foreach(Thing t in General.Map.Map.Things)
if(t.Sector == s && t.Selected) t.Selected = false;
}
UpdateEffectLabels(); //mxd
}
else if(result == DialogResult.Cancel) //mxd. Restore selection...
{
foreach(Sector s in selected) SelectSector(s, true, false);
UpdateSelectedLabels(); //mxd
}
UpdateOverlaySurfaces(); //mxd UpdateOverlaySurfaces(); //mxd
General.Interface.RedrawDisplay(); General.Interface.RedrawDisplay();
} }
@ -1150,7 +1131,6 @@ namespace CodeImp.DoomBuilder.BuilderModes
} }
editpressed = false; editpressed = false;
selectionfromhighlight = false; //mxd
base.OnEditEnd(); base.OnEditEnd();
} }
@ -1335,18 +1315,24 @@ namespace CodeImp.DoomBuilder.BuilderModes
// Anything highlighted? // Anything highlighted?
if((highlighted != null) && !highlighted.IsDisposed) if((highlighted != null) && !highlighted.IsDisposed)
{ {
List<Sector> dragsectors = new List<Sector>();
// Highlighted item not selected? // Highlighted item not selected?
if(!highlighted.Selected) if (!highlighted.Selected)
{ {
// Select only this sector for dragging // Select only this sector for dragging
General.Map.Map.ClearSelectedSectors(); General.Map.Map.ClearSelectedSectors();
SelectSector(highlighted, true, true); dragsectors.Add(highlighted);
UpdateOverlaySurfaces(); //mxd UpdateOverlaySurfaces(); //mxd
} }
else
{
dragsectors.AddRange(General.Map.Map.GetSelectedSectors(true));
}
// Start dragging the selection // Start dragging the selection
if(!BuilderPlug.Me.DontMoveGeometryOutsideMapBoundary || CanDrag()) //mxd if(!BuilderPlug.Me.DontMoveGeometryOutsideMapBoundary || CanDrag()) //mxd
General.Editing.ChangeMode(new DragSectorsMode(mousedownmappos)); General.Editing.ChangeMode(new DragSectorsMode(mousedownmappos, dragsectors));
} }
} }
} }

View file

@ -62,7 +62,6 @@ namespace CodeImp.DoomBuilder.BuilderModes
new private bool editpressed; new private bool editpressed;
private bool thinginserted; private bool thinginserted;
private bool awaitingMouseClick; //mxd private bool awaitingMouseClick; //mxd
private bool selectionfromhighlight; //mxd
//mxd. Helper shapes //mxd. Helper shapes
private List<Line3D> persistenteventlines; private List<Line3D> persistenteventlines;
@ -485,22 +484,28 @@ namespace CodeImp.DoomBuilder.BuilderModes
// Edit pressed in this mode // Edit pressed in this mode
editpressed = true; 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? // Highlighted item not selected?
if(!highlighted.Selected && (BuilderPlug.Me.AutoClearSelection || (General.Map.Map.SelectedThingsCount == 0))) if(!highlighted.Selected)
{ {
// Make this the only selection // Make this the only selection
selectionfromhighlight = true; //mxd
General.Map.Map.ClearSelectedThings(); General.Map.Map.ClearSelectedThings();
highlighted.Selected = true; highlighted.Marked = true;
UpdateSelectionInfo(); //mxd UpdateSelectionInfo(); //mxd
General.Interface.RedrawDisplay(); General.Interface.RedrawDisplay();
} }
else
{
General.Map.Map.MarkSelectedThings(true, true);
}
// Update display // Update display
if(renderer.StartThings(false)) if(renderer.StartThings(false))
{ {
// Redraw highlight to show selection // Redraw highlight to show selection
renderer.RenderThing(highlighted, renderer.DetermineThingColor(highlighted), General.Settings.FixedThingsScale ? Presentation.THINGS_ALPHA : General.Settings.ActiveThingsAlpha); renderer.RenderThing(highlighted, General.Colors.Highlight, General.Settings.FixedThingsScale ? Presentation.THINGS_ALPHA : General.Settings.ActiveThingsAlpha);
renderer.Finish(); renderer.Finish();
renderer.Present(); renderer.Present();
} }
@ -522,7 +527,8 @@ namespace CodeImp.DoomBuilder.BuilderModes
else else
{ {
General.Map.Map.ClearSelectedThings(); General.Map.Map.ClearSelectedThings();
t.Selected = true; General.Map.Map.ClearMarkedThings(false);
t.Marked = true;
Highlight(t); Highlight(t);
General.Interface.RedrawDisplay(); General.Interface.RedrawDisplay();
} }
@ -538,8 +544,9 @@ namespace CodeImp.DoomBuilder.BuilderModes
if(editpressed) if(editpressed)
{ {
// Anything selected? // Anything selected?
ICollection<Thing> selected = General.Map.Map.GetSelectedThings(true); ICollection<Thing> editthings = General.Map.Map.GetMarkedThings(true);
if(selected.Count > 0)
if(editthings.Count > 0)
{ {
if(General.Interface.IsActiveWindow) if(General.Interface.IsActiveWindow)
{ {
@ -548,19 +555,9 @@ namespace CodeImp.DoomBuilder.BuilderModes
{ {
//mxd. Show realtime thing edit dialog //mxd. Show realtime thing edit dialog
General.Interface.OnEditFormValuesChanged += thingEditForm_OnValuesChanged; General.Interface.OnEditFormValuesChanged += thingEditForm_OnValuesChanged;
DialogResult result = General.Interface.ShowEditThings(selected); DialogResult result = General.Interface.ShowEditThings(editthings);
General.Interface.OnEditFormValuesChanged -= thingEditForm_OnValuesChanged; General.Interface.OnEditFormValuesChanged -= thingEditForm_OnValuesChanged;
// When a single thing was selected, deselect it now
if(selected.Count == 1 && selectionfromhighlight)
{
General.Map.Map.ClearSelectedThings();
}
else if(result == DialogResult.Cancel) //mxd. Restore selection...
{
foreach(Thing t in selected) t.Selected = true;
}
//mxd. Update helper lines //mxd. Update helper lines
UpdateHelperObjects(); UpdateHelperObjects();
@ -575,7 +572,6 @@ namespace CodeImp.DoomBuilder.BuilderModes
} }
editpressed = false; editpressed = false;
selectionfromhighlight = false; //mxd
base.OnEditEnd(); base.OnEditEnd();
} }
@ -747,12 +743,19 @@ namespace CodeImp.DoomBuilder.BuilderModes
// Anything highlighted? // Anything highlighted?
if((highlighted != null) && !highlighted.IsDisposed) if((highlighted != null) && !highlighted.IsDisposed)
{ {
List<Thing> dragthings = new List<Thing>();
// Highlighted item not selected? // Highlighted item not selected?
if(!highlighted.Selected) if(!highlighted.Selected)
{ {
// Select only this thing for dragging // Select only this thing for dragging
General.Map.Map.ClearSelectedThings(); General.Map.Map.ClearSelectedThings();
highlighted.Selected = true; dragthings.Add(highlighted);
}
else
{
// Add all selected things to the things we want to drag
dragthings.AddRange(General.Map.Map.GetSelectedThings(true));
} }
// Start dragging the selection // Start dragging the selection
@ -762,14 +765,14 @@ namespace CodeImp.DoomBuilder.BuilderModes
bool thingscloned = false; bool thingscloned = false;
if(General.Interface.ShiftState) if(General.Interface.ShiftState)
{ {
ICollection<Thing> selection = General.Map.Map.GetSelectedThings(true); List<Thing> clonedthings = new List<Thing>(dragthings.Count);
if(selection.Count > 0) if(dragthings.Count > 0)
{ {
// Make undo // Make undo
General.Map.UndoRedo.CreateUndo((selection.Count == 1 ? "Clone-drag thing" : "Clone-drag " + selection.Count + " things")); General.Map.UndoRedo.CreateUndo((dragthings.Count == 1 ? "Clone-drag thing" : "Clone-drag " + dragthings.Count + " things"));
// Clone things // Clone things
foreach(Thing t in selection) foreach(Thing t in dragthings)
{ {
Thing clone = InsertThing(t.Position); Thing clone = InsertThing(t.Position);
t.CopyPropertiesTo(clone); t.CopyPropertiesTo(clone);
@ -798,15 +801,19 @@ namespace CodeImp.DoomBuilder.BuilderModes
} }
t.Selected = false; t.Selected = false;
clone.Selected = true;
clonedthings.Add(clone);
} }
// We'll want to skip creating additional Undo in DragThingsMode // We'll want to skip creating additional Undo in DragThingsMode
thingscloned = true; thingscloned = true;
// All the cloned things are now the things we want to drag
dragthings = clonedthings;
} }
} }
General.Editing.ChangeMode(new DragThingsMode(new ThingsMode(), mousedownmappos, !thingscloned)); General.Editing.ChangeMode(new DragThingsMode(new ThingsMode(), mousedownmappos, dragthings, !thingscloned));
} }
} }
} }
@ -1048,13 +1055,6 @@ namespace CodeImp.DoomBuilder.BuilderModes
{ {
// Dispose old labels // Dispose old labels
foreach(TextLabel l in labels.Values) l.Dispose(); foreach(TextLabel l in labels.Values) l.Dispose();
// Don't show lables for selected-from-highlight item
if(selectionfromhighlight)
{
labels.Clear();
return;
}
} }
// Make text labels for selected linedefs // Make text labels for selected linedefs

View file

@ -55,7 +55,6 @@ namespace CodeImp.DoomBuilder.BuilderModes
// Interface // Interface
new private bool editpressed; new private bool editpressed;
private bool selectionfromhighlight; //mxd
// The blockmap makes is used to make finding lines faster // The blockmap makes is used to make finding lines faster
BlockMap<BlockEntry> blockmap; BlockMap<BlockEntry> blockmap;
@ -287,22 +286,28 @@ namespace CodeImp.DoomBuilder.BuilderModes
// Edit pressed in this mode // Edit pressed in this mode
editpressed = true; editpressed = true;
// We use the marks to determine what to edit/drag, so clear it first
General.Map.Map.ClearMarkedVertices(false);
// Highlighted item not selected? // Highlighted item not selected?
if(!highlighted.Selected && (BuilderPlug.Me.AutoClearSelection || (General.Map.Map.SelectedVerticessCount == 0))) if(!highlighted.Selected)
{ {
// Make this the only selection // Make this the only selection
selectionfromhighlight = true; //mxd
General.Map.Map.ClearSelectedVertices(); General.Map.Map.ClearSelectedVertices();
highlighted.Selected = true; highlighted.Marked = true;
UpdateSelectionInfo(); //mxd UpdateSelectionInfo(); //mxd
General.Interface.RedrawDisplay(); General.Interface.RedrawDisplay();
} }
else
{
General.Map.Map.MarkSelectedVertices(true, true);
}
// Update display // Update display
if(renderer.StartPlotter(false)) if(renderer.StartPlotter(false))
{ {
// Redraw highlight to show selection // Redraw highlight to show selection
renderer.PlotVertex(highlighted, renderer.DetermineVertexColor(highlighted)); renderer.PlotVertex(highlighted, ColorCollection.HIGHLIGHT);
renderer.Finish(); renderer.Finish();
renderer.Present(); renderer.Present();
} }
@ -396,26 +401,17 @@ namespace CodeImp.DoomBuilder.BuilderModes
if(editpressed) if(editpressed)
{ {
// Anything selected? // Anything selected?
ICollection<Vertex> selected = General.Map.Map.GetSelectedVertices(true); ICollection<Vertex> editvertices = General.Map.Map.GetMarkedVertices(true);
if(selected.Count > 0)
if(editvertices.Count > 0)
{ {
if(General.Interface.IsActiveWindow) if(General.Interface.IsActiveWindow)
{ {
//mxd. Show realtime vertex edit dialog //mxd. Show realtime vertex edit dialog
General.Interface.OnEditFormValuesChanged += vertexEditForm_OnValuesChanged; General.Interface.OnEditFormValuesChanged += vertexEditForm_OnValuesChanged;
DialogResult result = General.Interface.ShowEditVertices(selected); DialogResult result = General.Interface.ShowEditVertices(editvertices);
General.Interface.OnEditFormValuesChanged -= vertexEditForm_OnValuesChanged; General.Interface.OnEditFormValuesChanged -= vertexEditForm_OnValuesChanged;
// When a single vertex was selected, deselect it now
if(selected.Count == 1 && selectionfromhighlight)
{
General.Map.Map.ClearSelectedVertices();
}
else if(result == DialogResult.Cancel) //mxd. Restore selection...
{
foreach(Vertex v in selected) v.Selected = true;
}
// Update entire display // Update entire display
UpdateSelectionInfo(); //mxd UpdateSelectionInfo(); //mxd
General.Interface.RedrawDisplay(); General.Interface.RedrawDisplay();
@ -424,7 +420,6 @@ namespace CodeImp.DoomBuilder.BuilderModes
} }
editpressed = false; editpressed = false;
selectionfromhighlight = false; //mxd
base.OnEditEnd(); base.OnEditEnd();
} }
@ -640,17 +635,24 @@ namespace CodeImp.DoomBuilder.BuilderModes
// Anything highlighted? // Anything highlighted?
if((highlighted != null) && !highlighted.IsDisposed) if((highlighted != null) && !highlighted.IsDisposed)
{ {
List<Vertex> dragvertices = new List<Vertex>();
// Highlighted item not selected? // Highlighted item not selected?
if(!highlighted.Selected) if(!highlighted.Selected)
{ {
// Select only this vertex for dragging // Select only this vertex for dragging
General.Map.Map.ClearSelectedVertices(); General.Map.Map.ClearSelectedVertices();
highlighted.Selected = true; dragvertices.Add(highlighted);
}
else
{
// Add all selected vertices to the vertices we want to drag
dragvertices.AddRange(General.Map.Map.GetSelectedVertices(true));
} }
// Start dragging the selection // Start dragging the selection
if(!BuilderPlug.Me.DontMoveGeometryOutsideMapBoundary || CanDrag()) //mxd if(!BuilderPlug.Me.DontMoveGeometryOutsideMapBoundary || CanDrag()) //mxd
General.Editing.ChangeMode(new DragVerticesMode(mousedownmappos)); General.Editing.ChangeMode(new DragVerticesMode(mousedownmappos, dragvertices));
} }
} }
} }