diff --git a/OngekiFumenEditor/Modules/FumenObjectPropertyBrowser/ViewModels/DropActions/ConnectableObjectSplitDropAction.cs b/OngekiFumenEditor/Modules/FumenObjectPropertyBrowser/ViewModels/DropActions/ConnectableObjectSplitDropAction.cs index 0af8f8f9..750747a4 100644 --- a/OngekiFumenEditor/Modules/FumenObjectPropertyBrowser/ViewModels/DropActions/ConnectableObjectSplitDropAction.cs +++ b/OngekiFumenEditor/Modules/FumenObjectPropertyBrowser/ViewModels/DropActions/ConnectableObjectSplitDropAction.cs @@ -50,7 +50,6 @@ public void Drop(FumenVisualEditorViewModel editor, Point dragEndPoint) foreach (var item in splitOutChildren) { startObject.RemoveChildObject(item); - item.CacheRecoveryChildIndex = -1;//force add to end nextStartObject.InsertChildObject(item.TGrid, item); } @@ -75,7 +74,6 @@ public void Drop(FumenVisualEditorViewModel editor, Point dragEndPoint) foreach (var item in splitOutChildren) { nextStartObject.RemoveChildObject(item); - item.CacheRecoveryChildIndex = -1; startObject.InsertChildObject(item.TGrid, item); } diff --git a/OngekiFumenEditor/Modules/FumenObjectPropertyBrowser/ViewModels/MultiLanesOperationViewModel.cs b/OngekiFumenEditor/Modules/FumenObjectPropertyBrowser/ViewModels/MultiLanesOperationViewModel.cs index 1a8750e7..5467f5d9 100644 --- a/OngekiFumenEditor/Modules/FumenObjectPropertyBrowser/ViewModels/MultiLanesOperationViewModel.cs +++ b/OngekiFumenEditor/Modules/FumenObjectPropertyBrowser/ViewModels/MultiLanesOperationViewModel.cs @@ -59,7 +59,6 @@ public void OnClick(ActionExecutionContext e) foreach (var laterChild in laterStart.Children.ToArray()) { laterStart.RemoveChildObject(laterChild); - laterChild.CacheRecoveryChildIndex = -1; frontStart.AddChildObject(laterChild); } @@ -71,7 +70,6 @@ public void OnClick(ActionExecutionContext e) while (next != null) { frontStart.RemoveChildObject(next); - next.CacheRecoveryChildIndex = -1; laterStart.AddChildObject(next); next = next.NextObject; } diff --git a/OngekiFumenEditor/Modules/FumenVisualEditor/ViewModels/FumenVisualEditorViewModel.UserInteractionActions.cs b/OngekiFumenEditor/Modules/FumenVisualEditor/ViewModels/FumenVisualEditorViewModel.UserInteractionActions.cs index b33d3093..241d19a9 100644 --- a/OngekiFumenEditor/Modules/FumenVisualEditor/ViewModels/FumenVisualEditorViewModel.UserInteractionActions.cs +++ b/OngekiFumenEditor/Modules/FumenVisualEditor/ViewModels/FumenVisualEditorViewModel.UserInteractionActions.cs @@ -702,49 +702,49 @@ public void KeyboardAction_DeleteSelectingObjects(ActionExecutionContext e) if (IsLocked) return; - //删除已选择的物件 - var selectedObjectGroup = SelectObjects.OfType().GroupBy(x => x.GetType()).ToArray(); - - //特殊处理LaneCurvePathControlObject - var cacheCurveControlsMap = new Dictionary(); + //获取要删除的物件 + var selects = SelectObjects.OfType().ToArray(); + + //依附于其他对象的子物件,比如轨道节点,曲线控制节点,无法做到单纯删除和添加 + //记录它们子节点相对于集合的位置,下次恢复的时候就是插入了 + var curveControlMaps = selects + .OfType() + .GroupBy(x => x.RefCurveObject) + .ToDictionary(x => x.Key, x => x.Select(c => (c, x.Key.PathControls.FirstIndexOf(p => p == c))).OrderBy(x => x.Item2).ToArray()); + var connectablesMaps = selects + .OfType() + .GroupBy(x => x.ReferenceStartObject) + .ToDictionary(x => x.Key, x => x.Select(c => (c, x.Key.Children.FirstIndexOf(p => p == c))).OrderBy(x => x.Item2).ToArray()); + + var expectedObjects = selects.Where(x => x switch + { + LaneCurvePathControlObject => false, + ConnectableChildObjectBase => false, + _ => true + }); UndoRedoManager.ExecuteAction(LambdaUndoAction.Create(Resources.DeleteObjects, () => { - foreach (var group in selectedObjectGroup) - { - if (group.Key == typeof(LaneCurvePathControlObject)) - { - foreach (var controlObject in group.OfType()) - { - var refObj = controlObject.RefCurveObject; - cacheCurveControlsMap[controlObject] = (refObj, refObj.PathControls.FirstIndexOf(x => x == controlObject)); - } - } - - RemoveObjects(group); - } + RemoveObjects(selects); }, () => { - foreach (var group in selectedObjectGroup) + expectedObjects.ForEach(Fumen.AddObject); + + foreach (var item in curveControlMaps) { - if (group.Key == typeof(LaneCurvePathControlObject)) + var child = item.Key; + foreach (var (curve, idx) in item.Value) { - foreach (var item in group.OfType().Select(x => - { - if (cacheCurveControlsMap.TryGetValue(x, out var val)) - return (x, val.refObj, val.idx); - else - return default; - }).Where(x => x.x is not null).GroupBy(x => x.refObj)) - { - var refObj = item.Key; - foreach ((var cp, _, var idx) in item.OrderBy(x => x.idx)) - refObj.InsertControlObject(idx, cp); - } + child.InsertControlObject(idx, curve); } - else + } + + foreach (var item in connectablesMaps) + { + var start = item.Key; + foreach (var (child, idx) in item.Value) { - group.ForEach(Fumen.AddObject); + start.InsertChildObject(idx, child); } } }));