From 505865d13557ba798998b4536c2e91318b860d6e Mon Sep 17 00:00:00 2001 From: ZZYZX Date: Mon, 13 Mar 2017 03:10:07 +0200 Subject: [PATCH] Fixed: cutting a thing in visual mode would leave disposed BaseVisualThings in the selection. (reported by DOOMGABR) --- .../VisualModes/BaseVisualMode.cs | 119 +++++++++++------- 1 file changed, 75 insertions(+), 44 deletions(-) diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs index a7855da..1eb076c 100644 --- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs +++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs @@ -1897,8 +1897,8 @@ namespace CodeImp.DoomBuilder.BuilderModes } } - // This returns all selected objects - internal List GetSelectedObjects(bool includesectors, bool includesidedefs, bool includethings, bool includevertices) + // This returns all selected objects + internal List GetSelectedObjects(bool includesectors, bool includesidedefs, bool includethings, bool includevertices) { List objs = new List(); foreach(IVisualEventReceiver i in selectedobjects) @@ -2160,54 +2160,82 @@ namespace CodeImp.DoomBuilder.BuilderModes } return t; - } + } #endregion #region ================== Actions - [BeginAction("clearselection", BaseAction = true)] + // [ZZ] I moved this out of ClearSelection because "cut selection" action needs this to only affect things. + private void ClearSelection(bool clearsectors, bool clearsidedefs, bool clearthings, bool clearvertices, bool displaystatus) + { + selectedobjects.RemoveAll(obj => + { + return ((obj is BaseVisualGeometrySector && clearsectors) || + (obj is BaseVisualGeometrySidedef && clearsidedefs) || + (obj is BaseVisualThing && clearthings) || + (obj is BaseVisualVertex && clearvertices)); + }); + + // + foreach (KeyValuePair vs in allsectors) + { + if (vs.Value != null) + { + BaseVisualSector bvs = (BaseVisualSector)vs.Value; + if (clearsectors) + { + if (bvs.Floor != null) bvs.Floor.Selected = false; + if (bvs.Ceiling != null) bvs.Ceiling.Selected = false; + foreach (VisualFloor vf in bvs.ExtraFloors) vf.Selected = false; + foreach (VisualCeiling vc in bvs.ExtraCeilings) vc.Selected = false; + foreach (VisualFloor vf in bvs.ExtraBackFloors) vf.Selected = false; //mxd + foreach (VisualCeiling vc in bvs.ExtraBackCeilings) vc.Selected = false; //mxd + } + + if (clearsidedefs) + { + foreach (Sidedef sd in vs.Key.Sidedefs) + { + //mxd. VisualSidedefParts can contain references to visual geometry, which is not present in VisualSector.sidedefgeometry + bvs.GetSidedefParts(sd).DeselectAllParts(); + } + } + } + } + + if (clearthings) + { + foreach (KeyValuePair vt in allthings) + { + if (vt.Value != null) + { + BaseVisualThing bvt = (BaseVisualThing)vt.Value; + bvt.Selected = false; + } + } + } + + //mxd + if (clearvertices) + { + if (General.Map.UDMF) + { + foreach (KeyValuePair pair in vertices) pair.Value.Deselect(); + } + } + + //mxd + if (displaystatus) + { + General.Interface.DisplayStatus(StatusType.Selection, string.Empty); + } + } + + [BeginAction("clearselection", BaseAction = true)] public void ClearSelection() { - selectedobjects = new List(); - - foreach(KeyValuePair vs in allsectors) - { - if(vs.Value != null) - { - BaseVisualSector bvs = (BaseVisualSector)vs.Value; - if(bvs.Floor != null) bvs.Floor.Selected = false; - if(bvs.Ceiling != null) bvs.Ceiling.Selected = false; - foreach(VisualFloor vf in bvs.ExtraFloors) vf.Selected = false; - foreach(VisualCeiling vc in bvs.ExtraCeilings) vc.Selected = false; - foreach(VisualFloor vf in bvs.ExtraBackFloors) vf.Selected = false; //mxd - foreach(VisualCeiling vc in bvs.ExtraBackCeilings) vc.Selected = false; //mxd - - foreach(Sidedef sd in vs.Key.Sidedefs) - { - //mxd. VisualSidedefParts can contain references to visual geometry, which is not present in VisualSector.sidedefgeometry - bvs.GetSidedefParts(sd).DeselectAllParts(); - } - } - } - - foreach(KeyValuePair vt in allthings) - { - if(vt.Value != null) - { - BaseVisualThing bvt = (BaseVisualThing)vt.Value; - bvt.Selected = false; - } - } - - //mxd - if(General.Map.UDMF) - { - foreach(KeyValuePair pair in vertices) pair.Value.Deselect(); - } - - //mxd - General.Interface.DisplayStatus(StatusType.Selection, string.Empty); + ClearSelection(true, true, true, true, true); } [BeginAction("visualselect", BaseAction = true)] @@ -3355,7 +3383,7 @@ namespace CodeImp.DoomBuilder.BuilderModes PreAction(UndoGroup.None); List objs = GetSelectedObjects(true, true, true, true); foreach(IVisualEventReceiver i in objs) i.OnDelete(); - PostAction(); + PostAction(); ClearSelection(); } @@ -3401,6 +3429,9 @@ namespace CodeImp.DoomBuilder.BuilderModes General.Map.IsChanged = true; General.Map.ThingsFilter.Update(); + // [ZZ] Clear selected things. + ClearSelection(false, false, true, false, false); + // Update event lines renderer.SetEventLines(LinksCollector.GetThingLinks(General.Map.ThingsFilter.VisibleThings, blockmap, bsp, useblockmap)); }