Files
aistudio-wpf-diagram/AIStudio.Wpf.Mind/ViewModels/MindNode.cs

668 lines
20 KiB
C#
Raw Normal View History

2023-02-12 21:30:16 +08:00
using System;
using System.Collections.Generic;
2023-02-19 21:38:28 +08:00
using System.Collections.ObjectModel;
2023-02-12 21:30:16 +08:00
using System.ComponentModel;
2023-02-19 21:38:28 +08:00
using System.IO;
2023-02-14 18:58:26 +08:00
using System.Linq;
2023-03-18 22:50:00 +08:00
using System.Security.Policy;
2023-02-12 21:30:16 +08:00
using System.Text;
2023-02-21 19:47:46 +08:00
using System.Windows;
2023-02-19 22:56:47 +08:00
using System.Windows.Controls;
2023-02-19 21:38:28 +08:00
using System.Windows.Media;
2023-03-01 19:28:06 +08:00
using System.Xml.Linq;
2023-02-12 21:30:16 +08:00
using AIStudio.Wpf.DiagramDesigner;
2023-02-19 21:38:28 +08:00
using AIStudio.Wpf.DiagramDesigner.Algorithms;
2023-02-14 18:58:26 +08:00
using AIStudio.Wpf.DiagramDesigner.Geometrys;
2023-02-22 19:50:00 +08:00
using AIStudio.Wpf.DiagramDesigner.Helpers;
2023-02-12 21:30:16 +08:00
using AIStudio.Wpf.DiagramDesigner.Models;
2023-03-01 19:28:06 +08:00
using AIStudio.Wpf.DiagramModels;
using AIStudio.Wpf.DiagramModels.ViewModels;
using AIStudio.Wpf.Flowchart.Models;
2023-02-21 19:47:46 +08:00
using AIStudio.Wpf.Mind.Helpers;
2023-03-01 19:28:06 +08:00
using AIStudio.Wpf.Mind.Models;
2023-02-12 21:30:16 +08:00
2023-03-05 21:30:53 +08:00
2023-02-12 21:30:16 +08:00
namespace AIStudio.Wpf.Mind.ViewModels
{
2023-03-01 19:28:06 +08:00
public class MindNode : DiagramItemViewModel
2023-02-12 21:30:16 +08:00
{
2023-03-05 23:22:34 +08:00
public MindNode() : this(null)
2023-02-12 21:30:16 +08:00
{
}
2023-03-05 23:22:34 +08:00
public MindNode(IDiagramViewModel root) : base(root)
2023-02-12 21:30:16 +08:00
{
2023-02-21 19:47:46 +08:00
2023-02-12 21:30:16 +08:00
}
public MindNode(IDiagramViewModel root, SelectableItemBase designer) : base(root, designer)
{
2023-03-05 21:30:53 +08:00
InitLayout(false);
2023-02-12 21:30:16 +08:00
}
public MindNode(IDiagramViewModel root, SerializableItem serializableItem, string serializableType) : base(root, serializableItem, serializableType)
{
2023-03-05 21:30:53 +08:00
InitLayout(false);
2023-02-12 21:30:16 +08:00
}
2023-03-01 19:28:06 +08:00
public override SelectableItemBase GetSerializableObject()
{
return new MindNodeDesignerItem(this);
}
2023-02-19 21:38:28 +08:00
protected override void Init(IDiagramViewModel root)
{
base.Init(root);
EnabledForConnection = false;
2023-03-07 22:59:27 +08:00
AlwayForResized = true;
2023-03-11 12:40:44 +08:00
CustomText = true;
2023-02-19 21:38:28 +08:00
2023-03-05 21:30:53 +08:00
AddChildCommand = (Root as IMindDiagramViewModel)?.AddChildCommand;
AddParentCommand = (Root as IMindDiagramViewModel)?.AddParentCommand;
2023-03-11 22:27:23 +08:00
AddPearCommand = (Root as IMindDiagramViewModel)?.AddPearCommand;
2023-03-08 23:02:50 +08:00
DeleteCommand = (Root as IMindDiagramViewModel)?.DeleteCommand;
2023-03-05 21:30:53 +08:00
MoveForwardCommand = (Root as IMindDiagramViewModel)?.MoveForwardCommand;
MoveBackCommand = (Root as IMindDiagramViewModel)?.MoveBackCommand;
2023-02-19 21:38:28 +08:00
BuildMenuOptions();
2023-03-18 21:44:58 +08:00
Tags = new ObservableCollection<string>();
2023-03-19 12:38:08 +08:00
LinkInfo = new LinkInfo();
ImageInfo = new ImageInfo();
2023-02-19 21:38:28 +08:00
}
2023-03-05 23:22:34 +08:00
public void InitLayout(bool initAppearance)
2023-02-21 19:47:46 +08:00
{
var layout = GlobalType.AllTypes.Where(p => typeof(IMindLayout).IsAssignableFrom(p)).FirstOrDefault(p => p.Name == MindType.ToString() + "Layout");
MindLayout = layout != null ? (System.Activator.CreateInstance(layout) as IMindLayout) : new MindLayout();
2023-03-05 21:30:53 +08:00
2023-03-10 12:09:13 +08:00
IsInnerConnector = true;
2023-03-11 22:27:23 +08:00
MindLayout.Appearance(this, MindThemeModel, initAppearance);
2023-03-19 23:26:14 +08:00
var xx = GlobalType.AllTypes;
2023-03-05 23:22:34 +08:00
this.PropertyChanged -= this.Item_PropertyChanged;
2023-03-05 21:30:53 +08:00
this.PropertyChanged += this.Item_PropertyChanged;
2023-02-19 21:38:28 +08:00
}
2023-03-11 22:27:23 +08:00
public void ThemeChange()
{
MindThemeHelper.ThemeChange(this, MindThemeModel);
}
2023-03-01 19:28:06 +08:00
protected override void LoadDesignerItemViewModel(SelectableItemBase designerbase)
{
base.LoadDesignerItemViewModel(designerbase);
if (designerbase is MindNodeDesignerItem designer)
{
Spacing = designer.Spacing;
Offset = designer.Offset;
IsExpanded = designer.IsExpanded;
}
}
public override DiagramNode ToDiagram()
{
var mindNodeModel = new MindNodeModel();
mindNodeModel.Spacing = Spacing;
mindNodeModel.Offset = Offset;
mindNodeModel.IsExpanded = IsExpanded;
return mindNodeModel;
}
2023-02-19 22:56:47 +08:00
#region
2023-02-21 19:47:46 +08:00
public IMindLayout MindLayout
{
2023-03-05 21:30:53 +08:00
get; set;
2023-02-21 19:47:46 +08:00
}
2023-03-05 23:22:34 +08:00
public MindNode ParentNode
2023-02-12 21:30:16 +08:00
{
2023-02-19 22:56:47 +08:00
get
{
2023-03-05 23:22:34 +08:00
return Parent as MindNode;
2023-02-19 22:56:47 +08:00
}
2023-03-05 23:22:34 +08:00
}
public int NodeLevel
{
get
2023-02-19 22:56:47 +08:00
{
2023-03-05 23:22:34 +08:00
if (ParentNode == null)
{
return 0;
}
else
{
return ParentNode.NodeLevel + 1;
}
2023-02-19 22:56:47 +08:00
}
2023-02-12 21:30:16 +08:00
}
2023-03-05 23:22:34 +08:00
2023-02-21 19:47:46 +08:00
public MindType MindType
{
get
{
2023-03-05 23:22:34 +08:00
return (Root as IMindDiagramViewModel)?.MindType ?? MindType.Mind;
2023-02-21 19:47:46 +08:00
}
2023-03-05 21:30:53 +08:00
}
2023-02-21 19:47:46 +08:00
2023-03-11 22:27:23 +08:00
public MindThemeModel MindThemeModel
{
get
{
2023-03-20 23:01:38 +08:00
return (Root as IMindDiagramViewModel)?.MindThemeModel ?? MindThemeHelper.GetTheme("天空蓝");
2023-03-11 22:27:23 +08:00
}
}
2023-02-19 21:38:28 +08:00
private bool _isExpanded = true;
public bool IsExpanded
{
get
{
return _isExpanded;
}
set
{
SetProperty(ref _isExpanded, value);
}
2023-02-20 23:01:26 +08:00
}
2023-02-19 21:38:28 +08:00
public SizeBase Spacing
2023-02-13 22:50:50 +08:00
{
get; set;
2023-02-19 21:38:28 +08:00
} = new SizeBase(15, 15);
2023-02-13 22:50:50 +08:00
2023-02-20 23:01:26 +08:00
private ObservableCollection<MindNode> _children = new ObservableCollection<MindNode>();
public ObservableCollection<MindNode> Children
2023-02-13 22:50:50 +08:00
{
2023-02-20 23:01:26 +08:00
get
{
return _children;
}
set
{
SetProperty(ref _children, value);
}
}
2023-02-16 19:21:37 +08:00
public SizeBase SizeWithSpacing
{
get
{
2023-02-19 21:38:28 +08:00
return this.Size.Add(Spacing.Width * 2, Spacing.Height * 2);
2023-02-16 19:21:37 +08:00
}
}
2023-02-16 23:02:43 +08:00
public SizeBase DesiredSize
{
2023-02-19 21:38:28 +08:00
get; set;
2023-02-16 23:02:43 +08:00
}
2023-02-19 21:38:28 +08:00
public PointBase DesiredPosition
2023-02-16 19:21:37 +08:00
{
2023-02-19 21:38:28 +08:00
get; set;
2023-02-13 22:50:50 +08:00
}
2023-02-14 18:58:26 +08:00
2023-02-19 21:38:28 +08:00
public PointBase Offset
2023-02-16 19:21:37 +08:00
{
2023-02-19 21:38:28 +08:00
get; set;
2023-02-16 23:02:43 +08:00
}
2023-02-14 18:58:26 +08:00
2023-02-21 23:23:03 +08:00
private ConnectorOrientation _connectorOrientation = ConnectorOrientation.Left;
public ConnectorOrientation ConnectorOrientation
2023-02-20 23:01:26 +08:00
{
get
{
2023-02-21 23:23:03 +08:00
return _connectorOrientation;
2023-02-20 23:01:26 +08:00
}
set
{
2023-02-21 23:23:03 +08:00
SetProperty(ref _connectorOrientation, value);
2023-02-20 23:01:26 +08:00
}
}
2023-02-21 19:47:46 +08:00
public bool LayoutUpdating
{
2023-03-05 21:30:53 +08:00
get; set;
2023-02-21 19:47:46 +08:00
}
2023-02-19 22:56:47 +08:00
#endregion
2023-02-19 23:20:02 +08:00
#region
2023-03-19 12:38:08 +08:00
private LinkInfo _linkInfo;
2023-02-19 23:20:02 +08:00
public LinkInfo LinkInfo
{
get
{
return _linkInfo;
}
set
{
2023-03-18 22:50:00 +08:00
if (_linkInfo != null)
{
_linkInfo.PropertyChanged -= Item_PropertyChanged;
}
2023-02-19 23:20:02 +08:00
SetProperty(ref _linkInfo, value);
2023-03-18 22:50:00 +08:00
if (_linkInfo != null)
{
_linkInfo.PropertyChanged += Item_PropertyChanged; ;
}
2023-02-19 23:20:02 +08:00
}
}
2023-03-19 12:38:08 +08:00
private ImageInfo _imageInfo;
2023-02-19 23:20:02 +08:00
public ImageInfo ImageInfo
{
get
{
return _imageInfo;
}
set
{
2023-03-18 22:50:00 +08:00
if (_imageInfo != null)
{
_imageInfo.PropertyChanged -= Item_PropertyChanged;
}
2023-02-19 23:20:02 +08:00
SetProperty(ref _imageInfo, value);
2023-03-18 22:50:00 +08:00
if (_imageInfo != null)
{
_imageInfo.PropertyChanged += Item_PropertyChanged;
}
2023-02-19 23:20:02 +08:00
}
}
private string _remark;
public string Remark
{
get
{
return _remark;
}
set
{
SetProperty(ref _remark, value);
}
}
2023-03-15 19:35:53 +08:00
private double? _priority;
public double? Priority
2023-02-19 23:20:02 +08:00
{
get
{
2023-03-13 19:44:30 +08:00
return _priority;
2023-02-19 23:20:02 +08:00
}
set
{
2023-03-13 19:44:30 +08:00
SetProperty(ref _priority, value);
2023-02-19 23:20:02 +08:00
}
}
2023-03-15 19:35:53 +08:00
private double? _rate;
public double? Rate
2023-02-19 23:20:02 +08:00
{
get
{
2023-03-13 19:44:30 +08:00
return _rate;
2023-02-19 23:20:02 +08:00
}
set
{
2023-03-13 19:44:30 +08:00
SetProperty(ref _rate, value);
2023-02-19 23:20:02 +08:00
}
}
2023-02-20 23:01:26 +08:00
private ObservableCollection<string> _tags;
public ObservableCollection<string> Tags
2023-02-19 23:20:02 +08:00
{
get
{
return _tags;
}
set
{
2023-03-18 21:44:58 +08:00
if (_tags != null)
{
_tags.CollectionChanged -= _tags_CollectionChanged;
}
2023-02-19 23:20:02 +08:00
SetProperty(ref _tags, value);
2023-03-18 21:44:58 +08:00
if (_tags != null)
{
_tags.CollectionChanged += _tags_CollectionChanged;
}
}
}
private void _tags_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
if (e.NewItems != null)
{
foreach (var item in e.NewItems.OfType<string>())
{
var width = GetTextDisplayWidthHelper.GetTextDisplayWidth(item, new FontFamily(FontViewModel.FontFamily), FontViewModel.FontStyle, FontViewModel.FontWeight, FontViewModel.FontStretch, 12) + 6;
ItemWidth += width;
}
}
if (e.OldItems != null)
{
foreach (var item in e.OldItems.OfType<string>())
{
var width = GetTextDisplayWidthHelper.GetTextDisplayWidth(item, new FontFamily(FontViewModel.FontFamily), FontViewModel.FontStyle, FontViewModel.FontWeight, FontViewModel.FontStretch, 12) + 6;
ItemWidth -= width;
}
2023-02-19 23:20:02 +08:00
}
}
#endregion
2023-02-19 22:56:47 +08:00
#region
2023-02-19 21:38:28 +08:00
public SimpleCommand AddParentCommand
2023-02-16 23:02:43 +08:00
{
2023-02-19 21:38:28 +08:00
get; private set;
2023-02-16 19:21:37 +08:00
}
2023-02-12 21:30:16 +08:00
2023-02-19 21:38:28 +08:00
public SimpleCommand AddChildCommand
2023-02-12 21:30:16 +08:00
{
2023-02-19 21:38:28 +08:00
get; private set;
}
2023-02-12 21:30:16 +08:00
2023-03-11 22:27:23 +08:00
public SimpleCommand AddPearCommand
2023-02-19 21:38:28 +08:00
{
get; private set;
2023-02-12 21:30:16 +08:00
}
2023-03-08 23:02:50 +08:00
public SimpleCommand DeleteCommand
2023-02-12 21:30:16 +08:00
{
2023-02-19 21:38:28 +08:00
get; private set;
}
2023-02-12 21:30:16 +08:00
2023-02-19 21:38:28 +08:00
public SimpleCommand MoveForwardCommand
{
get; private set;
2023-02-12 21:30:16 +08:00
}
2023-02-19 21:38:28 +08:00
public SimpleCommand MoveBackCommand
2023-02-12 21:30:16 +08:00
{
2023-02-19 21:38:28 +08:00
get; private set;
}
2023-02-19 22:56:47 +08:00
#endregion
2023-02-12 21:30:16 +08:00
2023-02-19 22:56:47 +08:00
#region
2023-02-19 21:38:28 +08:00
private void BuildMenuOptions()
{
menuOptions = new ObservableCollection<CinchMenuItem>();
CinchMenuItem menuItem = new CinchMenuItem();
menuItem.Text = "下级";
menuItem.Command = AddChildCommand;
2023-03-05 21:30:53 +08:00
menuItem.CommandParameter = this;
2023-02-19 21:38:28 +08:00
menuOptions.Add(menuItem);
menuItem = new CinchMenuItem();
menuItem.Text = "同级";
2023-03-11 22:27:23 +08:00
menuItem.Command = AddPearCommand;
2023-03-05 21:30:53 +08:00
menuItem.CommandParameter = this;
2023-02-19 21:38:28 +08:00
menuOptions.Add(menuItem);
2023-02-19 22:56:47 +08:00
menuItem = new CinchMenuItem();
menuItem.Text = "上级";
menuItem.Command = AddParentCommand;
2023-03-05 21:30:53 +08:00
menuItem.CommandParameter = this;
2023-02-19 22:56:47 +08:00
menuOptions.Add(menuItem);
2023-02-19 21:38:28 +08:00
menuItem = new CinchMenuItem();
menuItem.Text = "前移";
menuItem.Command = MoveForwardCommand;
2023-03-05 21:30:53 +08:00
menuItem.CommandParameter = this;
2023-02-19 21:38:28 +08:00
menuOptions.Add(menuItem);
menuItem = new CinchMenuItem();
menuItem.Text = "后移";
menuItem.Command = MoveBackCommand;
2023-03-05 21:30:53 +08:00
menuItem.CommandParameter = this;
2023-02-19 21:38:28 +08:00
menuOptions.Add(menuItem);
menuItem = new CinchMenuItem();
menuItem.Text = "删除";
2023-03-08 23:02:50 +08:00
menuItem.Command = DeleteCommand;
2023-03-05 21:30:53 +08:00
menuItem.CommandParameter = this;
2023-02-19 21:38:28 +08:00
menuOptions.Add(menuItem);
2023-02-12 21:30:16 +08:00
}
2023-02-19 22:56:47 +08:00
#endregion
2023-02-12 21:30:16 +08:00
2023-03-05 21:30:53 +08:00
#region
2023-02-19 21:38:28 +08:00
public void AddChild(MindNode item, int index = -1)
2023-02-12 21:30:16 +08:00
{
2023-02-19 21:38:28 +08:00
if (index >= 0)
{
this.Children.Insert(index, item);
}
else
{
this.Children.Add(item);
}
item.Parent = this;
2023-03-07 22:59:27 +08:00
item.ParentId = this.Id;
2023-03-05 23:22:34 +08:00
item.InitLayout(true);
ConnectionViewModel connector = MindLayout?.GetOrSetConnectionViewModel(this, item);
2023-03-05 21:30:53 +08:00
Root?.DirectAddItemCommand.Execute(new SelectableDesignerItemViewModelBase[] { item, connector });
connector.ZIndex = -1;
2023-03-07 22:59:27 +08:00
connector.IsSelected = false;
item.IsSelected = false;
2023-03-05 21:30:53 +08:00
this.IsSelected = true;
2023-02-12 21:30:16 +08:00
}
2023-02-19 22:56:47 +08:00
public void RemoveChild(MindNode item, bool removeall = false)
2023-02-12 21:30:16 +08:00
{
2023-02-19 21:38:28 +08:00
item.PropertyChanged -= Item_PropertyChanged;
this.Children.Remove(item);
var connectors = Root?.Items.OfType<ConnectionViewModel>().Where(p => p.SinkConnectorInfoFully?.DataItem == item).ToList();
2023-02-12 21:30:16 +08:00
2023-02-19 21:38:28 +08:00
Root?.DirectRemoveItemCommand.Execute(item);
Root?.DirectRemoveItemCommand.Execute(connectors);
2023-02-19 22:56:47 +08:00
if (removeall)
2023-02-19 21:38:28 +08:00
{
2023-02-19 22:56:47 +08:00
if (item.Children?.Count > 0)
2023-02-19 21:38:28 +08:00
{
2023-02-19 22:56:47 +08:00
foreach (var child in item.Children.ToList())
{
item.RemoveChild(child);
}
2023-02-19 21:38:28 +08:00
}
}
2023-02-12 21:30:16 +08:00
}
2023-03-05 23:22:34 +08:00
public void InitConnectLayout()
{
var connector = Root?.Items.OfType<ConnectionViewModel>().Where(p => p.IsFullConnection).FirstOrDefault(p => p.SinkConnectorInfoFully.DataItem == this);
if (connector != null)
{
2023-03-10 12:09:13 +08:00
MindLayout?.GetOrSetConnectionViewModel(connector.SourceConnectorInfo.DataItem as MindNode, connector.SinkConnectorInfoFully.DataItem as MindNode, connector);
2023-03-05 23:22:34 +08:00
}
}
2023-02-19 22:56:47 +08:00
#endregion
2023-02-16 19:21:37 +08:00
2023-02-19 21:38:28 +08:00
private void Item_PropertyChanged(object sender, PropertyChangedEventArgs e)
2023-02-14 18:58:26 +08:00
{
2023-02-21 23:23:03 +08:00
if (GetLevel1Node()?.LayoutUpdating == true) return;
2023-02-19 21:38:28 +08:00
switch (e.PropertyName)
{
case nameof(IsExpanded):
2023-02-19 22:56:47 +08:00
case nameof(ItemWidth):
case nameof(ItemHeight):
2023-02-21 19:47:46 +08:00
{
LayoutUpdated();
break;
}
case nameof(NodeLevel):
2023-03-11 22:27:23 +08:00
MindLayout?.Appearance(this);
2023-02-21 19:47:46 +08:00
break;
2023-02-19 21:38:28 +08:00
case nameof(Left):
{
if (e is ValuePropertyChangedEventArgs valuePropertyChangedEventArgs)
{
2023-03-07 22:59:27 +08:00
if (NodeLevel > 0 && IsSelected)
2023-02-19 21:38:28 +08:00
{
UpdateOffsetX((double)valuePropertyChangedEventArgs.OldValue, (double)valuePropertyChangedEventArgs.NewValue);
}
}
break;
}
case nameof(Top):
{
if (e is ValuePropertyChangedEventArgs valuePropertyChangedEventArgs)
{
2023-03-07 22:59:27 +08:00
if (NodeLevel > 0 && IsSelected)
2023-02-19 21:38:28 +08:00
{
UpdateOffsetY((double)valuePropertyChangedEventArgs.OldValue, (double)valuePropertyChangedEventArgs.NewValue);
}
}
break;
}
2023-02-22 19:50:00 +08:00
case nameof(Text):
{
ItemWidth = Math.Max(ItemWidth, GetTextDisplayWidthHelper.GetTextDisplayWidth(Text, new FontFamily(FontViewModel.FontFamily), FontViewModel.FontStyle, FontViewModel.FontWeight, FontViewModel.FontStretch, FontViewModel.FontSize) + 30);
break;
}
2023-03-18 21:44:58 +08:00
case nameof(Rate):
2023-03-18 22:50:00 +08:00
case nameof(Priority):
2023-03-18 21:44:58 +08:00
case nameof(Remark):
2023-03-18 22:50:00 +08:00
case nameof(LinkInfo.Link):
2023-03-18 21:44:58 +08:00
{
if (e is ValuePropertyChangedEventArgs valuePropertyChangedEventArgs)
{
2023-03-18 22:50:00 +08:00
if (string.IsNullOrEmpty(valuePropertyChangedEventArgs.OldValue?.ToString()) && !string.IsNullOrEmpty(valuePropertyChangedEventArgs.NewValue?.ToString()))
2023-03-18 21:44:58 +08:00
{
ItemWidth += 24;
}
2023-03-18 22:50:00 +08:00
else if (!string.IsNullOrEmpty(valuePropertyChangedEventArgs.OldValue?.ToString()) && string.IsNullOrEmpty(valuePropertyChangedEventArgs.NewValue?.ToString()))
2023-03-18 21:44:58 +08:00
{
ItemWidth -= 24;
}
}
break;
}
2023-03-18 22:50:00 +08:00
case nameof(ImageInfo.Url):
2023-03-19 12:38:08 +08:00
{
if (e is ValuePropertyChangedEventArgs valuePropertyChangedEventArgs)
{
if (string.IsNullOrEmpty(valuePropertyChangedEventArgs.OldValue?.ToString()) && !string.IsNullOrEmpty(valuePropertyChangedEventArgs.NewValue?.ToString()))
{
ItemWidth = Math.Max(ItemWidth, 160);
ItemHeight += 135;
}
else if (!string.IsNullOrEmpty(valuePropertyChangedEventArgs.OldValue?.ToString()) && string.IsNullOrEmpty(valuePropertyChangedEventArgs.NewValue?.ToString()))
{
ItemHeight -= 135;
}
}
break;
}
2023-02-19 21:38:28 +08:00
}
2023-02-14 18:58:26 +08:00
}
2023-02-12 21:30:16 +08:00
2023-03-07 22:59:27 +08:00
public override void AddToSelection(bool selected)
{
foreach (SelectableDesignerItemViewModelBase item in Root.SelectedItems.ToList())
item.IsSelected = false;
Root.SelectedItems.Clear();
IsSelected = selected;
}
2023-02-19 22:56:47 +08:00
#region
2023-02-21 19:47:46 +08:00
public MindNode GetLevel1Node()
2023-02-12 21:30:16 +08:00
{
2023-02-19 22:56:47 +08:00
var node = this;
while (node.Parent is MindNode mindNode)
{
node = mindNode;
}
return node;
}
2023-02-21 19:47:46 +08:00
public MindNode GetLevel2Node()
2023-02-19 22:56:47 +08:00
{
var node = this;
2023-03-05 23:22:34 +08:00
while (node.Parent is MindNode mindNode && mindNode.NodeLevel == 1)
2023-02-19 22:56:47 +08:00
{
node = mindNode;
}
return node;
}
protected void UpdateOffsetX(double oldvalue, double newvalue)
{
2023-02-19 21:38:28 +08:00
Offset += new VectorBase(newvalue - oldvalue, 0);
2023-02-12 21:30:16 +08:00
}
2023-02-19 22:56:47 +08:00
protected void UpdateOffsetY(double oldvalue, double newvalue)
2023-02-12 21:30:16 +08:00
{
2023-02-19 21:38:28 +08:00
Offset += new VectorBase(0, newvalue - oldvalue);
2023-02-12 21:30:16 +08:00
}
2023-02-19 21:38:28 +08:00
public void LayoutUpdated()
2023-02-12 21:30:16 +08:00
{
2023-02-21 19:47:46 +08:00
MindLayout?.LayoutUpdated(GetLevel1Node());
2023-02-12 21:30:16 +08:00
}
2023-02-19 22:56:47 +08:00
#endregion
2023-02-12 21:30:16 +08:00
}
2023-03-05 21:30:53 +08:00
2023-02-19 23:20:02 +08:00
public class LinkInfo : BindableBase
{
2023-03-18 22:50:00 +08:00
private string _link;
public string Link
2023-02-19 23:20:02 +08:00
{
get
{
2023-03-18 22:50:00 +08:00
return _link;
2023-02-19 23:20:02 +08:00
}
set
{
2023-03-18 22:50:00 +08:00
SetProperty(ref _link, value);
2023-02-19 23:20:02 +08:00
}
}
private string _text;
public string Text
{
get
{
return _text;
}
set
{
SetProperty(ref _text, value);
}
}
}
public class ImageInfo : BindableBase
{
private string _url;
public string Url
{
get
{
return _url;
}
set
{
SetProperty(ref _url, value);
}
}
private string _text;
public string Text
{
get
{
return _text;
}
set
{
SetProperty(ref _text, value);
}
}
}
2023-02-12 21:30:16 +08:00
}