From 0b56fd9088a788a43fd1ce6c9c8febb297c64178 Mon Sep 17 00:00:00 2001 From: SpoinkyNL Date: Tue, 26 Nov 2019 23:24:54 +0100 Subject: [PATCH] Added size observer to enable auto-centering the editor at some point --- src/Artemis.UI/Adorners/BoundingBoxAdorner.cs | 44 ----------- src/Artemis.UI/Artemis.UI.csproj | 2 +- src/Artemis.UI/Observers/SizeObserver.cs | 77 +++++++++++++++++++ .../Visualization/ProfileView.xaml | 6 +- .../Screens/Shared/PanZoomViewModel.cs | 2 + 5 files changed, 85 insertions(+), 46 deletions(-) delete mode 100644 src/Artemis.UI/Adorners/BoundingBoxAdorner.cs create mode 100644 src/Artemis.UI/Observers/SizeObserver.cs diff --git a/src/Artemis.UI/Adorners/BoundingBoxAdorner.cs b/src/Artemis.UI/Adorners/BoundingBoxAdorner.cs deleted file mode 100644 index d585da88a..000000000 --- a/src/Artemis.UI/Adorners/BoundingBoxAdorner.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System.Windows; -using System.Windows.Documents; -using System.Windows.Media; - -namespace Artemis.UI.Adorners -{ - public class BoundingBoxAdorner : Adorner - { - private Color _boundingBoxColor; - private Rect _boundingBoxRect; - - public BoundingBoxAdorner(UIElement adornedElement, Color boundingBoxColor) : base(adornedElement) - { - _boundingBoxRect = new Rect(new Size(0, 0)); - BoundingBoxColor = boundingBoxColor; - - IsHitTestVisible = false; - } - - public Color BoundingBoxColor - { - get => _boundingBoxColor; - set - { - _boundingBoxColor = value; - InvalidateVisual(); - } - } - - protected override void OnRender(DrawingContext drawingContext) - { - var renderBrush = new SolidColorBrush(BoundingBoxColor) {Opacity = 0.2}; - var renderPen = new Pen(new SolidColorBrush(BoundingBoxColor), 1.5); - - drawingContext.DrawRectangle(renderBrush, renderPen, _boundingBoxRect); - } - - public void Update(Point startingPoint, Point currentPoint) - { - _boundingBoxRect = new Rect(startingPoint, currentPoint); - InvalidateVisual(); - } - } -} \ No newline at end of file diff --git a/src/Artemis.UI/Artemis.UI.csproj b/src/Artemis.UI/Artemis.UI.csproj index 297a268e2..8c434df45 100644 --- a/src/Artemis.UI/Artemis.UI.csproj +++ b/src/Artemis.UI/Artemis.UI.csproj @@ -147,7 +147,6 @@ MSBuild:Compile Designer - @@ -162,6 +161,7 @@ + True True diff --git a/src/Artemis.UI/Observers/SizeObserver.cs b/src/Artemis.UI/Observers/SizeObserver.cs new file mode 100644 index 000000000..055958a23 --- /dev/null +++ b/src/Artemis.UI/Observers/SizeObserver.cs @@ -0,0 +1,77 @@ +using System.Windows; + +namespace Artemis.UI.Observers +{ + public static class SizeObserver + { + public static readonly DependencyProperty ObserveProperty = DependencyProperty.RegisterAttached( + "Observe", + typeof(bool), + typeof(SizeObserver), + new FrameworkPropertyMetadata(OnObserveChanged)); + + public static readonly DependencyProperty ObservedWidthProperty = DependencyProperty.RegisterAttached( + "ObservedWidth", + typeof(double), + typeof(SizeObserver)); + + public static readonly DependencyProperty ObservedHeightProperty = DependencyProperty.RegisterAttached( + "ObservedHeight", + typeof(double), + typeof(SizeObserver)); + + public static bool GetObserve(FrameworkElement frameworkElement) + { + return (bool) frameworkElement.GetValue(ObserveProperty); + } + + public static void SetObserve(FrameworkElement frameworkElement, bool observe) + { + frameworkElement.SetValue(ObserveProperty, observe); + } + + public static double GetObservedWidth(FrameworkElement frameworkElement) + { + return (double) frameworkElement.GetValue(ObservedWidthProperty); + } + + public static void SetObservedWidth(FrameworkElement frameworkElement, double observedWidth) + { + frameworkElement.SetValue(ObservedWidthProperty, observedWidth); + } + + public static double GetObservedHeight(FrameworkElement frameworkElement) + { + return (double) frameworkElement.GetValue(ObservedHeightProperty); + } + + public static void SetObservedHeight(FrameworkElement frameworkElement, double observedHeight) + { + frameworkElement.SetValue(ObservedHeightProperty, observedHeight); + } + + private static void OnObserveChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e) + { + var frameworkElement = (FrameworkElement) dependencyObject; + + if ((bool) e.NewValue) + { + frameworkElement.SizeChanged += OnFrameworkElementSizeChanged; + UpdateObservedSizesForFrameworkElement(frameworkElement); + } + else + frameworkElement.SizeChanged -= OnFrameworkElementSizeChanged; + } + + private static void OnFrameworkElementSizeChanged(object sender, SizeChangedEventArgs e) + { + UpdateObservedSizesForFrameworkElement((FrameworkElement) sender); + } + + private static void UpdateObservedSizesForFrameworkElement(FrameworkElement frameworkElement) + { + frameworkElement.SetCurrentValue(ObservedWidthProperty, frameworkElement.ActualWidth); + frameworkElement.SetCurrentValue(ObservedHeightProperty, frameworkElement.ActualHeight); + } + } +} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileView.xaml b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileView.xaml index d321c27c0..085e29ed0 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileView.xaml +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileView.xaml @@ -6,6 +6,7 @@ xmlns:s="https://github.com/canton7/Stylet" xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes" xmlns:profileEditor="clr-namespace:Artemis.UI.Screens.Module.ProfileEditor.Visualization" + xmlns:observers="clr-namespace:Artemis.UI.Observers" mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800" d:DataContext="{d:DesignInstance {x:Type profileEditor:ProfileViewModel}}"> @@ -42,7 +43,10 @@ MouseUp="{s:Action EditorGridMouseClick}" MouseDown="{s:Action EditorGridMouseClick}" MouseMove="{s:Action EditorGridMouseMove}" - Cursor="{Binding Cursor}"> + Cursor="{Binding Cursor}" + observers:SizeObserver.Observe="True" + observers:SizeObserver.ObservedWidth="{Binding PanZoomViewModel.CanvasWidth, Mode=OneWayToSource}" + observers:SizeObserver.ObservedHeight="{Binding PanZoomViewModel.CanvasHeight, Mode=OneWayToSource}"> diff --git a/src/Artemis.UI/Screens/Shared/PanZoomViewModel.cs b/src/Artemis.UI/Screens/Shared/PanZoomViewModel.cs index 2b4f564cb..9b4ffe838 100644 --- a/src/Artemis.UI/Screens/Shared/PanZoomViewModel.cs +++ b/src/Artemis.UI/Screens/Shared/PanZoomViewModel.cs @@ -20,6 +20,8 @@ namespace Artemis.UI.Screens.Shared public double PanX { get; set; } public double PanY { get; set; } + public double CanvasWidth { get; set; } + public double CanvasHeight { get; set; } public Rect BackgroundViewport => new Rect(PanX, PanY, 20, 20);