From 30b07f29c87df3b4f48bc388aaed29aea340683e Mon Sep 17 00:00:00 2001 From: miroiu Date: Fri, 21 Jun 2024 16:28:02 +0300 Subject: [PATCH 01/18] Add new example application --- Examples/Nodify.Shapes/App.xaml | 226 +++++++++ Examples/Nodify.Shapes/App.xaml.cs | 17 + Examples/Nodify.Shapes/AppShellViewModel.cs | 9 + Examples/Nodify.Shapes/AssemblyInfo.cs | 10 + .../Canvas/CanvasToolbarViewModel.cs | 54 ++ Examples/Nodify.Shapes/Canvas/CanvasView.xaml | 475 ++++++++++++++++++ .../Nodify.Shapes/Canvas/CanvasView.xaml.cs | 60 +++ .../Nodify.Shapes/Canvas/CanvasViewModel.cs | 204 ++++++++ .../Canvas/ConnectionViewModel.cs | 19 + .../Canvas/ConnectorViewModel.cs | 21 + .../Canvas/Decorators/ICanvasDecorator.cs | 9 + .../Decorators/ShapeToolbarViewModel.cs | 69 +++ .../Canvas/Decorators/UserCursorViewModel.cs | 19 + .../Canvas/Shapes/EllipseViewModel.cs | 13 + .../Canvas/Shapes/RectangleViewModel.cs | 13 + .../Canvas/Shapes/ShapeViewModel.cs | 66 +++ .../Canvas/UndoRedo/MoveShapesAction.cs | 37 ++ .../Canvas/UndoRedo/SelectShapesAction.cs | 41 ++ Examples/Nodify.Shapes/MainWindow.xaml | 35 ++ Examples/Nodify.Shapes/MainWindow.xaml.cs | 24 + Examples/Nodify.Shapes/Nodify.Shapes.csproj | 21 + Examples/Nodify.Shapes/PropertyChangedBase.cs | 54 ++ .../Nodify.Shapes/UndoRedo/ActionsHistory.cs | 215 ++++++++ .../Nodify.Shapes/UndoRedo/BatchAction.cs | 37 ++ .../Nodify.Shapes/UndoRedo/DelegateAction.cs | 25 + .../Nodify.Shapes/UndoRedo/PropertyCache.cs | 84 ++++ Examples/Nodify.Shapes/UndoRedo/Undoable.cs | 80 +++ .../Nodify.Shared/Controls/Swatches.xaml.cs | 48 ++ .../ColorToSolidColorBrushConverter.cs | 33 ++ .../Converters/MultiValueEqualityConverter.cs | 38 ++ Examples/Nodify.Shared/Themes/Generic.xaml | 186 ++++--- Nodify.sln | 7 + 32 files changed, 2187 insertions(+), 62 deletions(-) create mode 100644 Examples/Nodify.Shapes/App.xaml create mode 100644 Examples/Nodify.Shapes/App.xaml.cs create mode 100644 Examples/Nodify.Shapes/AppShellViewModel.cs create mode 100644 Examples/Nodify.Shapes/AssemblyInfo.cs create mode 100644 Examples/Nodify.Shapes/Canvas/CanvasToolbarViewModel.cs create mode 100644 Examples/Nodify.Shapes/Canvas/CanvasView.xaml create mode 100644 Examples/Nodify.Shapes/Canvas/CanvasView.xaml.cs create mode 100644 Examples/Nodify.Shapes/Canvas/CanvasViewModel.cs create mode 100644 Examples/Nodify.Shapes/Canvas/ConnectionViewModel.cs create mode 100644 Examples/Nodify.Shapes/Canvas/ConnectorViewModel.cs create mode 100644 Examples/Nodify.Shapes/Canvas/Decorators/ICanvasDecorator.cs create mode 100644 Examples/Nodify.Shapes/Canvas/Decorators/ShapeToolbarViewModel.cs create mode 100644 Examples/Nodify.Shapes/Canvas/Decorators/UserCursorViewModel.cs create mode 100644 Examples/Nodify.Shapes/Canvas/Shapes/EllipseViewModel.cs create mode 100644 Examples/Nodify.Shapes/Canvas/Shapes/RectangleViewModel.cs create mode 100644 Examples/Nodify.Shapes/Canvas/Shapes/ShapeViewModel.cs create mode 100644 Examples/Nodify.Shapes/Canvas/UndoRedo/MoveShapesAction.cs create mode 100644 Examples/Nodify.Shapes/Canvas/UndoRedo/SelectShapesAction.cs create mode 100644 Examples/Nodify.Shapes/MainWindow.xaml create mode 100644 Examples/Nodify.Shapes/MainWindow.xaml.cs create mode 100644 Examples/Nodify.Shapes/Nodify.Shapes.csproj create mode 100644 Examples/Nodify.Shapes/PropertyChangedBase.cs create mode 100644 Examples/Nodify.Shapes/UndoRedo/ActionsHistory.cs create mode 100644 Examples/Nodify.Shapes/UndoRedo/BatchAction.cs create mode 100644 Examples/Nodify.Shapes/UndoRedo/DelegateAction.cs create mode 100644 Examples/Nodify.Shapes/UndoRedo/PropertyCache.cs create mode 100644 Examples/Nodify.Shapes/UndoRedo/Undoable.cs create mode 100644 Examples/Nodify.Shared/Controls/Swatches.xaml.cs create mode 100644 Examples/Nodify.Shared/Converters/ColorToSolidColorBrushConverter.cs create mode 100644 Examples/Nodify.Shared/Converters/MultiValueEqualityConverter.cs diff --git a/Examples/Nodify.Shapes/App.xaml b/Examples/Nodify.Shapes/App.xaml new file mode 100644 index 00000000..01230f78 --- /dev/null +++ b/Examples/Nodify.Shapes/App.xaml @@ -0,0 +1,226 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/Nodify.Shapes/App.xaml.cs b/Examples/Nodify.Shapes/App.xaml.cs new file mode 100644 index 00000000..9f4aff5d --- /dev/null +++ b/Examples/Nodify.Shapes/App.xaml.cs @@ -0,0 +1,17 @@ +using System.Windows; +using System.Windows.Input; + +namespace Nodify.Shapes +{ + /// + /// Interaction logic for App.xaml + /// + public partial class App : Application + { + public App() + { + NodifyEditor.EnableDraggingContainersOptimizations = false; + EditorGestures.Mappings.Connection.Disconnect.Value = new AnyGesture(new MouseGesture(MouseAction.LeftClick, ModifierKeys.Alt), new MouseGesture(MouseAction.RightClick)); + } + } +} diff --git a/Examples/Nodify.Shapes/AppShellViewModel.cs b/Examples/Nodify.Shapes/AppShellViewModel.cs new file mode 100644 index 00000000..c8d827dc --- /dev/null +++ b/Examples/Nodify.Shapes/AppShellViewModel.cs @@ -0,0 +1,9 @@ +using Nodify.Shapes.Canvas; + +namespace Nodify.Shapes +{ + public class AppShellViewModel : ObservableObject + { + public CanvasViewModel Canvas { get; } = new CanvasViewModel(); + } +} diff --git a/Examples/Nodify.Shapes/AssemblyInfo.cs b/Examples/Nodify.Shapes/AssemblyInfo.cs new file mode 100644 index 00000000..b0ec8275 --- /dev/null +++ b/Examples/Nodify.Shapes/AssemblyInfo.cs @@ -0,0 +1,10 @@ +using System.Windows; + +[assembly: ThemeInfo( + ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located + //(used if a resource is not found in the page, + // or application resource dictionaries) + ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located + //(used if a resource is not found in the page, + // app, or any theme specific resource dictionaries) +)] diff --git a/Examples/Nodify.Shapes/Canvas/CanvasToolbarViewModel.cs b/Examples/Nodify.Shapes/Canvas/CanvasToolbarViewModel.cs new file mode 100644 index 00000000..d3cb7dc1 --- /dev/null +++ b/Examples/Nodify.Shapes/Canvas/CanvasToolbarViewModel.cs @@ -0,0 +1,54 @@ +using System.Windows.Input; + +namespace Nodify.Shapes.Canvas +{ + public class CanvasToolbarViewModel : PropertyChangedBase + { + private static readonly EditorGestures EditorGestures; + + private bool _locked; + public bool Locked + { + get => _locked; + set + { + if (SetProperty(ref _locked, value)) + { + var newMappings = _locked ? UnboundGestureMappings.Instance : EditorGestures; + EditorGestures.Mappings.Apply(newMappings); + } + } + } + + public ICommand ToggleLockCommand { get; set; } + + public CanvasViewModel Canvas { get; } + + static CanvasToolbarViewModel() + { + EditorGestures = new EditorGestures(); + // copy any user modifications + EditorGestures.Apply(EditorGestures.Mappings); + } + + public CanvasToolbarViewModel(CanvasViewModel canvas) + { + ToggleLockCommand = new DelegateCommand(() => Locked = !Locked); + Canvas = canvas; + } + } + + public class UnboundGestureMappings : EditorGestures + { + public static readonly UnboundGestureMappings Instance = new UnboundGestureMappings(); + + public UnboundGestureMappings() + { + Editor.Selection.Apply(SelectionGestures.None); + Editor.Pan.Value = new AnyGesture(new MouseGesture(MouseAction.LeftClick), new MouseGesture(MouseAction.RightClick), new MouseGesture(MouseAction.MiddleClick)); + ItemContainer.Selection.Apply(SelectionGestures.None); + Connection.Disconnect.Value = MultiGesture.None; + Connector.Connect.Value = MultiGesture.None; + } + } +} diff --git a/Examples/Nodify.Shapes/Canvas/CanvasView.xaml b/Examples/Nodify.Shapes/Canvas/CanvasView.xaml new file mode 100644 index 00000000..e36c716c --- /dev/null +++ b/Examples/Nodify.Shapes/Canvas/CanvasView.xaml @@ -0,0 +1,475 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +