mirror of
https://gitee.com/akwkevin/aistudio.-wpf.-diagram
synced 2026-04-07 09:46:37 +08:00
do redo
This commit is contained in:
@@ -4,6 +4,7 @@ using System.Linq;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls.Primitives;
|
||||
using System.Windows.Media;
|
||||
using AIStudio.Wpf.DiagramDesigner.Geometrys;
|
||||
|
||||
namespace AIStudio.Wpf.DiagramDesigner.Controls
|
||||
{
|
||||
@@ -16,6 +17,13 @@ namespace AIStudio.Wpf.DiagramDesigner.Controls
|
||||
base.DragCompleted += DragThumb_DragCompleted;
|
||||
}
|
||||
|
||||
public IDiagramViewModel DiagramViewModel
|
||||
{
|
||||
get
|
||||
{
|
||||
return (this.DataContext as SelectableDesignerItemViewModelBase)?.Root;
|
||||
}
|
||||
}
|
||||
private List<SelectableDesignerItemViewModelBase> designerItems;
|
||||
|
||||
private bool drag;
|
||||
@@ -51,11 +59,10 @@ namespace AIStudio.Wpf.DiagramDesigner.Controls
|
||||
|
||||
designerItems = designerItems.Distinct().ToList();
|
||||
|
||||
DiagramViewModel.DoCommandManager.BeginDo = true;
|
||||
foreach (DesignerItemViewModelBase item in designerItems.OfType<DesignerItemViewModelBase>())
|
||||
{
|
||||
item.BeginDo = true;
|
||||
item.SetOldValue(item.Left, nameof(item.Left));
|
||||
item.SetOldValue(item.Top, nameof(item.Top));
|
||||
{
|
||||
item.SetOldValue(item.TopLeft, nameof(item.TopLeft));
|
||||
}
|
||||
|
||||
e.Handled = true;
|
||||
@@ -75,10 +82,25 @@ namespace AIStudio.Wpf.DiagramDesigner.Controls
|
||||
foreach (DesignerItemViewModelBase item in designerItems.OfType<DesignerItemViewModelBase>())
|
||||
{
|
||||
item.SetCellAlignment();
|
||||
item.BeginDo = false;
|
||||
item.RaiseTopLeft();
|
||||
}
|
||||
|
||||
Dictionary<DesignerItemViewModelBase, Tuple<PointBase, PointBase>> infos =
|
||||
designerItems.OfType<DesignerItemViewModelBase>().ToDictionary(p => p,
|
||||
p => new Tuple<PointBase, PointBase>(p.GetOldValue< PointBase >(nameof(p.TopLeft)), p.TopLeft));
|
||||
DiagramViewModel.DoCommandManager.BeginDo = false;
|
||||
DiagramViewModel.DoCommandManager.DoNewCommand(this.ToString(),
|
||||
() => {
|
||||
foreach (var info in infos)
|
||||
{
|
||||
info.Key.TopLeft = info.Value.Item2;
|
||||
}
|
||||
},
|
||||
() => {
|
||||
foreach (var info in infos)
|
||||
{
|
||||
info.Key.TopLeft = info.Value.Item1;
|
||||
}
|
||||
});
|
||||
e.Handled = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Controls.Primitives;
|
||||
using System.Windows.Media;
|
||||
using AIStudio.Wpf.DiagramDesigner.Geometrys;
|
||||
|
||||
namespace AIStudio.Wpf.DiagramDesigner.Controls
|
||||
{
|
||||
@@ -17,6 +18,14 @@ namespace AIStudio.Wpf.DiagramDesigner.Controls
|
||||
base.DragCompleted += ResizeThumb_DragCompleted;
|
||||
}
|
||||
|
||||
public IDiagramViewModel DiagramViewModel
|
||||
{
|
||||
get
|
||||
{
|
||||
return (this.DataContext as SelectableDesignerItemViewModelBase)?.Root;
|
||||
}
|
||||
}
|
||||
|
||||
private List<SelectableDesignerItemViewModelBase> designerItems;
|
||||
IDiagramViewModel diagarmViewModel;
|
||||
|
||||
@@ -27,11 +36,11 @@ namespace AIStudio.Wpf.DiagramDesigner.Controls
|
||||
if (designerItem != null && designerItem.IsSelected)
|
||||
{
|
||||
designerItems = designerItem.Root.SelectedItems.ToList();
|
||||
|
||||
DiagramViewModel.DoCommandManager.BeginDo = true;
|
||||
foreach (DesignerItemViewModelBase item in designerItems.OfType<DesignerItemViewModelBase>())
|
||||
{
|
||||
item.BeginDo = true;
|
||||
item.SetOldValue(item.ItemWidth, nameof(item.ItemWidth));
|
||||
item.SetOldValue(item.ItemHeight, nameof(item.ItemHeight));
|
||||
item.SetOldValue(item.Size, nameof(item.Size));
|
||||
}
|
||||
|
||||
e.Handled = true;
|
||||
@@ -48,10 +57,26 @@ namespace AIStudio.Wpf.DiagramDesigner.Controls
|
||||
{
|
||||
foreach (DesignerItemViewModelBase item in designerItems.OfType<DesignerItemViewModelBase>())
|
||||
{
|
||||
item.BeginDo = false;
|
||||
item.RaiseItemWidthHeight();
|
||||
|
||||
}
|
||||
|
||||
Dictionary<DesignerItemViewModelBase, Tuple<SizeBase, SizeBase>> infos =
|
||||
designerItems.OfType<DesignerItemViewModelBase>().ToDictionary(p => p,
|
||||
p => new Tuple<SizeBase, SizeBase>(p.GetOldValue<SizeBase>(nameof(p.Size)), p.Size));
|
||||
DiagramViewModel.DoCommandManager.BeginDo = false;
|
||||
DiagramViewModel.DoCommandManager.DoNewCommand(this.ToString(),
|
||||
() => {
|
||||
foreach (var info in infos)
|
||||
{
|
||||
info.Key.Size = info.Value.Item2;
|
||||
}
|
||||
},
|
||||
() => {
|
||||
foreach (var info in infos)
|
||||
{
|
||||
info.Key.Size = info.Value.Item1;
|
||||
}
|
||||
});
|
||||
e.Handled = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,6 +24,14 @@ namespace AIStudio.Wpf.DiagramDesigner.Controls
|
||||
DragCompleted += RotateThumb_DragCompleted;
|
||||
}
|
||||
|
||||
public IDiagramViewModel DiagramViewModel
|
||||
{
|
||||
get
|
||||
{
|
||||
return (this.DataContext as SelectableDesignerItemViewModelBase)?.Root;
|
||||
}
|
||||
}
|
||||
|
||||
private List<SelectableDesignerItemViewModelBase> designerItems;
|
||||
|
||||
private void RotateThumb_DragStarted(object sender, DragStartedEventArgs e)
|
||||
@@ -34,9 +42,9 @@ namespace AIStudio.Wpf.DiagramDesigner.Controls
|
||||
{
|
||||
designerItems = designerItem.Root.SelectedItems.ToList();
|
||||
|
||||
DiagramViewModel.DoCommandManager.BeginDo = true;
|
||||
foreach (DesignerItemViewModelBase item in designerItems.OfType<DesignerItemViewModelBase>())
|
||||
{
|
||||
item.BeginDo = true;
|
||||
item.SetOldValue(this.designerItem.Angle, nameof(this.designerItem.Angle));
|
||||
}
|
||||
|
||||
@@ -69,10 +77,26 @@ namespace AIStudio.Wpf.DiagramDesigner.Controls
|
||||
{
|
||||
foreach (DesignerItemViewModelBase item in designerItems.OfType<DesignerItemViewModelBase>())
|
||||
{
|
||||
item.BeginDo = false;
|
||||
item.RaiseAngle();
|
||||
|
||||
}
|
||||
|
||||
Dictionary<DesignerItemViewModelBase, Tuple<double, double>> infos =
|
||||
designerItems.OfType<DesignerItemViewModelBase>().ToDictionary(p => p,
|
||||
p => new Tuple<double, double>(p.GetOldValue<double>(nameof(p.Angle)), p.Angle));
|
||||
DiagramViewModel.DoCommandManager.BeginDo = false;
|
||||
DiagramViewModel.DoCommandManager.DoNewCommand(this.ToString(),
|
||||
() => {
|
||||
foreach (var info in infos)
|
||||
{
|
||||
info.Key.Angle = info.Value.Item2;
|
||||
}
|
||||
},
|
||||
() => {
|
||||
foreach (var info in infos)
|
||||
{
|
||||
info.Key.Angle = info.Value.Item1;
|
||||
}
|
||||
});
|
||||
e.Handled = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -53,7 +53,7 @@ namespace AIStudio.Wpf.DiagramDesigner
|
||||
get; private set;
|
||||
}
|
||||
|
||||
public int Capacity { get; set; } = 10;
|
||||
public int Capacity { get; set; } = 100;
|
||||
|
||||
public DoCommandManager()
|
||||
{
|
||||
@@ -66,10 +66,18 @@ namespace AIStudio.Wpf.DiagramDesigner
|
||||
UnDoActionStack = new Stack<Command>();
|
||||
}
|
||||
|
||||
public bool BeginDo
|
||||
{
|
||||
get;set;
|
||||
}
|
||||
|
||||
private bool _undoing;
|
||||
public void DoNewCommand(string name, Action action, Action unDoAction, Action clearAction = null, bool doit = true)
|
||||
{
|
||||
if (_undoing == true) return;
|
||||
if (BeginDo == true)
|
||||
return;
|
||||
if (_undoing == true)
|
||||
return;
|
||||
try
|
||||
{
|
||||
_undoing = true;
|
||||
@@ -103,7 +111,8 @@ namespace AIStudio.Wpf.DiagramDesigner
|
||||
if (!CanUnDo)
|
||||
return;
|
||||
|
||||
if (_undoing == true) return;
|
||||
if (_undoing == true)
|
||||
return;
|
||||
try
|
||||
{
|
||||
_undoing = true;
|
||||
@@ -123,7 +132,8 @@ namespace AIStudio.Wpf.DiagramDesigner
|
||||
if (!CanReDo)
|
||||
return;
|
||||
|
||||
if (_undoing == true) return;
|
||||
if (_undoing == true)
|
||||
return;
|
||||
try
|
||||
{
|
||||
_undoing = true;
|
||||
|
||||
@@ -553,11 +553,6 @@ namespace AIStudio.Wpf.DiagramDesigner
|
||||
}
|
||||
}
|
||||
|
||||
public bool BeginDo
|
||||
{
|
||||
get; set;
|
||||
}
|
||||
|
||||
public IObservable<NotifyCollectionChangedEventArgs> WhenConnectorsChanged
|
||||
{
|
||||
get
|
||||
|
||||
@@ -319,16 +319,16 @@ namespace AIStudio.Wpf.DiagramDesigner
|
||||
}
|
||||
}
|
||||
|
||||
private Size _gridMargin = new Size(28, 28);
|
||||
private Size _gridMarginSize = new Size(28, 28);
|
||||
public Size GridMarginSize
|
||||
{
|
||||
get
|
||||
{
|
||||
return _gridMargin;
|
||||
return _gridMarginSize;
|
||||
}
|
||||
set
|
||||
{
|
||||
SetProperty(ref _gridMargin, value);
|
||||
SetProperty(ref _gridMarginSize, value);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -336,11 +336,11 @@ namespace AIStudio.Wpf.DiagramDesigner
|
||||
{
|
||||
get
|
||||
{
|
||||
return _gridMargin.Width;
|
||||
return _gridMarginSize.Width;
|
||||
}
|
||||
set
|
||||
{
|
||||
_gridMargin.Width = value;
|
||||
_gridMarginSize.Width = value;
|
||||
RaisePropertyChanged(nameof(GridMarginSize));
|
||||
}
|
||||
}
|
||||
@@ -349,11 +349,11 @@ namespace AIStudio.Wpf.DiagramDesigner
|
||||
{
|
||||
get
|
||||
{
|
||||
return _gridMargin.Height;
|
||||
return _gridMarginSize.Height;
|
||||
}
|
||||
set
|
||||
{
|
||||
_gridMargin.Height = value;
|
||||
_gridMarginSize.Height = value;
|
||||
RaisePropertyChanged(nameof(GridMarginSize));
|
||||
}
|
||||
}
|
||||
@@ -630,7 +630,7 @@ namespace AIStudio.Wpf.DiagramDesigner
|
||||
get; set;
|
||||
} = true;
|
||||
|
||||
protected DoCommandManager DoCommandManager = new DoCommandManager();
|
||||
public DoCommandManager DoCommandManager { get; private set; } = new DoCommandManager();
|
||||
|
||||
public event DiagramEventHandler Event;
|
||||
|
||||
@@ -1181,7 +1181,7 @@ namespace AIStudio.Wpf.DiagramDesigner
|
||||
RaisePropertyChanged("Items");
|
||||
}
|
||||
|
||||
private void Item_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
|
||||
protected virtual void Item_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
|
||||
{
|
||||
RaisePropertyChanged(sender, e.PropertyName);
|
||||
if (e.PropertyName == "IsSelected")
|
||||
@@ -1189,12 +1189,6 @@ namespace AIStudio.Wpf.DiagramDesigner
|
||||
RaisePropertyChanged(nameof(SelectedItem));
|
||||
}
|
||||
|
||||
//连续改变,需要特殊处理,不单独触发属性改变ReDo
|
||||
if (sender is DesignerItemViewModelBase designer)
|
||||
{
|
||||
if (designer.BeginDo) return;
|
||||
}
|
||||
|
||||
var selectable = sender as SelectableViewModelBase;
|
||||
|
||||
if (e is ValuePropertyChangedEventArgs valuePropertyChangedEventArgs)
|
||||
@@ -1211,6 +1205,8 @@ namespace AIStudio.Wpf.DiagramDesigner
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
//提供给标尺计算,延迟100ms,等布局改变再计算。
|
||||
private void OnZoomValueChanged(string obj)
|
||||
{
|
||||
@@ -1392,7 +1388,7 @@ namespace AIStudio.Wpf.DiagramDesigner
|
||||
|
||||
public void ClearSelectedItems()
|
||||
{
|
||||
foreach (var item in this.Items.ToList())
|
||||
foreach (var item in this.SelectedItems.ToList())
|
||||
{
|
||||
item.IsSelected = false;
|
||||
}
|
||||
@@ -2356,6 +2352,8 @@ namespace AIStudio.Wpf.DiagramDesigner
|
||||
FitViewModel = new FitViewModel() { BoundingRect = DiagramViewModelHelper.GetBoundingRectangle(selectedItems) };
|
||||
}
|
||||
|
||||
|
||||
|
||||
public void UpdateZIndex()
|
||||
{
|
||||
List<SelectableDesignerItemViewModelBase> ordered = Items.OrderBy(p => p.ZIndex).ToList();
|
||||
|
||||
@@ -322,6 +322,10 @@ namespace AIStudio.Wpf.DiagramDesigner
|
||||
}
|
||||
#endregion
|
||||
|
||||
DoCommandManager DoCommandManager
|
||||
{
|
||||
get;
|
||||
}
|
||||
#region 设置选项
|
||||
DiagramOption DiagramOption
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user