Files
aistudio-wpf-diagram/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/SelectableViewModelBase.cs

529 lines
14 KiB
C#
Raw Normal View History

2021-07-23 09:42:22 +08:00
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
2023-04-16 10:10:12 +08:00
using System.Linq.Expressions;
2021-07-23 09:42:22 +08:00
using System.Text;
using System.Windows.Input;
using System.Windows.Media;
2023-04-16 10:10:12 +08:00
using AIStudio.Wpf.DiagramDesigner.Helpers;
using AIStudio.Wpf.DiagramDesigner.Models;
2023-03-18 21:44:58 +08:00
using AIStudio.Wpf.DiagramDesigner.ViewModels;
using AIStudio.Wpf.DiagramDesigner.ViewModels.BaseViewModel;
using Newtonsoft.Json;
2021-07-23 09:42:22 +08:00
2022-10-28 22:45:39 +08:00
namespace AIStudio.Wpf.DiagramDesigner
2021-07-23 09:42:22 +08:00
{
public abstract class SelectableViewModelBase : BindableBase, ISelectable, IDisposable
2021-07-23 09:42:22 +08:00
{
2023-01-24 09:02:40 +08:00
protected IDiagramServiceProvider _service
{
get
{
return DiagramServicesProvider.Instance.Provider;
}
}
2021-07-23 09:42:22 +08:00
2023-01-27 14:54:03 +08:00
public SelectableViewModelBase() : this(null)
2021-07-23 09:42:22 +08:00
{
2023-01-27 14:54:03 +08:00
}
public SelectableViewModelBase(IDiagramViewModel root)
{
2023-04-08 23:38:01 +08:00
IsLoaded = false;
2023-03-25 11:59:31 +08:00
Init(root, true);
2023-04-08 23:38:01 +08:00
IsLoaded = true;
2021-07-23 09:42:22 +08:00
}
2023-01-24 16:20:39 +08:00
public SelectableViewModelBase(IDiagramViewModel root, SelectableItemBase designer)
2021-07-23 09:42:22 +08:00
{
2023-04-08 23:38:01 +08:00
IsLoaded = false;
2023-03-25 11:59:31 +08:00
Init(root, false);
2023-01-27 14:54:03 +08:00
LoadDesignerItemViewModel(designer);
2023-04-08 23:38:01 +08:00
IsLoaded = true;
2021-07-23 09:42:22 +08:00
}
public SelectableViewModelBase(IDiagramViewModel root, SerializableItem serializableItem, string serializableType = null)
{
2023-04-08 23:38:01 +08:00
IsLoaded = false;
2023-03-25 11:59:31 +08:00
Init(root, false);
2023-01-25 11:11:27 +08:00
SelectableItemBase obj = SerializeHelper.DeserializeObject(serializableItem.SerializableTypeName, serializableItem.SerializableString, serializableType);
2023-01-27 14:54:03 +08:00
LoadDesignerItemViewModel(obj);
2023-04-08 23:38:01 +08:00
IsLoaded = true;
2023-01-27 14:54:03 +08:00
}
public virtual SerializableItem ToSerializableItem(string serializableType = null)
{
2023-01-24 23:10:57 +08:00
var obj = GetSerializableObject();
if (obj != null)
{
2023-01-27 14:54:03 +08:00
return new SerializableItem() { ModelTypeName = this.GetType().FullName, SerializableTypeName = obj.GetType().FullName, SerializableString = SerializeHelper.SerializeObject(obj, serializableType) };
}
else
{
return null;
}
}
2023-01-24 23:10:57 +08:00
public virtual SelectableItemBase GetSerializableObject()
{
return null;
}
2023-03-25 11:59:31 +08:00
protected virtual void Init(IDiagramViewModel root, bool initNew)
2023-04-08 23:38:01 +08:00
{
2023-01-27 14:54:03 +08:00
Root = root;
if (Root?.ColorViewModel != null)
{
this.ColorViewModel = CopyHelper.Mapper(Root.ColorViewModel);
}
else
{
this.ColorViewModel = _service.CopyDefaultColorViewModel();
}
if (Root?.FontViewModel != null)
{
this.FontViewModel = CopyHelper.Mapper(Root.FontViewModel);
}
else
{
this.FontViewModel = _service.CopyDefaultFontViewModel();
}
if (Root?.ShapeViewModel != null)
{
this.ShapeViewModel = CopyHelper.Mapper(Root.ShapeViewModel);
}
else
{
this.ShapeViewModel = _service.CopyDefaultShapeViewModel();
}
2021-07-23 09:42:22 +08:00
2023-04-29 15:29:22 +08:00
if (Root?.AnimationViewModel != null)
{
this.AnimationViewModel = CopyHelper.Mapper(Root.AnimationViewModel);
}
else
{
this.AnimationViewModel = _service.CopyDefaultAnimationViewModel();
}
2021-07-23 09:42:22 +08:00
LockObjectViewModel = new LockObjectViewModel();
2023-03-25 11:59:31 +08:00
if (initNew)
{
InitNew();
}
2023-04-08 23:38:01 +08:00
this.PropertyChanged -= Item_PropertyChanged;
this.PropertyChanged += Item_PropertyChanged;
2023-03-25 11:59:31 +08:00
}
protected virtual void InitNew()
{
2023-04-16 10:10:12 +08:00
2021-07-23 09:42:22 +08:00
}
2023-01-27 14:54:03 +08:00
protected virtual void LoadDesignerItemViewModel(SelectableItemBase designerbase)
2021-07-23 09:42:22 +08:00
{
this.Id = designerbase.Id;
this.ParentId = designerbase.ParentId;
this.IsGroup = designerbase.IsGroup;
this.ZIndex = designerbase.ZIndex;
this.Text = designerbase.Text;
this.Name = designerbase.Name;
2021-07-23 09:42:22 +08:00
ColorViewModel = CopyHelper.Mapper(designerbase.ColorItem);
FontViewModel = CopyHelper.Mapper<FontViewModel, FontItem>(designerbase.FontItem);
ShapeViewModel = CopyHelper.Mapper(designerbase.SharpItem);
2023-04-29 15:29:22 +08:00
AnimationViewModel = CopyHelper.Mapper(designerbase.AnimationItem);
2021-07-23 09:42:22 +08:00
}
public bool IsLoaded
2023-04-08 23:38:01 +08:00
{
get;set;
}
public bool IsInternalChanged
{
get; set;
}
2023-01-24 16:20:39 +08:00
public IDiagramViewModel Root
{
get; set;
}
2023-01-24 16:20:39 +08:00
public SelectableViewModelBase Parent
{
get; set;
}
public Guid Id
{
get; set;
}
2021-07-23 09:42:22 +08:00
private Guid _parentId;
public Guid ParentId
{
get
{
return _parentId;
}
set
{
SetProperty(ref _parentId, value);
}
}
public bool IsGroup
{
get; set;
}
2021-07-23 09:42:22 +08:00
public bool DisableSelected
{
get;set;
}
2023-01-29 22:54:06 +08:00
private bool _isSelected;
2021-07-23 09:42:22 +08:00
[Browsable(false)]
2023-04-08 21:48:43 +08:00
//[CanDo]
2023-02-01 23:05:56 +08:00
public bool IsSelected
2021-07-23 09:42:22 +08:00
{
get
{
if (DisableSelected == true)
{
return false;
}
2021-07-23 09:42:22 +08:00
return _isSelected;
}
set
{
2023-02-01 23:05:56 +08:00
if (SetProperty(ref _isSelected, value))
2023-03-25 11:59:31 +08:00
{
2023-02-01 23:05:56 +08:00
//如果没有文字,失去焦点自动清除
if (_isSelected == false && string.IsNullOrEmpty(Text))
{
ClearText();
}
}
2021-07-23 09:42:22 +08:00
}
}
2023-04-08 14:37:07 +08:00
public bool InitIsEditing
2023-04-08 14:28:51 +08:00
{
get; set;
}
2023-03-12 15:26:58 +08:00
private bool _isEditing = false;
2023-02-27 20:18:58 +08:00
public bool IsEditing
{
get
{
return _isEditing;
}
set
{
SetProperty(ref _isEditing, value);
}
}
private bool _showText;
public bool ShowText
{
get
{
return _showText;
}
set
{
if (!SetProperty(ref _showText, value))
{
RaisePropertyChanged(nameof(ShowText));
}
}
}
2023-02-19 21:38:28 +08:00
private bool _visible = true;
public bool Visible
{
get
{
return _visible;
}
set
{
SetProperty(ref _visible, value);
}
}
2021-07-23 09:42:22 +08:00
private int _zIndex;
[Browsable(true)]
[CanDo]
public int ZIndex
{
get
{
return _zIndex;
}
set
{
SetProperty(ref _zIndex, value);
}
}
private bool _isReadOnly;
[Browsable(false)]
public bool IsReadOnly
{
get
{
2023-01-24 16:20:39 +08:00
if (Root?.IsReadOnly == true && Root?.IsLoading == false)
{
return true;
}
if (Parent?.IsReadOnly == true)
2022-12-04 23:07:20 +08:00
{
return true;
}
2023-01-24 16:20:39 +08:00
2022-12-04 23:07:20 +08:00
if (LockObjectViewModel?.LockObject.FirstOrDefault(p => p.LockFlag == LockFlag.All)?.IsChecked == true)
2021-07-23 09:42:22 +08:00
{
return true;
}
return _isReadOnly;
}
set
{
SetProperty(ref _isReadOnly, value);
}
}
private bool _isHitTestVisible = true;
[Browsable(false)]
public bool IsHitTestVisible
{
get
{
2023-01-24 16:20:39 +08:00
if (Parent?.IsHitTestVisible == false)
{
return false;
}
2023-05-14 00:31:25 +08:00
if (DisableSelected == true)
{
return false;
}
2023-01-24 16:20:39 +08:00
2021-07-23 09:42:22 +08:00
return _isHitTestVisible;
}
set
2023-01-27 14:54:03 +08:00
{
2021-07-23 09:42:22 +08:00
if (SetProperty(ref _isHitTestVisible, value))
{
RaisePropertyChanged("IsReadOnly");
}
}
}
private IColorViewModel _colorViewModel;
public IColorViewModel ColorViewModel
{
get
{
return _colorViewModel;
}
set
{
2023-04-08 23:38:01 +08:00
if (_colorViewModel != null)
{
_colorViewModel.PropertyChanged -= ColorViewModel_PropertyChanged;
}
2021-07-23 09:42:22 +08:00
SetProperty(ref _colorViewModel, value);
2023-04-08 23:38:01 +08:00
if (_colorViewModel != null)
{
_colorViewModel.PropertyChanged += ColorViewModel_PropertyChanged;
}
2021-07-23 09:42:22 +08:00
}
}
private IFontViewModel _fontViewModel;
public IFontViewModel FontViewModel
{
get
{
return _fontViewModel;
}
set
{
2023-04-08 23:38:01 +08:00
if (_fontViewModel != null)
{
_fontViewModel.PropertyChanged -= FontViewModel_PropertyChanged;
}
2021-07-23 09:42:22 +08:00
SetProperty(ref _fontViewModel, value);
2023-04-08 23:38:01 +08:00
if (_fontViewModel != null)
{
_fontViewModel.PropertyChanged += FontViewModel_PropertyChanged;
}
2021-07-23 09:42:22 +08:00
}
}
private IShapeViewModel _shapeViewModel;
public IShapeViewModel ShapeViewModel
{
get
{
return _shapeViewModel;
}
set
{
2023-04-08 23:38:01 +08:00
if (_shapeViewModel != null)
{
_shapeViewModel.PropertyChanged -= ShapeViewModel_PropertyChanged;
}
SetProperty(ref _shapeViewModel, value);
2023-04-08 23:38:01 +08:00
if (_shapeViewModel != null)
{
_shapeViewModel.PropertyChanged += ShapeViewModel_PropertyChanged;
}
}
}
2023-04-29 15:29:22 +08:00
private IAnimationViewModel _animationViewModel;
public IAnimationViewModel AnimationViewModel
{
get
{
return _animationViewModel;
}
set
{
if (_animationViewModel != null)
{
_animationViewModel.PropertyChanged -= AnimationViewModel_PropertyChanged;
}
SetProperty(ref _animationViewModel, value);
if (_animationViewModel != null)
{
_animationViewModel.PropertyChanged += AnimationViewModel_PropertyChanged;
}
}
}
public ILockObjectViewModel LockObjectViewModel
{
get; set;
}
2021-07-23 09:42:22 +08:00
2023-04-16 10:10:12 +08:00
[Browsable(true)]
public string Name
{
get;set;
}
2021-07-23 09:42:22 +08:00
private string _text;
[Browsable(true)]
[CanDo]
2023-01-24 09:02:40 +08:00
public virtual string Text
2021-07-23 09:42:22 +08:00
{
get
{
2021-07-27 21:58:55 +08:00
var text = _text;
2021-07-23 09:42:22 +08:00
if (FontViewModel.FontCase == FontCase.Upper)
{
2021-07-27 21:58:55 +08:00
return text?.ToUpper();
2021-07-23 09:42:22 +08:00
}
else if (FontViewModel.FontCase == FontCase.Lower)
{
2021-07-27 21:58:55 +08:00
return text?.ToLower();
2021-07-23 09:42:22 +08:00
}
else
{
2021-07-27 21:58:55 +08:00
return text;
2021-07-23 09:42:22 +08:00
}
}
set
{
2023-01-24 09:02:40 +08:00
if (SetProperty(ref _text, value))
2021-07-27 21:58:55 +08:00
{
2021-07-23 09:42:22 +08:00
}
}
}
2023-02-01 23:05:56 +08:00
protected virtual void ClearText()
{
2023-03-25 11:59:31 +08:00
2023-02-01 23:05:56 +08:00
}
public virtual void ClearSelected()
{
_isSelected = false;
}
2023-01-24 09:02:40 +08:00
public virtual void AddToSelection(bool selected)
2023-01-22 21:46:59 +08:00
{
}
2023-01-25 23:55:30 +08:00
protected bool Command_Enable(object para)
{
return IsReadOnly == false;
}
2023-04-08 23:38:01 +08:00
protected virtual void Item_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (IsLoaded == false || IsInternalChanged == true) { return; }
2023-04-08 23:38:01 +08:00
}
protected void FontViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
2021-07-23 09:42:22 +08:00
{
if (IsLoaded == false || IsInternalChanged == true) { return; }
2023-04-08 23:38:01 +08:00
2023-04-02 12:01:46 +08:00
if (e.PropertyName == nameof(FontViewModel.FontCase))
2021-07-23 09:42:22 +08:00
{
RaisePropertyChanged("Text");
}
2023-04-08 23:38:01 +08:00
RaisePropertyChanged(sender, e);
2021-07-23 09:42:22 +08:00
}
protected void ColorViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
2023-04-08 23:38:01 +08:00
{
if (IsLoaded == false || IsInternalChanged == true ) { return; }
2023-04-08 23:38:01 +08:00
RaisePropertyChanged(sender, e);
}
protected void ShapeViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
2023-04-08 23:38:01 +08:00
{
if (IsLoaded == false || IsInternalChanged == true) { return; }
2023-04-08 23:38:01 +08:00
RaisePropertyChanged(sender, e);
}
2023-04-29 15:29:22 +08:00
protected void AnimationViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if (IsLoaded == false || IsInternalChanged == true) { return; }
2023-04-29 15:29:22 +08:00
RaisePropertyChanged(sender, e);
}
2023-03-25 11:59:31 +08:00
public override string ToString()
{
2023-04-16 10:10:12 +08:00
return $"{Id}-{Name}-{Text}";
2023-03-25 11:59:31 +08:00
}
2021-07-23 09:42:22 +08:00
public virtual void Dispose()
{
}
}
}