file reorganization #2

This commit is contained in:
2017-08-31 13:39:03 +03:00
parent 4e40c7281a
commit 9c2dc48ee2
23 changed files with 171 additions and 69 deletions

View File

@@ -1,43 +0,0 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:s="clr-namespace:BrightSharp.Diagrams">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="SizeChrome.xaml"/>
<ResourceDictionary Source="ResizeRotateChrome.xaml"/>
</ResourceDictionary.MergedDictionaries>
<ControlTemplate x:Key="MoveThumbTemplate" TargetType="{x:Type s:MoveThumb}">
<Rectangle Fill="Transparent"/>
</ControlTemplate>
<Style x:Key="DesignerItemStyle" TargetType="ContentControl">
<Setter Property="MinHeight" Value="26"/>
<Setter Property="MinWidth" Value="30"/>
<Setter Property="RenderTransformOrigin" Value="0.5,0.5"/>
<Setter Property="SnapsToDevicePixels" Value="true"/>
<Setter Property="Focusable" Value="False" />
<Setter Property="MaxHeight" Value="900" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ContentControl">
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}">
<Grid DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}">
<s:MoveThumb Focusable="False" Cursor="SizeAll" Template="{StaticResource MoveThumbTemplate}" />
<ContentPresenter Content="{TemplateBinding ContentControl.Content}"
Margin="{TemplateBinding Padding}"/>
<s:DesignerItemDecorator x:Name="ItemDecorator" Focusable="False"/>
</Grid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="Selector.IsSelected" Value="True">
<Setter TargetName="ItemDecorator" Property="ShowDecorator" Value="True" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>

View File

@@ -1,114 +0,0 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:s="clr-namespace:BrightSharp.Diagrams">
<BooleanToVisibilityConverter x:Key="btvc" />
<Style TargetType="{x:Type Shape}" x:Key="ThumbCorner">
<Setter Property="SnapsToDevicePixels" Value="true" />
<Setter Property="Stroke" Value="#FF0166AC" />
<Setter Property="StrokeThickness" Value="1" />
<Setter Property="Width" Value="7" />
<Setter Property="Height" Value="7" />
<Setter Property="Margin" Value="-2" />
<Setter Property="Fill">
<Setter.Value>
<RadialGradientBrush Center="0.2, 0.2" GradientOrigin="0.2, 0.2" RadiusX="0.8" RadiusY="0.8">
<GradientStop Color="White" Offset="0.0" />
<GradientStop Color="#FF9AFF9F" Offset="0.8" />
</RadialGradientBrush>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="{x:Type s:ResizeRotateChrome}">
<Setter Property="Focusable" Value="False" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type s:ResizeRotateChrome}">
<Grid>
<Grid Opacity="0" Margin="-3">
<s:MoveThumb Margin="0,-20,0,0"
HorizontalAlignment="Right"
VerticalAlignment="Top"
Height="16"
Width="16"
Cursor="SizeAll"
Template="{DynamicResource MoveThumbTemplate}" />
<s:RotateThumb Width="20"
Height="20" Visibility="{Binding Path=DataContext.(s:VisualExtensions.CanRotate), RelativeSource={RelativeSource Self}, Converter={StaticResource btvc}}"
Margin="0,-20,0,0"
Cursor="Hand"
VerticalAlignment="Top"
HorizontalAlignment="Center"/>
<s:ResizeThumb Height="3"
Cursor="SizeNS"
VerticalAlignment="Top"
HorizontalAlignment="Stretch"/>
<s:ResizeThumb Width="3"
Cursor="SizeWE"
VerticalAlignment="Stretch"
HorizontalAlignment="Left"/>
<s:ResizeThumb Width="3"
Cursor="SizeWE"
VerticalAlignment="Stretch"
HorizontalAlignment="Right"/>
<s:ResizeThumb Height="3"
Cursor="SizeNS"
VerticalAlignment="Bottom"
HorizontalAlignment="Stretch"/>
<s:ResizeThumb Width="7"
Height="7"
Margin="-2"
Cursor="SizeNWSE"
VerticalAlignment="Top"
HorizontalAlignment="Left"/>
<s:ResizeThumb Width="7"
Height="7"
Margin="-2"
Cursor="SizeNESW"
VerticalAlignment="Top"
HorizontalAlignment="Right"/>
<s:ResizeThumb Width="7"
Height="7"
Margin="-2"
Cursor="SizeNESW"
VerticalAlignment="Bottom"
HorizontalAlignment="Left"/>
<s:ResizeThumb Width="7"
Height="7"
Margin="-2"
Cursor="SizeNWSE"
VerticalAlignment="Bottom"
HorizontalAlignment="Right"/>
</Grid>
<Canvas HorizontalAlignment="Right" VerticalAlignment="Top">
<ContentControl Canvas.Left="10" Content="{Binding Tag}" />
</Canvas>
<Grid IsHitTestVisible="False" Opacity="1" Margin="-3">
<Rectangle SnapsToDevicePixels="True"
StrokeThickness="1"
Margin="1"
Stroke="{DynamicResource DisabledBorderBrush}" StrokeDashArray="1 0 1"/>
<Line StrokeThickness="1" X1="0" Y1="0" X2="0" Y2="20" Visibility="{Binding Path=DataContext.(s:VisualExtensions.CanRotate), RelativeSource={RelativeSource Self}, Converter={StaticResource btvc}}"
HorizontalAlignment="Center"
VerticalAlignment="Top"
Margin="0,-19,0,0"
Stroke="White" StrokeDashArray="1 2"/>
<Path Style="{StaticResource ThumbCorner}" Stretch="Uniform" HorizontalAlignment="Center" VerticalAlignment="Top" Margin="0,-20,0,0" Width="20" Height="20" Data="M 11.7927,9.92031C 12.5184,8.74318 12.6759,7.05297 12.1717,5.75967C 11.5909,4.44354 10.2501,3.37314 8.87896,3.04485C 7.39649,2.74559 5.63977,3.1934 4.48733,4.196C 3.50995,5.1756 2.91946,6.75691 3.08599,8.14841L 0.0842173,8.57665C 0.0347556,8.20576 0.00766225,7.8312 -1.64198e-005,7.45693C 0.038148,6.21681 0.383575,4.9557 0.968669,3.8699C 1.5589,2.89611 2.36362,2.03356 3.28126,1.37902C 5.28605,0.0810452 8.05891,-0.284222 10.3301,0.412526C 12.1794,1.09169 13.9099,2.53647 14.8289,4.31779C 15.3434,5.43808 15.5957,6.72245 15.5449,7.95982C 15.4307,9.19718 15.0066,10.4344 14.358,11.484L 16.0043,12.4819L 11.226,13.5191L 10.1463,8.92239L 11.7927,9.92031 Z M -1.64198e-005,-1.90735e-006 Z M 15.564,14.9728 Z "
Fill="YellowGreen" Stroke="{DynamicResource PressedBorderBrush}"
Visibility="{Binding Path=DataContext.(s:VisualExtensions.CanRotate), RelativeSource={RelativeSource Self}, Converter={StaticResource btvc}}"
/>
<Rectangle Style="{StaticResource ThumbCorner}" HorizontalAlignment="Left" VerticalAlignment="Top"/>
<Rectangle Style="{StaticResource ThumbCorner}" HorizontalAlignment="Right" VerticalAlignment="Top"/>
<Rectangle Style="{StaticResource ThumbCorner}" HorizontalAlignment="Left" VerticalAlignment="Bottom"/>
<Rectangle Style="{StaticResource ThumbCorner}" HorizontalAlignment="Right" VerticalAlignment="Bottom"/>
<Viewbox Width="16" Height="16" HorizontalAlignment="Right" VerticalAlignment="Top" IsHitTestVisible="False" Margin="0,-20,0,0">
<Path Width="16" Height="16" Stretch="Fill" Fill="{DynamicResource NormalBrush}" StrokeThickness=".5" Stroke="{DynamicResource GlyphBrush}" Data="M 0,8.L 3.18485,4.81417L 3.18485,6.37077L 6.37181,6.37077L 6.37181,3.18408L 4.81418,3.18408L 8.00114,0L 11.1881,3.18408L 9.63047,3.18408L 9.63047,6.37077L 12.8174,6.37077L 12.8174,4.81417L 16.0044,8.L 12.8174,11.1876L 12.8174,9.63096L 9.63047,9.63096L 9.63047,12.8177L 11.1881,12.8177L 8.00114,16.0044L 4.81418,12.8177L 6.37181,12.8177L 6.37181,9.63096L 3.18485,9.63096L 3.18485,11.1876L 0,8. Z M 0,0 Z M 16.0044,16.0044 Z"/>
</Viewbox>
</Grid>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>

View File

@@ -1,49 +0,0 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:s="clr-namespace:BrightSharp.Diagrams">
<s:DoubleFormatConverter x:Key="doubleFormatConverter"/>
<Style TargetType="{x:Type s:SizeChrome}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type s:SizeChrome}">
<Grid SnapsToDevicePixels="True">
<Path Stroke="Red"
StrokeThickness="1"
Height="10"
VerticalAlignment="Bottom"
Margin="-2,0,-2,-15"
Stretch="Fill"
Data="M0,0 0,10 M 0,5 100,5 M 100,0 100,10" StrokeDashArray="1 2"/>
<TextBlock Text="{Binding Path=Width, Converter={StaticResource doubleFormatConverter}}"
Background="White"
Padding="3,0,3,0"
Foreground="#FF9C3535"
Margin="0,0,0,-18"
HorizontalAlignment="Center"
VerticalAlignment="Bottom"/>
<Path Stroke="#FF9C3535"
StrokeThickness="1"
Width="10"
HorizontalAlignment="Right"
Margin="0,-2,-15,-2"
Stretch="Fill"
Data="M5,0 5,100 M 0,0 10,0 M 0,100 10,100" StrokeDashArray="1 2"/>
<TextBlock Text="{Binding Path=Height, Converter={StaticResource doubleFormatConverter}}"
Background="White"
Foreground="#FF9C3535"
Padding="3,0,3,0"
Margin="0,0,-18,0"
HorizontalAlignment="Right"
VerticalAlignment="Center">
<TextBlock.LayoutTransform>
<RotateTransform Angle="90" CenterX="1" CenterY="0.5"/>
</TextBlock.LayoutTransform>
</TextBlock>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>

View File

@@ -0,0 +1,219 @@
using BrightSharp.Extensions;
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media.Animation;
namespace BrightSharp.Diagrams
{
public partial class ZoomControl : ItemsControl
{
public ZoomControl()
{
Loaded += ZoomControl_Loaded;
}
private void ZoomControl_Loaded(object sender, RoutedEventArgs e)
{
SelectionBehavior.Attach(this);
}
public ContentControl SelectedControl
{
get { return (ContentControl)GetValue(SelectedControlProperty); }
set { SetValue(SelectedControlProperty, value); }
}
public static readonly DependencyProperty SelectedControlProperty =
DependencyProperty.Register("SelectedControl", typeof(ContentControl), typeof(ZoomControl), new PropertyMetadata(null));
protected override void OnPreviewMouseDown(MouseButtonEventArgs e)
{
base.OnPreviewMouseDown(e);
if (e.MiddleButton == MouseButtonState.Pressed)
{
_panPoint = e.GetPosition(this);
}
}
private Point? _panPoint;
#region Props
public double TranslateX
{
get { return (double)GetValue(TranslateXProperty); }
set { SetValue(TranslateXProperty, value); }
}
public static readonly DependencyProperty TranslateXProperty =
DependencyProperty.Register("TranslateX", typeof(double), typeof(ZoomControl), new FrameworkPropertyMetadata(0.0, FrameworkPropertyMetadataOptions.AffectsArrange, TranslateChangedHandler));
public double TranslateY
{
get { return (double)GetValue(TranslateYProperty); }
set { SetValue(TranslateYProperty, value); }
}
public static readonly DependencyProperty TranslateYProperty =
DependencyProperty.Register("TranslateY", typeof(double), typeof(ZoomControl), new FrameworkPropertyMetadata(0.0, FrameworkPropertyMetadataOptions.AffectsArrange, TranslateChangedHandler));
public double RenderZoom
{
get { return (double)GetValue(RenderZoomProperty); }
set { SetValue(RenderZoomProperty, value); }
}
public static readonly DependencyProperty RenderZoomProperty =
DependencyProperty.Register("RenderZoom", typeof(double), typeof(ZoomControl), new FrameworkPropertyMetadata(1.0, FrameworkPropertyMetadataOptions.AffectsArrange, ZoomChangedHandler));
private static void ZoomChangedHandler(DependencyObject d, DependencyPropertyChangedEventArgs baseValue)
{
ZoomControl zc = (ZoomControl)d;
}
private static void TranslateChangedHandler(DependencyObject d, DependencyPropertyChangedEventArgs baseValue)
{
ZoomControl zc = (ZoomControl)d;
}
#endregion
private static readonly RoutedEvent ZoomChangedEvent = EventManager.RegisterRoutedEvent("ZoomChanged", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(ZoomControl));
public event RoutedEventHandler ZoomChanged
{
add { AddHandler(ZoomChangedEvent, value); }
remove { RemoveHandler(ZoomChangedEvent, value); }
}
private void RaiseZoomChangedEvent()
{
var newEventArgs = new RoutedEventArgs(ZoomChangedEvent);
RaiseEvent(newEventArgs);
}
static ZoomControl()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(ZoomControl), new FrameworkPropertyMetadata(typeof(ZoomControl)));
}
protected override void OnPreviewMouseWheel(MouseWheelEventArgs e)
{
if (CheckMouseOverControlWheelHandle(_panPoint.HasValue))
return;
var point = e.GetPosition(this);
var oldValue = RenderZoom;
const double zoomPower = 1.25;
var newValue = RenderZoom * (e.Delta > 0 ? zoomPower : 1 / zoomPower);
if (UseAnimation)
{
DoubleAnimation anim = new DoubleAnimation(newValue, TimeSpan.FromSeconds(.3));
anim.EasingFunction = new SineEase() { EasingMode = EasingMode.EaseInOut };
BeginAnimation(ZoomControl.RenderZoomProperty, anim);
}
else
{
DoubleAnimation anim = new DoubleAnimation(newValue, TimeSpan.FromSeconds(0));
anim.EasingFunction = new SineEase() { EasingMode = EasingMode.EaseInOut };
BeginAnimation(ZoomControl.RenderZoomProperty, anim);
}
RaiseZoomChangedEvent();
var translateXTo = CoercePanTranslate(TranslateX, point.X, oldValue, newValue);
var translateYTo = CoercePanTranslate(TranslateY, point.Y, oldValue, newValue);
if (UseAnimation)
{
DoubleAnimation anim = new DoubleAnimation(translateXTo, TimeSpan.FromSeconds(.3));
anim.EasingFunction = new SineEase() { EasingMode = EasingMode.EaseInOut };
BeginAnimation(ZoomControl.TranslateXProperty, anim);
anim = new DoubleAnimation(translateYTo, TimeSpan.FromSeconds(.3));
anim.EasingFunction = new SineEase() { EasingMode = EasingMode.EaseInOut };
BeginAnimation(ZoomControl.TranslateYProperty, anim);
}
else
{
DoubleAnimation anim = new DoubleAnimation(translateXTo, TimeSpan.FromSeconds(0));
anim.EasingFunction = new SineEase() { EasingMode = EasingMode.EaseInOut };
BeginAnimation(ZoomControl.TranslateXProperty, anim);
anim = new DoubleAnimation(translateYTo, TimeSpan.FromSeconds(0));
anim.EasingFunction = new SineEase() { EasingMode = EasingMode.EaseInOut };
BeginAnimation(ZoomControl.TranslateYProperty, anim);
}
e.Handled = true;
base.OnPreviewMouseWheel(e);
}
public bool UseAnimation { get; set; }
private static bool CheckMouseOverControlWheelHandle(bool checkFlowDoc = false)
{
if (Keyboard.IsKeyDown(Key.LeftCtrl)) return false;
var element = Mouse.DirectlyOver as DependencyObject;
if (element is ScrollViewer) return true;
var scrollViewer = element.FindAncestor<ScrollViewer>();
if (scrollViewer != null)
{
return scrollViewer.ComputedVerticalScrollBarVisibility == Visibility.Visible
|| scrollViewer.ComputedHorizontalScrollBarVisibility == Visibility.Visible;
}
if (checkFlowDoc)
{
var flowDocument = element.FindAncestor<FlowDocument>();
if (flowDocument != null)
{
return true;
}
}
return false;
}
private static double CoercePanTranslate(double oldTranslate, double mousePos, double oldZoom, double newZoom)
{
return Math.Round(oldTranslate + (oldTranslate - mousePos) * (newZoom - oldZoom) / oldZoom);
}
protected override void OnMouseUp(MouseButtonEventArgs e)
{
base.OnMouseUp(e);
if (e.MiddleButton == MouseButtonState.Released)
{
_panPoint = null;
ReleaseMouseCapture();
}
}
protected override void OnPreviewMouseMove(MouseEventArgs e)
{
base.OnPreviewMouseMove(e);
if (e.MiddleButton == MouseButtonState.Pressed && _panPoint.HasValue)
{
//PAN MODE
var vector = e.GetPosition(this) - _panPoint.Value;
_panPoint = _panPoint + vector;
CaptureMouse();
TranslateX += vector.X;
TranslateY += vector.Y;
BeginAnimation(TranslateXProperty, null);
BeginAnimation(TranslateYProperty, null);
}
}
}
}