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-04-02 22:59:22 +08:00
|
|
|
|
using System.ComponentModel.DataAnnotations;
|
|
|
|
|
|
using System.ComponentModel.Design;
|
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-04-02 21:47:55 +08:00
|
|
|
|
using System.Text.RegularExpressions;
|
2023-04-08 21:48:43 +08:00
|
|
|
|
using System.Threading;
|
2023-03-24 22:32:42 +08:00
|
|
|
|
using System.Windows.Input;
|
2023-02-19 21:38:28 +08:00
|
|
|
|
using System.Windows.Media;
|
2023-02-12 21:30:16 +08:00
|
|
|
|
using AIStudio.Wpf.DiagramDesigner;
|
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-04-16 20:11:40 +08:00
|
|
|
|
using AIStudio.Wpf.DiagramDesigner.Serializable;
|
|
|
|
|
|
using AIStudio.Wpf.DiagramDesigner.Serializable.ViewModels;
|
2023-04-02 21:47:55 +08:00
|
|
|
|
using AIStudio.Wpf.Mind.Controls;
|
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
|
|
|
|
|
|
|
|
|
|
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-25 11:59:31 +08:00
|
|
|
|
|
2023-03-01 19:28:06 +08:00
|
|
|
|
public override SelectableItemBase GetSerializableObject()
|
|
|
|
|
|
{
|
|
|
|
|
|
return new MindNodeDesignerItem(this);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-03-25 11:59:31 +08:00
|
|
|
|
public override DiagramNode ToDiagram()
|
2023-02-19 21:38:28 +08:00
|
|
|
|
{
|
2023-03-25 11:59:31 +08:00
|
|
|
|
var mindNodeModel = new MindNodeModel();
|
|
|
|
|
|
|
2023-04-02 22:59:22 +08:00
|
|
|
|
mindNodeModel.MindType = MindType;
|
|
|
|
|
|
mindNodeModel.MindTheme = MindTheme;
|
2023-03-25 11:59:31 +08:00
|
|
|
|
mindNodeModel.Spacing = Spacing;
|
|
|
|
|
|
mindNodeModel.Offset = Offset;
|
|
|
|
|
|
mindNodeModel.IsExpanded = IsExpanded;
|
|
|
|
|
|
mindNodeModel.LinkInfoModel = new LinkInfoModel(LinkInfo);
|
|
|
|
|
|
mindNodeModel.ImageInfoModel = new ImageInfoModel(ImageInfo);
|
|
|
|
|
|
mindNodeModel.Remark = Remark;
|
|
|
|
|
|
mindNodeModel.Priority = Priority;
|
|
|
|
|
|
mindNodeModel.Rate = Rate;
|
|
|
|
|
|
if (Tags != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
mindNodeModel.Tags = new List<string>(Tags);
|
|
|
|
|
|
}
|
|
|
|
|
|
return mindNodeModel;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
protected override void Init(IDiagramViewModel root, bool initNew)
|
|
|
|
|
|
{
|
|
|
|
|
|
base.Init(root, initNew);
|
2023-02-19 21:38:28 +08:00
|
|
|
|
|
|
|
|
|
|
EnabledForConnection = false;
|
2023-03-07 22:59:27 +08:00
|
|
|
|
AlwayForResized = true;
|
2023-03-11 12:40:44 +08:00
|
|
|
|
CustomText = true;
|
2023-04-05 20:35:10 +08:00
|
|
|
|
IsInnerConnector = 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-04-02 21:47:55 +08:00
|
|
|
|
ExportCommand = (Root as IMindDiagramViewModel)?.ExportCommand;
|
|
|
|
|
|
ImportCommand = (Root as IMindDiagramViewModel)?.ImportCommand;
|
2023-02-19 21:38:28 +08:00
|
|
|
|
BuildMenuOptions();
|
2023-03-18 21:44:58 +08:00
|
|
|
|
Tags = new ObservableCollection<string>();
|
2023-02-19 21:38:28 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-03-25 11:59:31 +08:00
|
|
|
|
protected override void InitNew()
|
|
|
|
|
|
{
|
|
|
|
|
|
this.ClearConnectors();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-03-05 23:22:34 +08:00
|
|
|
|
public void InitLayout(bool initAppearance)
|
2023-02-21 19:47:46 +08:00
|
|
|
|
{
|
2023-04-10 23:08:14 +08:00
|
|
|
|
IsLoaded = false;
|
2023-04-02 12:01:46 +08:00
|
|
|
|
var layout = TypeHelper.GetType(this.MindType.ToString() + "Layout");
|
2023-02-21 19:47:46 +08:00
|
|
|
|
MindLayout = layout != null ? (System.Activator.CreateInstance(layout) as IMindLayout) : new MindLayout();
|
2023-04-02 12:01:46 +08:00
|
|
|
|
MindLayout.Appearance(this, MindTheme, initAppearance);
|
2023-04-10 23:08:14 +08:00
|
|
|
|
IsLoaded = true;
|
2023-02-19 21:38:28 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-04-02 21:47:55 +08:00
|
|
|
|
public void InitConnectionLayout()
|
|
|
|
|
|
{
|
|
|
|
|
|
var connector = Root?.Items.OfType<ConnectionViewModel>().Where(p => p.IsFullConnection).FirstOrDefault(p => p.SinkConnectorInfoFully.DataItem == this);
|
|
|
|
|
|
if (connector != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
MindLayout?.GetOrSetConnectionViewModel(connector.SourceConnectorInfo.DataItem as MindNode, connector.SinkConnectorInfoFully.DataItem as MindNode, connector);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (ParentNode != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
connector = MindLayout?.GetOrSetConnectionViewModel(ParentNode, this, null);
|
|
|
|
|
|
Root?.Add(new SelectableDesignerItemViewModelBase[] { connector });
|
|
|
|
|
|
connector.ZIndex = -1;
|
|
|
|
|
|
connector.IsSelected = false;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void UpdatedLayout()
|
|
|
|
|
|
{
|
|
|
|
|
|
MindLayout?.UpdatedLayout(GetLevel0Node());
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-03-11 22:27:23 +08:00
|
|
|
|
public void ThemeChange()
|
|
|
|
|
|
{
|
2023-04-02 12:01:46 +08:00
|
|
|
|
MindThemeHelper.ThemeChange(this, MindTheme);
|
2023-03-28 22:09:24 +08:00
|
|
|
|
}
|
2023-03-11 22:27:23 +08:00
|
|
|
|
|
2023-03-01 19:28:06 +08:00
|
|
|
|
protected override void LoadDesignerItemViewModel(SelectableItemBase designerbase)
|
|
|
|
|
|
{
|
|
|
|
|
|
base.LoadDesignerItemViewModel(designerbase);
|
|
|
|
|
|
|
|
|
|
|
|
if (designerbase is MindNodeDesignerItem designer)
|
|
|
|
|
|
{
|
2023-04-02 22:59:22 +08:00
|
|
|
|
MindType = designer.MindType;
|
|
|
|
|
|
MindTheme = designer.MindTheme;
|
2023-03-01 19:28:06 +08:00
|
|
|
|
Spacing = designer.Spacing;
|
|
|
|
|
|
Offset = designer.Offset;
|
|
|
|
|
|
IsExpanded = designer.IsExpanded;
|
2023-03-28 22:09:24 +08:00
|
|
|
|
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);
|
|
|
|
|
|
}
|
2023-03-21 23:08:12 +08:00
|
|
|
|
Remark = designer.Remark;
|
2023-04-02 22:59:22 +08:00
|
|
|
|
if (double.TryParse(designer.Priority ?? "", out var priority))
|
|
|
|
|
|
{
|
|
|
|
|
|
Priority = priority;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (double.TryParse(designer.Rate ?? "", out var rate))
|
|
|
|
|
|
{
|
|
|
|
|
|
Rate = rate;
|
|
|
|
|
|
}
|
2023-03-21 23:08:12 +08:00
|
|
|
|
if (designer.Tags != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
Tags = new ObservableCollection<string>(designer.Tags);
|
|
|
|
|
|
}
|
2023-03-01 19:28:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2023-04-02 21:47:55 +08:00
|
|
|
|
|
2023-02-19 22:56:47 +08:00
|
|
|
|
#region 属性
|
2023-04-02 12:01:46 +08:00
|
|
|
|
private MindType _mindType = MindType.Mind;
|
|
|
|
|
|
public MindType MindType
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return GetLevel0Node()._mindType;
|
|
|
|
|
|
}
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
GetLevel0Node()._mindType = value;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private MindTheme _mindTheme;
|
|
|
|
|
|
public MindTheme MindTheme
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return GetLevel0Node()._mindTheme;
|
|
|
|
|
|
}
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
GetLevel0Node()._mindTheme = value;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
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-24 22:32:42 +08:00
|
|
|
|
}
|
2023-03-05 23:22:34 +08:00
|
|
|
|
|
2023-03-24 22:32:42 +08:00
|
|
|
|
public MindNode RootNode
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
2023-03-28 23:16:56 +08:00
|
|
|
|
return GetLevel0Node();
|
2023-03-24 22:32:42 +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-19 21:38:28 +08:00
|
|
|
|
private bool _isExpanded = true;
|
2023-04-08 21:48:43 +08:00
|
|
|
|
[CanDo]
|
2023-02-19 21:38:28 +08:00
|
|
|
|
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-03-28 23:16:56 +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-03-28 23:16:56 +08:00
|
|
|
|
public PointBase DesiredMiddlePosition
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return new PointBase(this.DesiredPosition.X + ItemWidth / 2, this.DesiredPosition.Y + ItemHeight / 2);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-02-19 21:38:28 +08:00
|
|
|
|
public PointBase Offset
|
2023-02-16 19:21:37 +08:00
|
|
|
|
{
|
2023-03-28 22:09:24 +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-04-08 21:48:43 +08:00
|
|
|
|
[CanDo]
|
2023-02-19 23:20:02 +08:00
|
|
|
|
public LinkInfo LinkInfo
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return _linkInfo;
|
|
|
|
|
|
}
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
SetProperty(ref _linkInfo, value);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-03-19 12:38:08 +08:00
|
|
|
|
private ImageInfo _imageInfo;
|
2023-04-08 21:48:43 +08:00
|
|
|
|
[CanDo]
|
2023-02-19 23:20:02 +08:00
|
|
|
|
public ImageInfo ImageInfo
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return _imageInfo;
|
|
|
|
|
|
}
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
SetProperty(ref _imageInfo, value);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private string _remark;
|
2023-04-08 21:48:43 +08:00
|
|
|
|
[CanDo]
|
2023-04-05 20:35:10 +08:00
|
|
|
|
[Browsable(true)]
|
2023-02-19 23:20:02 +08:00
|
|
|
|
public string Remark
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return _remark;
|
|
|
|
|
|
}
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
SetProperty(ref _remark, value);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-03-15 19:35:53 +08:00
|
|
|
|
private double? _priority;
|
2023-04-08 21:48:43 +08:00
|
|
|
|
[CanDo]
|
2023-03-15 19:35:53 +08:00
|
|
|
|
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;
|
2023-04-08 21:48:43 +08:00
|
|
|
|
[CanDo]
|
2023-03-15 19:35:53 +08:00
|
|
|
|
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;
|
2023-04-08 21:48:43 +08:00
|
|
|
|
[CanDo]
|
2023-02-20 23:01:26 +08:00
|
|
|
|
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;
|
2023-03-24 22:32:42 +08:00
|
|
|
|
}
|
2023-03-18 21:44:58 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
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-03-24 22:32:42 +08:00
|
|
|
|
public ICommand 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-03-24 22:32:42 +08:00
|
|
|
|
public ICommand 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-24 22:32:42 +08:00
|
|
|
|
public ICommand AddPearCommand
|
2023-02-19 21:38:28 +08:00
|
|
|
|
{
|
|
|
|
|
|
get; private set;
|
2023-02-12 21:30:16 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-03-24 22:32:42 +08:00
|
|
|
|
public ICommand 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-03-24 22:32:42 +08:00
|
|
|
|
public ICommand MoveForwardCommand
|
2023-02-19 21:38:28 +08:00
|
|
|
|
{
|
|
|
|
|
|
get; private set;
|
2023-02-12 21:30:16 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-03-24 22:32:42 +08:00
|
|
|
|
public ICommand MoveBackCommand
|
2023-02-12 21:30:16 +08:00
|
|
|
|
{
|
2023-02-19 21:38:28 +08:00
|
|
|
|
get; private set;
|
|
|
|
|
|
}
|
2023-04-02 21:47:55 +08:00
|
|
|
|
|
|
|
|
|
|
public ICommand ExportCommand
|
|
|
|
|
|
{
|
|
|
|
|
|
get; private set;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public ICommand ImportCommand
|
|
|
|
|
|
{
|
|
|
|
|
|
get; private set;
|
2023-04-02 22:59:22 +08:00
|
|
|
|
}
|
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-04-02 21:47:55 +08:00
|
|
|
|
menuItem = new CinchMenuItem();
|
|
|
|
|
|
menuItem.Text = "导出节点";
|
|
|
|
|
|
menuItem.Command = ExportCommand;
|
|
|
|
|
|
menuItem.CommandParameter = this;
|
2023-04-02 22:59:22 +08:00
|
|
|
|
menuOptions.Add(menuItem);
|
2023-04-02 21:47:55 +08:00
|
|
|
|
menuItem = new CinchMenuItem();
|
|
|
|
|
|
menuItem.Text = "导入节点";
|
|
|
|
|
|
menuItem.Command = ImportCommand;
|
|
|
|
|
|
menuItem.CommandParameter = this;
|
|
|
|
|
|
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-03-26 23:23:34 +08:00
|
|
|
|
public void AddTo(MindNode parent, int index = -1, bool isSelected = true)
|
2023-02-12 21:30:16 +08:00
|
|
|
|
{
|
2023-03-26 23:23:34 +08:00
|
|
|
|
//parent为空,为根节点
|
2023-02-19 21:38:28 +08:00
|
|
|
|
if (index >= 0)
|
|
|
|
|
|
{
|
2023-03-26 23:23:34 +08:00
|
|
|
|
parent?.Children.Insert(index, this);
|
2023-02-19 21:38:28 +08:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2023-03-26 23:23:34 +08:00
|
|
|
|
parent?.Children.Add(this);
|
2023-02-19 21:38:28 +08:00
|
|
|
|
}
|
2023-03-26 23:23:34 +08:00
|
|
|
|
this.Parent = parent;
|
|
|
|
|
|
this.ParentId = parent?.Id ?? Guid.Empty;
|
2023-03-28 23:16:56 +08:00
|
|
|
|
this.Offset = parent?.Offset ?? new PointBase();
|
2023-03-26 23:23:34 +08:00
|
|
|
|
this.InitLayout(true);//因为节点的层级不同的样式,所以需要Parent确定后才能初始化
|
2023-04-02 21:47:55 +08:00
|
|
|
|
this.InitConnectionLayout();
|
2023-02-19 21:38:28 +08:00
|
|
|
|
|
2023-03-26 23:23:34 +08:00
|
|
|
|
Root?.Add(this);
|
2023-02-19 21:38:28 +08:00
|
|
|
|
|
2023-03-26 23:23:34 +08:00
|
|
|
|
if (isSelected)
|
2023-02-19 21:38:28 +08:00
|
|
|
|
{
|
2023-03-26 23:23:34 +08:00
|
|
|
|
if (parent != null)
|
2023-02-19 21:38:28 +08:00
|
|
|
|
{
|
2023-03-26 23:23:34 +08:00
|
|
|
|
parent.IsSelected = false;
|
2023-03-25 22:10:49 +08:00
|
|
|
|
}
|
2023-03-26 23:23:34 +08:00
|
|
|
|
this.IsSelected = true;
|
2023-03-25 22:10:49 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-03-26 23:23:34 +08:00
|
|
|
|
public void RemoveFrom()
|
2023-03-25 22:10:49 +08:00
|
|
|
|
{
|
2023-04-10 23:08:14 +08:00
|
|
|
|
this.IsLoaded = false;
|
2023-03-25 22:10:49 +08:00
|
|
|
|
if (this.ParentNode != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
this.ParentNode.Children.Remove(this);
|
|
|
|
|
|
}
|
|
|
|
|
|
var connectors = Root?.Items.OfType<ConnectionViewModel>().Where(p => p.SinkConnectorInfoFully?.DataItem == this).ToList();
|
|
|
|
|
|
|
2023-03-25 22:29:02 +08:00
|
|
|
|
Root?.Remove(this);
|
|
|
|
|
|
Root?.Remove(connectors);
|
2023-04-02 22:59:22 +08:00
|
|
|
|
}
|
2023-02-19 22:56:47 +08:00
|
|
|
|
#endregion
|
2023-04-02 21:47:55 +08:00
|
|
|
|
|
|
|
|
|
|
#region 属性改变
|
2023-04-10 23:08:14 +08:00
|
|
|
|
protected override void Item_PropertyChanged(object sender, PropertyChangedEventArgs e)
|
2023-02-14 18:58:26 +08:00
|
|
|
|
{
|
2023-04-10 23:08:14 +08:00
|
|
|
|
if (IsLoaded == false) return;
|
|
|
|
|
|
|
2023-03-28 23:16:56 +08:00
|
|
|
|
if (GetLevel0Node()?.LayoutUpdating == true) return;
|
2023-03-25 11:59:31 +08:00
|
|
|
|
|
2023-04-08 21:48:43 +08:00
|
|
|
|
Interlocked.Increment(ref Root.DoCommandManager.BeginDo);
|
2023-02-19 21:38:28 +08:00
|
|
|
|
switch (e.PropertyName)
|
|
|
|
|
|
{
|
2023-03-28 22:09:24 +08:00
|
|
|
|
case nameof(Left):
|
|
|
|
|
|
{
|
|
|
|
|
|
if (e is ValuePropertyChangedEventArgs valuePropertyChangedEventArgs)
|
|
|
|
|
|
{
|
|
|
|
|
|
UpdateOffsetX((double)valuePropertyChangedEventArgs.OldValue, (double)valuePropertyChangedEventArgs.NewValue);
|
2023-03-28 23:16:56 +08:00
|
|
|
|
Console.WriteLine((sender as MindNode).Text);
|
2023-03-28 22:09:24 +08:00
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
case nameof(Top):
|
|
|
|
|
|
{
|
|
|
|
|
|
if (e is ValuePropertyChangedEventArgs valuePropertyChangedEventArgs)
|
|
|
|
|
|
{
|
|
|
|
|
|
UpdateOffsetY((double)valuePropertyChangedEventArgs.OldValue, (double)valuePropertyChangedEventArgs.NewValue);
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
2023-02-19 21:38:28 +08:00
|
|
|
|
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
|
|
|
|
{
|
2023-04-10 23:08:14 +08:00
|
|
|
|
|
2023-04-02 21:47:55 +08:00
|
|
|
|
UpdatedLayout();
|
2023-02-21 19:47:46 +08:00
|
|
|
|
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-04-02 22:59:22 +08:00
|
|
|
|
case nameof(Text):
|
2023-03-18 21:44:58 +08:00
|
|
|
|
case nameof(Rate):
|
2023-03-24 22:32:42 +08:00
|
|
|
|
case nameof(Priority):
|
2023-03-18 21:44:58 +08:00
|
|
|
|
case nameof(Remark):
|
2023-03-26 23:23:34 +08:00
|
|
|
|
case nameof(LinkInfo):
|
|
|
|
|
|
case nameof(ImageInfo):
|
|
|
|
|
|
{
|
2023-04-02 12:01:46 +08:00
|
|
|
|
SetItemWidthHeight();
|
2023-03-19 12:38:08 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
2023-04-10 23:08:14 +08:00
|
|
|
|
case nameof(FontViewModel.FontSize):
|
|
|
|
|
|
SetItemWidthHeight();
|
|
|
|
|
|
break;
|
2023-02-19 21:38:28 +08:00
|
|
|
|
}
|
2023-04-08 21:48:43 +08:00
|
|
|
|
Interlocked.Decrement(ref Root.DoCommandManager.BeginDo);
|
2023-02-14 18:58:26 +08:00
|
|
|
|
}
|
2023-04-02 21:47:55 +08:00
|
|
|
|
#endregion
|
2023-04-02 12:01:46 +08:00
|
|
|
|
|
2023-02-19 22:56:47 +08:00
|
|
|
|
#region 布局相关
|
2023-03-28 23:16:56 +08:00
|
|
|
|
public MindNode GetLevel0Node()
|
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-03-28 23:16:56 +08:00
|
|
|
|
public MindNode GetLevel1Node()
|
2023-02-19 22:56:47 +08:00
|
|
|
|
{
|
|
|
|
|
|
var node = this;
|
2023-03-29 06:26:00 +08:00
|
|
|
|
while (node.Parent is MindNode mindNode)
|
2023-02-19 22:56:47 +08:00
|
|
|
|
{
|
2023-03-29 06:26:00 +08:00
|
|
|
|
if (node.NodeLevel == 1)
|
|
|
|
|
|
{
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
2023-02-19 22:56:47 +08:00
|
|
|
|
node = mindNode;
|
|
|
|
|
|
}
|
|
|
|
|
|
return node;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-03-26 23:23:34 +08:00
|
|
|
|
public List<MindNode> GetParent()
|
|
|
|
|
|
{
|
|
|
|
|
|
var node = this;
|
|
|
|
|
|
List<MindNode> mindnode = new List<MindNode>();
|
|
|
|
|
|
while (node.ParentNode != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
mindnode.Add(node.ParentNode);
|
|
|
|
|
|
node = node.ParentNode;
|
|
|
|
|
|
}
|
|
|
|
|
|
return mindnode;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-04-02 12:01:46 +08:00
|
|
|
|
public List<MindNode> GetChildren(bool self = false)
|
2023-03-26 23:23:34 +08:00
|
|
|
|
{
|
|
|
|
|
|
List<MindNode> mindnode = new List<MindNode>();
|
2023-04-02 12:01:46 +08:00
|
|
|
|
if (self)
|
|
|
|
|
|
{
|
|
|
|
|
|
mindnode.Add(this);
|
|
|
|
|
|
}
|
2023-04-02 22:59:22 +08:00
|
|
|
|
|
2023-03-26 23:23:34 +08:00
|
|
|
|
if (this.Children != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
foreach (var child in this.Children)
|
|
|
|
|
|
{
|
|
|
|
|
|
mindnode.Add(child);
|
|
|
|
|
|
mindnode.AddRange(child.GetChildren());
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return mindnode;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-04-02 21:47:55 +08:00
|
|
|
|
public string GetChildrenText(bool self = false)
|
|
|
|
|
|
{
|
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
|
|
|
|
|
List<MindNode> mindnode = new List<MindNode>();
|
|
|
|
|
|
if (self)
|
|
|
|
|
|
{
|
|
|
|
|
|
sb.AppendLine(this.Text);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (this.Children != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
foreach (var child in this.Children)
|
|
|
|
|
|
{
|
|
|
|
|
|
sb.AppendLine($"{new String('\t', child.NodeLevel)}{child.Text}");
|
|
|
|
|
|
sb.Append(child.GetChildrenText());
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-02-19 22:56:47 +08:00
|
|
|
|
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-04-02 21:47:55 +08:00
|
|
|
|
private void SetItemWidthHeight()
|
|
|
|
|
|
{
|
|
|
|
|
|
double width = 0;
|
|
|
|
|
|
double height = 0;
|
|
|
|
|
|
width += GetTextDisplayWidthHelper.GetTextDisplayWidth(Text, new FontFamily(FontViewModel.FontFamily), FontViewModel.FontStyle, FontViewModel.FontWeight, FontViewModel.FontStretch, FontViewModel.FontSize) + 30;
|
|
|
|
|
|
width += Rate == null ? 0 : 24;
|
|
|
|
|
|
width += Priority == null ? 0 : 24;
|
|
|
|
|
|
width += Remark == null ? 0 : 24;
|
|
|
|
|
|
width += LinkInfo == null ? 0 : 24;
|
|
|
|
|
|
|
|
|
|
|
|
var defaultTheme = MindThemeHelper.GetNodeDefaultTheme(this);
|
|
|
|
|
|
if (ImageInfo != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
width = Math.Max(width, 160);
|
|
|
|
|
|
height = defaultTheme.ItemHeight / defaultTheme.FontSize * FontViewModel.FontSize + 135;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
height = defaultTheme.ItemHeight / defaultTheme.FontSize * FontViewModel.FontSize;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ItemWidth = width;
|
|
|
|
|
|
ItemHeight = height;
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public override void AddToSelection(bool selected)
|
2023-02-12 21:30:16 +08:00
|
|
|
|
{
|
2023-04-02 21:47:55 +08:00
|
|
|
|
foreach (SelectableDesignerItemViewModelBase item in Root.SelectedItems.ToList())
|
|
|
|
|
|
item.IsSelected = false;
|
|
|
|
|
|
|
|
|
|
|
|
Root.SelectedItems.Clear();
|
|
|
|
|
|
IsSelected = selected;
|
2023-02-12 21:30:16 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-04-02 22:59:22 +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-03-26 23:23:34 +08:00
|
|
|
|
public class LinkInfo
|
2023-02-19 23:20:02 +08:00
|
|
|
|
{
|
2023-03-26 23:23:34 +08:00
|
|
|
|
public string Url
|
2023-02-19 23:20:02 +08:00
|
|
|
|
{
|
2023-03-26 23:23:34 +08:00
|
|
|
|
get; set;
|
2023-02-19 23:20:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public string Text
|
|
|
|
|
|
{
|
2023-03-26 23:23:34 +08:00
|
|
|
|
get; set;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public LinkInfo()
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public LinkInfo(string url, string text)
|
|
|
|
|
|
{
|
|
|
|
|
|
Url = url;
|
|
|
|
|
|
Text = text;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public LinkInfo(LinkInfo info)
|
|
|
|
|
|
{
|
|
|
|
|
|
Url = info?.Url;
|
|
|
|
|
|
Text = info?.Text;
|
2023-02-19 23:20:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-03-26 23:23:34 +08:00
|
|
|
|
public class ImageInfo
|
2023-02-19 23:20:02 +08:00
|
|
|
|
{
|
|
|
|
|
|
public string Url
|
|
|
|
|
|
{
|
2023-03-26 23:23:34 +08:00
|
|
|
|
get; set;
|
2023-02-19 23:20:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public string Text
|
|
|
|
|
|
{
|
2023-03-26 23:23:34 +08:00
|
|
|
|
get; set;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public ImageInfo()
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public ImageInfo(string url, string text)
|
|
|
|
|
|
{
|
|
|
|
|
|
Url = url;
|
|
|
|
|
|
Text = text;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public ImageInfo(ImageInfo info)
|
|
|
|
|
|
{
|
|
|
|
|
|
Url = info?.Url;
|
|
|
|
|
|
Text = info?.Text;
|
2023-02-19 23:20:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2023-02-12 21:30:16 +08:00
|
|
|
|
}
|