From af1cacc846de2b74fb0803cdf0fdfaa1fc22f380 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=89=BE=E7=AB=B9?= Date: Sun, 18 Jun 2023 16:21:18 +0800 Subject: [PATCH] block --- .../Themes/DesignerItem.xaml | 1 + .../Container/BlockItemsContainerInfo.cs | 27 ++- .../BaseViewModel/DiagramViewModel.cs | 6 +- .../BlockContainDesignerItemViewModel.cs | 68 -------- .../BlockContainListDesignerItemViewModel.cs | 59 ------- .../BlockDesignerItemTempLink.cs | 72 -------- .../BlockDesignerItemViewModel.cs | 161 +++++++++++++++++- 7 files changed, 176 insertions(+), 218 deletions(-) delete mode 100644 AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/BlockContainDesignerItemViewModel.cs delete mode 100644 AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/BlockContainListDesignerItemViewModel.cs delete mode 100644 AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/BlockDesignerItemTempLink.cs diff --git a/AIStudio.Wpf.DiagramDesigner/Themes/DesignerItem.xaml b/AIStudio.Wpf.DiagramDesigner/Themes/DesignerItem.xaml index e00c0bc..bf3f8b6 100644 --- a/AIStudio.Wpf.DiagramDesigner/Themes/DesignerItem.xaml +++ b/AIStudio.Wpf.DiagramDesigner/Themes/DesignerItem.xaml @@ -13,6 +13,7 @@ + diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/Container/BlockItemsContainerInfo.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/Container/BlockItemsContainerInfo.cs index 4dbcad6..c4f005c 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/Container/BlockItemsContainerInfo.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/Container/BlockItemsContainerInfo.cs @@ -12,14 +12,16 @@ namespace AIStudio.Wpf.DiagramDesigner { public class BlockItemsContainerInfo : SelectableViewModelBase { - public BlockItemsContainerInfo(BlockDesignerItemViewModel dataItem) : this(null, dataItem) + public BlockItemsContainerInfo(BlockDesignerItemViewModel dataItem, bool onlyOneChild, List childFlag) : this(null, dataItem, onlyOneChild, childFlag) { } - public BlockItemsContainerInfo(IDiagramViewModel root, BlockDesignerItemViewModel dataItem) : base(root) + public BlockItemsContainerInfo(IDiagramViewModel root, BlockDesignerItemViewModel dataItem, bool onlyOneChild, List childFlag) : base(root) { this.Parent = dataItem; + this.OnlyOneChild = onlyOneChild; + this.ChildFlag = childFlag; } public BlockItemsContainerInfo(IDiagramViewModel root, SelectableItemBase designer) : base(root, designer) @@ -65,6 +67,17 @@ namespace AIStudio.Wpf.DiagramDesigner } #region 属性 + public bool OnlyOneChild + { + get; set; + } = true; + + public List ChildFlag + { + get; set; + } = new List(); + + private double _itemWidth = double.NaN; public double ItemWidth { @@ -147,7 +160,7 @@ namespace AIStudio.Wpf.DiagramDesigner } } - public List ChildrenContain + public List ChildrenContainer { get { @@ -155,7 +168,7 @@ namespace AIStudio.Wpf.DiagramDesigner } } - public int ContainLevel + public int ContainerLevel { get { @@ -165,7 +178,7 @@ namespace AIStudio.Wpf.DiagramDesigner } else { - return DataItem.ParentContainer.ContainLevel + 1; + return DataItem.ParentContainer.ContainerLevel + 1; } } } @@ -210,7 +223,7 @@ namespace AIStudio.Wpf.DiagramDesigner } public virtual bool CanAttachTo(BlockDesignerItemViewModel item) - => item != null && item != this.DataItem && !item.IsReadOnly && item.CanContainTo; + => item != null && item != this.DataItem && !item.IsReadOnly && (this.ChildFlag == null || this.ChildFlag.Count == 0 || this.ChildFlag.Contains(item.Flag)); #endregion public double GetItemWidth() @@ -237,7 +250,7 @@ namespace AIStudio.Wpf.DiagramDesigner public List GetAllContain(ObservableCollection children, bool self) { - List itemsContainers= new List (); + List itemsContainers = new List(); if (self) { itemsContainers.Add(this); diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs index 857b46f..fda8b50 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs @@ -3221,7 +3221,7 @@ namespace AIStudio.Wpf.DiagramDesigner { if (port.GetBounds().IntersectsWith(blockDesignerItemViewModel.GetBounds())) //如果两个位置相交 { - var innerport = port.GetAllContain(port.Children, false).Where(p => p.GetBounds().IntersectsWith(blockDesignerItemViewModel.GetBounds())).OrderByDescending(p => p.ContainLevel).FirstOrDefault(); + var innerport = port.GetAllContain(port.Children, false).Where(p => p.GetBounds().IntersectsWith(blockDesignerItemViewModel.GetBounds())).OrderByDescending(p => p.ContainerLevel).FirstOrDefault(); if (innerport != null) { innerport.DataItem.ShowConnectors = true; @@ -3356,7 +3356,7 @@ namespace AIStudio.Wpf.DiagramDesigner { if (port.GetBounds().IntersectsWith(blockDesignerItemTempLink.GetBounds())) //如果两个位置相交 { - var innerport = port.GetAllContain(port.Children, false).Where(p => p.GetBounds().IntersectsWith(blockDesignerItemTempLink.GetBounds())).OrderByDescending(p => p.ContainLevel).FirstOrDefault(); + var innerport = port.GetAllContain(port.Children, false).Where(p => p.GetBounds().IntersectsWith(blockDesignerItemTempLink.GetBounds())).OrderByDescending(p => p.ContainerLevel).FirstOrDefault(); if (innerport != null) { innerport.DataItem.ShowConnectors = true; @@ -3446,7 +3446,7 @@ namespace AIStudio.Wpf.DiagramDesigner var container = FindNearContainerToAttachTo(item); if (container != null) { - (container.DataItem as BlockDesignerItemViewModel).AddChild(item.Items.FirstOrDefault(), container);//待完善 + container.DataItem.AddChild(item.Items.FirstOrDefault(), container);//待完善 container.BeAttachTo = false; container.DisableAttachTo = false; continue; diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/BlockContainDesignerItemViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/BlockContainDesignerItemViewModel.cs deleted file mode 100644 index 6b4c229..0000000 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/BlockContainDesignerItemViewModel.cs +++ /dev/null @@ -1,68 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using AIStudio.Wpf.DiagramDesigner.Models; - -namespace AIStudio.Wpf.DiagramDesigner -{ - public class BlockContainDesignerItemViewModel : BlockDesignerItemViewModel - { - public BlockContainDesignerItemViewModel() - { - } - - public BlockContainDesignerItemViewModel(IDiagramViewModel root) : base(root) - { - } - - public BlockContainDesignerItemViewModel(IDiagramViewModel root, SelectableItemBase designer) : base(root, designer) - { - } - - public BlockContainDesignerItemViewModel(IDiagramViewModel root, SerializableItem serializableItem, string serializableType) : base(root, serializableItem, serializableType) - { - } - - protected override void InitNew() - { - base.InitNew(); - - Containers.Add(new BlockItemsContainerInfo(this.Root, this)); - } - - public override void AddChild(BlockDesignerItemViewModel child, BlockItemsContainerInfo container) - { - if (container == null) - { - container = FirstContainer; - } - var oldchildren = container.Children.FirstOrDefault(); - if (oldchildren != null) - { - this.RemoveChild(oldchildren, container); - } - - Root.Items.Remove(child); - container.AddChild(child); - - base.AddChild(child, container); - } - - public override void RemoveChild(BlockDesignerItemViewModel child, BlockItemsContainerInfo container) - { - if (container == null) - { - container = FirstContainer; - } - Root.Items.Add(child); - container.RemoveChild(child); - - this.RemoveFromSelection(); - child.AddToSelection(true, false); - - base.RemoveChild(child, container); - } - } -} diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/BlockContainListDesignerItemViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/BlockContainListDesignerItemViewModel.cs deleted file mode 100644 index 5a72b64..0000000 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/BlockContainListDesignerItemViewModel.cs +++ /dev/null @@ -1,59 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using AIStudio.Wpf.DiagramDesigner.Models; - -namespace AIStudio.Wpf.DiagramDesigner -{ - public class BlockContainListDesignerItemViewModel : BlockDesignerItemViewModel - { - public BlockContainListDesignerItemViewModel() - { - } - - public BlockContainListDesignerItemViewModel(IDiagramViewModel root) : base(root) - { - } - - public BlockContainListDesignerItemViewModel(IDiagramViewModel root, SelectableItemBase designer) : base(root, designer) - { - } - - public BlockContainListDesignerItemViewModel(IDiagramViewModel root, SerializableItem serializableItem, string serializableType) : base(root, serializableItem, serializableType) - { - } - - protected override void InitNew() - { - base.InitNew(); - - Containers.Add(new BlockItemsContainerInfo(this.Root, this)); - } - - public override void AddChild(BlockDesignerItemViewModel child, BlockItemsContainerInfo container) - { - if (container == null) - { - container = FirstContainer; - } - Root.Items.Remove(child); - container.Children.Add(child); - - base.AddChild(child, container); - } - - public override void RemoveChild(BlockDesignerItemViewModel child, BlockItemsContainerInfo container) - { - if (container == null) - { - container = FirstContainer; - } - Root.Items.Add(child); - container.Children.Remove(child); - - base.RemoveChild(child, container); - } - } -} diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/BlockDesignerItemTempLink.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/BlockDesignerItemTempLink.cs deleted file mode 100644 index 0de46b0..0000000 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/BlockDesignerItemTempLink.cs +++ /dev/null @@ -1,72 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using AIStudio.Wpf.DiagramDesigner.Geometrys; - -namespace AIStudio.Wpf.DiagramDesigner -{ - public class BlockDesignerItemTempLink - { - public List Items - { - get; set; - } = new List(); - - public RectangleBase GetBounds(bool includePorts = false) - { - return Items.FirstOrDefault().GetBounds(); - } - - public List Connectors - { - get - { - List connectors = new List(); - if (Items.FirstOrDefault().TopConnector != null) - { - connectors.Add(Items.FirstOrDefault().TopConnector); - } - if (Items.FirstOrDefault().LeftConnector != null) - { - connectors.Add(Items.FirstOrDefault().LeftConnector); - } - if (Items.LastOrDefault().BottomConnector != null) - { - connectors.Add(Items.LastOrDefault().BottomConnector); - } - if (Items.LastOrDefault().RightConnector != null) - { - connectors.Add(Items.LastOrDefault().RightConnector); - } - return connectors; - } - } - - public static List Build(List blocks) - { - List links = new List(); - foreach (var block in blocks.OrderBy(p => p.BlockLevel).ToList()) - { - bool success = false; - foreach (var link in links) - { - if (link.Items.LastOrDefault() == block.Prev) - { - link.Items.Add(block); - success = true; - } - } - if (success == false) - { - BlockDesignerItemTempLink link = new BlockDesignerItemTempLink(); - link.Items.Add(block); - links.Add(link); - } - } - return links; - } - } -} diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/BlockDesignerItemViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/BlockDesignerItemViewModel.cs index a3ddc97..66fe7fc 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/BlockDesignerItemViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/BlockDesignerItemViewModel.cs @@ -4,6 +4,7 @@ using System.Collections.ObjectModel; using System.Linq; using System.Text; using System.Threading.Tasks; +using AIStudio.Wpf.DiagramDesigner.Geometrys; using AIStudio.Wpf.DiagramDesigner.Models; using static System.Net.Mime.MediaTypeNames; @@ -61,7 +62,7 @@ namespace AIStudio.Wpf.DiagramDesigner await Task.Delay(10); GetLast().AddNext(oldnext); })); - + } } @@ -108,19 +109,41 @@ namespace AIStudio.Wpf.DiagramDesigner public virtual void AddChild(BlockDesignerItemViewModel child, BlockItemsContainerInfo container) { + if (container == null) + { + container = FirstContainer; + } + + if (container.OnlyOneChild) + { + var oldchildren = container.Children.FirstOrDefault(); + if (oldchildren != null) + { + this.RemoveChild(oldchildren, container); + } + } + Root.Items.Remove(child); + container.AddChild(child); + child.RemoveFromSelection(); this.GetRootContainItem.AddToSelection(true, true); System.Windows.Application.Current?.Dispatcher.BeginInvoke(new Action(async () => { await Task.Delay(10); AlignNext(this.Next); - })); + })); } public virtual void RemoveChild(BlockDesignerItemViewModel child, BlockItemsContainerInfo container) { - this.RemoveFromSelection(); + if (container == null) + { + container = FirstContainer; + } + Root.Items.Add(child); + container.RemoveChild(child); + this.RemoveFromSelection(); child.AddToSelection(true, true); System.Windows.Application.Current?.Dispatcher.BeginInvoke(new Action(async () => { @@ -129,6 +152,11 @@ namespace AIStudio.Wpf.DiagramDesigner })); } + public string Flag + { + get; set; + } + public int BlockLevel { get @@ -157,11 +185,6 @@ namespace AIStudio.Wpf.DiagramDesigner get; set; } - public bool CanContainTo - { - get; set; - } = true; - public BlockItemsContainerInfo ParentContainer { get; set; @@ -194,7 +217,7 @@ namespace AIStudio.Wpf.DiagramDesigner { return Containers?.Skip(2)?.FirstOrDefault(); } - } + } public BlockDesignerItemViewModel GetFirst() { @@ -242,4 +265,124 @@ namespace AIStudio.Wpf.DiagramDesigner } } } + + #region 扩展 + public class BlockContainDesignerItemViewModel : BlockDesignerItemViewModel + { + public BlockContainDesignerItemViewModel() + { + } + + public BlockContainDesignerItemViewModel(IDiagramViewModel root) : base(root) + { + } + + public BlockContainDesignerItemViewModel(IDiagramViewModel root, SelectableItemBase designer) : base(root, designer) + { + } + + public BlockContainDesignerItemViewModel(IDiagramViewModel root, SerializableItem serializableItem, string serializableType) : base(root, serializableItem, serializableType) + { + } + + protected override void InitNew() + { + base.InitNew(); + + Containers.Add(new BlockItemsContainerInfo(this.Root, this, true, null)); + } + + } + + public class BlockContainListDesignerItemViewModel : BlockDesignerItemViewModel + { + public BlockContainListDesignerItemViewModel() + { + } + + public BlockContainListDesignerItemViewModel(IDiagramViewModel root) : base(root) + { + } + + public BlockContainListDesignerItemViewModel(IDiagramViewModel root, SelectableItemBase designer) : base(root, designer) + { + } + + public BlockContainListDesignerItemViewModel(IDiagramViewModel root, SerializableItem serializableItem, string serializableType) : base(root, serializableItem, serializableType) + { + } + + protected override void InitNew() + { + base.InitNew(); + + Containers.Add(new BlockItemsContainerInfo(this.Root, this, false, null)); + } + + } + #endregion + + #region 帮助 + public class BlockDesignerItemTempLink + { + public List Items + { + get; set; + } = new List(); + + public RectangleBase GetBounds() + { + return Items.FirstOrDefault().GetBounds(); + } + + public List Connectors + { + get + { + List connectors = new List(); + if (Items.FirstOrDefault().TopConnector != null) + { + connectors.Add(Items.FirstOrDefault().TopConnector); + } + if (Items.FirstOrDefault().LeftConnector != null) + { + connectors.Add(Items.FirstOrDefault().LeftConnector); + } + if (Items.LastOrDefault().BottomConnector != null) + { + connectors.Add(Items.LastOrDefault().BottomConnector); + } + if (Items.LastOrDefault().RightConnector != null) + { + connectors.Add(Items.LastOrDefault().RightConnector); + } + return connectors; + } + } + + public static List Build(List blocks) + { + List links = new List(); + foreach (var block in blocks.OrderBy(p => p.BlockLevel).ToList()) + { + bool success = false; + foreach (var link in links) + { + if (link.Items.LastOrDefault() == block.Prev) + { + link.Items.Add(block); + success = true; + } + } + if (success == false) + { + BlockDesignerItemTempLink link = new BlockDesignerItemTempLink(); + link.Items.Add(block); + links.Add(link); + } + } + return links; + } + } + #endregion }