diff --git a/AIStudio.Wpf.DiagramApp/ViewModels/MainWindowViewModel.cs b/AIStudio.Wpf.DiagramApp/ViewModels/MainWindowViewModel.cs index 7c865a6..57413bd 100644 --- a/AIStudio.Wpf.DiagramApp/ViewModels/MainWindowViewModel.cs +++ b/AIStudio.Wpf.DiagramApp/ViewModels/MainWindowViewModel.cs @@ -165,6 +165,13 @@ namespace AIStudio.Wpf.DiagramApp.ViewModels return _service.ShapeViewModel; } } + public IAnimationViewModel AnimationViewModel + { + get + { + return _service.AnimationViewModel; + } + } public IQuickThemeViewModel QuickThemeViewModel { get @@ -418,6 +425,7 @@ namespace AIStudio.Wpf.DiagramApp.ViewModels || e.PropertyName == nameof(FontViewModel) || e.PropertyName == nameof(ColorViewModel) || e.PropertyName == nameof(ShapeViewModel) + || e.PropertyName == nameof(AnimationViewModel) || e.PropertyName == nameof(QuickThemeViewModel) || e.PropertyName == nameof(LockObjectViewModel) || e.PropertyName == nameof(SelectedItemViewModel)) @@ -678,7 +686,7 @@ namespace AIStudio.Wpf.DiagramApp.ViewModels switch (ColorType) { - case Models.ColorType.Text: PageViewModel?.DiagramViewModel?.SetFont(new FontViewModel() { FontColor = (Color)para }, "FontColor", PageViewModel.DiagramViewModel.SelectedItems); break; + case Models.ColorType.Text: PageViewModel?.DiagramViewModel?.SetFont(new FontViewModel() { FontColor = (Color)para }, "Color", PageViewModel.DiagramViewModel.SelectedItems); break; case Models.ColorType.Fill: PageViewModel?.DiagramViewModel?.SetColor(new ColorViewModel() { FillColor = new ColorObject() { Color = (Color)para } }, "FillColor", PageViewModel.DiagramViewModel.SelectedItems); break; case Models.ColorType.Line: PageViewModel?.DiagramViewModel?.SetColor(new ColorViewModel() { LineColor = new ColorObject() { Color = (Color)para } }, "LineColor", PageViewModel.DiagramViewModel.SelectedItems); break; } diff --git a/AIStudio.Wpf.DiagramApp/Views/MainWindow.xaml b/AIStudio.Wpf.DiagramApp/Views/MainWindow.xaml index 49c85f6..127f9f0 100644 --- a/AIStudio.Wpf.DiagramApp/Views/MainWindow.xaml +++ b/AIStudio.Wpf.DiagramApp/Views/MainWindow.xaml @@ -1268,7 +1268,7 @@ - + diff --git a/AIStudio.Wpf.DiagramDesigner.Serializable/DiagramDataExtention.cs b/AIStudio.Wpf.DiagramDesigner.Serializable/DiagramDataExtention.cs index debb9bf..4910ba6 100644 --- a/AIStudio.Wpf.DiagramDesigner.Serializable/DiagramDataExtention.cs +++ b/AIStudio.Wpf.DiagramDesigner.Serializable/DiagramDataExtention.cs @@ -181,11 +181,11 @@ namespace AIStudio.Wpf.DiagramDesigner.Serializable if (!string.IsNullOrEmpty(diagramLink.SourceMarkerPath)) { - linkModel.ShapeViewModel.SourceMarker = new LinkMarker() { Path = diagramLink.SourceMarkerPath, Width = diagramLink.SourceMarkerWidth ?? 10, Height = diagramLink.SourceMarkerWidth ?? 10 }; + linkModel.ShapeViewModel.SourceMarker = new SharpPath() { Path = diagramLink.SourceMarkerPath, Width = diagramLink.SourceMarkerWidth ?? 10, Height = diagramLink.SourceMarkerWidth ?? 10 }; } if (!string.IsNullOrEmpty(diagramLink.TargetMarkerPath)) { - linkModel.ShapeViewModel.SinkMarker = new LinkMarker() { Path = diagramLink.TargetMarkerPath, Width = diagramLink.TargetMarkerWidth ?? 10.0, Height = diagramLink.TargetMarkerWidth ?? 10 }; + linkModel.ShapeViewModel.SinkMarker = new SharpPath() { Path = diagramLink.TargetMarkerPath, Width = diagramLink.TargetMarkerWidth ?? 10.0, Height = diagramLink.TargetMarkerWidth ?? 10 }; } return linkModel; } diff --git a/AIStudio.Wpf.DiagramDesigner/Controls/DesignerCanvas.cs b/AIStudio.Wpf.DiagramDesigner/Controls/DesignerCanvas.cs index 768e33e..52afa39 100644 --- a/AIStudio.Wpf.DiagramDesigner/Controls/DesignerCanvas.cs +++ b/AIStudio.Wpf.DiagramDesigner/Controls/DesignerCanvas.cs @@ -289,6 +289,7 @@ namespace AIStudio.Wpf.DiagramDesigner CopyHelper.CopyPropertyValue(source.ColorViewModel, target.ColorViewModel); CopyHelper.CopyPropertyValue(source.FontViewModel, target.FontViewModel); CopyHelper.CopyPropertyValue(source.ShapeViewModel, target.ShapeViewModel); + CopyHelper.CopyPropertyValue(source.AnimationViewModel, target.AnimationViewModel); } #endregion diff --git a/AIStudio.Wpf.DiagramDesigner/Helpers/CopyHelper.cs b/AIStudio.Wpf.DiagramDesigner/Helpers/CopyHelper.cs index 0e35672..5e300a7 100644 --- a/AIStudio.Wpf.DiagramDesigner/Helpers/CopyHelper.cs +++ b/AIStudio.Wpf.DiagramDesigner/Helpers/CopyHelper.cs @@ -165,6 +165,7 @@ namespace AIStudio.Wpf.DiagramDesigner d.ColorViewModel = CopyHelper.Mapper(s.ColorViewModel); d.FontViewModel = CopyHelper.Mapper(s.FontViewModel); d.ShapeViewModel = CopyHelper.Mapper(s.ShapeViewModel); + d.AnimationViewModel = CopyHelper.Mapper(s.AnimationViewModel); d.LockObjectViewModel = CopyHelper.Mapper(s.LockObjectViewModel); d.IsLoaded = true; return d; @@ -194,16 +195,16 @@ namespace AIStudio.Wpf.DiagramDesigner public static IShapeViewModel Mapper(IShapeViewModel s) { var d = CopyHelper.Mapper(s); - d.SourceMarker = CopyHelper.Mapper(s.SourceMarker); - d.SinkMarker = CopyHelper.Mapper(s.SinkMarker); + d.SourceMarker = CopyHelper.Mapper(s.SourceMarker); + d.SinkMarker = CopyHelper.Mapper(s.SinkMarker); return d; } public static T Mapper(IShapeViewModel s) where T : IShapeViewModel { var d = CopyHelper.Mapper(s); - d.SourceMarker = CopyHelper.Mapper(s.SourceMarker); - d.SinkMarker = CopyHelper.Mapper(s.SinkMarker); + d.SourceMarker = CopyHelper.Mapper(s.SourceMarker); + d.SinkMarker = CopyHelper.Mapper(s.SinkMarker); return d; } @@ -219,6 +220,18 @@ namespace AIStudio.Wpf.DiagramDesigner return d; } + public static IAnimationViewModel Mapper(IAnimationViewModel s) + { + var d = CopyHelper.Mapper(s); + return d; + } + + public static T Mapper(IAnimationViewModel s) where T : IAnimationViewModel + { + var d = CopyHelper.Mapper(s); + return d; + } + public static void CopyPropertyValue(IColorViewModel s, IColorViewModel d, string propertyName = null) { if (propertyName == "LineColor") diff --git a/AIStudio.Wpf.DiagramDesigner/Models/Serializables/SelectableItemBase.cs b/AIStudio.Wpf.DiagramDesigner/Models/Serializables/SelectableItemBase.cs index bd40a79..948f65b 100644 --- a/AIStudio.Wpf.DiagramDesigner/Models/Serializables/SelectableItemBase.cs +++ b/AIStudio.Wpf.DiagramDesigner/Models/Serializables/SelectableItemBase.cs @@ -24,7 +24,7 @@ namespace AIStudio.Wpf.DiagramDesigner { ColorItem = new ColorItem() { LineColor = new ColorObjectItem(), FillColor = new ColorObjectItem() }; FontItem = new FontItem(); - SharpItem = new SharpItem() { SourceMarker = new LinkMarkerItem(), SinkMarker = new LinkMarkerItem() }; + SharpItem = new SharpItem() { SourceMarker = new SharpPathItem(), SinkMarker = new SharpPathItem() }; } public SelectableItemBase(SelectableViewModelBase viewmodel) @@ -37,8 +37,9 @@ namespace AIStudio.Wpf.DiagramDesigner this.Name = viewmodel.Name; ColorItem = CopyHelper.Mapper(viewmodel.ColorViewModel); - FontItem = CopyHelper.Mapper(viewmodel.FontViewModel); + FontItem = CopyHelper.Mapper(viewmodel.FontViewModel); SharpItem = CopyHelper.Mapper(viewmodel.ShapeViewModel); + AnimationItem = CopyHelper.Mapper(viewmodel.AnimationViewModel); } [XmlAttribute] @@ -94,6 +95,12 @@ namespace AIStudio.Wpf.DiagramDesigner { get; set; } + + [XmlElement] + public AnimationItem AnimationItem + { + get; set; + } } [XmlInclude(typeof(ColorItem))] @@ -171,18 +178,7 @@ namespace AIStudio.Wpf.DiagramDesigner { get; set; } - - [XmlAttribute] - public LineAnimation LineAnimation - { - get; set; - } - - [XmlAttribute] - public double LineAnimationDuration - { - get; set; - } + public event PropertyChangedEventHandler PropertyChanged; } @@ -190,18 +186,18 @@ namespace AIStudio.Wpf.DiagramDesigner public class SharpItem : IShapeViewModel { [XmlIgnore] - public ILinkMarker SourceMarker + public ISharpPath SourceMarker { get; set; } [JsonIgnore] [XmlElement("SourceMarker")] - public LinkMarkerItem XmlSourceMarker + public SharpPathItem XmlSourceMarker { get { - return SourceMarker as LinkMarkerItem; + return SourceMarker as SharpPathItem; } set { @@ -210,18 +206,18 @@ namespace AIStudio.Wpf.DiagramDesigner } [XmlIgnore] - public ILinkMarker SinkMarker + public ISharpPath SinkMarker { get; set; } [JsonIgnore] [XmlElement("SinkMarker")] - public LinkMarkerItem XmlSinkMarker + public SharpPathItem XmlSinkMarker { get { - return SinkMarker as LinkMarkerItem; + return SinkMarker as SharpPathItem; } set { @@ -273,7 +269,7 @@ namespace AIStudio.Wpf.DiagramDesigner } [JsonIgnore] - [XmlElement("FontColor")] + [XmlElement("Color")] public string XmlFontColor { get @@ -419,6 +415,62 @@ namespace AIStudio.Wpf.DiagramDesigner public event PropertyChangedEventHandler PropertyChanged; } + [XmlInclude(typeof(AnimationItem))] + public class AnimationItem : IAnimationViewModel + { + [XmlAttribute] + public LineAnimation LineAnimation + { + get; set; + } + + [XmlAttribute] + public double Duration + { + get; set; + } + + [XmlIgnore] + public Color Color + { + get; set; + } + + [JsonIgnore] + [XmlElement("Color")] + public string XmlColor + { + get + { + return SerializeHelper.SerializeColor(Color); + } + set + { + Color = SerializeHelper.DeserializeColor(value); + } + } + + [XmlAttribute] + public string Path + { + get; set; + } + + [XmlAttribute] + public double Width + { + get; set; + } + + [XmlAttribute] + public double Height + { + get; set; + } + + public event PropertyChangedEventHandler PropertyChanged; + } + public class SerializeHelper { public static string SerializeColor(Color color) @@ -798,7 +850,7 @@ namespace AIStudio.Wpf.DiagramDesigner } - public class LinkMarkerItem : ILinkMarker + public class SharpPathItem : ISharpPath { [XmlAttribute] public string Path diff --git a/AIStudio.Wpf.DiagramDesigner/UserControls/LineControl.xaml b/AIStudio.Wpf.DiagramDesigner/UserControls/LineControl.xaml index f5557bc..7290dfb 100644 --- a/AIStudio.Wpf.DiagramDesigner/UserControls/LineControl.xaml +++ b/AIStudio.Wpf.DiagramDesigner/UserControls/LineControl.xaml @@ -104,7 +104,10 @@ Height="{Binding SinkConnectorInfo.ConnectorHeight}" Visibility="{Binding IsSelected,Converter={StaticResource BooleanToVisibilityConverter}}" /> - diff --git a/AIStudio.Wpf.DiagramDesigner/UserControls/LineControl.xaml.cs b/AIStudio.Wpf.DiagramDesigner/UserControls/LineControl.xaml.cs index 1b194b1..3c4ad9d 100644 --- a/AIStudio.Wpf.DiagramDesigner/UserControls/LineControl.xaml.cs +++ b/AIStudio.Wpf.DiagramDesigner/UserControls/LineControl.xaml.cs @@ -41,8 +41,8 @@ namespace AIStudio.Wpf.DiagramDesigner { if (this.DataContext is ConnectionViewModel connector && connector.ColorViewModel != null) { - connector.ColorViewModel.PropertyChanged -= Connector_PropertyChanged; - connector.ColorViewModel.PropertyChanged += Connector_PropertyChanged; + connector.AnimationViewModel.PropertyChanged -= Connector_PropertyChanged; + connector.AnimationViewModel.PropertyChanged += Connector_PropertyChanged; } this.ball.Visibility = Visibility.Collapsed; await DoAnimation(); @@ -52,8 +52,8 @@ namespace AIStudio.Wpf.DiagramDesigner { switch (e.PropertyName) { - case nameof(ColorViewModel.LineAnimation): - case nameof(ColorViewModel.LineAnimationDuration): + case nameof(AnimationViewModel.LineAnimation): + case nameof(AnimationViewModel.Duration): await DoAnimation(); break; @@ -65,7 +65,7 @@ namespace AIStudio.Wpf.DiagramDesigner if (this.DataContext is ConnectionViewModel connector && connector.IsFullConnection) { await System.Threading.Tasks.Task.Delay(100); - switch (connector.ColorViewModel.LineAnimation) + switch (connector.AnimationViewModel.LineAnimation) { case LineAnimation.None: _story?.Stop(this); @@ -76,14 +76,14 @@ namespace AIStudio.Wpf.DiagramDesigner { connector.ColorViewModel.FillColor.Color = Colors.Red; } - PathAnimation(connector.ColorViewModel.LineAnimationDuration); + PathAnimation(connector.AnimationViewModel.Duration); break; case LineAnimation.DashAnimation: if (connector.ColorViewModel.LineDashStyle == LineDashStyle.None) { connector.ColorViewModel.LineDashStyle = LineDashStyle.Dash1; } - DashAnimation(connector.ColorViewModel.LineAnimationDuration); + DashAnimation(connector.AnimationViewModel.Duration); break; } } @@ -128,11 +128,14 @@ namespace AIStudio.Wpf.DiagramDesigner _story?.Stop(this); _story = new Storyboard(); - _story.RepeatBehavior = RepeatBehavior.Forever; + //_story.RepeatBehavior = RepeatBehavior.Forever; //story.AutoReverse = true; _story.Children.Add(animationX); _story.Children.Add(animationY); _story.Children.Add(animationAngle); + _story.Completed += (s, d) => { + _story.Begin(this, true); + }; Storyboard.SetTargetName(animationX, "translate"); Storyboard.SetTargetName(animationY, "translate"); Storyboard.SetTargetName(animationAngle, "rotate"); diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/AdditionViewModel/AnimationViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/AdditionViewModel/AnimationViewModel.cs new file mode 100644 index 0000000..5ba55a2 --- /dev/null +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/AdditionViewModel/AnimationViewModel.cs @@ -0,0 +1,96 @@ +using System; +using System.Windows.Media; + +namespace AIStudio.Wpf.DiagramDesigner +{ + [Serializable] + public class AnimationViewModel : BindableBase, IAnimationViewModel + { + private LineAnimation _lineAnimation = LineAnimation.None; + [CanDo] + public LineAnimation LineAnimation + { + get + { + return _lineAnimation; + } + set + { + SetProperty(ref _lineAnimation, value); + } + } + + private double _duration = 1; + [CanDo] + public double Duration + { + get + { + return _duration; + } + set + { + SetProperty(ref _duration, value); + } + } + + private Color _color = Colors.Red; + [CanDo] + public Color Color + { + get + { + return _color; + } + set + { + if (!SetProperty(ref _color, value)) + { + RaisePropertyChanged(nameof(Color)); + } + } + } + + private string _path = "M 10,20 A 20,20 0 1 1 50,20 A 20,20 0 1 1 10,20"; + [CanDo] + public string Path + { + get + { + return _path; + } + set + { + SetProperty(ref _path, value); + } + } + + private double _witdh; + [CanDo] + public double Width + { + get + { + return _witdh; + } + set + { + SetProperty(ref _witdh, value); + } + } + + private double _height; + [CanDo] + public double Height + { + get + { + return _height; + } + set + { + SetProperty(ref _height, value); + } + } + } +} diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/AdditionViewModel/ColorViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/AdditionViewModel/ColorViewModel.cs index 5fcbb7c..3e76899 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/AdditionViewModel/ColorViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/AdditionViewModel/ColorViewModel.cs @@ -144,34 +144,6 @@ namespace AIStudio.Wpf.DiagramDesigner } } } - - private LineAnimation _lineAnimation = LineAnimation.None; - [CanDo] - public LineAnimation LineAnimation - { - get - { - return _lineAnimation; - } - set - { - SetProperty(ref _lineAnimation, value); - } - } - - private double _lineAnimationDuration = 1; - [CanDo] - public double LineAnimationDuration - { - get - { - return _lineAnimationDuration; - } - set - { - SetProperty(ref _lineAnimationDuration, value); - } - } } diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/AdditionViewModel/Interface/IAnimationViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/AdditionViewModel/Interface/IAnimationViewModel.cs new file mode 100644 index 0000000..6e7b10c --- /dev/null +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/AdditionViewModel/Interface/IAnimationViewModel.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Media; + +namespace AIStudio.Wpf.DiagramDesigner +{ + public interface IAnimationViewModel + { + LineAnimation LineAnimation + { + get; set; + } + double Duration + { + get; set; + } + Color Color + { + get; set; + } + string Path + { + get; set; + } + double Width + { + get; set; + } + double Height + { + get; set; + } + event PropertyChangedEventHandler PropertyChanged; + } +} diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/AdditionViewModel/Interface/IColorViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/AdditionViewModel/Interface/IColorViewModel.cs index fb4088d..46e4502 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/AdditionViewModel/Interface/IColorViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/AdditionViewModel/Interface/IColorViewModel.cs @@ -28,15 +28,7 @@ namespace AIStudio.Wpf.DiagramDesigner LineDashStyle LineDashStyle { get; set; - } - LineAnimation LineAnimation - { - get; set; - } - double LineAnimationDuration - { - get; set; - } + } event PropertyChangedEventHandler PropertyChanged; } } diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/AdditionViewModel/Interface/IShapeViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/AdditionViewModel/Interface/IShapeViewModel.cs index 98a31b3..9288e9c 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/AdditionViewModel/Interface/IShapeViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/AdditionViewModel/Interface/IShapeViewModel.cs @@ -7,12 +7,12 @@ namespace AIStudio.Wpf.DiagramDesigner { public interface IShapeViewModel { - ILinkMarker SourceMarker + ISharpPath SourceMarker { get; set; } - ILinkMarker SinkMarker + ISharpPath SinkMarker { get; set; } diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/AdditionViewModel/ShapeViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/AdditionViewModel/ShapeViewModel.cs index d96d2c9..0a673b7 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/AdditionViewModel/ShapeViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/AdditionViewModel/ShapeViewModel.cs @@ -6,8 +6,8 @@ namespace AIStudio.Wpf.DiagramDesigner { public class ShapeViewModel : BindableBase, IShapeViewModel { - private ILinkMarker _sourceMarker = LinkMarker.None; - public ILinkMarker SourceMarker + private ISharpPath _sourceMarker = SharpPath.None; + public ISharpPath SourceMarker { get { @@ -17,12 +17,12 @@ namespace AIStudio.Wpf.DiagramDesigner { if (_sourceMarker != value) { - if (_sourceMarker != null && _sourceMarker is LinkMarker _linkMarker1) + if (_sourceMarker != null && _sourceMarker is SharpPath _linkMarker1) { _linkMarker1.PropertyChanged -= ShapeViewModel_PropertyChanged; } SetProperty(ref _sourceMarker, value); - if (_sourceMarker != null && _sourceMarker is LinkMarker _linkMarker2) + if (_sourceMarker != null && _sourceMarker is SharpPath _linkMarker2) { _linkMarker2.PropertyChanged += ShapeViewModel_PropertyChanged; } @@ -34,8 +34,8 @@ namespace AIStudio.Wpf.DiagramDesigner } } - private ILinkMarker _sinkMarker = LinkMarker.Arrow; - public ILinkMarker SinkMarker + private ISharpPath _sinkMarker = SharpPath.Arrow; + public ISharpPath SinkMarker { get { @@ -45,12 +45,12 @@ namespace AIStudio.Wpf.DiagramDesigner { if (_sinkMarker != value) { - if (_sinkMarker != null && _sinkMarker is LinkMarker _linkMarker1) + if (_sinkMarker != null && _sinkMarker is SharpPath _linkMarker1) { _linkMarker1.PropertyChanged -= ShapeViewModel_PropertyChanged; } SetProperty(ref _sinkMarker, value); - if (_sinkMarker != null && _sinkMarker is LinkMarker _linkMarker2) + if (_sinkMarker != null && _sinkMarker is SharpPath _linkMarker2) { _linkMarker2.PropertyChanged += ShapeViewModel_PropertyChanged; } @@ -75,12 +75,12 @@ namespace AIStudio.Wpf.DiagramDesigner } } - public class LinkMarker : BindableBase, ILinkMarker + public class SharpPath : BindableBase, ISharpPath { - public static LinkMarker None { get; } = new LinkMarker("", 10, 10, ArrowPathStyle.None, ArrowSizeStyle.Middle); - public static LinkMarker Arrow { get; } = new LinkMarker("M 0 -5 10 0 0 5 z", 10, 10, ArrowPathStyle.Arrow, ArrowSizeStyle.Middle); - public static LinkMarker Circle { get; } = new LinkMarker("M 0, 0 a 5,5 0 1,0 10,0 a 5,5 0 1,0 -10,0", 10, 10, ArrowPathStyle.Circle, ArrowSizeStyle.Middle); - public static LinkMarker Square { get; } = new LinkMarker("M 0 -5 10 -5 10 5 0 5 z", 10, 10, ArrowPathStyle.Square, ArrowSizeStyle.Middle); + public static SharpPath None { get; } = new SharpPath("", 10, 10, ArrowPathStyle.None, ArrowSizeStyle.Middle); + public static SharpPath Arrow { get; } = new SharpPath("M 0 -5 10 0 0 5 z", 10, 10, ArrowPathStyle.Arrow, ArrowSizeStyle.Middle); + public static SharpPath Circle { get; } = new SharpPath("M 0, 0 a 5,5 0 1,0 10,0 a 5,5 0 1,0 -10,0", 10, 10, ArrowPathStyle.Circle, ArrowSizeStyle.Middle); + public static SharpPath Square { get; } = new SharpPath("M 0 -5 10 -5 10 5 0 5 z", 10, 10, ArrowPathStyle.Square, ArrowSizeStyle.Middle); public static readonly Dictionary ArrowDictionary = new Dictionary() { @@ -90,12 +90,12 @@ namespace AIStudio.Wpf.DiagramDesigner { ArrowPathStyle.Square, Square.Path }, }; - public LinkMarker() + public SharpPath() { } - public LinkMarker(string path, double width, double height, ArrowPathStyle arrowPathStyle, ArrowSizeStyle arrowSizeStyle) + public SharpPath(string path, double width, double height, ArrowPathStyle arrowPathStyle, ArrowSizeStyle arrowSizeStyle) { Path = path; Width = width; @@ -184,19 +184,19 @@ namespace AIStudio.Wpf.DiagramDesigner } } - public static LinkMarker NewArrow(double width, double height) - => new LinkMarker(FormattableString.Invariant($"M 0 -{height / 2} {width} 0 0 {height / 2}"), width, height, ArrowPathStyle.Arrow, (ArrowSizeStyle)width); + public static SharpPath NewArrow(double width, double height) + => new SharpPath(FormattableString.Invariant($"M 0 -{height / 2} {width} 0 0 {height / 2}"), width, height, ArrowPathStyle.Arrow, (ArrowSizeStyle)width); - public static LinkMarker NewCircle(double r) - => new LinkMarker(FormattableString.Invariant($"M 0, 0 a {r},{r} 0 1,0 {r * 2},0 a {r},{r} 0 1,0 -{r * 2},0"), r * 2, r * 2, ArrowPathStyle.Circle, (ArrowSizeStyle)(r * 2)); + public static SharpPath NewCircle(double r) + => new SharpPath(FormattableString.Invariant($"M 0, 0 a {r},{r} 0 1,0 {r * 2},0 a {r},{r} 0 1,0 -{r * 2},0"), r * 2, r * 2, ArrowPathStyle.Circle, (ArrowSizeStyle)(r * 2)); - public static LinkMarker NewRectangle(double width, double height) - => new LinkMarker(FormattableString.Invariant($"M 0 -{height / 2} {width} -{height / 2} {width} {height / 2} 0 {height / 2} z"), width, height, ArrowPathStyle.Square, (ArrowSizeStyle)width); + public static SharpPath NewRectangle(double width, double height) + => new SharpPath(FormattableString.Invariant($"M 0 -{height / 2} {width} -{height / 2} {width} {height / 2} 0 {height / 2} z"), width, height, ArrowPathStyle.Square, (ArrowSizeStyle)width); - public static LinkMarker NewSquare(double size) => NewRectangle(size, size); + public static SharpPath NewSquare(double size) => NewRectangle(size, size); } - public interface ILinkMarker + public interface ISharpPath { string Path { diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/ConnectionViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/ConnectionViewModel.cs index 9f97745..b09b1d7 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/ConnectionViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/ConnectionViewModel.cs @@ -62,7 +62,7 @@ namespace AIStudio.Wpf.DiagramDesigner this.Root = root ?? sourceConnectorInfo.Root; if (sinkConnectorInfo is FullyCreatedConnectorInfo sink && sink.DataItem.ShowArrow == false) { - this.ShapeViewModel.SinkMarker = new LinkMarker("", 10, 10, ArrowPathStyle.None, ArrowSizeStyle.Middle); + this.ShapeViewModel.SinkMarker = new SharpPath("", 10, 10, ArrowPathStyle.None, ArrowSizeStyle.Middle); } var routetype = TypeHelper.GetType(RouterMode); Router = routetype != null ? (System.Activator.CreateInstance(routetype) as IRouter) : new RouterNormal(); diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramServicesProvider.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramServicesProvider.cs index d3b5780..1deeb09 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramServicesProvider.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramServicesProvider.cs @@ -14,6 +14,7 @@ namespace AIStudio.Wpf.DiagramDesigner.ViewModels.BaseViewModel ColorViewModel = new ColorViewModel(); FontViewModel = new FontViewModel(); ShapeViewModel = new ShapeViewModel(); + AnimationViewModel= new AnimationViewModel(); LockObjectViewModel = new LockObjectViewModel(); _drawModeViewModel = new DrawModeViewModel(); @@ -25,6 +26,7 @@ namespace AIStudio.Wpf.DiagramDesigner.ViewModels.BaseViewModel SetOldValue(ColorViewModel, nameof(ColorViewModel)); SetOldValue(FontViewModel, nameof(FontViewModel)); SetOldValue(ShapeViewModel, nameof(ShapeViewModel)); + SetOldValue(AnimationViewModel, nameof(AnimationViewModel)); SetOldValue(LockObjectViewModel, nameof(LockObjectViewModel)); } @@ -51,6 +53,12 @@ namespace AIStudio.Wpf.DiagramDesigner.ViewModels.BaseViewModel return CopyHelper.Mapper(viewModel); } + public IAnimationViewModel CopyDefaultAnimationViewModel() + { + var viewModel = GetOldValue(nameof(AnimationViewModel)); + return CopyHelper.Mapper(viewModel); + } + private IColorViewModel _colorViewModel; public IColorViewModel ColorViewModel { @@ -90,6 +98,19 @@ namespace AIStudio.Wpf.DiagramDesigner.ViewModels.BaseViewModel } } + private IAnimationViewModel _animationViewModel; + public IAnimationViewModel AnimationViewModel + { + get + { + return _animationViewModel; + } + set + { + SetProperty(ref _animationViewModel, value); + } + } + private IDrawModeViewModel _drawModeViewModel; public IDrawModeViewModel DrawModeViewModel { @@ -147,6 +168,7 @@ namespace AIStudio.Wpf.DiagramDesigner.ViewModels.BaseViewModel ColorViewModel = GetOldValue(nameof(ColorViewModel)); FontViewModel = GetOldValue(nameof(FontViewModel)); ShapeViewModel = GetOldValue(nameof(ShapeViewModel)); + AnimationViewModel = GetOldValue(nameof(AnimationViewModel)); LockObjectViewModel = GetOldValue(nameof(LockObjectViewModel)); } else @@ -154,6 +176,7 @@ namespace AIStudio.Wpf.DiagramDesigner.ViewModels.BaseViewModel ColorViewModel = _selectedItem.ColorViewModel; FontViewModel = _selectedItem.FontViewModel; ShapeViewModel = _selectedItem.ShapeViewModel; + AnimationViewModel = _selectedItem.AnimationViewModel; LockObjectViewModel = _selectedItem.LockObjectViewModel; } } diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs index 13db7b9..040b7ce 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/DiagramViewModel.cs @@ -87,6 +87,11 @@ namespace AIStudio.Wpf.DiagramDesigner get; set; } + public IAnimationViewModel AnimationViewModel + { + get; set; + } + private PageSizeType _pageSizeType = PageSizeType.A4; public PageSizeType PageSizeType { @@ -2971,6 +2976,28 @@ namespace AIStudio.Wpf.DiagramDesigner } } + public void SetAnimation(IAnimationViewModel animationViewModel, string propertyName, List items) + { + if (items.Any()) + { + Dictionary infos = items.ToDictionary(p => p, p => p.AnimationViewModel.GetPropertyValue(propertyName)); + DoCommandManager.DoNewCommand(this.ToString(), + () => { + var value = animationViewModel.GetPropertyValue(propertyName); + foreach (var item in items) + { + item.AnimationViewModel.SetPropertyValue(propertyName, value); + } + }, + () => { + foreach (var item in infos) + { + item.Key.AnimationViewModel.SetPropertyValue(propertyName, item.Value); + } + }); + } + } + public void SetQuickItem(IQuickThemeViewModel quickThemeViewModel, string propertyName, List items) { if (propertyName == nameof(QuickTheme) && quickThemeViewModel.QuickTheme != null) @@ -2979,19 +3006,19 @@ namespace AIStudio.Wpf.DiagramDesigner { Dictionary> infos = items.ToDictionary(p => p, p => new Tuple( - p.FontViewModel.GetPropertyValue("FontColor"), + p.FontViewModel.GetPropertyValue("Color"), p.ColorViewModel.GetPropertyValue("FillColor"), p.ColorViewModel.GetPropertyValue("LineColor"), p.ColorViewModel.GetPropertyValue("LineWidth"))); DoCommandManager.DoNewCommand(this.ToString(), () => { - var value1 = quickThemeViewModel.QuickTheme.FontViewModel.GetPropertyValue("FontColor"); + var value1 = quickThemeViewModel.QuickTheme.FontViewModel.GetPropertyValue("Color"); var value2 = quickThemeViewModel.QuickTheme.ColorViewModel.GetPropertyValue("FillColor"); var value3 = quickThemeViewModel.QuickTheme.ColorViewModel.GetPropertyValue("LineColor"); var value4 = quickThemeViewModel.QuickTheme.ColorViewModel.GetPropertyValue("LineWidth"); foreach (var item in items) { - item.FontViewModel.SetPropertyValue("FontColor", value1); + item.FontViewModel.SetPropertyValue("Color", value1); item.ColorViewModel.SetPropertyValue("FillColor", value2); item.ColorViewModel.SetPropertyValue("LineColor", value3); item.ColorViewModel.SetPropertyValue("LineWidth", value4); @@ -3000,7 +3027,7 @@ namespace AIStudio.Wpf.DiagramDesigner () => { foreach (var item in infos) { - item.Key.FontViewModel.SetPropertyValue("FontColor", item.Value.Item1); + item.Key.FontViewModel.SetPropertyValue("Color", item.Value.Item1); item.Key.ColorViewModel.SetPropertyValue("FillColor", item.Value.Item2); item.Key.ColorViewModel.SetPropertyValue("LineColor", item.Value.Item3); item.Key.ColorViewModel.SetPropertyValue("LineWidth", item.Value.Item4); diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/SelectableViewModelBase.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/SelectableViewModelBase.cs index e8cb3ad..000fb1e 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/SelectableViewModelBase.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/BaseViewModel/SelectableViewModelBase.cs @@ -102,6 +102,15 @@ namespace AIStudio.Wpf.DiagramDesigner this.ShapeViewModel = _service.CopyDefaultShapeViewModel(); } + if (Root?.AnimationViewModel != null) + { + this.AnimationViewModel = CopyHelper.Mapper(Root.AnimationViewModel); + } + else + { + this.AnimationViewModel = _service.CopyDefaultAnimationViewModel(); + } + LockObjectViewModel = new LockObjectViewModel(); if (initNew) @@ -130,6 +139,7 @@ namespace AIStudio.Wpf.DiagramDesigner ColorViewModel = CopyHelper.Mapper(designerbase.ColorItem); FontViewModel = CopyHelper.Mapper(designerbase.FontItem); ShapeViewModel = CopyHelper.Mapper(designerbase.SharpItem); + AnimationViewModel = CopyHelper.Mapper(designerbase.AnimationItem); } public bool IsLoaded @@ -367,6 +377,27 @@ namespace AIStudio.Wpf.DiagramDesigner } } + 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; @@ -459,6 +490,14 @@ namespace AIStudio.Wpf.DiagramDesigner RaisePropertyChanged(sender, e); } + protected void AnimationViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) + { + if (IsLoaded == false) { return; } + + RaisePropertyChanged(sender, e); + } + + public override string ToString() { return $"{Id}-{Name}-{Text}"; diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/IDiagramServiceProvider.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/IDiagramServiceProvider.cs index 0ceff2a..5bdaafb 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/IDiagramServiceProvider.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/IDiagramServiceProvider.cs @@ -22,6 +22,10 @@ namespace AIStudio.Wpf.DiagramDesigner.ViewModels { get; } + IAnimationViewModel AnimationViewModel + { + get; + } IDrawModeViewModel DrawModeViewModel { get; @@ -42,5 +46,6 @@ namespace AIStudio.Wpf.DiagramDesigner.ViewModels IColorViewModel CopyDefaultColorViewModel(); IFontViewModel CopyDefaultFontViewModel(); IShapeViewModel CopyDefaultShapeViewModel(); + IAnimationViewModel CopyDefaultAnimationViewModel(); } } diff --git a/AIStudio.Wpf.DiagramDesigner/ViewModels/IDiagramViewModel.cs b/AIStudio.Wpf.DiagramDesigner/ViewModels/IDiagramViewModel.cs index 2c7407b..cd30b8e 100644 --- a/AIStudio.Wpf.DiagramDesigner/ViewModels/IDiagramViewModel.cs +++ b/AIStudio.Wpf.DiagramDesigner/ViewModels/IDiagramViewModel.cs @@ -360,6 +360,10 @@ namespace AIStudio.Wpf.DiagramDesigner { get; set; } + IAnimationViewModel AnimationViewModel + { + get; set; + } #endregion DoCommandManager DoCommandManager diff --git a/Demos/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Animations/LineAnimationViewModel.cs b/Demos/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Animations/LineAnimationViewModel.cs index b27b1ad..291d410 100644 --- a/Demos/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Animations/LineAnimationViewModel.cs +++ b/Demos/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Animations/LineAnimationViewModel.cs @@ -29,12 +29,12 @@ namespace AIStudio.Wpf.DiagramDesigner.Demo.ViewModels ConnectionViewModel connector1 = new ConnectionViewModel(DiagramViewModel, node1.RightConnector, node2.LeftConnector, DrawMode.ConnectingLineSmooth, RouterMode.RouterNormal); connector1.ColorViewModel.LineDashStyle = LineDashStyle.Dash1; - connector1.ColorViewModel.LineAnimation = LineAnimation.DashAnimation; + connector1.AnimationViewModel.LineAnimation = LineAnimation.DashAnimation; DiagramViewModel.Add(connector1); ConnectionViewModel connector2 = new ConnectionViewModel(DiagramViewModel, node2.RightConnector, node3.RightConnector, DrawMode.ConnectingLineStraight, RouterMode.RouterOrthogonal); connector2.ColorViewModel.LineDashStyle = LineDashStyle.Dash1; - connector2.ColorViewModel.LineAnimation = LineAnimation.DashAnimation; + connector2.AnimationViewModel.LineAnimation = LineAnimation.DashAnimation; DiagramViewModel.Add(connector2); } } diff --git a/Demos/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Animations/PathAnimationViewModel.cs b/Demos/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Animations/PathAnimationViewModel.cs index 2560b74..d213e59 100644 --- a/Demos/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Animations/PathAnimationViewModel.cs +++ b/Demos/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Animations/PathAnimationViewModel.cs @@ -30,12 +30,12 @@ namespace AIStudio.Wpf.DiagramDesigner.Demo.ViewModels ConnectionViewModel connector1 = new ConnectionViewModel(DiagramViewModel, node1.RightConnector, node2.LeftConnector, DrawMode.ConnectingLineSmooth, RouterMode.RouterNormal); connector1.ColorViewModel.FillColor.Color = Colors.Red; - connector1.ColorViewModel.LineAnimation = LineAnimation.PathAnimation; + connector1.AnimationViewModel.LineAnimation = LineAnimation.PathAnimation; DiagramViewModel.Add(connector1); ConnectionViewModel connector2 = new ConnectionViewModel(DiagramViewModel, node2.RightConnector, node3.RightConnector, DrawMode.ConnectingLineStraight, RouterMode.RouterOrthogonal); connector2.ColorViewModel.FillColor.Color = Colors.Red; - connector2.ColorViewModel.LineAnimation = LineAnimation.PathAnimation; + connector2.AnimationViewModel.LineAnimation = LineAnimation.PathAnimation; DiagramViewModel.Add(connector2); } } diff --git a/Demos/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Links/MarkersViewModel.cs b/Demos/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Links/MarkersViewModel.cs index 3f0dbad..c83ec2b 100644 --- a/Demos/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Links/MarkersViewModel.cs +++ b/Demos/AIStudio.Wpf.DiagramDesigner.Demo/ViewModels/Links/MarkersViewModel.cs @@ -25,8 +25,8 @@ namespace AIStudio.Wpf.DiagramDesigner.Demo.ViewModels DiagramViewModel.Add(node2); ConnectionViewModel connector1 = new ConnectionViewModel(DiagramViewModel, node1.RightConnector, node2.LeftConnector); - connector1.ShapeViewModel.SourceMarker = LinkMarker.Arrow; - connector1.ShapeViewModel.SinkMarker = LinkMarker.Arrow; + connector1.ShapeViewModel.SourceMarker = SharpPath.Arrow; + connector1.ShapeViewModel.SinkMarker = SharpPath.Arrow; connector1.AddLabel("Arrow"); DiagramViewModel.Add(connector1); @@ -37,8 +37,8 @@ namespace AIStudio.Wpf.DiagramDesigner.Demo.ViewModels DiagramViewModel.Add(node2); connector1 = new ConnectionViewModel(DiagramViewModel, node1.RightConnector, node2.LeftConnector); - connector1.ShapeViewModel.SourceMarker = LinkMarker.Circle; - connector1.ShapeViewModel.SinkMarker = LinkMarker.Circle; + connector1.ShapeViewModel.SourceMarker = SharpPath.Circle; + connector1.ShapeViewModel.SinkMarker = SharpPath.Circle; connector1.AddLabel("Circle"); DiagramViewModel.Add(connector1); @@ -49,8 +49,8 @@ namespace AIStudio.Wpf.DiagramDesigner.Demo.ViewModels DiagramViewModel.Add(node2); connector1 = new ConnectionViewModel(DiagramViewModel, node1.RightConnector, node2.LeftConnector); - connector1.ShapeViewModel.SourceMarker = LinkMarker.Square; - connector1.ShapeViewModel.SinkMarker = LinkMarker.Square; + connector1.ShapeViewModel.SourceMarker = SharpPath.Square; + connector1.ShapeViewModel.SinkMarker = SharpPath.Square; connector1.AddLabel("Square"); DiagramViewModel.Add(connector1); @@ -61,8 +61,8 @@ namespace AIStudio.Wpf.DiagramDesigner.Demo.ViewModels DiagramViewModel.Add(node2); connector1 = new ConnectionViewModel(DiagramViewModel, node1.RightConnector, node2.LeftConnector); - connector1.ShapeViewModel.SourceMarker = LinkMarker.NewRectangle(10, 20); - connector1.ShapeViewModel.SinkMarker = LinkMarker.NewArrow(20, 10); + connector1.ShapeViewModel.SourceMarker = SharpPath.NewRectangle(10, 20); + connector1.ShapeViewModel.SinkMarker = SharpPath.NewArrow(20, 10); connector1.AddLabel("Factory"); DiagramViewModel.Add(connector1); @@ -73,8 +73,8 @@ namespace AIStudio.Wpf.DiagramDesigner.Demo.ViewModels DiagramViewModel.Add(node2); connector1 = new ConnectionViewModel(DiagramViewModel, node1.RightConnector, node2.LeftConnector); - connector1.ShapeViewModel.SourceMarker = new LinkMarker("M 0 -8 L 3 -8 3 8 0 8 z M 4 -8 7 -8 7 8 4 8 z M 8 -8 16 0 8 8 z", 16, 16, ArrowPathStyle.Arrow, ArrowSizeStyle.ExtraLarge); - connector1.ShapeViewModel.SinkMarker = new LinkMarker("M 0 -8 L 8 -8 4 0 8 8 0 8 4 0 z", 8, 8, ArrowPathStyle.Arrow, ArrowSizeStyle.Small); + connector1.ShapeViewModel.SourceMarker = new SharpPath("M 0 -8 L 3 -8 3 8 0 8 z M 4 -8 7 -8 7 8 4 8 z M 8 -8 16 0 8 8 z", 16, 16, ArrowPathStyle.Arrow, ArrowSizeStyle.ExtraLarge); + connector1.ShapeViewModel.SinkMarker = new SharpPath("M 0 -8 L 8 -8 4 0 8 8 0 8 4 0 z", 8, 8, ArrowPathStyle.Arrow, ArrowSizeStyle.Small); connector1.AddLabel("Custom"); DiagramViewModel.Add(connector1); }