mirror of
https://gitee.com/akwkevin/aistudio.-wpf.-diagram
synced 2026-05-04 06:51:28 +08:00
mind 有点样子了
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -29,7 +29,8 @@ namespace AIStudio.Wpf.Flowchart
|
|||||||
{
|
{
|
||||||
base.InitDiagramViewModel();
|
base.InitDiagramViewModel();
|
||||||
|
|
||||||
DiagramViewModel.GridCellSize = new Size(100, 100);
|
DiagramViewModel.GridCellSize = new Size(100, 100);
|
||||||
|
DiagramViewModel.ShowGrid= false;
|
||||||
_service.DrawModeViewModel.LineDrawMode = DrawMode.ConnectingLineSmooth;
|
_service.DrawModeViewModel.LineDrawMode = DrawMode.ConnectingLineSmooth;
|
||||||
DiagramViewModel.AllowDrop = false;
|
DiagramViewModel.AllowDrop = false;
|
||||||
}
|
}
|
||||||
@@ -38,35 +39,32 @@ namespace AIStudio.Wpf.Flowchart
|
|||||||
{
|
{
|
||||||
base.Init();
|
base.Init();
|
||||||
|
|
||||||
MindLevel1Node level1node = new MindLevel1Node() { Text = "思维导图" };
|
MindNode level1node = new MindNode(DiagramViewModel, Mind.NodeLevel.Level1) { Text = "思维导图" };
|
||||||
DiagramViewModel.DirectAddItemCommand.Execute(level1node);
|
DiagramViewModel.DirectAddItemCommand.Execute(level1node);
|
||||||
DiagramViewModel.CenterMoveCommand.Execute(level1node);
|
DiagramViewModel.CenterMoveCommand.Execute(level1node);
|
||||||
|
|
||||||
MindLevel2Node level2node1_1 = new MindLevel2Node() { Text = "分支主题1" };
|
MindNode level2node1_1 = new MindNode(DiagramViewModel, Mind.NodeLevel.Level2) { Text = "分支主题1" };
|
||||||
DiagramViewModel.DirectAddItemCommand.Execute(level2node1_1);
|
level1node.AddChild(level2node1_1);
|
||||||
level1node.Children.Add(level2node1_1);
|
|
||||||
|
|
||||||
MindLevel3Node level3node1_1_1 = new MindLevel3Node() { Text = "分支主题1_1" };
|
MindNode level3node1_1_1 = new MindNode(DiagramViewModel, Mind.NodeLevel.Level3) { Text = "分支主题1_1" };
|
||||||
DiagramViewModel.DirectAddItemCommand.Execute(level3node1_1_1);
|
level2node1_1.AddChild(level3node1_1_1);
|
||||||
level2node1_1.Children.Add(level3node1_1_1);
|
|
||||||
|
|
||||||
MindLevel3Node level3node1_1_2 = new MindLevel3Node() { Text = "分支主题1_2" };
|
MindNode level3node1_1_2 = new MindNode(DiagramViewModel, Mind.NodeLevel.Level3) { Text = "分支主题1_2" };
|
||||||
DiagramViewModel.DirectAddItemCommand.Execute(level3node1_1_2);
|
level2node1_1.AddChild(level3node1_1_2);
|
||||||
level2node1_1.Children.Add(level3node1_1_2);
|
|
||||||
|
|
||||||
MindLevel3Node level3node1_1_3 = new MindLevel3Node() { Text = "分支主题1_3" };
|
MindNode level3node1_1_3 = new MindNode(DiagramViewModel, Mind.NodeLevel.Level3) { Text = "分支主题1_3" };
|
||||||
DiagramViewModel.DirectAddItemCommand.Execute(level3node1_1_3);
|
level2node1_1.AddChild(level3node1_1_3);
|
||||||
level2node1_1.Children.Add(level3node1_1_3);
|
|
||||||
|
|
||||||
MindLevel2Node level2node1_2 = new MindLevel2Node() { Text = "分支主题2" };
|
MindNode level2node1_2 = new MindNode(DiagramViewModel, Mind.NodeLevel.Level2) { Text = "分支主题2" };
|
||||||
DiagramViewModel.DirectAddItemCommand.Execute(level2node1_2);
|
level1node.AddChild(level2node1_2);
|
||||||
level1node.Children.Add(level2node1_2);
|
|
||||||
|
|
||||||
|
MindNode level2node1_3 = new MindNode(DiagramViewModel, Mind.NodeLevel.Level2) { Text = "分支主题3" };
|
||||||
|
level1node.AddChild(level2node1_3);
|
||||||
|
|
||||||
DiagramViewModel.ClearSelectedItemsCommand.Execute(null);
|
DiagramViewModel.ClearSelectedItemsCommand.Execute(null);
|
||||||
|
|
||||||
level1node.LayoutUpdated();
|
level1node.LayoutUpdated();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Dispose()
|
public override void Dispose()
|
||||||
|
|||||||
@@ -1,24 +1,25 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Windows;
|
||||||
using System.Windows.Data;
|
using System.Windows.Data;
|
||||||
|
|
||||||
namespace AIStudio.Wpf.DiagramDesigner.Converters
|
namespace AIStudio.Wpf.DiagramDesigner.Converters
|
||||||
{
|
{
|
||||||
public class IntToBoolConverter : IValueConverter
|
public class IntToVisibilityConverter : IValueConverter
|
||||||
{
|
{
|
||||||
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
|
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
|
||||||
{
|
{
|
||||||
if (object.Equals(value, 0d))
|
if (value == null || object.Equals(value, 0))
|
||||||
return false;
|
return Visibility.Collapsed;
|
||||||
else
|
else
|
||||||
return true;
|
return Visibility.Visible;
|
||||||
}
|
}
|
||||||
|
|
||||||
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
|
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
|
||||||
{
|
{
|
||||||
if (object.Equals(value, false))
|
if (object.Equals(value, Visibility.Collapsed))
|
||||||
return 0d;
|
return 0;
|
||||||
else
|
else
|
||||||
return 1d;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
using System;
|
||||||
|
using System.Windows.Data;
|
||||||
|
|
||||||
|
namespace AIStudio.Wpf.DiagramDesigner.Converters
|
||||||
|
{
|
||||||
|
public class IntToBoolConverter : IValueConverter
|
||||||
|
{
|
||||||
|
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
|
||||||
|
{
|
||||||
|
if (object.Equals(value, 0d))
|
||||||
|
return false;
|
||||||
|
else
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
|
||||||
|
{
|
||||||
|
if (object.Equals(value, false))
|
||||||
|
return 0d;
|
||||||
|
else
|
||||||
|
return 1d;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -76,6 +76,8 @@ namespace AIStudio.Wpf.DiagramDesigner.Geometrys
|
|||||||
|
|
||||||
public SizeBase Add(double value) => new SizeBase(Width + value, Height + value);
|
public SizeBase Add(double value) => new SizeBase(Width + value, Height + value);
|
||||||
|
|
||||||
|
public SizeBase Add(double width, double height) => new SizeBase(Width + width, Height + height);
|
||||||
|
|
||||||
//public bool Equals(Size size) => size != null && Width == size.Width && Height == size.Height;
|
//public bool Equals(Size size) => size != null && Width == size.Width && Height == size.Height;
|
||||||
|
|
||||||
//public override string ToString() => $"Size(width={Width}, height={Height})";
|
//public override string ToString() => $"Size(width={Width}, height={Height})";
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ namespace AIStudio.Wpf.DiagramDesigner
|
|||||||
{
|
{
|
||||||
public static partial class PathGenerators
|
public static partial class PathGenerators
|
||||||
{
|
{
|
||||||
private const double _margin = 125;
|
|
||||||
|
|
||||||
public static PathGeneratorResult Smooth(IDiagramViewModel _, ConnectionViewModel link, PointBase[] route, PointBase source, PointBase target)
|
public static PathGeneratorResult Smooth(IDiagramViewModel _, ConnectionViewModel link, PointBase[] route, PointBase source, PointBase target)
|
||||||
{
|
{
|
||||||
@@ -74,17 +74,39 @@ namespace AIStudio.Wpf.DiagramDesigner
|
|||||||
if (sourceOrientation == ConnectorOrientation.None)//按照线条的四象限来处理。
|
if (sourceOrientation == ConnectorOrientation.None)//按照线条的四象限来处理。
|
||||||
{
|
{
|
||||||
var slope = (route[1].Y - route[0].Y) / (route[1].X - route[0].X);
|
var slope = (route[1].Y - route[0].Y) / (route[1].X - route[0].X);
|
||||||
|
if (Math.Abs(slope) < link.SmoothAutoSlope)
|
||||||
|
{
|
||||||
|
if (route[1].X > route[0].X)
|
||||||
|
{
|
||||||
|
sourceOrientation = ConnectorOrientation.Right;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sourceOrientation = ConnectorOrientation.Left;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (route[1].Y > route[0].Y)//Y轴方向是反的
|
||||||
|
{
|
||||||
|
sourceOrientation = ConnectorOrientation.Bottom;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sourceOrientation = ConnectorOrientation.Top;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
var curvePointA = GetCurvePoint(route[0].X, route[0].Y, cX, cY, sourceOrientation);
|
var curvePointA = GetCurvePoint(route[0].X, route[0].Y, cX, cY, link.SmoothMargin, sourceOrientation);
|
||||||
var curvePointB = GetCurvePoint(route[1].X, route[1].Y, cX, cY, link.SinkConnectorInfo?.Orientation);
|
var curvePointB = GetCurvePoint(route[1].X, route[1].Y, cX, cY, link.SmoothMargin, link.SinkConnectorInfo?.Orientation);
|
||||||
return new[] { route[0], curvePointA, curvePointB, route[1] };
|
return new[] { route[0], curvePointA, curvePointB, route[1] };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static PointBase GetCurvePoint(double pX, double pY, double cX, double cY, ConnectorOrientation? alignment)
|
private static PointBase GetCurvePoint(double pX, double pY, double cX, double cY, double smoothMargin, ConnectorOrientation? alignment)
|
||||||
{
|
{
|
||||||
var margin = Math.Min(_margin, Math.Pow(Math.Pow(pX - cX, 2) + Math.Pow(pY - cY, 2), .5));
|
var margin = Math.Min(smoothMargin, Math.Pow(Math.Pow(pX - cX, 2) + Math.Pow(pY - cY, 2), .5));
|
||||||
switch (alignment)
|
switch (alignment)
|
||||||
{
|
{
|
||||||
case ConnectorOrientation.Top: return new PointBase(pX, Math.Min(pY - margin, cY));
|
case ConnectorOrientation.Top: return new PointBase(pX, Math.Min(pY - margin, cY));
|
||||||
|
|||||||
@@ -301,13 +301,15 @@
|
|||||||
<Setter Property="Canvas.ZIndex"
|
<Setter Property="Canvas.ZIndex"
|
||||||
Value="{Binding ZIndex}" />
|
Value="{Binding ZIndex}" />
|
||||||
<Setter Property="s:SelectionProps.EnabledForSelection"
|
<Setter Property="s:SelectionProps.EnabledForSelection"
|
||||||
Value="True" />
|
Value="{Binding EnabledForSelection}" />
|
||||||
<Setter Property="s:ItemConnectProps.EnabledForConnection"
|
<Setter Property="s:ItemConnectProps.EnabledForConnection"
|
||||||
Value="True" />
|
Value="{Binding EnabledForConnection}" />
|
||||||
|
<Setter Property="Visibility"
|
||||||
|
Value="{Binding Visible,Converter={StaticResource BooleanToVisibilityConverter}}"/>
|
||||||
<Setter Property="Width"
|
<Setter Property="Width"
|
||||||
Value="{Binding ItemWidth}" />
|
Value="{Binding ItemWidth}" />
|
||||||
<Setter Property="Height"
|
<Setter Property="Height"
|
||||||
Value="{Binding ItemHeight}" />
|
Value="{Binding ItemHeight}" />
|
||||||
<Setter Property="SnapsToDevicePixels"
|
<Setter Property="SnapsToDevicePixels"
|
||||||
Value="True" />
|
Value="True" />
|
||||||
<Setter Property="ContentTemplate">
|
<Setter Property="ContentTemplate">
|
||||||
@@ -351,7 +353,7 @@
|
|||||||
VerticalAlignment="Stretch"
|
VerticalAlignment="Stretch"
|
||||||
Content="{TemplateBinding Content}" />
|
Content="{TemplateBinding Content}" />
|
||||||
|
|
||||||
<Control x:Name="PART_Text" Margin="5" IsHitTestVisible="{Binding IsReadOnlyText,Converter={StaticResource InvertBoolConverter}}">
|
<Control x:Name="PART_Text" Margin="1" IsHitTestVisible="{Binding IsReadOnlyText,Converter={StaticResource InvertBoolConverter}}">
|
||||||
<Control.Style>
|
<Control.Style>
|
||||||
<Style TargetType="Control">
|
<Style TargetType="Control">
|
||||||
<Setter Property="Template">
|
<Setter Property="Template">
|
||||||
@@ -458,7 +460,9 @@
|
|||||||
<Setter Property="Canvas.ZIndex"
|
<Setter Property="Canvas.ZIndex"
|
||||||
Value="{Binding ZIndex}" />
|
Value="{Binding ZIndex}" />
|
||||||
<Setter Property="s:SelectionProps.EnabledForSelection"
|
<Setter Property="s:SelectionProps.EnabledForSelection"
|
||||||
Value="True" />
|
Value="{Binding EnabledForSelection}" />
|
||||||
|
<Setter Property="Visibility"
|
||||||
|
Value="{Binding Visible,Converter={StaticResource BooleanToVisibilityConverter}}"/>
|
||||||
<Setter Property="ContentTemplate">
|
<Setter Property="ContentTemplate">
|
||||||
<Setter.Value>
|
<Setter.Value>
|
||||||
<DataTemplate>
|
<DataTemplate>
|
||||||
@@ -569,9 +573,11 @@
|
|||||||
<Setter Property="Canvas.ZIndex"
|
<Setter Property="Canvas.ZIndex"
|
||||||
Value="{Binding ZIndex}" />
|
Value="{Binding ZIndex}" />
|
||||||
<Setter Property="s:SelectionProps.EnabledForSelection"
|
<Setter Property="s:SelectionProps.EnabledForSelection"
|
||||||
Value="True" />
|
Value="{Binding EnabledForSelection}" />
|
||||||
<Setter Property="s:ItemConnectProps.EnabledForConnection"
|
<Setter Property="s:ItemConnectProps.EnabledForConnection"
|
||||||
Value="True" />
|
Value="{Binding EnabledForConnection}" />
|
||||||
|
<Setter Property="Visibility"
|
||||||
|
Value="{Binding Visible,Converter={StaticResource BooleanToVisibilityConverter}}"/>
|
||||||
<Setter Property="Width"
|
<Setter Property="Width"
|
||||||
Value="{Binding ItemWidth}" />
|
Value="{Binding ItemWidth}" />
|
||||||
<Setter Property="Height"
|
<Setter Property="Height"
|
||||||
@@ -647,9 +653,11 @@
|
|||||||
<Setter Property="Canvas.ZIndex"
|
<Setter Property="Canvas.ZIndex"
|
||||||
Value="{Binding ZIndex}" />
|
Value="{Binding ZIndex}" />
|
||||||
<Setter Property="s:SelectionProps.EnabledForSelection"
|
<Setter Property="s:SelectionProps.EnabledForSelection"
|
||||||
Value="True" />
|
Value="{Binding EnabledForSelection}" />
|
||||||
<Setter Property="s:ItemConnectProps.EnabledForConnection"
|
<Setter Property="s:ItemConnectProps.EnabledForConnection"
|
||||||
Value="True" />
|
Value="{Binding EnabledForConnection}" />
|
||||||
|
<Setter Property="Visibility"
|
||||||
|
Value="{Binding Visible,Converter={StaticResource BooleanToVisibilityConverter}}"/>
|
||||||
<Setter Property="Width"
|
<Setter Property="Width"
|
||||||
Value="{Binding ItemWidth}" />
|
Value="{Binding ItemWidth}" />
|
||||||
<Setter Property="Height"
|
<Setter Property="Height"
|
||||||
@@ -726,7 +734,9 @@
|
|||||||
<Setter Property="Canvas.ZIndex"
|
<Setter Property="Canvas.ZIndex"
|
||||||
Value="{Binding ZIndex}" />
|
Value="{Binding ZIndex}" />
|
||||||
<Setter Property="s:SelectionProps.EnabledForSelection"
|
<Setter Property="s:SelectionProps.EnabledForSelection"
|
||||||
Value="True" />
|
Value="{Binding EnabledForSelection}" />
|
||||||
|
<Setter Property="Visibility"
|
||||||
|
Value="{Binding Visible,Converter={StaticResource BooleanToVisibilityConverter}}"/>
|
||||||
<Setter Property="Width"
|
<Setter Property="Width"
|
||||||
Value="{Binding ItemWidth}" />
|
Value="{Binding ItemWidth}" />
|
||||||
<Setter Property="Height"
|
<Setter Property="Height"
|
||||||
@@ -770,9 +780,11 @@
|
|||||||
<Setter Property="Canvas.ZIndex"
|
<Setter Property="Canvas.ZIndex"
|
||||||
Value="{Binding ZIndex}" />
|
Value="{Binding ZIndex}" />
|
||||||
<Setter Property="s:SelectionProps.EnabledForSelection"
|
<Setter Property="s:SelectionProps.EnabledForSelection"
|
||||||
Value="True" />
|
Value="{Binding EnabledForSelection}" />
|
||||||
<Setter Property="s:ItemConnectProps.EnabledForConnection"
|
<Setter Property="s:ItemConnectProps.EnabledForConnection"
|
||||||
Value="True" />
|
Value="{Binding EnabledForConnection}" />
|
||||||
|
<Setter Property="Visibility"
|
||||||
|
Value="{Binding Visible,Converter={StaticResource BooleanToVisibilityConverter}}"/>
|
||||||
<Setter Property="Width"
|
<Setter Property="Width"
|
||||||
Value="{Binding ItemWidth}" />
|
Value="{Binding ItemWidth}" />
|
||||||
<Setter Property="Height"
|
<Setter Property="Height"
|
||||||
|
|||||||
@@ -174,6 +174,7 @@ namespace AIStudio.Wpf.DiagramDesigner
|
|||||||
if (SetProperty(ref _sizeStyle, value))
|
if (SetProperty(ref _sizeStyle, value))
|
||||||
{
|
{
|
||||||
Width = (double)_sizeStyle;
|
Width = (double)_sizeStyle;
|
||||||
|
Height = (double)_sizeStyle;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ namespace AIStudio.Wpf.DiagramDesigner
|
|||||||
|
|
||||||
if (sinkConnectorInfo is FullyCreatedConnectorInfo sink && sink.DataItem.ShowArrow == false)
|
if (sinkConnectorInfo is FullyCreatedConnectorInfo sink && sink.DataItem.ShowArrow == false)
|
||||||
{
|
{
|
||||||
this.ShapeViewModel.SinkMarker = LinkMarker.None;
|
this.ShapeViewModel.SinkMarker = new LinkMarker("", 10, 10, ArrowPathStyle.None, ArrowSizeStyle.Middle);
|
||||||
}
|
}
|
||||||
this.ColorViewModel.PropertyChanged += ConnectorViewModel_PropertyChanged;
|
this.ColorViewModel.PropertyChanged += ConnectorViewModel_PropertyChanged;
|
||||||
this.ShapeViewModel.PropertyChanged += ConnectorViewModel_PropertyChanged;
|
this.ShapeViewModel.PropertyChanged += ConnectorViewModel_PropertyChanged;
|
||||||
@@ -398,6 +398,10 @@ namespace AIStudio.Wpf.DiagramDesigner
|
|||||||
RaisePropertyChanged(nameof(IsFullConnection));
|
RaisePropertyChanged(nameof(IsFullConnection));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public double SmoothMargin { get; set; } = 125;
|
||||||
|
|
||||||
|
public double SmoothAutoSlope { get; set; } = 1;
|
||||||
|
|
||||||
public bool IsPortless => SourceConnectorInfo.IsPortless || SinkConnectorInfoFully?.IsPortless == true;
|
public bool IsPortless => SourceConnectorInfo.IsPortless || SinkConnectorInfoFully?.IsPortless == true;
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
@@ -445,13 +449,13 @@ namespace AIStudio.Wpf.DiagramDesigner
|
|||||||
break;
|
break;
|
||||||
case nameof(SourceConnectorInfo):
|
case nameof(SourceConnectorInfo):
|
||||||
SourceA = PointHelper.GetPointForConnector(SourceConnectorInfo);
|
SourceA = PointHelper.GetPointForConnector(SourceConnectorInfo);
|
||||||
(SourceConnectorInfo.DataItem as INotifyPropertyChanged).PropertyChanged += new WeakINPCEventHandler(ConnectorViewModel_PropertyChanged).Handler;
|
SourceConnectorInfo.DataItem.PropertyChanged += new WeakINPCEventHandler(ConnectorViewModel_PropertyChanged).Handler;
|
||||||
break;
|
break;
|
||||||
case nameof(SinkConnectorInfo):
|
case nameof(SinkConnectorInfo):
|
||||||
SourceB = SinkConnectorInfo.Position;
|
SourceB = SinkConnectorInfo.Position;
|
||||||
if (SinkConnectorInfo is FullyCreatedConnectorInfo)
|
if (SinkConnectorInfo is FullyCreatedConnectorInfo)
|
||||||
{
|
{
|
||||||
(((FullyCreatedConnectorInfo)SinkConnectorInfo).DataItem as INotifyPropertyChanged).PropertyChanged += new WeakINPCEventHandler(ConnectorViewModel_PropertyChanged).Handler;
|
SinkConnectorInfoFully.DataItem.PropertyChanged += new WeakINPCEventHandler(ConnectorViewModel_PropertyChanged).Handler;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case nameof(IsSelected):
|
case nameof(IsSelected):
|
||||||
|
|||||||
@@ -304,6 +304,32 @@ namespace AIStudio.Wpf.DiagramDesigner
|
|||||||
|
|
||||||
public bool ShowArrow { get; set; } = true;
|
public bool ShowArrow { get; set; } = true;
|
||||||
|
|
||||||
|
private bool enabledForConnection = true;
|
||||||
|
public bool EnabledForConnection
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return enabledForConnection;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
SetProperty(ref enabledForConnection, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool enabledForSelection = true;
|
||||||
|
public bool EnabledForSelection
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return enabledForSelection;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
SetProperty(ref enabledForSelection, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private double _left;
|
private double _left;
|
||||||
[CanDo]
|
[CanDo]
|
||||||
public double Left
|
public double Left
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Collections.ObjectModel;
|
using System.Collections.ObjectModel;
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
@@ -742,7 +743,7 @@ namespace AIStudio.Wpf.DiagramDesigner
|
|||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
private DoCommandManager DoCommandManager = new DoCommandManager();
|
private DoCommandManager DoCommandManager = new DoCommandManager();
|
||||||
|
|
||||||
public event DiagramEventHandler Event;
|
public event DiagramEventHandler Event;
|
||||||
|
|
||||||
@@ -899,7 +900,7 @@ namespace AIStudio.Wpf.DiagramDesigner
|
|||||||
{
|
{
|
||||||
//加入ReDo
|
//加入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));
|
Event?.Invoke(sender, new DiagramEventArgs(valuePropertyChangedEventArgs.PropertyName, valuePropertyChangedEventArgs.NewValue, valuePropertyChangedEventArgs.OldValue, selectable?.Id));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -992,7 +993,7 @@ namespace AIStudio.Wpf.DiagramDesigner
|
|||||||
Items.Remove(ite);
|
Items.Remove(ite);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else if (parameter is List<SelectableDesignerItemViewModelBase> items)
|
else if (parameter is IEnumerable<SelectableDesignerItemViewModelBase> items)
|
||||||
{
|
{
|
||||||
if (items.Select(p => AddVerify(p)).Any() != true) return;
|
if (items.Select(p => AddVerify(p)).Any() != true) return;
|
||||||
|
|
||||||
@@ -1005,7 +1006,10 @@ namespace AIStudio.Wpf.DiagramDesigner
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
() => {
|
() => {
|
||||||
items.ForEach(item => Items.Remove(item));
|
foreach (var item in items)
|
||||||
|
{
|
||||||
|
Items.Remove(item);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1016,7 +1020,7 @@ namespace AIStudio.Wpf.DiagramDesigner
|
|||||||
ite.IsSelected = false;
|
ite.IsSelected = false;
|
||||||
Items.Remove(ite);
|
Items.Remove(ite);
|
||||||
}
|
}
|
||||||
else if (parameter is List<SelectableDesignerItemViewModelBase> items)
|
else if (parameter is IEnumerable<SelectableDesignerItemViewModelBase> items)
|
||||||
{
|
{
|
||||||
foreach (var item in items)
|
foreach (var item in items)
|
||||||
{
|
{
|
||||||
@@ -1038,7 +1042,7 @@ namespace AIStudio.Wpf.DiagramDesigner
|
|||||||
Items.Add(ite);
|
Items.Add(ite);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else if (parameter is List<SelectableDesignerItemViewModelBase> items)
|
else if (parameter is IEnumerable<SelectableDesignerItemViewModelBase> items)
|
||||||
{
|
{
|
||||||
DoCommandManager.DoNewCommand(this.ToString(),
|
DoCommandManager.DoNewCommand(this.ToString(),
|
||||||
() => {
|
() => {
|
||||||
@@ -1060,8 +1064,22 @@ namespace AIStudio.Wpf.DiagramDesigner
|
|||||||
}
|
}
|
||||||
private void ExecuteClearSelectedItemsCommand(object parameter)
|
private void ExecuteClearSelectedItemsCommand(object parameter)
|
||||||
{
|
{
|
||||||
ClearSelectedItems();
|
IEnumerable<SelectableDesignerItemViewModelBase> selectedItems;
|
||||||
|
if (parameter is IEnumerable<SelectableDesignerItemViewModelBase> para)
|
||||||
|
{
|
||||||
|
selectedItems = para;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
selectedItems = this.SelectedItems.OfType<DesignerItemViewModelBase>();
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var item in selectedItems)
|
||||||
|
{
|
||||||
|
item.IsSelected = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ClearSelectedItems()
|
public void ClearSelectedItems()
|
||||||
{
|
{
|
||||||
foreach (var item in this.Items.ToList())
|
foreach (var item in this.Items.ToList())
|
||||||
@@ -1081,7 +1099,15 @@ namespace AIStudio.Wpf.DiagramDesigner
|
|||||||
#region 布局
|
#region 布局
|
||||||
private void ExecuteAlignTopCommand(object parameter)
|
private void ExecuteAlignTopCommand(object parameter)
|
||||||
{
|
{
|
||||||
var selectedItems = this.SelectedItems.OfType<DesignerItemViewModelBase>();
|
IEnumerable<DesignerItemViewModelBase> selectedItems;
|
||||||
|
if (parameter is IEnumerable<DesignerItemViewModelBase> para)
|
||||||
|
{
|
||||||
|
selectedItems = para;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
selectedItems = this.SelectedItems.OfType<DesignerItemViewModelBase>();
|
||||||
|
}
|
||||||
var guid = Guid.NewGuid();
|
var guid = Guid.NewGuid();
|
||||||
|
|
||||||
if (selectedItems.Count() > 1)
|
if (selectedItems.Count() > 1)
|
||||||
@@ -1113,7 +1139,15 @@ namespace AIStudio.Wpf.DiagramDesigner
|
|||||||
|
|
||||||
private void ExecuteAlignVerticalCentersCommand(object parameter)
|
private void ExecuteAlignVerticalCentersCommand(object parameter)
|
||||||
{
|
{
|
||||||
var selectedItems = this.SelectedItems.OfType<DesignerItemViewModelBase>();
|
IEnumerable<DesignerItemViewModelBase> selectedItems;
|
||||||
|
if (parameter is IEnumerable<DesignerItemViewModelBase> para)
|
||||||
|
{
|
||||||
|
selectedItems = para;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
selectedItems = this.SelectedItems.OfType<DesignerItemViewModelBase>();
|
||||||
|
}
|
||||||
var guid = Guid.NewGuid();
|
var guid = Guid.NewGuid();
|
||||||
|
|
||||||
if (selectedItems.Count() > 1)
|
if (selectedItems.Count() > 1)
|
||||||
@@ -1145,7 +1179,16 @@ namespace AIStudio.Wpf.DiagramDesigner
|
|||||||
|
|
||||||
private void ExecuteAlignBottomCommand(object parameter)
|
private void ExecuteAlignBottomCommand(object parameter)
|
||||||
{
|
{
|
||||||
var selectedItems = this.SelectedItems.OfType<DesignerItemViewModelBase>();
|
IEnumerable<DesignerItemViewModelBase> selectedItems;
|
||||||
|
if (parameter is IEnumerable<DesignerItemViewModelBase> para)
|
||||||
|
{
|
||||||
|
selectedItems = para;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
selectedItems = this.SelectedItems.OfType<DesignerItemViewModelBase>();
|
||||||
|
}
|
||||||
|
|
||||||
var guid = Guid.NewGuid();
|
var guid = Guid.NewGuid();
|
||||||
|
|
||||||
if (selectedItems.Count() > 1)
|
if (selectedItems.Count() > 1)
|
||||||
@@ -1177,7 +1220,16 @@ namespace AIStudio.Wpf.DiagramDesigner
|
|||||||
|
|
||||||
private void ExecuteAlignLeftCommand(object parameter)
|
private void ExecuteAlignLeftCommand(object parameter)
|
||||||
{
|
{
|
||||||
var selectedItems = this.SelectedItems.OfType<DesignerItemViewModelBase>();
|
IEnumerable<DesignerItemViewModelBase> selectedItems;
|
||||||
|
if (parameter is IEnumerable<DesignerItemViewModelBase> para)
|
||||||
|
{
|
||||||
|
selectedItems = para;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
selectedItems = this.SelectedItems.OfType<DesignerItemViewModelBase>();
|
||||||
|
}
|
||||||
|
|
||||||
var guid = Guid.NewGuid();
|
var guid = Guid.NewGuid();
|
||||||
|
|
||||||
if (selectedItems.Count() > 1)
|
if (selectedItems.Count() > 1)
|
||||||
@@ -1209,7 +1261,16 @@ namespace AIStudio.Wpf.DiagramDesigner
|
|||||||
|
|
||||||
private void ExecuteAlignHorizontalCentersCommand(object parameter)
|
private void ExecuteAlignHorizontalCentersCommand(object parameter)
|
||||||
{
|
{
|
||||||
var selectedItems = this.SelectedItems.OfType<DesignerItemViewModelBase>();
|
IEnumerable<DesignerItemViewModelBase> selectedItems;
|
||||||
|
if (parameter is IEnumerable<DesignerItemViewModelBase> para)
|
||||||
|
{
|
||||||
|
selectedItems = para;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
selectedItems = this.SelectedItems.OfType<DesignerItemViewModelBase>();
|
||||||
|
}
|
||||||
|
|
||||||
var guid = Guid.NewGuid();
|
var guid = Guid.NewGuid();
|
||||||
|
|
||||||
if (selectedItems.Count() > 1)
|
if (selectedItems.Count() > 1)
|
||||||
@@ -1241,7 +1302,16 @@ namespace AIStudio.Wpf.DiagramDesigner
|
|||||||
|
|
||||||
private void ExecuteAlignRightCommand(object parameter)
|
private void ExecuteAlignRightCommand(object parameter)
|
||||||
{
|
{
|
||||||
var selectedItems = this.SelectedItems.OfType<DesignerItemViewModelBase>();
|
IEnumerable<DesignerItemViewModelBase> selectedItems;
|
||||||
|
if (parameter is IEnumerable<DesignerItemViewModelBase> para)
|
||||||
|
{
|
||||||
|
selectedItems = para;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
selectedItems = this.SelectedItems.OfType<DesignerItemViewModelBase>();
|
||||||
|
}
|
||||||
|
|
||||||
var guid = Guid.NewGuid();
|
var guid = Guid.NewGuid();
|
||||||
|
|
||||||
if (selectedItems.Count() > 1)
|
if (selectedItems.Count() > 1)
|
||||||
@@ -1274,7 +1344,15 @@ namespace AIStudio.Wpf.DiagramDesigner
|
|||||||
|
|
||||||
private void ExecuteBringForwardCommand(object parameter)
|
private void ExecuteBringForwardCommand(object parameter)
|
||||||
{
|
{
|
||||||
List<SelectableDesignerItemViewModelBase> ordered = SelectedItems.OrderByDescending(p => p.ZIndex).ToList();
|
List<SelectableDesignerItemViewModelBase> ordered;
|
||||||
|
if (parameter is IEnumerable<SelectableDesignerItemViewModelBase> para)
|
||||||
|
{
|
||||||
|
ordered = para.OrderByDescending(p => p.ZIndex).ToList();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ordered = SelectedItems.OrderByDescending(p => p.ZIndex).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
List<SelectableDesignerItemViewModelBase> changeditems = new List<SelectableDesignerItemViewModelBase>();
|
List<SelectableDesignerItemViewModelBase> changeditems = new List<SelectableDesignerItemViewModelBase>();
|
||||||
var guid = Guid.NewGuid();
|
var guid = Guid.NewGuid();
|
||||||
@@ -1323,7 +1401,16 @@ namespace AIStudio.Wpf.DiagramDesigner
|
|||||||
}
|
}
|
||||||
private void ExecuteBringToFrontCommand(object parameter)
|
private void ExecuteBringToFrontCommand(object parameter)
|
||||||
{
|
{
|
||||||
List<SelectableDesignerItemViewModelBase> selectionSorted = SelectedItems.OrderByDescending(p => p.ZIndex).ToList();
|
List<SelectableDesignerItemViewModelBase> selectionSorted;
|
||||||
|
if (parameter is IEnumerable<SelectableDesignerItemViewModelBase> para)
|
||||||
|
{
|
||||||
|
selectionSorted = para.OrderByDescending(p => p.ZIndex).ToList();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
selectionSorted = SelectedItems.OrderByDescending(p => p.ZIndex).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
List<SelectableDesignerItemViewModelBase> childrenSorted = Items.OrderByDescending(p => p.ZIndex).ToList();
|
List<SelectableDesignerItemViewModelBase> childrenSorted = Items.OrderByDescending(p => p.ZIndex).ToList();
|
||||||
|
|
||||||
List<SelectableDesignerItemViewModelBase> changeditems = new List<SelectableDesignerItemViewModelBase>();
|
List<SelectableDesignerItemViewModelBase> changeditems = new List<SelectableDesignerItemViewModelBase>();
|
||||||
@@ -1363,7 +1450,16 @@ namespace AIStudio.Wpf.DiagramDesigner
|
|||||||
}
|
}
|
||||||
private void ExecuteSendBackwardCommand(object parameter)
|
private void ExecuteSendBackwardCommand(object parameter)
|
||||||
{
|
{
|
||||||
List<SelectableDesignerItemViewModelBase> ordered = this.SelectedItems.OrderBy(p => p.ZIndex).ToList();
|
List<SelectableDesignerItemViewModelBase> ordered;
|
||||||
|
if (parameter is IEnumerable<SelectableDesignerItemViewModelBase> para)
|
||||||
|
{
|
||||||
|
ordered = para.OrderBy(p => p.ZIndex).ToList();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ordered = SelectedItems.OrderBy(p => p.ZIndex).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
int count = this.Items.Count;
|
int count = this.Items.Count;
|
||||||
|
|
||||||
List<SelectableDesignerItemViewModelBase> changeditems = new List<SelectableDesignerItemViewModelBase>();
|
List<SelectableDesignerItemViewModelBase> changeditems = new List<SelectableDesignerItemViewModelBase>();
|
||||||
@@ -1412,7 +1508,16 @@ namespace AIStudio.Wpf.DiagramDesigner
|
|||||||
}
|
}
|
||||||
private void ExecuteSendToBackCommand(object parameter)
|
private void ExecuteSendToBackCommand(object parameter)
|
||||||
{
|
{
|
||||||
List<SelectableDesignerItemViewModelBase> selectionSorted = SelectedItems.OrderByDescending(p => p.ZIndex).ToList();
|
List<SelectableDesignerItemViewModelBase> selectionSorted;
|
||||||
|
if (parameter is IEnumerable<SelectableDesignerItemViewModelBase> para)
|
||||||
|
{
|
||||||
|
selectionSorted = para.OrderByDescending(p => p.ZIndex).ToList();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
selectionSorted = SelectedItems.OrderByDescending(p => p.ZIndex).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
List<SelectableDesignerItemViewModelBase> childrenSorted = Items.OrderByDescending(p => p.ZIndex).ToList();
|
List<SelectableDesignerItemViewModelBase> childrenSorted = Items.OrderByDescending(p => p.ZIndex).ToList();
|
||||||
|
|
||||||
List<SelectableDesignerItemViewModelBase> changeditems = new List<SelectableDesignerItemViewModelBase>();
|
List<SelectableDesignerItemViewModelBase> changeditems = new List<SelectableDesignerItemViewModelBase>();
|
||||||
@@ -1452,10 +1557,16 @@ namespace AIStudio.Wpf.DiagramDesigner
|
|||||||
}
|
}
|
||||||
private void ExecuteDistributeHorizontalCommand(object parameter)
|
private void ExecuteDistributeHorizontalCommand(object parameter)
|
||||||
{
|
{
|
||||||
var selectedItems = from item in this.SelectedItems.OfType<DesignerItemViewModelBase>()
|
IEnumerable<DesignerItemViewModelBase> selectedItems;
|
||||||
where item.ParentId == Guid.Empty
|
if (parameter is IEnumerable<DesignerItemViewModelBase> para)
|
||||||
orderby item.Left
|
{
|
||||||
select item;
|
selectedItems = para.Where(p => p.ParentId == Guid.Empty).OrderBy(p => p.Left);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
selectedItems = this.SelectedItems.OfType<DesignerItemViewModelBase>().Where(p => p.ParentId == Guid.Empty).OrderBy(p => p.Left);
|
||||||
|
}
|
||||||
|
|
||||||
var guid = Guid.NewGuid();
|
var guid = Guid.NewGuid();
|
||||||
|
|
||||||
if (selectedItems.Count() > 1)
|
if (selectedItems.Count() > 1)
|
||||||
@@ -1509,10 +1620,16 @@ namespace AIStudio.Wpf.DiagramDesigner
|
|||||||
}
|
}
|
||||||
private void ExecuteDistributeVerticalCommand(object parameter)
|
private void ExecuteDistributeVerticalCommand(object parameter)
|
||||||
{
|
{
|
||||||
var selectedItems = from item in this.SelectedItems.OfType<DesignerItemViewModelBase>()
|
IEnumerable<DesignerItemViewModelBase> selectedItems;
|
||||||
where item.ParentId == Guid.Empty
|
if (parameter is IEnumerable<DesignerItemViewModelBase> para)
|
||||||
orderby item.Top
|
{
|
||||||
select item;
|
selectedItems = para.Where(p => p.ParentId == Guid.Empty).OrderBy(p => p.Top);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
selectedItems = this.SelectedItems.OfType<DesignerItemViewModelBase>().Where(p => p.ParentId == Guid.Empty).OrderBy(p => p.Top);
|
||||||
|
}
|
||||||
|
|
||||||
var guid = Guid.NewGuid();
|
var guid = Guid.NewGuid();
|
||||||
|
|
||||||
if (selectedItems.Count() > 1)
|
if (selectedItems.Count() > 1)
|
||||||
@@ -1568,11 +1685,21 @@ namespace AIStudio.Wpf.DiagramDesigner
|
|||||||
#region 复制,粘贴
|
#region 复制,粘贴
|
||||||
private void ExecuteCopyCommand(object parameter)
|
private void ExecuteCopyCommand(object parameter)
|
||||||
{
|
{
|
||||||
List<DesignerItemViewModelBase> selectedDesignerItems =
|
List<DesignerItemViewModelBase> selectedDesignerItems;
|
||||||
SelectedItems.OfType<DesignerItemViewModelBase>().ToList();
|
|
||||||
|
List<ConnectionViewModel> selectedConnections;
|
||||||
|
|
||||||
|
if (parameter is IEnumerable<SelectableDesignerItemViewModelBase> para)
|
||||||
|
{
|
||||||
|
selectedDesignerItems = para.OfType<DesignerItemViewModelBase>().ToList();
|
||||||
|
selectedConnections = para.OfType<ConnectionViewModel>().ToList();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
selectedDesignerItems = SelectedItems.OfType<DesignerItemViewModelBase>().ToList();
|
||||||
|
selectedConnections = SelectedItems.OfType<ConnectionViewModel>().ToList();
|
||||||
|
}
|
||||||
|
|
||||||
List<ConnectionViewModel> selectedConnections =
|
|
||||||
SelectedItems.OfType<ConnectionViewModel>().ToList();
|
|
||||||
|
|
||||||
foreach (ConnectionViewModel connection in Items.OfType<ConnectionViewModel>())
|
foreach (ConnectionViewModel connection in Items.OfType<ConnectionViewModel>())
|
||||||
{
|
{
|
||||||
@@ -1712,7 +1839,17 @@ namespace AIStudio.Wpf.DiagramDesigner
|
|||||||
|
|
||||||
private void ExecuteDeleteCommand(object parameter)
|
private void ExecuteDeleteCommand(object parameter)
|
||||||
{
|
{
|
||||||
List<SelectableDesignerItemViewModelBase> itemsToRemove = SelectedItems.OfType<SelectableDesignerItemViewModelBase>().ToList();
|
List<SelectableDesignerItemViewModelBase> itemsToRemove;
|
||||||
|
|
||||||
|
if (parameter is IEnumerable<SelectableDesignerItemViewModelBase> para)
|
||||||
|
{
|
||||||
|
itemsToRemove = para.OfType<SelectableDesignerItemViewModelBase>().ToList();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
itemsToRemove = SelectedItems.OfType<SelectableDesignerItemViewModelBase>().ToList();
|
||||||
|
}
|
||||||
|
|
||||||
List<SelectableDesignerItemViewModelBase> connectionsToAlsoRemove = new List<SelectableDesignerItemViewModelBase>();
|
List<SelectableDesignerItemViewModelBase> connectionsToAlsoRemove = new List<SelectableDesignerItemViewModelBase>();
|
||||||
|
|
||||||
foreach (var connector in Items.OfType<ConnectionViewModel>())
|
foreach (var connector in Items.OfType<ConnectionViewModel>())
|
||||||
@@ -1737,7 +1874,17 @@ namespace AIStudio.Wpf.DiagramDesigner
|
|||||||
#region 移动
|
#region 移动
|
||||||
private void ExecuteLeftMoveCommand(object parameter)
|
private void ExecuteLeftMoveCommand(object parameter)
|
||||||
{
|
{
|
||||||
foreach (var item in SelectedItems.OfType<DesignerItemViewModelBase>())
|
IEnumerable<DesignerItemViewModelBase> selectedItems;
|
||||||
|
if (parameter is IEnumerable<DesignerItemViewModelBase> para)
|
||||||
|
{
|
||||||
|
selectedItems = para;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
selectedItems = this.SelectedItems.OfType<DesignerItemViewModelBase>();
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var item in selectedItems.OfType<DesignerItemViewModelBase>())
|
||||||
{
|
{
|
||||||
item.Left -= 0.5;
|
item.Left -= 0.5;
|
||||||
}
|
}
|
||||||
@@ -1745,7 +1892,17 @@ namespace AIStudio.Wpf.DiagramDesigner
|
|||||||
|
|
||||||
private void ExecuteRightMoveCommand(object parameter)
|
private void ExecuteRightMoveCommand(object parameter)
|
||||||
{
|
{
|
||||||
foreach (var item in SelectedItems.OfType<DesignerItemViewModelBase>())
|
IEnumerable<DesignerItemViewModelBase> selectedItems;
|
||||||
|
if (parameter is IEnumerable<DesignerItemViewModelBase> para)
|
||||||
|
{
|
||||||
|
selectedItems = para;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
selectedItems = this.SelectedItems.OfType<DesignerItemViewModelBase>();
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var item in selectedItems.OfType<DesignerItemViewModelBase>())
|
||||||
{
|
{
|
||||||
item.Left += 0.5;
|
item.Left += 0.5;
|
||||||
}
|
}
|
||||||
@@ -1753,7 +1910,17 @@ namespace AIStudio.Wpf.DiagramDesigner
|
|||||||
|
|
||||||
private void ExecuteUpMoveCommand(object parameter)
|
private void ExecuteUpMoveCommand(object parameter)
|
||||||
{
|
{
|
||||||
foreach (var item in SelectedItems.OfType<DesignerItemViewModelBase>())
|
IEnumerable<DesignerItemViewModelBase> selectedItems;
|
||||||
|
if (parameter is IEnumerable<DesignerItemViewModelBase> para)
|
||||||
|
{
|
||||||
|
selectedItems = para;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
selectedItems = this.SelectedItems.OfType<DesignerItemViewModelBase>();
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var item in selectedItems.OfType<DesignerItemViewModelBase>())
|
||||||
{
|
{
|
||||||
item.Top -= 0.5;
|
item.Top -= 0.5;
|
||||||
}
|
}
|
||||||
@@ -1761,7 +1928,17 @@ namespace AIStudio.Wpf.DiagramDesigner
|
|||||||
|
|
||||||
private void ExecuteDownMoveCommand(object parameter)
|
private void ExecuteDownMoveCommand(object parameter)
|
||||||
{
|
{
|
||||||
foreach (var item in SelectedItems.OfType<DesignerItemViewModelBase>())
|
IEnumerable<DesignerItemViewModelBase> selectedItems;
|
||||||
|
if (parameter is IEnumerable<DesignerItemViewModelBase> para)
|
||||||
|
{
|
||||||
|
selectedItems = para;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
selectedItems = this.SelectedItems.OfType<DesignerItemViewModelBase>();
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var item in selectedItems.OfType<DesignerItemViewModelBase>())
|
||||||
{
|
{
|
||||||
item.Top += 0.5;
|
item.Top += 0.5;
|
||||||
}
|
}
|
||||||
@@ -1769,7 +1946,17 @@ namespace AIStudio.Wpf.DiagramDesigner
|
|||||||
|
|
||||||
private void ExecuteCenterMoveCommand(object parameter)
|
private void ExecuteCenterMoveCommand(object parameter)
|
||||||
{
|
{
|
||||||
foreach (var item in SelectedItems.OfType<DesignerItemViewModelBase>())
|
IEnumerable<DesignerItemViewModelBase> selectedItems;
|
||||||
|
if (parameter is IEnumerable<DesignerItemViewModelBase> para)
|
||||||
|
{
|
||||||
|
selectedItems = para;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
selectedItems = this.SelectedItems.OfType<DesignerItemViewModelBase>();
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var item in selectedItems.OfType<DesignerItemViewModelBase>())
|
||||||
{
|
{
|
||||||
item.Left = (PageSize.Width - item.ItemWidth) / 2;
|
item.Left = (PageSize.Width - item.ItemWidth) / 2;
|
||||||
item.Top = (PageSize.Height - item.ItemHeight) / 2;
|
item.Top = (PageSize.Height - item.ItemHeight) / 2;
|
||||||
@@ -1780,7 +1967,6 @@ namespace AIStudio.Wpf.DiagramDesigner
|
|||||||
{
|
{
|
||||||
List<SelectableDesignerItemViewModelBase> ordered = Items.OrderBy(p => p.ZIndex).ToList();
|
List<SelectableDesignerItemViewModelBase> ordered = Items.OrderBy(p => p.ZIndex).ToList();
|
||||||
|
|
||||||
|
|
||||||
for (int i = 0; i < ordered.Count; i++)
|
for (int i = 0; i < ordered.Count; i++)
|
||||||
{
|
{
|
||||||
ordered[i].ZIndex = i;
|
ordered[i].ZIndex = i;
|
||||||
|
|||||||
@@ -166,6 +166,19 @@ namespace AIStudio.Wpf.DiagramDesigner
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private bool _visible = true;
|
||||||
|
public bool Visible
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _visible;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
SetProperty(ref _visible, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private int _zIndex;
|
private int _zIndex;
|
||||||
[Browsable(true)]
|
[Browsable(true)]
|
||||||
[CanDo]
|
[CanDo]
|
||||||
|
|||||||
@@ -5,32 +5,139 @@
|
|||||||
|
|
||||||
<dd:ColorBrushConverter x:Key="ColorBrushConverter"/>
|
<dd:ColorBrushConverter x:Key="ColorBrushConverter"/>
|
||||||
<dd:DoubleToCornerRadius x:Key="DoubleToCornerRadius"/>
|
<dd:DoubleToCornerRadius x:Key="DoubleToCornerRadius"/>
|
||||||
|
<dd:IntToVisibilityConverter x:Key="IntToVisibilityConverter"/>
|
||||||
|
|
||||||
|
<!-- Toggle Button -->
|
||||||
|
<Style x:Key="ExpandCollapseToggleStyle" TargetType="ToggleButton">
|
||||||
|
<Setter Property="Focusable" Value="False"/>
|
||||||
|
<Setter Property="Template">
|
||||||
|
<Setter.Value>
|
||||||
|
<ControlTemplate TargetType="ToggleButton">
|
||||||
|
<Grid Width="17" Height="17" SnapsToDevicePixels="True">
|
||||||
|
<Rectangle Width="13" Height="13" Stroke="Gray" RadiusX="6" RadiusY="6" SnapsToDevicePixels="true">
|
||||||
|
<Rectangle.Fill>
|
||||||
|
<LinearGradientBrush EndPoint="0.5,2" StartPoint="0.5,0">
|
||||||
|
<GradientStop Color="White" Offset="0"/>
|
||||||
|
<GradientStop Color="Silver" Offset="0.5"/>
|
||||||
|
<GradientStop Color="LightGray" Offset="1"/>
|
||||||
|
</LinearGradientBrush>
|
||||||
|
</Rectangle.Fill>
|
||||||
|
</Rectangle>
|
||||||
|
<Rectangle x:Name="ExpandPath" Width="1" Height="9" Stroke="Gray" SnapsToDevicePixels="true" />
|
||||||
|
<Rectangle Width="9" Height="1" Stroke="Gray" SnapsToDevicePixels="true"/>
|
||||||
|
</Grid>
|
||||||
|
<ControlTemplate.Triggers>
|
||||||
|
<Trigger Property="IsChecked" Value="True">
|
||||||
|
<Setter Property="Visibility" TargetName="ExpandPath" Value="Collapsed"/>
|
||||||
|
</Trigger>
|
||||||
|
</ControlTemplate.Triggers>
|
||||||
|
</ControlTemplate>
|
||||||
|
</Setter.Value>
|
||||||
|
</Setter>
|
||||||
|
</Style>
|
||||||
|
|
||||||
|
<ControlTemplate x:Key="MindLevel1NodeStyle" TargetType="{x:Type ContentControl}">
|
||||||
|
<Grid >
|
||||||
|
<Grid.ContextMenu>
|
||||||
|
<ContextMenu ItemsSource="{Binding MenuOptions}">
|
||||||
|
<ContextMenu.ItemContainerStyle>
|
||||||
|
<Style TargetType="MenuItem">
|
||||||
|
<Setter Property="MenuItem.Header" Value="{Binding Text}" />
|
||||||
|
<Setter Property="MenuItem.ItemsSource" Value="{Binding Children}" />
|
||||||
|
<Setter Property="MenuItem.Command" Value="{Binding Command}" />
|
||||||
|
<Setter Property="MenuItem.Icon" Value="{Binding Icon}" />
|
||||||
|
<Setter Property="CommandParameter" Value="{Binding CommandParameter}" />
|
||||||
|
<Setter Property="MenuItem.IsCheckable" Value="{Binding IsCheckable}" />
|
||||||
|
<Setter Property="MenuItem.IsChecked" Value="{Binding IsChecked}" />
|
||||||
|
</Style>
|
||||||
|
</ContextMenu.ItemContainerStyle>
|
||||||
|
</ContextMenu>
|
||||||
|
</Grid.ContextMenu>
|
||||||
|
<Grid IsHitTestVisible="False">
|
||||||
|
<Border BorderThickness="1"
|
||||||
|
BorderBrush="{Binding ColorViewModel.LineColor,Converter={StaticResource ColorBrushConverter}}"
|
||||||
|
Background="{Binding ColorViewModel.FillColor,Converter={StaticResource ColorBrushConverter}}"
|
||||||
|
CornerRadius="{Binding CornerRadius,Converter={StaticResource DoubleToCornerRadius}}">
|
||||||
|
</Border>
|
||||||
|
</Grid>
|
||||||
|
</Grid>
|
||||||
|
</ControlTemplate>
|
||||||
|
|
||||||
|
<ControlTemplate x:Key="MindLevel2NodeStyle" TargetType="{x:Type ContentControl}">
|
||||||
|
<Grid>
|
||||||
|
<Grid.ContextMenu>
|
||||||
|
<ContextMenu ItemsSource="{Binding MenuOptions}">
|
||||||
|
<ContextMenu.ItemContainerStyle>
|
||||||
|
<Style TargetType="MenuItem">
|
||||||
|
<Setter Property="MenuItem.Header" Value="{Binding Text}" />
|
||||||
|
<Setter Property="MenuItem.ItemsSource" Value="{Binding Children}" />
|
||||||
|
<Setter Property="MenuItem.Command" Value="{Binding Command}" />
|
||||||
|
<Setter Property="MenuItem.Icon" Value="{Binding Icon}" />
|
||||||
|
<Setter Property="CommandParameter" Value="{Binding CommandParameter}" />
|
||||||
|
<Setter Property="MenuItem.IsCheckable" Value="{Binding IsCheckable}" />
|
||||||
|
<Setter Property="MenuItem.IsChecked" Value="{Binding IsChecked}" />
|
||||||
|
</Style>
|
||||||
|
</ContextMenu.ItemContainerStyle>
|
||||||
|
</ContextMenu>
|
||||||
|
</Grid.ContextMenu>
|
||||||
|
<Grid IsHitTestVisible="False">
|
||||||
|
<Border BorderThickness="1"
|
||||||
|
BorderBrush="{Binding ColorViewModel.LineColor,Converter={StaticResource ColorBrushConverter}}"
|
||||||
|
Background="{Binding ColorViewModel.FillColor,Converter={StaticResource ColorBrushConverter}}"
|
||||||
|
CornerRadius="{Binding CornerRadius,Converter={StaticResource DoubleToCornerRadius}}">
|
||||||
|
</Border>
|
||||||
|
</Grid>
|
||||||
|
<ToggleButton IsChecked="{Binding IsExpanded}" Style="{StaticResource ExpandCollapseToggleStyle}" HorizontalAlignment="Left" Margin="-15,0,0,0" Visibility="{Binding Children.Count,Converter={StaticResource IntToVisibilityConverter}}"/>
|
||||||
|
</Grid>
|
||||||
|
</ControlTemplate>
|
||||||
|
|
||||||
|
<ControlTemplate x:Key="MindLevel3NodeStyle" TargetType="{x:Type ContentControl}">
|
||||||
|
<Grid>
|
||||||
|
<Grid.ContextMenu>
|
||||||
|
<ContextMenu ItemsSource="{Binding MenuOptions}">
|
||||||
|
<ContextMenu.ItemContainerStyle>
|
||||||
|
<Style TargetType="MenuItem">
|
||||||
|
<Setter Property="MenuItem.Header" Value="{Binding Text}" />
|
||||||
|
<Setter Property="MenuItem.ItemsSource" Value="{Binding Children}" />
|
||||||
|
<Setter Property="MenuItem.Command" Value="{Binding Command}" />
|
||||||
|
<Setter Property="MenuItem.Icon" Value="{Binding Icon}" />
|
||||||
|
<Setter Property="CommandParameter" Value="{Binding CommandParameter}" />
|
||||||
|
<Setter Property="MenuItem.IsCheckable" Value="{Binding IsCheckable}" />
|
||||||
|
<Setter Property="MenuItem.IsChecked" Value="{Binding IsChecked}" />
|
||||||
|
</Style>
|
||||||
|
</ContextMenu.ItemContainerStyle>
|
||||||
|
</ContextMenu>
|
||||||
|
</Grid.ContextMenu>
|
||||||
|
<Grid IsHitTestVisible="False">
|
||||||
|
<Border BorderThickness="0,0,0,1"
|
||||||
|
BorderBrush="{Binding ColorViewModel.LineColor,Converter={StaticResource ColorBrushConverter}}"
|
||||||
|
Background="{Binding ColorViewModel.FillColor,Converter={StaticResource ColorBrushConverter}}">
|
||||||
|
|
||||||
|
</Border>
|
||||||
|
</Grid>
|
||||||
|
<ToggleButton IsChecked="{Binding IsExpanded}" Style="{StaticResource ExpandCollapseToggleStyle}" HorizontalAlignment="Left" Margin="-15,0,0,0" Visibility="{Binding Children.Count,Converter={StaticResource IntToVisibilityConverter}}"/>
|
||||||
|
</Grid>
|
||||||
|
</ControlTemplate>
|
||||||
|
|
||||||
|
<Style x:Key="MindNodeStyle" TargetType="{x:Type ContentControl}">
|
||||||
|
<Setter Property="Template" Value="{StaticResource MindLevel1NodeStyle}" />
|
||||||
|
<Style.Triggers>
|
||||||
|
<DataTrigger Binding="{Binding NodeLevel}" Value="Level1">
|
||||||
|
<Setter Property="Template" Value="{StaticResource MindLevel1NodeStyle}" />
|
||||||
|
</DataTrigger>
|
||||||
|
<DataTrigger Binding="{Binding NodeLevel}" Value="Level2">
|
||||||
|
<Setter Property="Template" Value="{StaticResource MindLevel2NodeStyle}" />
|
||||||
|
</DataTrigger>
|
||||||
|
<DataTrigger Binding="{Binding NodeLevel}" Value="Level3">
|
||||||
|
<Setter Property="Template" Value="{StaticResource MindLevel3NodeStyle}" />
|
||||||
|
</DataTrigger>
|
||||||
|
</Style.Triggers>
|
||||||
|
</Style>
|
||||||
|
|
||||||
<DataTemplate DataType="{x:Type viewmodel:MindNode}">
|
<DataTemplate DataType="{x:Type viewmodel:MindNode}">
|
||||||
<Grid IsHitTestVisible="False">
|
<Grid IsHitTestVisible="False">
|
||||||
<Grid>
|
<ContentControl Style="{StaticResource MindNodeStyle}"/>
|
||||||
<Border BorderThickness="1"
|
|
||||||
BorderBrush="{Binding ColorViewModel.LineColor,Converter={StaticResource ColorBrushConverter}}"
|
|
||||||
Background="{Binding ColorViewModel.FillColor,Converter={StaticResource ColorBrushConverter}}"
|
|
||||||
CornerRadius="{Binding CornerRadius,Converter={StaticResource DoubleToCornerRadius}}">
|
|
||||||
|
|
||||||
</Border>
|
|
||||||
</Grid>
|
|
||||||
</Grid>
|
|
||||||
|
|
||||||
</DataTemplate>
|
|
||||||
<DataTemplate DataType="{x:Type viewmodel:MindLevel1Node}">
|
|
||||||
<Grid IsHitTestVisible="False">
|
|
||||||
<Grid>
|
|
||||||
<Border BorderThickness="1"
|
|
||||||
BorderBrush="{Binding ColorViewModel.LineColor,Converter={StaticResource ColorBrushConverter}}"
|
|
||||||
Background="{Binding ColorViewModel.FillColor,Converter={StaticResource ColorBrushConverter}}"
|
|
||||||
CornerRadius="{Binding CornerRadius,Converter={StaticResource DoubleToCornerRadius}}">
|
|
||||||
|
|
||||||
</Border>
|
|
||||||
</Grid>
|
|
||||||
</Grid>
|
</Grid>
|
||||||
</DataTemplate>
|
</DataTemplate>
|
||||||
|
|
||||||
|
|
||||||
</ResourceDictionary>
|
</ResourceDictionary>
|
||||||
@@ -1,9 +1,13 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
using System.Windows.Media;
|
||||||
using AIStudio.Wpf.DiagramDesigner;
|
using AIStudio.Wpf.DiagramDesigner;
|
||||||
|
using AIStudio.Wpf.DiagramDesigner.Algorithms;
|
||||||
using AIStudio.Wpf.DiagramDesigner.Geometrys;
|
using AIStudio.Wpf.DiagramDesigner.Geometrys;
|
||||||
using AIStudio.Wpf.DiagramDesigner.Models;
|
using AIStudio.Wpf.DiagramDesigner.Models;
|
||||||
|
|
||||||
@@ -13,12 +17,12 @@ namespace AIStudio.Wpf.Mind.ViewModels
|
|||||||
{
|
{
|
||||||
public MindNode(NodeLevel nodeLevel) : this(null, nodeLevel)
|
public MindNode(NodeLevel nodeLevel) : this(null, nodeLevel)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public MindNode(IDiagramViewModel root, NodeLevel nodeLevel) : base(root)
|
public MindNode(IDiagramViewModel root, NodeLevel nodeLevel) : base(root)
|
||||||
{
|
{
|
||||||
NodeLevel = nodeLevel;
|
NodeLevel = nodeLevel;
|
||||||
|
LevelInit(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public MindNode(IDiagramViewModel root, SelectableItemBase designer) : base(root, designer)
|
public MindNode(IDiagramViewModel root, SelectableItemBase designer) : base(root, designer)
|
||||||
@@ -29,6 +33,90 @@ namespace AIStudio.Wpf.Mind.ViewModels
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override void Init(IDiagramViewModel root)
|
||||||
|
{
|
||||||
|
base.Init(root);
|
||||||
|
|
||||||
|
EnabledForConnection = false;
|
||||||
|
|
||||||
|
AddChildCommand = new SimpleCommand(Command_Enable, ExecuteAddChildCommand);
|
||||||
|
AddParentCommand = new SimpleCommand(Level_Enable, ExecuteAddParentCommand);
|
||||||
|
AddPeerCommand = new SimpleCommand(Level_Enable, ExecuteAddPeerCommand);
|
||||||
|
DeleteCommand = new SimpleCommand(Command_Enable, ExecuteDeleteCommand);
|
||||||
|
MoveForwardCommand = new SimpleCommand(Command_Enable, ExecuteMoveForwardCommand);
|
||||||
|
MoveBackCommand = new SimpleCommand(Command_Enable, ExecuteMoveBackCommand);
|
||||||
|
BuildMenuOptions();
|
||||||
|
|
||||||
|
this.PropertyChanged += this.Item_PropertyChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LevelInit(bool init =false)
|
||||||
|
{
|
||||||
|
switch (NodeLevel)
|
||||||
|
{
|
||||||
|
case NodeLevel.Level1:
|
||||||
|
{
|
||||||
|
ItemWidth = 110;
|
||||||
|
ItemHeight = 40;
|
||||||
|
this.ClearConnectors();
|
||||||
|
var port = new FullyCreatedConnectorInfo(Root, this, ConnectorOrientation.None, true) { XRatio = 0.5, YRatio = 0.5 };
|
||||||
|
this.AddConnector(port);
|
||||||
|
IsInnerConnector = true;
|
||||||
|
|
||||||
|
ColorViewModel.FillColor.Color = Color.FromRgb(0x73, 0xa1, 0xbf);
|
||||||
|
ColorViewModel.LineColor.Color = Color.FromRgb(0x73, 0xa1, 0xbf);
|
||||||
|
FontViewModel.FontColor = Colors.White;
|
||||||
|
FontViewModel.FontSize = 15;
|
||||||
|
Spacing = new SizeBase(50, 15);
|
||||||
|
ShapeViewModel.SinkMarker.PathStyle = ArrowPathStyle.Circle;
|
||||||
|
ShapeViewModel.SinkMarker.SizeStyle = ArrowSizeStyle.VerySmall;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case NodeLevel.Level2:
|
||||||
|
{
|
||||||
|
ItemWidth = 80;
|
||||||
|
ItemHeight = 25;
|
||||||
|
this.ClearConnectors();
|
||||||
|
var port1 = new FullyCreatedConnectorInfo(Root, this, ConnectorOrientation.Left, true) { XRatio = 0, YRatio = 0.5 };
|
||||||
|
this.AddConnector(port1);
|
||||||
|
var port2 = new FullyCreatedConnectorInfo(Root, this, ConnectorOrientation.Right, true) { XRatio = 1, YRatio = 0.5 };
|
||||||
|
this.AddConnector(port2);
|
||||||
|
IsInnerConnector = true;
|
||||||
|
|
||||||
|
ColorViewModel.LineColor.Color = Color.FromRgb(0x73, 0xa1, 0xbf);
|
||||||
|
ShapeViewModel.SinkMarker.PathStyle = ArrowPathStyle.None;
|
||||||
|
ShapeViewModel.SinkMarker.SizeStyle = ArrowSizeStyle.VerySmall;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case NodeLevel.Level3:
|
||||||
|
{
|
||||||
|
ItemWidth = 80;
|
||||||
|
ItemHeight = 25;
|
||||||
|
this.ClearConnectors();
|
||||||
|
var port1 = new FullyCreatedConnectorInfo(Root, this, ConnectorOrientation.Left, true) { XRatio = 0, YRatio = 1 };
|
||||||
|
this.AddConnector(port1);
|
||||||
|
var port2 = new FullyCreatedConnectorInfo(Root, this, ConnectorOrientation.Right, true) { XRatio = 1, YRatio = 1 };
|
||||||
|
this.AddConnector(port2);
|
||||||
|
IsInnerConnector = true;
|
||||||
|
|
||||||
|
ColorViewModel.LineColor.Color = Color.FromRgb(0x73, 0xa1, 0xbf);
|
||||||
|
ShapeViewModel.SinkMarker.PathStyle = ArrowPathStyle.None;
|
||||||
|
ShapeViewModel.SinkMarker.SizeStyle = ArrowSizeStyle.VerySmall;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private bool Level_Enable(object obj)
|
||||||
|
{
|
||||||
|
if (Command_Enable(obj) == false) return false;
|
||||||
|
|
||||||
|
return NodeLevel != NodeLevel.Level1;
|
||||||
|
}
|
||||||
|
|
||||||
[Browsable(false)]
|
[Browsable(false)]
|
||||||
public NodeLevel NodeLevel
|
public NodeLevel NodeLevel
|
||||||
{
|
{
|
||||||
@@ -48,10 +136,28 @@ namespace AIStudio.Wpf.Mind.ViewModels
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public double Spacing
|
private bool _isExpanded = true;
|
||||||
|
public bool IsExpanded
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _isExpanded;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
SetProperty(ref _isExpanded, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool LayoutUpdating
|
||||||
{
|
{
|
||||||
get; set;
|
get; set;
|
||||||
} = 20;
|
}
|
||||||
|
|
||||||
|
public SizeBase Spacing
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
} = new SizeBase(15, 15);
|
||||||
|
|
||||||
public List<MindNode> Children
|
public List<MindNode> Children
|
||||||
{
|
{
|
||||||
@@ -62,170 +168,357 @@ namespace AIStudio.Wpf.Mind.ViewModels
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return this.Size.Add(Spacing * 2);
|
return this.Size.Add(Spacing.Width * 2, Spacing.Height * 2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public SizeBase DesiredSize
|
public SizeBase DesiredSize
|
||||||
{
|
{
|
||||||
get;set;
|
get; set;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SizeBase MeasureOverride()
|
public PointBase DesiredPosition
|
||||||
{
|
{
|
||||||
var sizewithSpacing = SizeWithSpacing;
|
get; set;
|
||||||
if (Children?.Count > 0)
|
}
|
||||||
|
|
||||||
|
public PointBase Offset
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SimpleCommand AddParentCommand
|
||||||
|
{
|
||||||
|
get; private set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SimpleCommand AddChildCommand
|
||||||
|
{
|
||||||
|
get; private set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SimpleCommand AddPeerCommand
|
||||||
|
{
|
||||||
|
get; private set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SimpleCommand DeleteCommand
|
||||||
|
{
|
||||||
|
get; private set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SimpleCommand MoveForwardCommand
|
||||||
|
{
|
||||||
|
get; private set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SimpleCommand MoveBackCommand
|
||||||
|
{
|
||||||
|
get; private set;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void BuildMenuOptions()
|
||||||
|
{
|
||||||
|
menuOptions = new ObservableCollection<CinchMenuItem>();
|
||||||
|
CinchMenuItem menuItem = new CinchMenuItem();
|
||||||
|
menuItem.Text = "下级";
|
||||||
|
menuItem.Command = AddChildCommand;
|
||||||
|
menuOptions.Add(menuItem);
|
||||||
|
menuItem = new CinchMenuItem();
|
||||||
|
menuItem.Text = "同级";
|
||||||
|
menuItem.Command = AddPeerCommand;
|
||||||
|
menuOptions.Add(menuItem);
|
||||||
|
//menuItem = new CinchMenuItem();
|
||||||
|
//menuItem.Text = "上级";
|
||||||
|
//menuItem.Command = AddParentCommand;
|
||||||
|
//menuOptions.Add(menuItem);
|
||||||
|
menuItem = new CinchMenuItem();
|
||||||
|
menuItem.Text = "前移";
|
||||||
|
menuItem.Command = MoveForwardCommand;
|
||||||
|
menuOptions.Add(menuItem);
|
||||||
|
menuItem = new CinchMenuItem();
|
||||||
|
menuItem.Text = "后移";
|
||||||
|
menuItem.Command = MoveBackCommand;
|
||||||
|
menuOptions.Add(menuItem);
|
||||||
|
menuItem = new CinchMenuItem();
|
||||||
|
menuItem.Text = "删除";
|
||||||
|
menuItem.Command = DeleteCommand;
|
||||||
|
menuOptions.Add(menuItem);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ExecuteAddChildCommand(object obj)
|
||||||
|
{
|
||||||
|
if (obj is MindNode node)
|
||||||
{
|
{
|
||||||
var childrensizes = Children.Select(p => p.MeasureOverride()).ToArray();
|
|
||||||
sizewithSpacing = new SizeBase(sizewithSpacing.Width + childrensizes.Max(p => p.Width), Math.Max(sizewithSpacing.Height, childrensizes.Sum(p => p.Height)));
|
|
||||||
}
|
}
|
||||||
DesiredSize = sizewithSpacing;
|
else
|
||||||
return DesiredSize;
|
{
|
||||||
|
if (NodeLevel == NodeLevel.Level1)
|
||||||
|
node = new MindNode(Root, NodeLevel.Level2) { Text = "分支主题" };
|
||||||
|
else
|
||||||
|
node = new MindNode(Root, NodeLevel.Level3) { Text = "分支主题" };
|
||||||
|
}
|
||||||
|
AddChild(node);
|
||||||
|
|
||||||
|
LayoutUpdated();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ExecuteAddParentCommand(object obj)
|
||||||
|
{
|
||||||
|
if (Parent is MindNode parent)
|
||||||
|
{
|
||||||
|
if (obj is MindNode node)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (NodeLevel == NodeLevel.Level1)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (NodeLevel == NodeLevel.Level2)
|
||||||
|
node = new MindNode(Root, NodeLevel.Level2) { Text = "分支主题" };
|
||||||
|
else
|
||||||
|
node = new MindNode(Root, NodeLevel.Level3) { Text = "分支主题" };
|
||||||
|
}
|
||||||
|
|
||||||
|
parent.RemoveChild(this);
|
||||||
|
int index = parent.Children.IndexOf(this);
|
||||||
|
parent.AddChild(node, index + 1);
|
||||||
|
node.AddChild(this);
|
||||||
|
|
||||||
|
LayoutUpdated();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ExecuteAddPeerCommand(object obj)
|
||||||
|
{
|
||||||
|
if (Parent is MindNode parent)
|
||||||
|
{
|
||||||
|
if (obj is MindNode node)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (NodeLevel == NodeLevel.Level1)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (NodeLevel == NodeLevel.Level2)
|
||||||
|
node = new MindNode(Root, NodeLevel.Level2) { Text = "分支主题" };
|
||||||
|
else
|
||||||
|
node = new MindNode(Root, NodeLevel.Level3) { Text = "分支主题" };
|
||||||
|
}
|
||||||
|
int index = parent.Children.IndexOf(this);
|
||||||
|
parent.AddChild(node, index + 1);
|
||||||
|
|
||||||
|
LayoutUpdated();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ExecuteMoveBackCommand(object obj)
|
||||||
|
{
|
||||||
|
if (Parent is MindNode parent)
|
||||||
|
{
|
||||||
|
int index = parent.Children.IndexOf(this);
|
||||||
|
if (index < parent.Children.Count - 1)
|
||||||
|
{
|
||||||
|
parent.RemoveChild(this);
|
||||||
|
parent.AddChild(this, index + 1);
|
||||||
|
LayoutUpdated();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ExecuteMoveForwardCommand(object obj)
|
||||||
|
{
|
||||||
|
if (Parent is MindNode parent)
|
||||||
|
{
|
||||||
|
int index = parent.Children.IndexOf(this);
|
||||||
|
if (index > 0)
|
||||||
|
{
|
||||||
|
parent.RemoveChild(this);
|
||||||
|
parent.AddChild(this, index - 1);
|
||||||
|
LayoutUpdated();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ExecuteDeleteCommand(object obj)
|
||||||
|
{
|
||||||
|
if (Parent is MindNode parent)
|
||||||
|
{
|
||||||
|
parent.RemoveChild(this);
|
||||||
|
LayoutUpdated();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddChild(MindNode item, int index = -1)
|
||||||
|
{
|
||||||
|
if (index >= 0)
|
||||||
|
{
|
||||||
|
this.Children.Insert(index, item);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.Children.Add(item);
|
||||||
|
}
|
||||||
|
item.Parent = this;
|
||||||
|
//item.ParentId = this.Id;
|
||||||
|
Root?.DirectAddItemCommand.Execute(item);
|
||||||
|
|
||||||
|
ConnectionViewModel connector = new ConnectionViewModel(Root, this.Connectors.FirstOrDefault(), item.Connectors.FirstOrDefault());
|
||||||
|
connector.ColorViewModel.LineColor = this.ColorViewModel.LineColor;
|
||||||
|
connector.SmoothMargin = 20;
|
||||||
|
connector.SmoothAutoSlope = 0.2;
|
||||||
|
connector.ShapeViewModel.SinkMarker.PathStyle = this.ShapeViewModel.SinkMarker.PathStyle;
|
||||||
|
connector.ShapeViewModel.SinkMarker.SizeStyle = this.ShapeViewModel.SinkMarker.SizeStyle;
|
||||||
|
|
||||||
|
Root?.DirectAddItemCommand.Execute(connector);
|
||||||
|
|
||||||
|
Root?.BringForwardCommand.Execute(new DesignerItemViewModelBase[] { item });
|
||||||
|
|
||||||
|
Root?.ClearSelectedItemsCommand.Execute(new SelectableDesignerItemViewModelBase[] { connector });
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RemoveChild(MindNode item)
|
||||||
|
{
|
||||||
|
item.PropertyChanged -= Item_PropertyChanged;
|
||||||
|
|
||||||
|
this.Children.Remove(item);
|
||||||
|
|
||||||
|
var connectors = Root?.Items.OfType<ConnectionViewModel>().Where(p => p.SinkConnectorInfoFully?.DataItem == item).ToList();
|
||||||
|
|
||||||
|
Root?.DirectRemoveItemCommand.Execute(item);
|
||||||
|
Root?.DirectRemoveItemCommand.Execute(connectors);
|
||||||
|
if (item.Children?.Count > 0)
|
||||||
|
{
|
||||||
|
foreach (var child in item.Children.ToList())
|
||||||
|
{
|
||||||
|
item.RemoveChild(child);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public MindNode GetLevel1Node()
|
||||||
|
{
|
||||||
|
var node = this;
|
||||||
|
while (node.Parent is MindNode mindNode)
|
||||||
|
{
|
||||||
|
node = mindNode;
|
||||||
|
}
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Item_PropertyChanged(object sender, PropertyChangedEventArgs e)
|
||||||
|
{
|
||||||
|
switch (e.PropertyName)
|
||||||
|
{
|
||||||
|
case nameof(IsExpanded):
|
||||||
|
GetLevel1Node()?.LayoutUpdated();
|
||||||
|
break;
|
||||||
|
case nameof(NodeLevel):
|
||||||
|
LevelInit();
|
||||||
|
break;
|
||||||
|
case nameof(Left):
|
||||||
|
{
|
||||||
|
|
||||||
|
if (e is ValuePropertyChangedEventArgs valuePropertyChangedEventArgs)
|
||||||
|
{
|
||||||
|
if (NodeLevel == NodeLevel.Level1)
|
||||||
|
{
|
||||||
|
LayoutUpdated();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UpdateOffsetX((double)valuePropertyChangedEventArgs.OldValue, (double)valuePropertyChangedEventArgs.NewValue);
|
||||||
|
LayoutUpdated();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case nameof(Top):
|
||||||
|
{
|
||||||
|
if (e is ValuePropertyChangedEventArgs valuePropertyChangedEventArgs)
|
||||||
|
{
|
||||||
|
if (NodeLevel == NodeLevel.Level1)
|
||||||
|
{
|
||||||
|
LayoutUpdated();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UpdateOffsetY((double)valuePropertyChangedEventArgs.OldValue, (double)valuePropertyChangedEventArgs.NewValue);
|
||||||
|
LayoutUpdated();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdateOffsetX(double oldvalue, double newvalue)
|
||||||
|
{
|
||||||
|
if (GetLevel1Node()?.LayoutUpdating == true) return;
|
||||||
|
|
||||||
|
Offset += new VectorBase(newvalue - oldvalue, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdateOffsetY(double oldvalue, double newvalue)
|
||||||
|
{
|
||||||
|
if (GetLevel1Node()?.LayoutUpdating == true) return;
|
||||||
|
|
||||||
|
Offset += new VectorBase(0, newvalue - oldvalue);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void LayoutUpdated()
|
public void LayoutUpdated()
|
||||||
{
|
{
|
||||||
var size = MeasureOverride();
|
GetLevel1Node()?.Level1LayoutUpdated();
|
||||||
ArrangeOverride(size);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ArrangeOverride(SizeBase sizeBase)
|
protected void Level1LayoutUpdated()
|
||||||
{
|
{
|
||||||
double left = MiddlePosition.X + ItemWidth / 2 + Spacing;
|
LayoutUpdating = true;
|
||||||
double top = MiddlePosition.Y - sizeBase.Height / 2;
|
var size = MeasureOverride();
|
||||||
|
ArrangeOverride();
|
||||||
|
|
||||||
|
Root.BringToFrontCommand.Execute(new SelectableDesignerItemViewModelBase[] { this });
|
||||||
|
Root?.ReconnectLinksToClosestPorts();
|
||||||
|
|
||||||
|
LayoutUpdating = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected SizeBase MeasureOverride(bool isExpanded = true)
|
||||||
|
{
|
||||||
|
var sizewithSpacing = SizeWithSpacing;
|
||||||
|
if (Children?.Count > 0)
|
||||||
|
{
|
||||||
|
var childrensizes = Children.Select(p => p.MeasureOverride(IsExpanded && isExpanded)).ToArray();
|
||||||
|
sizewithSpacing = new SizeBase(sizewithSpacing.Width + childrensizes.Max(p => p.Width), Math.Max(sizewithSpacing.Height, childrensizes.Sum(p => p.Height)));
|
||||||
|
}
|
||||||
|
DesiredSize = isExpanded ? sizewithSpacing : new SizeBase(0, 0);
|
||||||
|
Visible = isExpanded;
|
||||||
|
var connectors = Root?.Items.OfType<ConnectionViewModel>().Where(p => p.SinkConnectorInfoFully?.DataItem == this).ToList();
|
||||||
|
connectors?.ForEach(p => p.Visible = Visible);
|
||||||
|
return DesiredSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void ArrangeOverride()
|
||||||
|
{
|
||||||
|
double left = MiddlePosition.X + ItemWidth / 2 + Spacing.Width;
|
||||||
|
double top = MiddlePosition.Y - DesiredSize.Height / 2;
|
||||||
if (Children?.Count > 0)
|
if (Children?.Count > 0)
|
||||||
{
|
{
|
||||||
foreach (var child in Children)
|
foreach (var child in Children)
|
||||||
{
|
{
|
||||||
child.Left = left + Spacing;
|
|
||||||
child.Top = top + child.DesiredSize.Height / 2 - child.ItemHeight;
|
child.Left = left + child.Spacing.Width + child.Offset.X;
|
||||||
|
child.Top = top + child.DesiredSize.Height / 2 - child.ItemHeight / 2 + child.Offset.Y;
|
||||||
|
child.DesiredPosition = child.Position;
|
||||||
top += child.DesiredSize.Height;
|
top += child.DesiredSize.Height;
|
||||||
|
|
||||||
child.ArrangeOverride(child.DesiredSize);
|
child.ArrangeOverride();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class MindLevel1Node : MindNode
|
|
||||||
{
|
|
||||||
public MindLevel1Node() : this(null)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public MindLevel1Node(IDiagramViewModel root) : base(root, NodeLevel.Level1)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public MindLevel1Node(IDiagramViewModel root, SelectableItemBase designer) : base(root, designer)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public MindLevel1Node(IDiagramViewModel root, SerializableItem serializableItem, string serializableType) : base(root, serializableItem, serializableType)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
protected override void Init(IDiagramViewModel root)
|
|
||||||
{
|
|
||||||
base.Init(root);
|
|
||||||
|
|
||||||
ItemWidth = 80;
|
|
||||||
ItemHeight = 40;
|
|
||||||
this.ClearConnectors();
|
|
||||||
var port = new FullyCreatedConnectorInfo(root, this, ConnectorOrientation.None, true) { XRatio = 0.5, YRatio = 0.5 };
|
|
||||||
this.AddConnector(port);
|
|
||||||
IsInnerConnector = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public RectangleBase Rectangle
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public class MindLevel2Node : MindNode
|
|
||||||
{
|
|
||||||
public MindLevel2Node() : this(null)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public MindLevel2Node(IDiagramViewModel root) : base(root, NodeLevel.Level2)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public MindLevel2Node(IDiagramViewModel root, SelectableItemBase designer) : base(root, designer)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public MindLevel2Node(IDiagramViewModel root, SerializableItem serializableItem, string serializableType) : base(root, serializableItem, serializableType)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void Init(IDiagramViewModel root)
|
|
||||||
{
|
|
||||||
base.Init(root);
|
|
||||||
|
|
||||||
ItemWidth = 80;
|
|
||||||
ItemHeight = 40;
|
|
||||||
this.ClearConnectors();
|
|
||||||
var port1 = new FullyCreatedConnectorInfo(root, this, ConnectorOrientation.None, true) { XRatio = 0, YRatio = 0.5 };
|
|
||||||
this.AddConnector(port1);
|
|
||||||
var port2 = new FullyCreatedConnectorInfo(root, this, ConnectorOrientation.None, true) { XRatio = 1, YRatio = 0.5 };
|
|
||||||
this.AddConnector(port2);
|
|
||||||
IsInnerConnector = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public PointBase Offset
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class MindLevel3Node : MindNode
|
|
||||||
{
|
|
||||||
public MindLevel3Node() : this(null)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public MindLevel3Node(IDiagramViewModel root) : base(root, NodeLevel.Level2)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public MindLevel3Node(IDiagramViewModel root, SelectableItemBase designer) : base(root, designer)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public MindLevel3Node(IDiagramViewModel root, SerializableItem serializableItem, string serializableType) : base(root, serializableItem, serializableType)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
protected override void Init(IDiagramViewModel root)
|
|
||||||
{
|
|
||||||
base.Init(root);
|
|
||||||
|
|
||||||
ItemWidth = 80;
|
|
||||||
ItemHeight = 40;
|
|
||||||
this.ClearConnectors();
|
|
||||||
var port1 = new FullyCreatedConnectorInfo(root, this, ConnectorOrientation.None, true) { XRatio = 0, YRatio = 1 };
|
|
||||||
this.AddConnector(port1);
|
|
||||||
var port2 = new FullyCreatedConnectorInfo(root, this, ConnectorOrientation.None, true) { XRatio = 1, YRatio = 1 };
|
|
||||||
this.AddConnector(port2);
|
|
||||||
IsInnerConnector = true;
|
|
||||||
}
|
|
||||||
public PointBase Offset
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user