using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Text; using System.Windows; using System.Windows.Media; using AIStudio.Wpf.DiagramDesigner.Geometrys; using AIStudio.Wpf.DiagramDesigner.Models; namespace AIStudio.Wpf.DiagramDesigner { public class BlockItemsContainerInfo : SelectableViewModelBase { public BlockItemsContainerInfo(BlockDesignerItemViewModel dataItem, bool onlyOneChild, List childFlag) : this(null, dataItem, onlyOneChild, childFlag) { } 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) { } public BlockItemsContainerInfo(IDiagramViewModel root, SerializableItem serializableItem, string serializableType) : base(root, serializableItem, serializableType) { } //public override SelectableItemBase GetSerializableObject() //{ // return new ConnectorInfoItemBase(this); //} protected override void Init(IDiagramViewModel root, bool initNew) { base.Init(root, initNew); } protected override void InitNew() { ColorViewModel = new ColorViewModel() { LineWidth = 1, LineColor = new ColorObject() { Color = Color.FromArgb(0xAA, 0x00, 0x00, 0x80) }, FillColor = new ColorObject() { Color = Colors.Transparent }, }; } protected override void LoadDesignerItemViewModel(SelectableItemBase designerbase) { base.LoadDesignerItemViewModel(designerbase); //if (designerbase is ConnectorInfoItemBase designer) //{ // PhysicalConnectorWidth = designer.PhysicalConnectorWidth; // PhysicalConnectorHeight = designer.PhysicalConnectorHeight; // Orientation = designer.Orientation; //} } #region 属性 public bool OnlyOneChild { get; set; } = true; public List ChildFlag { get; set; } = new List(); private double _itemWidth = double.NaN; public double ItemWidth { get { return _itemWidth; } set { if (value <= 0) return; SetProperty(ref _itemWidth, value); } } private double _itemHeight = double.NaN; public double ItemHeight { get { return _itemHeight; } set { if (value <= 0) return; SetProperty(ref _itemHeight, value); } } private double _actualItemWidth; public double ActualItemWidth { get { return _actualItemWidth; } set { SetProperty(ref _actualItemWidth, value); } } private double _actualItemHeight; public double ActualItemHeight { get { return _actualItemHeight; } set { SetProperty(ref _actualItemHeight, value); } } public RectangleBase GetBounds() { var offset = GetOffSetFunc?.Invoke() ?? new Point(0, 0); return new RectangleBase(DataItem.Left + offset.X, DataItem.Top + offset.Y, GetItemWidth(), GetItemHeight()); } public BlockDesignerItemViewModel DataItem { get { return Parent as BlockDesignerItemViewModel; } } private ObservableCollection _children = new ObservableCollection(); public ObservableCollection Children { get { return _children; } set { SetProperty(ref _children, value); } } public List ChildrenContainer { get { return Children?.SelectMany(p => p.Containers)?.ToList(); } } public int ContainerLevel { get { if (DataItem.ParentContainer == null) { return 0; } else { return DataItem.ParentContainer.ContainerLevel + 1; } } } private Func _getOffSetFunc; public Func GetOffSetFunc { get { return _getOffSetFunc; } set { SetProperty(ref _getOffSetFunc, value); } } private bool _beAttachTo; public bool BeAttachTo { get { return _beAttachTo; } set { SetProperty(ref _beAttachTo, value); } } private bool _disableAttachTo; public bool DisableAttachTo { get { return _disableAttachTo; } set { SetProperty(ref _disableAttachTo, value); } } public virtual bool CanAttachTo(BlockDesignerItemViewModel item) => 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; } public double GetItemHeight() { return double.IsNaN(ItemHeight) ? ActualItemHeight : ItemHeight; } public void AddChild(BlockDesignerItemViewModel child) { child.ParentContainer = this; Children.Add(child); } public void RemoveChild(BlockDesignerItemViewModel child) { child.ParentContainer = null; Children.Remove(child); } public List GetAllContain(ObservableCollection children, bool self) { List itemsContainers = new List(); if (self) { itemsContainers.Add(this); } if (children != null) { foreach (var item in children) { if (item.Containers != null) { foreach (var container in item.Containers) { itemsContainers.Add(container); itemsContainers.AddRange(container.GetAllContain(container.Children, false)); } } } } return itemsContainers; } } }