From 0701f2551926490d2dfcc61e23c31f4c28792652 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=89=BE=E7=AB=B9?= Date: Sun, 2 Apr 2023 12:01:46 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A5=E5=85=B7=E6=A0=8F=E6=95=B4=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ViewModels/MainWindowViewModel.cs | 3 +- .../ViewModels/MindViewModel.cs | 44 +- AIStudio.Wpf.DiagramApp/Views/MainWindow.xaml | 90 +- .../Views/PropertyControl.xaml | 10 +- ...iagramDesigner.Demo_qayelfaa_wpftmp.csproj | 272 ++++ ...iagramDesigner.Demo_vqryfojq_wpftmp.csproj | 337 +++++ .../ViewModels/MindEditorViewModel.cs | 2 +- .../Adorners/RubberbandAdorner.cs | 26 +- .../Helpers/EnumHelper.cs | 4 +- .../BaseViewModel/SelectableViewModelBase.cs | 4 +- .../ShapeDesignerItemViewModel.cs | 29 +- .../Controls/DropDownButton.xaml | 21 +- .../Controls/ToolBoxControl.xaml | 86 +- .../Converters/MindThemeFillBrushConverter.cs | 28 + .../Converters/MindThemeFontBrushConverter.cs | 29 + AIStudio.Wpf.Mind/Helpers/DirectoryLayout.cs | 11 +- AIStudio.Wpf.Mind/Helpers/FishBoneLayout.cs | 13 +- AIStudio.Wpf.Mind/Helpers/IMindLayout.cs | 3 +- AIStudio.Wpf.Mind/Helpers/LogicalLayout.cs | 11 +- AIStudio.Wpf.Mind/Helpers/MindLayout.cs | 11 +- AIStudio.Wpf.Mind/Helpers/MindThemeHelper.cs | 1147 ++++++++--------- .../Helpers/OrganizationalLayout.cs | 11 +- AIStudio.Wpf.Mind/Models/MindNodeModel.cs | 2 +- AIStudio.Wpf.Mind/Models/MindTheme.cs | 41 + AIStudio.Wpf.Mind/{ => Models}/MindType.cs | 4 +- AIStudio.Wpf.Mind/Properties/AssemblyInfo.cs | 3 +- AIStudio.Wpf.Mind/Styles/ComboBox.xaml | 160 +++ .../ViewModels/IMindDiagramViewModel.cs | 10 +- .../ViewModels/MindDiagramViewModel.cs | 102 +- AIStudio.Wpf.Mind/ViewModels/MindNode.cs | 139 +- 30 files changed, 1730 insertions(+), 923 deletions(-) create mode 100644 AIStudio.Wpf.DiagramDesigner.Demo/AIStudio.Wpf.DiagramDesigner.Demo_qayelfaa_wpftmp.csproj create mode 100644 AIStudio.Wpf.DiagramDesigner.Demo/AIStudio.Wpf.DiagramDesigner.Demo_vqryfojq_wpftmp.csproj rename {AIStudio.Wpf.DiagramDesigner.Additionals => AIStudio.Wpf.DiagramDesigner}/Helpers/EnumHelper.cs (93%) create mode 100644 AIStudio.Wpf.Mind/Converters/MindThemeFillBrushConverter.cs create mode 100644 AIStudio.Wpf.Mind/Converters/MindThemeFontBrushConverter.cs create mode 100644 AIStudio.Wpf.Mind/Models/MindTheme.cs rename AIStudio.Wpf.Mind/{ => Models}/MindType.cs (84%) create mode 100644 AIStudio.Wpf.Mind/Styles/ComboBox.xaml diff --git a/AIStudio.Wpf.DiagramApp/ViewModels/MainWindowViewModel.cs b/AIStudio.Wpf.DiagramApp/ViewModels/MainWindowViewModel.cs index 714e0c7..f57a13e 100644 --- a/AIStudio.Wpf.DiagramApp/ViewModels/MainWindowViewModel.cs +++ b/AIStudio.Wpf.DiagramApp/ViewModels/MainWindowViewModel.cs @@ -20,6 +20,7 @@ using AIStudio.Wpf.DiagramDesigner.Additionals.Commands; using AIStudio.Wpf.DiagramDesigner.ViewModels; using AIStudio.Wpf.DiagramDesigner.ViewModels.BaseViewModel; using AIStudio.Wpf.Mind; +using AIStudio.Wpf.Mind.Models; namespace AIStudio.Wpf.DiagramApp.ViewModels { @@ -947,7 +948,7 @@ namespace AIStudio.Wpf.DiagramApp.ViewModels { IsOpenBackstage = false; - PageViewModel = new MindViewModel(NewNameHelper.GetNewName(DiagramsViewModels.Select(p => p.Title), "新建-"), "*", DiagramType.Mind, (MindType)Enum.Parse(typeof(MindType), mindtype)); + PageViewModel = new MindViewModel(NewNameHelper.GetNewName(DiagramsViewModels.Select(p => p.Title), "新建-"), "*", DiagramType.Mind, mindtype.ToEnum()); DiagramsViewModels.Add(PageViewModel); diff --git a/AIStudio.Wpf.DiagramApp/ViewModels/MindViewModel.cs b/AIStudio.Wpf.DiagramApp/ViewModels/MindViewModel.cs index d7364cf..48ec2f7 100644 --- a/AIStudio.Wpf.DiagramApp/ViewModels/MindViewModel.cs +++ b/AIStudio.Wpf.DiagramApp/ViewModels/MindViewModel.cs @@ -14,6 +14,7 @@ using AIStudio.Wpf.Mind.ViewModels; using AIStudio.Wpf.Mind; using AIStudio.Wpf.DiagramDesigner.Additionals; using AIStudio.Wpf.Mind.Helpers; +using AIStudio.Wpf.Mind.Models; namespace AIStudio.Wpf.Flowchart { @@ -33,6 +34,7 @@ namespace AIStudio.Wpf.Flowchart if (MindDiagramViewModel != null) { MindType = MindDiagramViewModel.MindType; + MindTheme = MindDiagramViewModel.MindTheme; } } @@ -53,42 +55,14 @@ namespace AIStudio.Wpf.Flowchart } } - private MindType _mindType = Mind.MindType.Mind; public MindType MindType { - get - { - return _mindType; - } - set - { - if (SetProperty(ref _mindType, value)) - { - foreach (var vm in DiagramViewModels.OfType()) - { - vm.MindType = MindType; - } - } - } + get; } - private MindThemeModel _mindThemeModel = MindThemeHelper.GetTheme("天空蓝"); - public MindThemeModel MindThemeModel + public MindTheme MindTheme { - get - { - return _mindThemeModel; - } - set - { - if (SetProperty(ref _mindThemeModel, value)) - { - foreach (var vm in DiagramViewModels.OfType()) - { - vm.MindThemeModel = MindThemeHelper.GetTheme(MindThemeModel?.Name); - } - } - } + get; } protected override void Init() @@ -109,13 +83,13 @@ namespace AIStudio.Wpf.Flowchart level2node1_1_1.AddTo(level2node1_1, 0, false); MindNode level2node1_1_2 = new MindNode(DiagramViewModel) { Text = "分支主题1_2" }; - level2node1_1_2.AddTo(level2node1_1, 0, false); + level2node1_1_2.AddTo(level2node1_1, 0, false); MindNode level2node1_1_3 = new MindNode(DiagramViewModel) { Text = "分支主题1_3" }; - level2node1_1_3.AddTo(level2node1_1, 0, false); + level2node1_1_3.AddTo(level2node1_1, 0, false); MindNode level2node1_2 = new MindNode(DiagramViewModel) { Text = "分支主题2" }; - level2node1_2.AddTo(level1node, 0, false); + level2node1_2.AddTo(level1node, 0, false); MindNode level2node1_3 = new MindNode(DiagramViewModel) { Text = "分支主题3" }; level2node1_3.AddTo(level1node, 0, false); @@ -125,7 +99,7 @@ namespace AIStudio.Wpf.Flowchart protected override DiagramViewModel GetDiagramViewModel(string name, DiagramType diagramType) { - var viewmodel = new MindDiagramViewModel() { Name = name ?? NewNameHelper.GetNewName(DiagramViewModels.Select(p => p.Name), "页-"), DiagramType = diagramType, MindType = MindType, MindThemeModel = MindThemeHelper.GetTheme(MindThemeModel?.Name) }; + var viewmodel = new MindDiagramViewModel() { Name = name ?? NewNameHelper.GetNewName(DiagramViewModels.Select(p => p.Name), "页-"), DiagramType = diagramType, MindType = MindType, MindTheme = MindTheme }; viewmodel.Init(); return viewmodel; diff --git a/AIStudio.Wpf.DiagramApp/Views/MainWindow.xaml b/AIStudio.Wpf.DiagramApp/Views/MainWindow.xaml index c0a166f..95863c2 100644 --- a/AIStudio.Wpf.DiagramApp/Views/MainWindow.xaml +++ b/AIStudio.Wpf.DiagramApp/Views/MainWindow.xaml @@ -32,7 +32,9 @@ - + + + @@ -1160,7 +1162,7 @@ - + @@ -1187,7 +1189,7 @@ - + @@ -1224,14 +1226,14 @@ - + - + @@ -1244,7 +1246,7 @@ - + @@ -1259,7 +1261,7 @@ - + @@ -1515,7 +1517,7 @@ - + @@ -1532,7 +1534,7 @@ - + @@ -1549,7 +1551,7 @@ - + @@ -2165,50 +2167,58 @@ - + - - - + - - - - - - + + + + + + + + + + + + - + - - - + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - + + @@ -2454,7 +2464,7 @@ - + diff --git a/AIStudio.Wpf.DiagramApp/Views/PropertyControl.xaml b/AIStudio.Wpf.DiagramApp/Views/PropertyControl.xaml index 2f1c492..9a0cdb1 100644 --- a/AIStudio.Wpf.DiagramApp/Views/PropertyControl.xaml +++ b/AIStudio.Wpf.DiagramApp/Views/PropertyControl.xaml @@ -58,7 +58,7 @@ - + @@ -68,7 +68,7 @@ - + @@ -138,7 +138,7 @@ - + @@ -148,7 +148,7 @@ - + @@ -212,7 +212,7 @@ - + diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/AIStudio.Wpf.DiagramDesigner.Demo_qayelfaa_wpftmp.csproj b/AIStudio.Wpf.DiagramDesigner.Demo/AIStudio.Wpf.DiagramDesigner.Demo_qayelfaa_wpftmp.csproj new file mode 100644 index 0000000..989c674 --- /dev/null +++ b/AIStudio.Wpf.DiagramDesigner.Demo/AIStudio.Wpf.DiagramDesigner.Demo_qayelfaa_wpftmp.csproj @@ -0,0 +1,272 @@ + + + AIStudio.Wpf.DiagramDesigner.Demo + obj\Debug\ + obj\ + F:\aistudio.-wpf.-diagram\AIStudio.Wpf.DiagramDesigner.Demo\obj\ + <_TargetAssemblyProjectName>AIStudio.Wpf.DiagramDesigner.Demo + + + + WinExe + true + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + Code + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/AIStudio.Wpf.DiagramDesigner.Demo_vqryfojq_wpftmp.csproj b/AIStudio.Wpf.DiagramDesigner.Demo/AIStudio.Wpf.DiagramDesigner.Demo_vqryfojq_wpftmp.csproj new file mode 100644 index 0000000..69b147c --- /dev/null +++ b/AIStudio.Wpf.DiagramDesigner.Demo/AIStudio.Wpf.DiagramDesigner.Demo_vqryfojq_wpftmp.csproj @@ -0,0 +1,337 @@ + + + AIStudio.Wpf.DiagramDesigner.Demo + obj\Debug\ + obj\ + F:\aistudio.-wpf.-diagram\AIStudio.Wpf.DiagramDesigner.Demo\obj\ + <_TargetAssemblyProjectName>AIStudio.Wpf.DiagramDesigner.Demo + + + + WinExe + true + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + Code + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/MindEditorViewModel.cs b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/MindEditorViewModel.cs index 5f214f5..a7faab7 100644 --- a/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/MindEditorViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/MindEditorViewModel.cs @@ -13,7 +13,7 @@ namespace AIStudio.Wpf.DiagramDesigner.Demo.ViewModels GetDataCommand = new SimpleCommand(GetDataExcute); SetDataCommand = new SimpleCommand(SetDataExcute); - var theme = MindThemeHelper.GetSkyBlueTheme(); + var theme = MindThemeHelper.SkyBlueTheme; } private Func _getDataFunc; diff --git a/AIStudio.Wpf.DiagramDesigner/Adorners/RubberbandAdorner.cs b/AIStudio.Wpf.DiagramDesigner/Adorners/RubberbandAdorner.cs index 271e906..9e9e895 100644 --- a/AIStudio.Wpf.DiagramDesigner/Adorners/RubberbandAdorner.cs +++ b/AIStudio.Wpf.DiagramDesigner/Adorners/RubberbandAdorner.cs @@ -126,19 +126,7 @@ namespace AIStudio.Wpf.DiagramDesigner { if (this.startPoint.HasValue && this.endPoint.HasValue) { - if (this._service.DrawModeViewModel.GetDrawMode() == DrawMode.Polyline - || this._service.DrawModeViewModel.GetDrawMode() == DrawMode.Polygon - || this._service.DrawModeViewModel.GetDrawMode() == DrawMode.DirectLine) - { - ShapeDesignerItemViewModel itemBase = new ShapeDesignerItemViewModel(this._service.DrawModeViewModel.GetDrawMode(), pointList); - _viewModel.AddItemCommand.Execute(itemBase); - itemBase.PointDesignerItemViewModels.ForEach(p => - { - p.ParentId = itemBase.Id; - _viewModel.Add(p); - }); - } - else if (this._service.DrawModeViewModel.GetDrawMode() == DrawMode.Text) + if (this._service.DrawModeViewModel.GetDrawMode() == DrawMode.Text) { TextDesignerItemViewModel itemBase = new TextDesignerItemViewModel(); Point position = e.GetPosition(this); @@ -149,15 +137,17 @@ namespace AIStudio.Wpf.DiagramDesigner _viewModel.AddItemCommand.Execute(itemBase); } + else if (this._service.DrawModeViewModel.GetDrawMode() == DrawMode.Polyline + || this._service.DrawModeViewModel.GetDrawMode() == DrawMode.Polygon + || this._service.DrawModeViewModel.GetDrawMode() == DrawMode.DirectLine) + { + ShapeDesignerItemViewModel itemBase = new ShapeDesignerItemViewModel(this._service.DrawModeViewModel.GetDrawMode(), pointList); + _viewModel.AddItemCommand.Execute(itemBase); + } else { ShapeDesignerItemViewModel itemBase = new ShapeDesignerItemViewModel(this._service.DrawModeViewModel.GetDrawMode(), new List { this.startPoint.Value, this.endPoint.Value }); _viewModel.AddItemCommand.Execute(itemBase); - itemBase.PointDesignerItemViewModels.ForEach(p => - { - p.ParentId = itemBase.Id; - _viewModel.Add(p); - }); } } this._service.DrawModeViewModel.ResetDrawMode(); diff --git a/AIStudio.Wpf.DiagramDesigner.Additionals/Helpers/EnumHelper.cs b/AIStudio.Wpf.DiagramDesigner/Helpers/EnumHelper.cs similarity index 93% rename from AIStudio.Wpf.DiagramDesigner.Additionals/Helpers/EnumHelper.cs rename to AIStudio.Wpf.DiagramDesigner/Helpers/EnumHelper.cs index 410150f..6666780 100644 --- a/AIStudio.Wpf.DiagramDesigner.Additionals/Helpers/EnumHelper.cs +++ b/AIStudio.Wpf.DiagramDesigner/Helpers/EnumHelper.cs @@ -1,13 +1,15 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; +using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using AIStudio.Wpf.DiagramDesigner; -namespace AIStudio.Wpf.DiagramDesigner.Additionals +namespace AIStudio.Wpf.DiagramDesigner { public class EnumHelper : DependencyObject { diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/SelectableViewModelBase.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/SelectableViewModelBase.cs index 67c589c..7870875 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/SelectableViewModelBase.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/SelectableViewModelBase.cs @@ -364,9 +364,9 @@ namespace AIStudio.Wpf.DiagramDesigner return IsReadOnly == false; } - private void FontViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) + protected virtual void FontViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) { - if (e.PropertyName == "FontCase") + if (e.PropertyName == nameof(FontViewModel.FontCase)) { RaisePropertyChanged("Text"); } diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/ShapeDesignerItemViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/ShapeDesignerItemViewModel.cs index 8e3c7df..ec2a23f 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/ShapeDesignerItemViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/DefaultViewModel/ShapeDesignerItemViewModel.cs @@ -24,20 +24,7 @@ namespace AIStudio.Wpf.DiagramDesigner ItemWidth = ConnectionPoints.Max(p => p.X) - ConnectionPoints.Min(p => p.X); ItemHeight = ConnectionPoints.Max(p => p.Y) - ConnectionPoints.Min(p => p.Y); Left = ConnectionPoints.Min(p => p.X); - Top = ConnectionPoints.Min(p => p.Y); - - PointDesignerItemViewModels = new List(); - ConnectionPoints.ForEach((Action)(p => { - var item = new PointDesignerItemViewModel(p); - PointDesignerItemViewModels.Add((PointDesignerItemViewModel)item); - })); - - PointDesignerItemViewModels.ForEach(p => p.PropertyChanged += PointDesignerItemViewModel_PropertyChanged); - } - - public List PointDesignerItemViewModels - { - get; set; + Top = ConnectionPoints.Min(p => p.Y); } private List _connectionPoints; @@ -68,10 +55,7 @@ namespace AIStudio.Wpf.DiagramDesigner { if (SetProperty(ref _showConnectors, value)) { - foreach (var connector in PointDesignerItemViewModels) - { - connector.ShowConnectors = value; - } + } } } @@ -81,17 +65,8 @@ namespace AIStudio.Wpf.DiagramDesigner get; private set; } - private void PointDesignerItemViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) - { - if (e.PropertyName == nameof(Left) || e.PropertyName == nameof(Top)) - { - UpdatePoints(); - } - } - private void UpdatePoints() { - ConnectionPoints = PointDesignerItemViewModels.Select(p => p.CurrentLocation).ToList(); ItemWidth = ConnectionPoints.Max(p => p.X) - ConnectionPoints.Min(p => p.X); ItemHeight = ConnectionPoints.Max(p => p.Y) - ConnectionPoints.Min(p => p.Y); Left = ConnectionPoints.Min(p => p.X); diff --git a/AIStudio.Wpf.Mind/Controls/DropDownButton.xaml b/AIStudio.Wpf.Mind/Controls/DropDownButton.xaml index 4538d5d..0e2baab 100644 --- a/AIStudio.Wpf.Mind/Controls/DropDownButton.xaml +++ b/AIStudio.Wpf.Mind/Controls/DropDownButton.xaml @@ -1,12 +1,15 @@  + xmlns:controls="clr-namespace:AIStudio.Wpf.Mind.Controls" + xmlns:dd="https://gitee.com/akwkevin/aistudio.-wpf.-diagram"> + + + + + + + + \ No newline at end of file diff --git a/AIStudio.Wpf.Mind/ViewModels/IMindDiagramViewModel.cs b/AIStudio.Wpf.Mind/ViewModels/IMindDiagramViewModel.cs index beb979a..5b2c295 100644 --- a/AIStudio.Wpf.Mind/ViewModels/IMindDiagramViewModel.cs +++ b/AIStudio.Wpf.Mind/ViewModels/IMindDiagramViewModel.cs @@ -1,11 +1,7 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Collections.Generic; using System.Windows.Input; using AIStudio.Wpf.DiagramDesigner; -using AIStudio.Wpf.Mind.Helpers; +using AIStudio.Wpf.Mind.Models; namespace AIStudio.Wpf.Mind.ViewModels { @@ -16,7 +12,7 @@ namespace AIStudio.Wpf.Mind.ViewModels get; set; } - MindThemeModel MindThemeModel + MindTheme MindTheme { get; set; } diff --git a/AIStudio.Wpf.Mind/ViewModels/MindDiagramViewModel.cs b/AIStudio.Wpf.Mind/ViewModels/MindDiagramViewModel.cs index 3a780d7..b6f7fb2 100644 --- a/AIStudio.Wpf.Mind/ViewModels/MindDiagramViewModel.cs +++ b/AIStudio.Wpf.Mind/ViewModels/MindDiagramViewModel.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; using System.Linq; using System.Reflection; using System.Windows.Input; @@ -7,13 +8,14 @@ using System.Windows.Media; using AIStudio.Wpf.DiagramDesigner; using AIStudio.Wpf.DiagramDesigner.Geometrys; using AIStudio.Wpf.Mind.Helpers; +using AIStudio.Wpf.Mind.Models; namespace AIStudio.Wpf.Mind.ViewModels { public class MindDiagramViewModel : DiagramViewModel, IMindDiagramViewModel { #region - private MindType _mindType = Mind.MindType.Mind; + private MindType _mindType = MindType.Mind; public MindType MindType { get @@ -22,26 +24,23 @@ namespace AIStudio.Wpf.Mind.ViewModels } set { - var oldvalue = _mindType; - if (SetProperty(ref _mindType, value)) - { - ExecutedChangeMindType(oldvalue, value); - } + SetProperty(ref _mindType, value); } } - private MindThemeModel _mindThemeModel = MindThemeHelper.GetTheme("天空蓝"); - public MindThemeModel MindThemeModel + private MindTheme _mindTheme; + public MindTheme MindTheme { get { - return _mindThemeModel; + return _mindTheme; } set { - SetProperty(ref _mindThemeModel, value); + SetProperty(ref _mindTheme, value); } } + public List RootItems { get @@ -58,6 +57,14 @@ namespace AIStudio.Wpf.Mind.ViewModels } } + public List MindSelectedItems + { + get + { + return SelectedItems.OfType().ToList(); + } + } + private LinkInfo _linkInfo = new LinkInfo(); public LinkInfo LinkInfo { @@ -354,7 +361,7 @@ namespace AIStudio.Wpf.Mind.ViewModels private MindNode AddRootItem() { ClearSelectedItems(); - MindNode level1node = new MindNode(this) { Root = this, Id = Guid.NewGuid(), Text = "思维导图" }; + MindNode level1node = new MindNode(this) { Root = this, Id = Guid.NewGuid(), Text = "思维导图", MindType = MindType, MindTheme = MindTheme }; level1node.InitLayout(true); Items.Add(level1node); level1node.IsSelected = true; @@ -422,6 +429,11 @@ namespace AIStudio.Wpf.Mind.ViewModels LinkInfo = new LinkInfo(MindSelectedItem?.LinkInfo); ImageInfo = new ImageInfo(MindSelectedItem?.ImageInfo); Remark = MindSelectedItem?.Remark; + if (MindSelectedItem != null) + { + MindType = MindSelectedItem.MindType; + MindTheme = MindSelectedItem.MindTheme; + } } } } @@ -975,37 +987,42 @@ namespace AIStudio.Wpf.Mind.ViewModels #region 改变模式,主题 private void ExecutedChangeMindTypeCommand(object obj) { - if (obj is MindType mindType) + var oldMindType = MindType; + if (obj is MindType mindType && mindType != oldMindType) { - MindType = mindType; + var roots = MindSelectedItems.Select(p => p.RootNode).Distinct().ToList(); + if (roots.Count > 0) + { + DoCommandManager.DoNewCommand(this.ToString(), + () => { + roots.ForEach(p => p.MindType = mindType); + Items.OfType().ToList().ForEach(item => { item.InitLayout(true); }); + Items.OfType().ToList().ForEach(item => { item.InitConnectLayout(); }); + roots.ForEach(p => p.LayoutUpdated()); + }, + () => { + roots.ForEach(p => p.MindType = oldMindType); + Items.OfType().ToList().ForEach(item => { item.InitLayout(true); }); + Items.OfType().ToList().ForEach(item => { item.InitConnectLayout(); }); + roots.ForEach(p => p.LayoutUpdated()); + }); + } } } - private void ExecutedChangeMindType(MindType oldvalue, MindType newvalue) - { - DoCommandManager.DoNewCommand(this.ToString(), - () => { - Items.OfType().ToList().ForEach(item => { item.InitLayout(true); }); - Items.OfType().ToList().ForEach(item => { item.InitConnectLayout(); }); - RootItems?.ForEach(p => p.LayoutUpdated()); - }, - () => { - _mindType = oldvalue; - Items.OfType().ToList().ForEach(item => { item.InitLayout(true); }); - Items.OfType().ToList().ForEach(item => { item.InitConnectLayout(); }); - RootItems?.ForEach(p => p.LayoutUpdated()); - }); - } private void ExecutedChangeMindThemeCommand(object obj) { - string oldmindThemeModel = MindThemeModel.Name; - if (obj is string mindThemeModel && mindThemeModel != oldmindThemeModel) + var oldmindTheme = MindTheme; + if (obj is MindTheme mindTheme && mindTheme != oldmindTheme) { - DoCommandManager.DoNewCommand(this.ToString(), + var roots = MindSelectedItems.Select(p => p.RootNode).Distinct().ToList(); + if (roots.Count > 0) + { + DoCommandManager.DoNewCommand(this.ToString(), () => { - MindThemeModel = MindThemeHelper.GetTheme(mindThemeModel); - if (MindThemeModel?.Dark == true) + var mindThemeModel = MindThemeHelper.GetTheme(mindTheme); + if (mindThemeModel?.Dark == true) { PageBackground = Colors.Black; } @@ -1013,11 +1030,14 @@ namespace AIStudio.Wpf.Mind.ViewModels { PageBackground = Colors.White; } - Items.OfType().ToList().ForEach(item => { item.ThemeChange(); }); + MindTheme = mindTheme; + roots.ForEach(p => p.MindTheme = MindTheme); + roots.SelectMany(p => p.GetChildren(true)).ToList().ForEach(item => { item.ThemeChange(); }); + roots.ForEach(p => p.LayoutUpdated()); }, () => { - MindThemeModel = MindThemeHelper.GetTheme(oldmindThemeModel); - if (MindThemeModel?.Dark == true) + var mindThemeModel = MindThemeHelper.GetTheme(oldmindTheme); + if (mindThemeModel?.Dark == true) { PageBackground = Colors.Black; } @@ -1025,8 +1045,12 @@ namespace AIStudio.Wpf.Mind.ViewModels { PageBackground = Colors.White; } - Items.OfType().ToList().ForEach(item => { item.ThemeChange(); }); + MindTheme = oldmindTheme; + roots.ForEach(p => p.MindTheme = MindTheme); + roots.SelectMany(p => p.GetChildren(true)).ToList().ForEach(item => { item.ThemeChange(); }); + roots.ForEach(p => p.LayoutUpdated()); }); + } } } @@ -1048,7 +1072,7 @@ namespace AIStudio.Wpf.Mind.ViewModels if (items.Any()) { - Dictionary infos = items.OfType().ToDictionary(p => p, p => MindThemeHelper.GetThemeModel(p)); + Dictionary infos = items.OfType().ToDictionary(p => p, p => MindThemeHelper.GetNodeTheme(p)); DoCommandManager.DoNewCommand(this.ToString(), () => { foreach (var item in items) @@ -1144,7 +1168,7 @@ 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) diff --git a/AIStudio.Wpf.Mind/ViewModels/MindNode.cs b/AIStudio.Wpf.Mind/ViewModels/MindNode.cs index 035135d..2c440fe 100644 --- a/AIStudio.Wpf.Mind/ViewModels/MindNode.cs +++ b/AIStudio.Wpf.Mind/ViewModels/MindNode.cs @@ -18,7 +18,7 @@ using AIStudio.Wpf.DiagramDesigner.Helpers; using AIStudio.Wpf.DiagramDesigner.Models; using AIStudio.Wpf.DiagramModels; using AIStudio.Wpf.DiagramModels.ViewModels; -using AIStudio.Wpf.Flowchart.Models; +using AIStudio.Wpf.Mind.Models; using AIStudio.Wpf.Mind.Helpers; using AIStudio.Wpf.Mind.Models; @@ -96,18 +96,18 @@ namespace AIStudio.Wpf.Mind.ViewModels public void InitLayout(bool initAppearance) { - var layout = TypeHelper.GetType(MindType.ToString() + "Layout"); + var layout = TypeHelper.GetType(this.MindType.ToString() + "Layout"); MindLayout = layout != null ? (System.Activator.CreateInstance(layout) as IMindLayout) : new MindLayout(); this.PropertyChanged -= this.Item_PropertyChanged; IsInnerConnector = true; - MindLayout.Appearance(this, MindThemeModel, initAppearance); + MindLayout.Appearance(this, MindTheme, initAppearance); this.PropertyChanged += this.Item_PropertyChanged; } public void ThemeChange() { - MindThemeHelper.ThemeChange(this, MindThemeModel); + MindThemeHelper.ThemeChange(this, MindTheme); } protected override void LoadDesignerItemViewModel(SelectableItemBase designerbase) @@ -145,6 +145,32 @@ namespace AIStudio.Wpf.Mind.ViewModels } } #region 属性 + 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; + } + } + public IMindLayout MindLayout { get; set; @@ -181,22 +207,6 @@ namespace AIStudio.Wpf.Mind.ViewModels } } - public MindType MindType - { - get - { - return (Root as IMindDiagramViewModel)?.MindType ?? MindType.Mind; - } - } - - public MindThemeModel MindThemeModel - { - get - { - return (Root as IMindDiagramViewModel)?.MindThemeModel ?? MindThemeHelper.GetTheme("天空蓝"); - } - } - private bool _isExpanded = true; public bool IsExpanded { @@ -560,62 +570,54 @@ namespace AIStudio.Wpf.Mind.ViewModels case nameof(NodeLevel): MindLayout?.Appearance(this); break; - case nameof(Text): - { - ItemWidth = Math.Max(ItemWidth, GetTextDisplayWidthHelper.GetTextDisplayWidth(Text, new FontFamily(FontViewModel.FontFamily), FontViewModel.FontStyle, FontViewModel.FontWeight, FontViewModel.FontStretch, FontViewModel.FontSize) + 30); - break; - } + case nameof(Text): case nameof(Rate): case nameof(Priority): case nameof(Remark): - { - if (e is ValuePropertyChangedEventArgs valuePropertyChangedEventArgs) - { - if (string.IsNullOrEmpty(valuePropertyChangedEventArgs.OldValue?.ToString()) && !string.IsNullOrEmpty(valuePropertyChangedEventArgs.NewValue?.ToString())) - { - ItemWidth += 24; - } - else if (!string.IsNullOrEmpty(valuePropertyChangedEventArgs.OldValue?.ToString()) && string.IsNullOrEmpty(valuePropertyChangedEventArgs.NewValue?.ToString())) - { - ItemWidth -= 24; - } - } - break; - } case nameof(LinkInfo): - { - if (e is ValuePropertyChangedEventArgs valuePropertyChangedEventArgs) - { - if (valuePropertyChangedEventArgs.OldValue == null && valuePropertyChangedEventArgs.NewValue != null) - { - ItemWidth += 24; - } - else if (valuePropertyChangedEventArgs.OldValue != null && valuePropertyChangedEventArgs.NewValue == null) - { - ItemWidth -= 24; - } - } - break; - } case nameof(ImageInfo): { - if (e is ValuePropertyChangedEventArgs valuePropertyChangedEventArgs) - { - if (valuePropertyChangedEventArgs.OldValue == null && valuePropertyChangedEventArgs.NewValue != null) - { - ItemWidth = Math.Max(ItemWidth, 160); - ItemHeight += 135; - } - else if (valuePropertyChangedEventArgs.OldValue != null && valuePropertyChangedEventArgs.NewValue == null) - { - ItemHeight -= 135; - } - } + SetItemWidthHeight(); break; } } } + 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; + + } + + + protected override void FontViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) + { + if (e.PropertyName == nameof(FontViewModel.FontSize)) + { + SetItemWidthHeight(); + } + } + public override void AddToSelection(bool selected) { foreach (SelectableDesignerItemViewModelBase item in Root.SelectedItems.ToList()) @@ -661,9 +663,14 @@ namespace AIStudio.Wpf.Mind.ViewModels return mindnode; } - public List GetChildren() + public List GetChildren(bool self = false) { List mindnode = new List(); + if (self) + { + mindnode.Add(this); + } + if (this.Children != null) { foreach (var child in this.Children)