diff --git a/AIStudio.Wpf.DiagramDesigner/Models/Serializables/BlockDesignerItem.cs b/AIStudio.Wpf.DiagramDesigner/Models/Serializables/BlockDesignerItem.cs new file mode 100644 index 0000000..495dc67 --- /dev/null +++ b/AIStudio.Wpf.DiagramDesigner/Models/Serializables/BlockDesignerItem.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Xml.Serialization; + +namespace AIStudio.Wpf.DiagramDesigner +{ + [Serializable] + [XmlInclude(typeof(BlockDesignerItem))] + public class BlockDesignerItem : DesignerItemBase + { + public BlockDesignerItem() + { + } + + public BlockDesignerItem(BlockDesignerItemViewModel viewmodel) : base(viewmodel) + { + Containers = new List(viewmodel.Containers.Select(p => new BlockItemsContainerInfoItem(p))); + } + + + [XmlArray] + public List Containers + { + get; set; + } + } +} diff --git a/AIStudio.Wpf.DiagramDesigner/Models/Serializables/Container/BlockItemsContainerInfoItem.cs b/AIStudio.Wpf.DiagramDesigner/Models/Serializables/Container/BlockItemsContainerInfoItem.cs new file mode 100644 index 0000000..1e624a7 --- /dev/null +++ b/AIStudio.Wpf.DiagramDesigner/Models/Serializables/Container/BlockItemsContainerInfoItem.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Xml.Serialization; +using Newtonsoft.Json; + +namespace AIStudio.Wpf.DiagramDesigner +{ + + [Serializable] + [XmlInclude(typeof(BlockItemsContainerInfoItem))] + public class BlockItemsContainerInfoItem : SelectableItemBase + { + public BlockItemsContainerInfoItem() + { + } + + public BlockItemsContainerInfoItem(BlockItemsContainerInfo viewmodel) : base(viewmodel) + { + this.OnlyOneChild = viewmodel.OnlyOneChild; + this.ChildFlag = viewmodel.ChildFlag; + this.PhysicalItemWidth = viewmodel.PhysicalItemWidth; + this.PhysicalItemHeight = viewmodel.PhysicalItemHeight; + + Children = new List(viewmodel.Children.Select(p => new BlockDesignerItem(p))); + } + + public bool OnlyOneChild + { + get; set; + } + + public List ChildFlag + { + get; set; + } + + + [JsonProperty(PropertyName = "ItemWidth")] + [XmlAttribute("ItemWidth")] + public double PhysicalItemWidth + { + get; set; + } + + [JsonProperty(PropertyName = "ItemHeight")] + [XmlAttribute("ItemHeight")] + public double PhysicalItemHeight + { + get; set; + } + + [XmlArray] + public List Children + { + get; set; + } + } +} diff --git a/AIStudio.Wpf.DiagramDesigner/Models/Serializables/DesignerItemBase.cs b/AIStudio.Wpf.DiagramDesigner/Models/Serializables/DesignerItemBase.cs index d2436b3..8f271fb 100644 --- a/AIStudio.Wpf.DiagramDesigner/Models/Serializables/DesignerItemBase.cs +++ b/AIStudio.Wpf.DiagramDesigner/Models/Serializables/DesignerItemBase.cs @@ -29,6 +29,8 @@ namespace AIStudio.Wpf.DiagramDesigner this.ScaleY = viewmodel.ScaleY; this.PhysicalItemWidth = viewmodel.PhysicalItemWidth; this.PhysicalItemHeight = viewmodel.PhysicalItemHeight; + this.MinItemWidth = viewmodel.MinItemWidth; + this.MinItemHeight = viewmodel.MinItemHeight; this.Icon = viewmodel.Icon; this.ItemTypeName = viewmodel.GetType().FullName; this.Margin = viewmodel.Margin; @@ -89,6 +91,19 @@ namespace AIStudio.Wpf.DiagramDesigner get; set; } + [XmlAttribute] + public double MinItemWidth + { + get; set; + } + + + [XmlAttribute] + public double MinItemHeight + { + get; set; + } + [XmlAttribute] public string Icon { diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/Container/BlockItemsContainerInfo.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/Container/BlockItemsContainerInfo.cs index a7d3fd7..b9d4b3e 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/Container/BlockItemsContainerInfo.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/Container/BlockItemsContainerInfo.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.ComponentModel; using System.Linq; using System.Text; using System.Windows; @@ -24,20 +25,20 @@ namespace AIStudio.Wpf.DiagramDesigner this.ChildFlag = childFlag; } - public BlockItemsContainerInfo(IDiagramViewModel root, SelectableItemBase designer) : base(root, designer) + public BlockItemsContainerInfo(IDiagramViewModel root, BlockDesignerItemViewModel dataItem, SelectableItemBase designer) : base(root, designer) { - + this.Parent = dataItem; } - public BlockItemsContainerInfo(IDiagramViewModel root, SerializableItem serializableItem, string serializableType) : base(root, serializableItem, serializableType) + public BlockItemsContainerInfo(IDiagramViewModel root, BlockDesignerItemViewModel dataItem, SerializableItem serializableItem, string serializableType) : base(root, serializableItem, serializableType) { - + this.Parent = dataItem; } - //public override SelectableItemBase GetSerializableObject() - //{ - // return new ConnectorInfoItemBase(this); - //} + public override SelectableItemBase GetSerializableObject() + { + return new BlockItemsContainerInfoItem(this); + } protected override void Init(IDiagramViewModel root, bool initNew) { @@ -58,15 +59,32 @@ namespace AIStudio.Wpf.DiagramDesigner { base.LoadDesignerItemViewModel(designerbase); - //if (designerbase is ConnectorInfoItemBase designer) - //{ - // PhysicalConnectorWidth = designer.PhysicalConnectorWidth; - // PhysicalConnectorHeight = designer.PhysicalConnectorHeight; - // Orientation = designer.Orientation; - //} + if (designerbase is BlockItemsContainerInfoItem designer) + { + this.OnlyOneChild = designer.OnlyOneChild; + this.ChildFlag = designer.ChildFlag; + this.PhysicalItemWidth = designer.PhysicalItemWidth; + this.PhysicalItemHeight = designer.PhysicalItemHeight; + if (designer.Children != null) + { + foreach (var child in designer.Children) + { + BlockDesignerItemViewModel fullyCreatedConnectorInfo = new BlockDesignerItemViewModel(this.Root, child); + InsertChild(fullyCreatedConnectorInfo); + } + } + } } #region 属性 + public BlockDesignerItemViewModel DataItem + { + get + { + return Parent as BlockDesignerItemViewModel; + } + } + public bool OnlyOneChild { get; set; @@ -106,6 +124,34 @@ namespace AIStudio.Wpf.DiagramDesigner } } + [DisplayName("ItemWidth(mm)")] + [Browsable(true)] + public double PhysicalItemWidth + { + get + { + return ScreenHelper.WidthToMm(ItemWidth); + } + set + { + ItemWidth = ScreenHelper.MmToWidth(value); + } + } + + [DisplayName("ItemHeight(mm)")] + [Browsable(true)] + public double PhysicalItemHeight + { + get + { + return ScreenHelper.WidthToMm(ItemHeight); + } + set + { + ItemHeight = ScreenHelper.MmToWidth(value); + } + } + private double _actualItemWidth; public double ActualItemWidth { @@ -130,33 +176,7 @@ namespace AIStudio.Wpf.DiagramDesigner { SetProperty(ref _actualItemHeight, value); } - } - - public RectangleBase GetBounds() - { - var offset = GetOffSetFunc?.Invoke() ?? new Point(0, 0); - - var containBound = new RectangleBase(DataItem.Left + offset.X, DataItem.Top + offset.Y, GetItemWidth(), GetItemHeight()); - double height = 0; - foreach (var child in Children) - { - child.Left = DataItem.Left + offset.X; - child.Top = DataItem.Top + offset.Y + height; - height += child.GetItemHeight(); - } - - return containBound; - } - - - - public BlockDesignerItemViewModel DataItem - { - get - { - return Parent as BlockDesignerItemViewModel; - } - } + } private ObservableCollection _children = new ObservableCollection(); public ObservableCollection Children @@ -171,14 +191,6 @@ namespace AIStudio.Wpf.DiagramDesigner } } - public List ChildrenContainer - { - get - { - return Children.SelectMany(p => p.Containers)?.ToList(); - } - } - public int ContainerLevel { get @@ -237,6 +249,7 @@ namespace AIStudio.Wpf.DiagramDesigner => item != null && item != this.DataItem && !item.IsReadOnly && (this.ChildFlag == null || this.ChildFlag.Count == 0 || this.ChildFlag.Contains(item.Flag)); #endregion + public double GetItemWidth() { return double.IsNaN(ItemWidth) ? ActualItemWidth : ItemWidth; @@ -247,6 +260,12 @@ namespace AIStudio.Wpf.DiagramDesigner return double.IsNaN(ItemHeight) ? ActualItemHeight : ItemHeight; } + public void InsertChild(BlockDesignerItemViewModel child) + { + child.ParentContainer = this; + Children.Add(child); + } + public void InsertChild(BlockDesignerItemViewModel child, int index) { child.ParentContainer = this; @@ -282,5 +301,21 @@ namespace AIStudio.Wpf.DiagramDesigner } return itemsContainers; } + + public RectangleBase GetBounds() + { + var offset = GetOffSetFunc?.Invoke() ?? new Point(0, 0); + + var containBound = new RectangleBase(DataItem.Left + offset.X, DataItem.Top + offset.Y, GetItemWidth(), GetItemHeight()); + double height = 0; + foreach (var child in Children) + { + child.Left = DataItem.Left + offset.X; + child.Top = DataItem.Top + offset.Y + height; + height += child.GetItemHeight(); + } + + return containBound; + } } } diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DesignerItemViewModelBase.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DesignerItemViewModelBase.cs index 3fb0546..55fd508 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DesignerItemViewModelBase.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DesignerItemViewModelBase.cs @@ -59,6 +59,8 @@ namespace AIStudio.Wpf.DiagramDesigner this.ScaleY = designer.ScaleY; this.PhysicalItemWidth = designer.PhysicalItemWidth; this.PhysicalItemHeight = designer.PhysicalItemHeight; + this.MinItemWidth = designer.MinItemWidth; + this.MinItemHeight = designer.MinItemHeight; this.Icon = designer.Icon; this.CornerRadius = designer.CornerRadius; this.BorderThickness = designer.BorderThickness; diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/BlockViewModel/BlockDesignerItemViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/BlockViewModel/BlockDesignerItemViewModel.cs index e224dde..d13869c 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/BlockViewModel/BlockDesignerItemViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/BlockViewModel/BlockDesignerItemViewModel.cs @@ -28,15 +28,56 @@ namespace AIStudio.Wpf.DiagramDesigner { } + + public override SelectableItemBase GetSerializableObject() + { + return new BlockDesignerItem(this); + } + protected override void InitNew() { ItemWidth = double.NaN; ItemHeight = double.NaN; AddConnector(new BlockConnectorInfo(this.Root, this, ConnectorOrientation.Top)); AddConnector(new BlockConnectorInfo(this.Root, this, ConnectorOrientation.Bottom)); + + } + + protected override void Init(IDiagramViewModel root, bool initNew) + { + base.Init(root, initNew); + IsReadOnlyText = true; } + protected override void LoadDesignerItemViewModel(SelectableItemBase designerbase) + { + base.LoadDesignerItemViewModel(designerbase); + + if (designerbase is BlockDesignerItem designer) + { + if (designer.Connectors != null) + { + ClearConnectors(); + foreach (var connector in designer.Connectors) + { + BlockConnectorInfo fullyCreatedConnectorInfo = new BlockConnectorInfo(this.Root, this, connector); + AddConnector(fullyCreatedConnectorInfo); + } + } + + if (designer.Containers != null) + { + ClearContainers(); + foreach (var container in designer.Containers) + { + BlockItemsContainerInfo blockitemsContainerInfo = new BlockItemsContainerInfo(this.Root, this, container); + AddContainer(blockitemsContainerInfo); + } + } + } + } + public void AddNext(BlockDesignerItemViewModel next, bool first = true) { if (this.Next == next)