diff --git a/AIStudio.Wpf.Mind/Helpers/MindLayout.cs b/AIStudio.Wpf.Mind/Helpers/MindLayout.cs index 4b2c734..18b1887 100644 --- a/AIStudio.Wpf.Mind/Helpers/MindLayout.cs +++ b/AIStudio.Wpf.Mind/Helpers/MindLayout.cs @@ -150,8 +150,8 @@ namespace AIStudio.Wpf.Mind.Helpers double lefttop = mindNode.MiddlePosition.Y - Math.Min(mindNode.DesiredSize.Height, rights.SumOrDefault(p => p.DesiredSize.Height)) / 2; foreach (var child in rights) { - child.Left = left + child.Spacing.Width + child.Offset.X; - child.Top = lefttop + child.DesiredSize.Height / 2 - child.ItemHeight / 2 + child.Offset.Y; + child.Left = left + child.Spacing.Width + child.Offset.X - child.RootNode.Offset.X; + child.Top = lefttop + child.DesiredSize.Height / 2 - child.ItemHeight / 2 + child.Offset.Y - child.RootNode.Offset.Y; child.DesiredPosition = new PointBase(left + child.Spacing.Width, lefttop + child.DesiredSize.Height / 2 - child.ItemHeight / 2); lefttop += child.DesiredSize.Height; @@ -168,8 +168,8 @@ namespace AIStudio.Wpf.Mind.Helpers double righttop = mindNode.MiddlePosition.Y - Math.Min(mindNode.DesiredSize.Height, lefts.SumOrDefault(p => p.DesiredSize.Height)) / 2; foreach (var child in lefts) { - child.Left = right - child.Spacing.Width - child.ItemWidth + child.Offset.X; - child.Top = righttop + child.DesiredSize.Height / 2 - child.ItemHeight / 2 + child.Offset.Y; + child.Left = right - child.Spacing.Width - child.ItemWidth + child.Offset.X - child.RootNode.Offset.X; + child.Top = righttop + child.DesiredSize.Height / 2 - child.ItemHeight / 2 + child.Offset.Y - child.RootNode.Offset.Y; child.DesiredPosition = new PointBase(right - child.Spacing.Width - child.ItemWidth, righttop + child.DesiredSize.Height / 2 - child.ItemHeight / 2); righttop += child.DesiredSize.Height; @@ -183,6 +183,7 @@ namespace AIStudio.Wpf.Mind.Helpers } mindNode.DesiredPosition = mindNode.Position; + //mindNode.Offset = new PointBase(); } else { @@ -194,8 +195,8 @@ namespace AIStudio.Wpf.Mind.Helpers { foreach (var child in mindNode.Children) { - child.Left = left + child.Spacing.Width + child.Offset.X; - child.Top = top + child.DesiredSize.Height / 2 - child.ItemHeight / 2 + child.Offset.Y; + child.Left = left + child.Spacing.Width + child.Offset.X - child.RootNode.Offset.X; + child.Top = top + child.DesiredSize.Height / 2 - child.ItemHeight / 2 + child.Offset.Y - child.RootNode.Offset.Y; child.DesiredPosition = new PointBase(left + child.Spacing.Width, top + child.DesiredSize.Height / 2 - child.ItemHeight / 2); top += child.DesiredSize.Height; @@ -216,8 +217,8 @@ namespace AIStudio.Wpf.Mind.Helpers { foreach (var child in mindNode.Children) { - child.Left = right - child.Spacing.Width - child.ItemWidth + child.Offset.X; - child.Top = top + child.DesiredSize.Height / 2 - child.ItemHeight / 2 + child.Offset.Y; + child.Left = right - child.Spacing.Width - child.ItemWidth + child.Offset.X - child.RootNode.Offset.X; + child.Top = top + child.DesiredSize.Height / 2 - child.ItemHeight / 2 + child.Offset.Y - child.RootNode.Offset.Y; child.DesiredPosition = new PointBase(right - child.Spacing.Width - child.ItemWidth, top + child.DesiredSize.Height / 2 - child.ItemHeight / 2); top += child.DesiredSize.Height; diff --git a/AIStudio.Wpf.Mind/Models/MindNodeDesignerItem.cs b/AIStudio.Wpf.Mind/Models/MindNodeDesignerItem.cs index a547cb0..d734e1c 100644 --- a/AIStudio.Wpf.Mind/Models/MindNodeDesignerItem.cs +++ b/AIStudio.Wpf.Mind/Models/MindNodeDesignerItem.cs @@ -124,8 +124,8 @@ namespace AIStudio.Wpf.Mind.Models public LinkInfoItem(LinkInfo linkinfo) { - Url = linkinfo.Url; - Text = linkinfo.Text; + Url = linkinfo?.Url; + Text = linkinfo?.Text; } [XmlAttribute] @@ -152,8 +152,8 @@ namespace AIStudio.Wpf.Mind.Models public ImageInfoItem(ImageInfo imageInfo) { - Url = imageInfo.Url; - Text = imageInfo.Text; + Url = imageInfo?.Url; + Text = imageInfo?.Text; } public string Url diff --git a/AIStudio.Wpf.Mind/Models/MindNodeModel.cs b/AIStudio.Wpf.Mind/Models/MindNodeModel.cs index 85450ef..f257682 100644 --- a/AIStudio.Wpf.Mind/Models/MindNodeModel.cs +++ b/AIStudio.Wpf.Mind/Models/MindNodeModel.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel.Design; using System.Windows; using System.Xml.Serialization; using AIStudio.Wpf.DiagramDesigner; @@ -69,8 +70,22 @@ namespace AIStudio.Wpf.Flowchart.Models mindNode.Spacing = Spacing; mindNode.Offset = Offset; mindNode.IsExpanded = IsExpanded; - mindNode.LinkInfo = new LinkInfo(LinkInfoModel?.Url, LinkInfoModel?.Text); - mindNode.ImageInfo = new ImageInfo(ImageInfoModel?.Url, ImageInfoModel?.Text); + if (string.IsNullOrEmpty(LinkInfoModel?.Url) && string.IsNullOrEmpty(LinkInfoModel?.Text)) + { + mindNode.LinkInfo = null; + } + else + { + mindNode.LinkInfo = new LinkInfo(LinkInfoModel?.Url, LinkInfoModel?.Text); + } + if (string.IsNullOrEmpty(ImageInfoModel?.Url) && string.IsNullOrEmpty(ImageInfoModel?.Text)) + { + mindNode.ImageInfo = null; + } + else + { + mindNode.ImageInfo = new ImageInfo(ImageInfoModel?.Url, ImageInfoModel?.Text); + } mindNode.Remark = Remark; mindNode.Priority = Priority; mindNode.Rate = Rate; @@ -82,8 +97,6 @@ namespace AIStudio.Wpf.Flowchart.Models mindNode.InitLayout(false); return mindNode; } - - } public class LinkInfoModel @@ -95,8 +108,8 @@ namespace AIStudio.Wpf.Flowchart.Models public LinkInfoModel(LinkInfo linkinfo) { - Url = linkinfo.Url; - Text = linkinfo.Text; + Url = linkinfo?.Url; + Text = linkinfo?.Text; } public string Url @@ -119,8 +132,8 @@ namespace AIStudio.Wpf.Flowchart.Models public ImageInfoModel(ImageInfo imageInfo) { - Url = imageInfo.Url; - Text = imageInfo.Text; + Url = imageInfo?.Url; + Text = imageInfo?.Text; } public string Url diff --git a/AIStudio.Wpf.Mind/ViewModels/MindDiagramViewModel.cs b/AIStudio.Wpf.Mind/ViewModels/MindDiagramViewModel.cs index ec8e238..3a780d7 100644 --- a/AIStudio.Wpf.Mind/ViewModels/MindDiagramViewModel.cs +++ b/AIStudio.Wpf.Mind/ViewModels/MindDiagramViewModel.cs @@ -751,7 +751,6 @@ namespace AIStudio.Wpf.Mind.ViewModels List parents = new List(); foreach (var item in items.OfType()) { - //item.DesiredPosition = new PointBase(item.DesiredPosition?.X ?? 0 + OffsetX, item.DesiredPosition?.Y ?? 0 + OffsetY); var parent = Items.OfType().FirstOrDefault(p => p.Id == item.ParentId); if (parent != null && !items.Contains(parent)) { @@ -759,7 +758,7 @@ namespace AIStudio.Wpf.Mind.ViewModels } else if (item.ParentId == Guid.Empty) { - item.Offset = new PointBase(OffsetX, OffsetX); + //item.Offset = new PointBase(item.Offset.X - OffsetX, item.Offset.Y - OffsetY); parents.Add(item); item.InitLayout(false); } @@ -1145,12 +1144,15 @@ namespace AIStudio.Wpf.Mind.ViewModels private void Move(MindNode rootitem, double? left, double? top) { + if (left == null) left = (PageSize.Width - rootitem.ItemWidth) / 2; if (top == null) top = (PageSize.Height - rootitem.ItemHeight) / 2; + var offset = rootitem.Offset; rootitem.Left = left.Value; rootitem.Top = top.Value; + rootitem.Offset = offset; rootitem?.LayoutUpdated(); FitViewModel = new FitViewModel() { BoundingRect = rootitem.GetBounds() }; } @@ -1354,7 +1356,7 @@ namespace AIStudio.Wpf.Mind.ViewModels item.IsSelected = false; } }); - } + } } #endregion diff --git a/AIStudio.Wpf.Mind/ViewModels/MindNode.cs b/AIStudio.Wpf.Mind/ViewModels/MindNode.cs index 1ab6a85..dcacfc6 100644 --- a/AIStudio.Wpf.Mind/ViewModels/MindNode.cs +++ b/AIStudio.Wpf.Mind/ViewModels/MindNode.cs @@ -108,7 +108,7 @@ namespace AIStudio.Wpf.Mind.ViewModels public void ThemeChange() { MindThemeHelper.ThemeChange(this, MindThemeModel); - } + } protected override void LoadDesignerItemViewModel(SelectableItemBase designerbase) { @@ -119,8 +119,22 @@ namespace AIStudio.Wpf.Mind.ViewModels Spacing = designer.Spacing; Offset = designer.Offset; IsExpanded = designer.IsExpanded; - LinkInfo = new LinkInfo(designer.LinkInfoItem?.Url, designer.LinkInfoItem?.Text); - ImageInfo = new ImageInfo(designer.ImageInfoItem?.Url, designer.ImageInfoItem?.Text); + if (string.IsNullOrEmpty(designer.LinkInfoItem?.Url) && string.IsNullOrEmpty(designer.LinkInfoItem?.Text)) + { + LinkInfo = null; + } + else + { + LinkInfo = new LinkInfo(designer.LinkInfoItem?.Url, designer.LinkInfoItem?.Text); + } + if (string.IsNullOrEmpty(designer.ImageInfoItem?.Url) && string.IsNullOrEmpty(designer.ImageInfoItem?.Text)) + { + ImageInfo = null; + } + else + { + ImageInfo = new ImageInfo(designer.ImageInfoItem?.Url, designer.ImageInfoItem?.Text); + } Remark = designer.Remark; Priority = designer.Priority; Rate = designer.Rate; @@ -235,44 +249,7 @@ namespace AIStudio.Wpf.Mind.ViewModels public PointBase Offset { - get - { - PointBase point; - if (NodeLevel == 0) - { - if (DesiredPosition == null) - { - point = new PointBase(); - } - else - { - point = new PointBase(Position.X - DesiredPosition.Value.X, Position.Y - DesiredPosition.Value.Y); - } - } - else - { - if (DesiredPosition == null) - { - point = new PointBase(); - } - else - { - point = new PointBase(Position.X - DesiredPosition.Value.X - RootNode.Offset.X, Position.Y - DesiredPosition.Value.Y - RootNode.Offset.Y); - } - } - return point; - } - set - { - if (NodeLevel == 0) - { - DesiredPosition = new PointBase(Position.X - value.X, Position.Y - value.Y); - } - else - { - DesiredPosition = new PointBase(Position.X - value.X - RootNode.Offset.X, Position.Y - value.Y - RootNode.Offset.Y); - } - } + get; set; } private ConnectorOrientation _connectorOrientation = ConnectorOrientation.Left; @@ -547,6 +524,22 @@ namespace AIStudio.Wpf.Mind.ViewModels switch (e.PropertyName) { + case nameof(Left): + { + if (e is ValuePropertyChangedEventArgs valuePropertyChangedEventArgs) + { + UpdateOffsetX((double)valuePropertyChangedEventArgs.OldValue, (double)valuePropertyChangedEventArgs.NewValue); + } + break; + } + case nameof(Top): + { + if (e is ValuePropertyChangedEventArgs valuePropertyChangedEventArgs) + { + UpdateOffsetY((double)valuePropertyChangedEventArgs.OldValue, (double)valuePropertyChangedEventArgs.NewValue); + } + break; + } case nameof(IsExpanded): case nameof(ItemWidth): case nameof(ItemHeight):