From 5da58563082ed3d1b21a3bb2e3f92c2cb01ebf61 Mon Sep 17 00:00:00 2001 From: Vitali Semianiaka Date: Sat, 22 Jun 2019 00:42:22 +0300 Subject: [PATCH] Grid snaps for ZoomControl, not critical Theme corrections, new demo set --- BrightSharp.Ui.Tests/App.xaml | 2 +- .../BrightSharp.Ui.Tests.csproj | 7 + BrightSharp.Ui.Tests/TabbedMainWindow.xaml | 210 ++++++++++++++++++ BrightSharp.Ui.Tests/TabbedMainWindow.xaml.cs | 43 ++++ BrightSharp/Diagrams/Adorners/SizeAdorner.cs | 4 +- BrightSharp/Diagrams/SelectionBehavior.cs | 22 +- BrightSharp/Diagrams/Thumbs/MoveThumb.cs | 43 ++-- BrightSharp/Diagrams/Thumbs/ResizeThumb.cs | 96 ++++---- BrightSharp/Diagrams/ZoomControl.cs | 9 + BrightSharp/Themes/Style.Classic.xaml | 4 +- BrightSharp/Themes/Theme.xaml | 30 ++- 11 files changed, 395 insertions(+), 75 deletions(-) create mode 100644 BrightSharp.Ui.Tests/TabbedMainWindow.xaml create mode 100644 BrightSharp.Ui.Tests/TabbedMainWindow.xaml.cs diff --git a/BrightSharp.Ui.Tests/App.xaml b/BrightSharp.Ui.Tests/App.xaml index b71f081..f69967f 100644 --- a/BrightSharp.Ui.Tests/App.xaml +++ b/BrightSharp.Ui.Tests/App.xaml @@ -1,7 +1,7 @@  + StartupUri="TabbedMainWindow.xaml"> diff --git a/BrightSharp.Ui.Tests/BrightSharp.Ui.Tests.csproj b/BrightSharp.Ui.Tests/BrightSharp.Ui.Tests.csproj index 9f77edf..86f54de 100644 --- a/BrightSharp.Ui.Tests/BrightSharp.Ui.Tests.csproj +++ b/BrightSharp.Ui.Tests/BrightSharp.Ui.Tests.csproj @@ -63,6 +63,9 @@ ControlContainer.xaml + + TabbedMainWindow.xaml + TestPage2.xaml @@ -94,6 +97,10 @@ MainWindow.xaml Code + + Designer + MSBuild:Compile + MSBuild:Compile Designer diff --git a/BrightSharp.Ui.Tests/TabbedMainWindow.xaml b/BrightSharp.Ui.Tests/TabbedMainWindow.xaml new file mode 100644 index 0000000..35c41d4 --- /dev/null +++ b/BrightSharp.Ui.Tests/TabbedMainWindow.xaml @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BrightSharp.Ui.Tests/TabbedMainWindow.xaml.cs b/BrightSharp.Ui.Tests/TabbedMainWindow.xaml.cs new file mode 100644 index 0000000..0a7eaaf --- /dev/null +++ b/BrightSharp.Ui.Tests/TabbedMainWindow.xaml.cs @@ -0,0 +1,43 @@ +using BrightSharp.Themes; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Shapes; + +namespace BrightSharp.Ui.Tests +{ + /// + /// Interaction logic for TabbedMainWindow.xaml + /// + public partial class TabbedMainWindow : Window + { + public TabbedMainWindow() + { + InitializeComponent(); + StyleNameTextBlock.Text = ThemeManager.Theme.ToString(); + } + private void ChangeStyleButton_Click(object sender, RoutedEventArgs e) + { + if (Enum.IsDefined(typeof(ColorThemes), ThemeManager.Theme + 1)) + ThemeManager.Theme = ThemeManager.Theme + 1; + else + ThemeManager.Theme = ColorThemes.Classic; + StyleNameTextBlock.Text = ThemeManager.Theme.ToString(); + } + private void Calendar_Loaded(object sender, RoutedEventArgs e) + { + var cal = (Calendar)sender; + cal.BlackoutDates.Add(new CalendarDateRange(DateTime.Now.AddDays(-10), DateTime.Now.AddDays(-8))); + cal.DisplayDateStart = DateTime.Now.AddDays(-400); + } + } +} diff --git a/BrightSharp/Diagrams/Adorners/SizeAdorner.cs b/BrightSharp/Diagrams/Adorners/SizeAdorner.cs index 0aa5b93..9c68a88 100644 --- a/BrightSharp/Diagrams/Adorners/SizeAdorner.cs +++ b/BrightSharp/Diagrams/Adorners/SizeAdorner.cs @@ -11,7 +11,7 @@ namespace BrightSharp.Diagrams { private SizeChrome chrome; private VisualCollection visuals; - private ContentControl designerItem; + private FrameworkElement designerItem; protected override int VisualChildrenCount { @@ -21,7 +21,7 @@ namespace BrightSharp.Diagrams } } - public SizeAdorner(ContentControl designerItem) + public SizeAdorner(FrameworkElement designerItem) : base(designerItem) { SnapsToDevicePixels = true; diff --git a/BrightSharp/Diagrams/SelectionBehavior.cs b/BrightSharp/Diagrams/SelectionBehavior.cs index f8b26b0..a1ed199 100644 --- a/BrightSharp/Diagrams/SelectionBehavior.cs +++ b/BrightSharp/Diagrams/SelectionBehavior.cs @@ -10,7 +10,7 @@ namespace BrightSharp.Diagrams { public static void Attach(FrameworkElement fe) { - ContentControl selectedControl = null; + FrameworkElement selectedControl = null; Style designerStyle = (Style)Application.Current.FindResource("DesignerItemStyle"); if (fe is Panel) { @@ -29,12 +29,15 @@ namespace BrightSharp.Diagrams selectedControl = null; return; } - foreach (var control in fePanel.Children.OfType()) + foreach (var control in fePanel.Children.OfType()) { if (ProcessControl(control, clickedElement, ref selectedControl)) { - e.Handled = selectedControl.Content is ButtonBase; - return; + if (selectedControl is ContentControl cc && cc.Content is ButtonBase) + { + e.Handled = true; + return; + } } } @@ -58,12 +61,15 @@ namespace BrightSharp.Diagrams selectedControl = null; return; } - foreach (var control in feItemsControl.Items.OfType()) + foreach (var control in feItemsControl.Items.OfType()) { if (ProcessControl(control, clickedElement, ref selectedControl)) { - e.Handled = selectedControl.Content is ButtonBase; - return; + if (selectedControl is ContentControl cc && cc.Content is ButtonBase) + { + e.Handled = true; + return; + } } } @@ -72,7 +78,7 @@ namespace BrightSharp.Diagrams } } - private static bool ProcessControl(ContentControl control, ContentControl clickedElement, ref ContentControl selectedControl) + private static bool ProcessControl(FrameworkElement control, FrameworkElement clickedElement, ref FrameworkElement selectedControl) { if (control == clickedElement && control != selectedControl) { diff --git a/BrightSharp/Diagrams/Thumbs/MoveThumb.cs b/BrightSharp/Diagrams/Thumbs/MoveThumb.cs index a875e3e..e204c32 100644 --- a/BrightSharp/Diagrams/Thumbs/MoveThumb.cs +++ b/BrightSharp/Diagrams/Thumbs/MoveThumb.cs @@ -11,44 +11,61 @@ namespace BrightSharp.Diagrams public class MoveThumb : Thumb { private RotateTransform rotateTransform; - private ContentControl designerItem; + private FrameworkElement designerItem; private static int? zIndex = null; - public MoveThumb() { + public MoveThumb() + { DragStarted += MoveThumb_DragStarted; DragDelta += MoveThumb_DragDelta; DragCompleted += MoveThumb_DragCompleted; } - private void MoveThumb_DragCompleted(object sender, DragCompletedEventArgs e) { + private void MoveThumb_DragCompleted(object sender, DragCompletedEventArgs e) + { //TODO Need think about ZIndex changes } - private void MoveThumb_DragStarted(object sender, DragStartedEventArgs e) { - designerItem = DataContext as ContentControl; + private void MoveThumb_DragStarted(object sender, DragStartedEventArgs e) + { + designerItem = DataContext as FrameworkElement; - if (designerItem != null) { + if (designerItem != null) + { rotateTransform = designerItem.RenderTransform as RotateTransform; - if (designerItem.GetBindingExpression(Panel.ZIndexProperty) == null) { + if (designerItem.GetBindingExpression(Panel.ZIndexProperty) == null) + { zIndex = Math.Max(zIndex ?? 0, Panel.GetZIndex(designerItem)); Panel.SetZIndex(designerItem, zIndex.Value + 1); } } } - private void MoveThumb_DragDelta(object sender, DragDeltaEventArgs e) { - if (designerItem != null) { + private void MoveThumb_DragDelta(object sender, DragDeltaEventArgs e) + { + if (designerItem != null) + { Point dragDelta = new Point(e.HorizontalChange, e.VerticalChange); - if (rotateTransform != null) { + var zoomControl = designerItem.Parent as dynamic; + double.TryParse(zoomControl.Tag as string, out var gridSize); + + if (rotateTransform != null) + { dragDelta = rotateTransform.Transform(dragDelta); } if (double.IsNaN(Canvas.GetLeft(designerItem))) Canvas.SetLeft(designerItem, 0); if (double.IsNaN(Canvas.GetTop(designerItem))) Canvas.SetTop(designerItem, 0); - Canvas.SetLeft(designerItem, Canvas.GetLeft(designerItem) + dragDelta.X); - Canvas.SetTop(designerItem, Canvas.GetTop(designerItem) + dragDelta.Y); - + var newLeft = Canvas.GetLeft(designerItem) + dragDelta.X; + var newTop = Canvas.GetTop(designerItem) + dragDelta.Y; + if (gridSize > 0) + { + newLeft = Math.Truncate(newLeft / gridSize) * gridSize; + newTop = Math.Truncate(newTop / gridSize) * gridSize; + } + Canvas.SetLeft(designerItem, newLeft); + Canvas.SetTop(designerItem, newTop); } } diff --git a/BrightSharp/Diagrams/Thumbs/ResizeThumb.cs b/BrightSharp/Diagrams/Thumbs/ResizeThumb.cs index 40907df..4db4666 100644 --- a/BrightSharp/Diagrams/Thumbs/ResizeThumb.cs +++ b/BrightSharp/Diagrams/Thumbs/ResizeThumb.cs @@ -16,8 +16,8 @@ namespace BrightSharp.Diagrams private double angle; private Adorner adorner; private Point transformOrigin; - private ContentControl designerItem; - private Canvas canvas; + private FrameworkElement designerItem; + private FrameworkElement canvas; public ResizeThumb() { @@ -29,7 +29,7 @@ namespace BrightSharp.Diagrams private void ResizeThumb_MouseRightButtonDown(object sender, MouseButtonEventArgs e) { - designerItem = designerItem ?? DataContext as ContentControl; + designerItem = designerItem ?? DataContext as FrameworkElement; if (VerticalAlignment == VerticalAlignment.Top || VerticalAlignment == VerticalAlignment.Bottom) { @@ -47,7 +47,7 @@ namespace BrightSharp.Diagrams if (designerItem != null) { - canvas = VisualTreeHelper.GetParent(designerItem) as Canvas; + canvas = VisualTreeHelper.GetParent(designerItem) as FrameworkElement; if (canvas != null) { @@ -83,44 +83,60 @@ namespace BrightSharp.Diagrams if ((VerticalAlignment == VerticalAlignment.Top || VerticalAlignment == VerticalAlignment.Bottom) && double.IsNaN(designerItem.Height)) designerItem.Height = designerItem.ActualHeight; if ((HorizontalAlignment == HorizontalAlignment.Left || HorizontalAlignment == HorizontalAlignment.Right) && double.IsNaN(designerItem.Width)) designerItem.Width = designerItem.ActualWidth; - switch (VerticalAlignment) - { - case System.Windows.VerticalAlignment.Bottom: - deltaVertical = Math.Min(-e.VerticalChange, designerItem.ActualHeight - designerItem.MinHeight); - deltaVertical = Math.Max(deltaVertical, designerItem.ActualHeight - designerItem.MaxHeight); - Canvas.SetTop(designerItem, Canvas.GetTop(designerItem) + (transformOrigin.Y * deltaVertical * (1 - Math.Cos(-angle)))); - Canvas.SetLeft(designerItem, Canvas.GetLeft(designerItem) - deltaVertical * transformOrigin.Y * Math.Sin(-angle)); - designerItem.Height -= deltaVertical; - break; - case System.Windows.VerticalAlignment.Top: - deltaVertical = Math.Min(e.VerticalChange, designerItem.ActualHeight - designerItem.MinHeight); - deltaVertical = Math.Max(deltaVertical, designerItem.ActualHeight - designerItem.MaxHeight); - Canvas.SetTop(designerItem, Canvas.GetTop(designerItem) + deltaVertical * Math.Cos(-angle) + (transformOrigin.Y * deltaVertical * (1 - Math.Cos(-angle)))); - Canvas.SetLeft(designerItem, Canvas.GetLeft(designerItem) + deltaVertical * Math.Sin(-angle) - (transformOrigin.Y * deltaVertical * Math.Sin(-angle))); - designerItem.Height -= deltaVertical; - break; - default: - break; - } + var zoomControl = designerItem.Parent as dynamic; + double.TryParse(zoomControl.Tag as string, out var gridSize); - switch (HorizontalAlignment) + var verticalChange = e.VerticalChange; + var horizontalChange = e.HorizontalChange; + + if (gridSize > 0) { - case System.Windows.HorizontalAlignment.Left: - deltaHorizontal = Math.Min(e.HorizontalChange, designerItem.ActualWidth - designerItem.MinWidth); - deltaHorizontal = Math.Max(deltaHorizontal, designerItem.ActualWidth - designerItem.MaxWidth); - Canvas.SetTop(designerItem, Canvas.GetTop(designerItem) + deltaHorizontal * Math.Sin(angle) - transformOrigin.X * deltaHorizontal * Math.Sin(angle)); - Canvas.SetLeft(designerItem, Canvas.GetLeft(designerItem) + deltaHorizontal * Math.Cos(angle) + (transformOrigin.X * deltaHorizontal * (1 - Math.Cos(angle)))); - designerItem.Width -= deltaHorizontal; - break; - case System.Windows.HorizontalAlignment.Right: - deltaHorizontal = Math.Min(-e.HorizontalChange, designerItem.ActualWidth - designerItem.MinWidth); - deltaHorizontal = Math.Max(deltaHorizontal, designerItem.ActualWidth - designerItem.MaxWidth); - Canvas.SetTop(designerItem, Canvas.GetTop(designerItem) - transformOrigin.X * deltaHorizontal * Math.Sin(angle)); - Canvas.SetLeft(designerItem, Canvas.GetLeft(designerItem) + (deltaHorizontal * transformOrigin.X * (1 - Math.Cos(angle)))); - designerItem.Width -= deltaHorizontal; - break; - default: - break; + verticalChange = Math.Truncate(verticalChange / gridSize) * gridSize; + horizontalChange = Math.Truncate(horizontalChange / gridSize) * gridSize; + } + if (verticalChange != 0) + { + switch (VerticalAlignment) + { + case System.Windows.VerticalAlignment.Bottom: + deltaVertical = Math.Min(-verticalChange, designerItem.ActualHeight - designerItem.MinHeight); + deltaVertical = Math.Max(deltaVertical, designerItem.ActualHeight - designerItem.MaxHeight); + Canvas.SetTop(designerItem, Canvas.GetTop(designerItem) + (transformOrigin.Y * deltaVertical * (1 - Math.Cos(-angle)))); + Canvas.SetLeft(designerItem, Canvas.GetLeft(designerItem) - deltaVertical * transformOrigin.Y * Math.Sin(-angle)); + designerItem.Height -= deltaVertical; + break; + case System.Windows.VerticalAlignment.Top: + deltaVertical = Math.Min(verticalChange, designerItem.ActualHeight - designerItem.MinHeight); + deltaVertical = Math.Max(deltaVertical, designerItem.ActualHeight - designerItem.MaxHeight); + Canvas.SetTop(designerItem, Canvas.GetTop(designerItem) + deltaVertical * Math.Cos(-angle) + (transformOrigin.Y * deltaVertical * (1 - Math.Cos(-angle)))); + Canvas.SetLeft(designerItem, Canvas.GetLeft(designerItem) + deltaVertical * Math.Sin(-angle) - (transformOrigin.Y * deltaVertical * Math.Sin(-angle))); + designerItem.Height -= deltaVertical; + break; + default: + break; + } + } + if (horizontalChange != 0) + { + switch (HorizontalAlignment) + { + case System.Windows.HorizontalAlignment.Left: + deltaHorizontal = Math.Min(horizontalChange, designerItem.ActualWidth - designerItem.MinWidth); + deltaHorizontal = Math.Max(deltaHorizontal, designerItem.ActualWidth - designerItem.MaxWidth); + Canvas.SetTop(designerItem, Canvas.GetTop(designerItem) + deltaHorizontal * Math.Sin(angle) - transformOrigin.X * deltaHorizontal * Math.Sin(angle)); + Canvas.SetLeft(designerItem, Canvas.GetLeft(designerItem) + deltaHorizontal * Math.Cos(angle) + (transformOrigin.X * deltaHorizontal * (1 - Math.Cos(angle)))); + designerItem.Width -= deltaHorizontal; + break; + case System.Windows.HorizontalAlignment.Right: + deltaHorizontal = Math.Min(-horizontalChange, designerItem.ActualWidth - designerItem.MinWidth); + deltaHorizontal = Math.Max(deltaHorizontal, designerItem.ActualWidth - designerItem.MaxWidth); + Canvas.SetTop(designerItem, Canvas.GetTop(designerItem) - transformOrigin.X * deltaHorizontal * Math.Sin(angle)); + Canvas.SetLeft(designerItem, Canvas.GetLeft(designerItem) + (deltaHorizontal * transformOrigin.X * (1 - Math.Cos(angle)))); + designerItem.Width -= deltaHorizontal; + break; + default: + break; + } } } diff --git a/BrightSharp/Diagrams/ZoomControl.cs b/BrightSharp/Diagrams/ZoomControl.cs index 1d5182c..287d689 100644 --- a/BrightSharp/Diagrams/ZoomControl.cs +++ b/BrightSharp/Diagrams/ZoomControl.cs @@ -67,6 +67,15 @@ namespace BrightSharp.Diagrams + public double GridSize + { + get { return (double)GetValue(GridSizeProperty); } + set { SetValue(GridSizeProperty, value); } + } + + public static readonly DependencyProperty GridSizeProperty = + DependencyProperty.Register("GridSize", typeof(double), typeof(ZoomControl), new PropertyMetadata(0.0)); + public double RenderZoom { get { return (double)GetValue(RenderZoomProperty); } diff --git a/BrightSharp/Themes/Style.Classic.xaml b/BrightSharp/Themes/Style.Classic.xaml index eb359ac..02648d2 100644 --- a/BrightSharp/Themes/Style.Classic.xaml +++ b/BrightSharp/Themes/Style.Classic.xaml @@ -212,7 +212,7 @@ - + Black @@ -228,7 +228,7 @@ - + Black #DEE4FF diff --git a/BrightSharp/Themes/Theme.xaml b/BrightSharp/Themes/Theme.xaml index 4d719fe..e073304 100644 --- a/BrightSharp/Themes/Theme.xaml +++ b/BrightSharp/Themes/Theme.xaml @@ -83,6 +83,7 @@ + @@ -2501,7 +2502,7 @@ - - + @@ -2654,6 +2656,7 @@ + @@ -2950,7 +2953,7 @@ - + @@ -3541,7 +3544,8 @@ - + @@ -4507,6 +4511,13 @@ + + + + + + +