分组,取消分组 ReDo UnDo 整理

This commit is contained in:
艾竹
2023-04-08 21:48:43 +08:00
parent fa96573cbd
commit 8ad42aec49
15 changed files with 123 additions and 62 deletions

View File

@@ -5,6 +5,7 @@ using System.ComponentModel;
using System.Linq;
using System.Reactive.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using AIStudio.Wpf.DiagramDesigner.Geometrys;
@@ -1195,7 +1196,15 @@ namespace AIStudio.Wpf.DiagramDesigner
if (attr != null && attr.Length != 0)
{
//加入ReDo
DoCommandManager.DoNewCommand(sender.ToString() + e.PropertyName, () => Do(sender, e.PropertyName, valuePropertyChangedEventArgs.NewValue), () => UnDo(sender, e.PropertyName, valuePropertyChangedEventArgs.OldValue), null, false);
DoCommandManager.DoNewCommand(sender.ToString() + e.PropertyName,
() => {
Do(sender, e.PropertyName, valuePropertyChangedEventArgs.NewValue);
},
() => {
UnDo(sender, e.PropertyName, valuePropertyChangedEventArgs.OldValue);
},
null,
false);
Event?.Invoke(sender, new DiagramEventArgs(valuePropertyChangedEventArgs.PropertyName, valuePropertyChangedEventArgs.NewValue, valuePropertyChangedEventArgs.OldValue, selectable?.Id));
}
@@ -2480,7 +2489,7 @@ namespace AIStudio.Wpf.DiagramDesigner
var oldcenter = BoundingRect.Center;
foreach (var item in selectedItems.OfType<DesignerItemViewModelBase>())
{
item.Left = item.Left - oldcenter.X + PageSize.Width / 2;
item.Left = item.Left - oldcenter.X + PageSize.Width / 2;
item.Top = item.Top - oldcenter.Y + PageSize.Height / 2;
}
@@ -2541,7 +2550,7 @@ namespace AIStudio.Wpf.DiagramDesigner
foreach (var item in infos)
{
item.Key.Size = item.Value;
}
}
});
}
}
@@ -2695,15 +2704,6 @@ namespace AIStudio.Wpf.DiagramDesigner
items = SelectedItems?.OfType<DesignerItemViewModelBase>().Where(p => p.ParentId == Guid.Empty).ToList();
}
var groups = items.OfType<DesignerItemViewModelBase>().Where(p => p.IsGroup && p.ParentId == Guid.Empty).ToList();
//解除分组
if (groupItem == null && groups.Count > 0)
{
ExecuteUngroupCommand(groups);
return;
}
RectangleBase rect = DiagramViewModelHelper.GetBoundingRectangle(items);
if (groupItem == null)
@@ -2711,16 +2711,24 @@ namespace AIStudio.Wpf.DiagramDesigner
groupItem = new GroupDesignerItemViewModel();
}
Add(groupItem, true);
DoCommandManager.DoNewCommand(this.ToString(),
() => {
Add(groupItem);
foreach (DesignerItemViewModelBase item in items)
item.ParentId = groupItem.Id;
groupItem.Resize();
ClearSelectedItems();
SelectionService.AddToSelection(groupItem);
},
() => {
Remove(groupItem);
foreach (DesignerItemViewModelBase item in items)
{
item.IsSelected = true;
item.ParentId = Guid.Empty;
}
});
foreach (DesignerItemViewModelBase item in items)
item.ParentId = groupItem.Id;
groupItem.Resize();
ClearSelectedItemsCommand.Execute(null);
//groupItem.IsSelected = true;
SelectionService.AddToSelection(groupItem);
}
private void ExecuteUngroupCommand(object parameter)
@@ -2728,22 +2736,45 @@ namespace AIStudio.Wpf.DiagramDesigner
List<DesignerItemViewModelBase> groups;
if (parameter is IEnumerable<DesignerItemViewModelBase> para)
{
groups = para.ToList();
groups = para.Where(p => p.IsGroup && p.ParentId == Guid.Empty).ToList();
}
else
{
groups = SelectedItems?.OfType<DesignerItemViewModelBase>().Where(p => p.IsGroup && p.ParentId == Guid.Empty).ToList();
}
Dictionary<DesignerItemViewModelBase, Tuple<Guid, int>> items = new Dictionary<DesignerItemViewModelBase, Tuple<Guid, int>>();
foreach (DesignerItemViewModelBase groupRoot in groups)
{
var children = SelectedItems.OfType<DesignerItemViewModelBase>().Where(p => p.ParentId == groupRoot.Id);
foreach (DesignerItemViewModelBase child in children)
child.ParentId = Guid.Empty;
RemoveItemCommand.Execute(groupRoot);
UpdateZIndex();
items.Add(child, new Tuple<Guid, int>(child.ParentId, child.ZIndex));
}
DoCommandManager.DoNewCommand(this.ToString(),
() => {
foreach (DesignerItemViewModelBase groupRoot in groups)
{
Remove(groupRoot);
}
foreach (var item in items)
{
item.Key.ParentId = Guid.Empty;
}
UpdateZIndex();
},
() => {
foreach (DesignerItemViewModelBase groupRoot in groups)
{
Add(groupRoot);
}
foreach (var item in items)
{
item.Key.ParentId = item.Value.Item1;
item.Key.ZIndex = item.Value.Item2;
}
});
}
private bool BelongToSameGroup(IGroupable item1, IGroupable item2)
@@ -2817,6 +2848,11 @@ namespace AIStudio.Wpf.DiagramDesigner
GroupCommand.Execute(null);
return true;
}
else if (DiagramOption.ShortcutOption.Ungroup(e))
{
UngroupCommand.Execute(null);
return true;
}
return false;
}