+ Fixed ZoomControl dynamic content switch to corectly refresh viewfinder

+ Some refactoring
This commit is contained in:
panthernet 2016-08-22 11:45:52 +03:00
Родитель e7dec38e52
Коммит 64fd24c4f0
5 изменённых файлов: 111 добавлений и 69 удалений

Просмотреть файл

@ -159,7 +159,7 @@ namespace GraphX.Controls
/// </summary>
internal override bool EdgeCurvingEnabled => LogicCore != null && LogicCore.EdgeCurvingEnabled;
/// <summary>
/// Link to LogicCore. Gets if edge curving tolerance.
/// Link to LogicCore. Gets edge curving tolerance.
/// </summary>
internal override double EdgeCurvingTolerance => LogicCore?.EdgeCurvingTolerance ?? 0;

Просмотреть файл

@ -128,21 +128,13 @@ namespace GraphX.Controls
#region AvailableSize Internal Property
internal Size AvailableSize => _availableSize;
private Size _availableSize = Size.Empty;
internal Size AvailableSize { get; private set; } = Size.Empty;
#endregion
#region Scale Internal Property
internal double Scale
{
get { return _scale; }
set { _scale = value; }
}
private double _scale = 1d;
internal double Scale { get; set; } = 1d;
#endregion
@ -162,7 +154,7 @@ namespace GraphX.Controls
// as a surface for the view finder's VisualBrush.
// store the available size for use by the Zoombox control
_availableSize = availableSize;
AvailableSize = availableSize;
// Simulate size-to-content for the display panel by ensuring a width and height
// based on the content bounds. Otherwise, the display panel may have no size, since it doesn't

Просмотреть файл

@ -189,6 +189,11 @@ namespace GraphX.Controls
//rem due to fail in template bg binding //_viewFinderDisplay.Background = this.Background;
// hook up event handlers for dragging and resizing the viewport
_viewFinderDisplay.MouseMove -= ViewFinderDisplayMouseMove;
_viewFinderDisplay.MouseLeftButtonDown -= ViewFinderDisplayBeginCapture;
_viewFinderDisplay.MouseLeftButtonUp -= ViewFinderDisplayEndCapture;
_viewFinderDisplay.IsVisibleChanged -= _viewFinderDisplay_IsVisibleChanged;
_viewFinderDisplay.MouseMove += ViewFinderDisplayMouseMove;
_viewFinderDisplay.MouseLeftButtonDown += ViewFinderDisplayBeginCapture;
_viewFinderDisplay.MouseLeftButtonUp += ViewFinderDisplayEndCapture;
@ -654,7 +659,7 @@ namespace GraphX.Controls
/// <summary>
/// Use Ctrl key to zoom with mouse wheel or without it
/// </summary>
public bool UseCtrlForMouseWheel { get; set; }
public bool UseCtrlForMouseWheel { get; set; } = true;
/// <summary>
/// Gets or sets mousewheel zooming mode. Positional: depend on mouse position. Absolute: center area.
@ -942,7 +947,7 @@ namespace GraphX.Controls
}
/// <summary>
/// Minimum zoom distance (Zoom out)
/// Minimum zoom distance (Zoom out). Default value is 0.01
/// </summary>
public double MinZoom
{
@ -951,7 +956,7 @@ namespace GraphX.Controls
}
/// <summary>
/// Maximum zoom distance (Zoom in)
/// Maximum zoom distance (Zoom in). DEfault value is 100
/// </summary>
public double MaxZoom
{
@ -1066,11 +1071,8 @@ namespace GraphX.Controls
public ZoomControl()
{
// ClipToBounds = true;
if (DesignerProperties.GetIsInDesignMode(this))
{
//Mode = ZoomControlModes.Fill;
//Zoom = 0.5;
}
else
{
@ -1078,7 +1080,6 @@ namespace GraphX.Controls
PreviewMouseDown += ZoomControl_PreviewMouseDown;
MouseDown += ZoomControl_MouseDown;
MouseUp += ZoomControl_MouseUp;
UseCtrlForMouseWheel = true;
AddHandler(SizeChangedEvent, new SizeChangedEventHandler(OnSizeChanged), true);
@ -1092,16 +1093,9 @@ namespace GraphX.Controls
BindKey(CommandZoomOut, Key.Down, ModifierKeys.Control,
(sender, args) => MouseWheelAction(-120, OrigoPosition));
this.PreviewKeyDown += ZoomControl_PreviewKeyDown;
Loaded += ZoomControl_Loaded;
}
}
void ZoomControl_PreviewKeyDown(object sender, KeyEventArgs e)
{
}
protected void BindCommand(RoutedUICommand command, ExecutedRoutedEventHandler execute, CanExecuteRoutedEventHandler canExecute = null)
{
@ -1116,12 +1110,6 @@ namespace GraphX.Controls
InputBindings.Add(new KeyBinding(command, key, modifier));
}
void ZoomControl_Loaded(object sender, RoutedEventArgs e)
{
//FakeZoom();
}
#region ContentChanged
protected override void OnContentChanged(object oldContent, object newContent)
{
@ -1131,8 +1119,6 @@ namespace GraphX.Controls
if (old != null) old.ContentSizeChanged -= Content_ContentSizeChanged;
if (newContent != null)
{
UpdateViewFinderDisplayContentBounds();
UpdateViewport();
var newc = newContent as ITrackableContent;
if (newc != null)
{
@ -1140,6 +1126,10 @@ namespace GraphX.Controls
newc.ContentSizeChanged += Content_ContentSizeChanged;
}
else _isga = false;
if(Template != null)
OnApplyTemplate();
UpdateViewFinderDisplayContentBounds();
UpdateViewport();
}
base.OnContentChanged(oldContent, newContent);
@ -1569,7 +1559,7 @@ namespace GraphX.Controls
if (DesignerProperties.GetIsInDesignMode(this))
{
ViewFinder?.SetCurrentValue(UIElement.VisibilityProperty, Visibility.Collapsed);
ViewFinder?.SetCurrentValue(VisibilityProperty, Visibility.Collapsed);
return;
}
@ -1577,27 +1567,26 @@ namespace GraphX.Controls
Presenter = GetTemplateChild(PART_PRESENTER) as ZoomContentPresenter;
if (Presenter != null)
{
Presenter.SizeChanged += (s, a) =>
Presenter.SizeChanged -= Presenter_SizeChanged;
Presenter.ContentSizeChanged -= Presenter_ContentSizeChanged;
Presenter.SizeChanged += Presenter_SizeChanged;
Presenter.ContentSizeChanged += Presenter_ContentSizeChanged;
}
if (Mode == ZoomControlModes.Fill)
DoZoomToFill();
}
private void Presenter_ContentSizeChanged(object sender, Size newSize)
{
if (Mode == ZoomControlModes.Fill)
DoZoomToFill();
}
private void Presenter_SizeChanged(object sender, SizeChangedEventArgs e)
{
//UpdateViewFinderDisplayContentBounds();
UpdateViewport();
if (Mode == ZoomControlModes.Fill)
DoZoomToFill();
};
Presenter.ContentSizeChanged += (s, a) =>
{
//UpdateViewFinderDisplayContentBounds();
if (Mode == ZoomControlModes.Fill)
{
DoZoomToFill();
//IsAnimationDisabled = false;
}
};
}
if (Mode == ZoomControlModes.Fill)
{
DoZoomToFill();
}
}
public event PropertyChangedEventHandler PropertyChanged;

Просмотреть файл

@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using GraphX.PCL.Common.Enums;
#if WPF
@ -107,6 +108,12 @@ namespace GraphX.Controls
return oPolyLineSegment;
}
public static IList<Point> GetCurvePointsThroughPoints(Point[] points, double tension, double tolerance)
{
return GetCurveThroughPoints(points, tension, tolerance).Points;
}
private static void AddPointsToPolyLineSegment(PolyLineSegment oPolyLineSegment, Point oPoint0, Point oPoint1, Point oPoint2, Point oPoint3, double dTension, double dTolerance)
{
Debug.Assert(oPolyLineSegment != null);
@ -175,6 +182,8 @@ namespace GraphX.Controls
return oPathFigure;
}
public static PathGeometry GetPathGeometryFromPathSegments(Point oStartPoint, bool bPathFigureIsFilled, params PathSegment[] aoPathSegments)
{
Debug.Assert(aoPathSegments != null);
@ -233,6 +242,21 @@ namespace GraphX.Controls
}
}
/* public static Point GetEdgeEndpoint2(Point endPoint, Rect bounds, Point startPoint, VertexShape vertexShape, double angle)
{
Rect b;
if (angle == 0)
b = bounds;
else
{
b = new Rect(bounds.X, bounds.Y, bounds.Width, bounds.Height);
var matrix = GetRotatedMatrix(bounds.Center(), MathHelper.RadiansToDegrees(angle));
b.Transform(matrix);
}
return GetEdgeEndpoint(endPoint, b, startPoint, vertexShape);
}*/
public static Point GetEdgeEndpointOnCircle(Point oVertexALocation, double dVertexARadius, Point oVertexBLocation)
{
Debug.Assert(dVertexARadius >= 0);
@ -579,5 +603,7 @@ namespace GraphX.Controls
return (oPathGeometry);
}
}
}

Просмотреть файл

@ -76,24 +76,59 @@ namespace GraphX.PCL.Logic.Algorithms.LayoutAlgorithms
if ((Parameters.Direction == LayoutDirection.TopToBottom || Parameters.Direction == LayoutDirection.BottomToTop) && sourcePosition.X != targetPosition.X)
{
var pt = new Point(targetPosition.X + targetSize.Width/2, sourcePosition.Y + sourceSize.Height/2);
var src = new Point(sourcePosition.X + sourceSize.Width/2, sourcePosition.Y + sourceSize.Height/2);
if (Parameters.Direction == LayoutDirection.TopToBottom)
{
var pt2 = new Point(targetPosition.X + targetSize.Width/2, targetPosition.Y);
_edgeRoutingPoints[edge] =
new[]
{
new Point(0, 0),
new Point(targetPosition.X + targetSize.Width / 2, sourcePosition.Y + sourceSize.Height / 2),
new Point(0, 0)
src,
pt,
pt2
};
}
else
{
var pt2 = new Point(targetPosition.X + targetSize.Width / 2, targetPosition.Y + targetSize.Height / 2);
_edgeRoutingPoints[edge] =
new[]
{
src,
pt,
pt2
};
}
}
else if ((Parameters.Direction == LayoutDirection.LeftToRight || Parameters.Direction == LayoutDirection.RightToLeft) && sourcePosition.Y != targetPosition.Y)
{
var src = new Point(sourcePosition.X + sourceSize.Width / 2, sourcePosition.Y + sourceSize.Height/2);
var pt = new Point(sourcePosition.X + sourceSize.Width/2, targetPosition.Y + targetSize.Height/2);
if (Parameters.Direction == LayoutDirection.LeftToRight)
{
var pt2 = new Point(targetPosition.X, targetPosition.Y + targetSize.Height / 2);
_edgeRoutingPoints[edge] =
new[]
{
new Point(0, 0),
new Point(sourcePosition.X + sourceSize.Width/2, targetPosition.Y + targetSize.Height/2),
new Point(0, 0)
src,
pt,
pt2
};
}
else
{
var pt2 = new Point(targetPosition.X + targetSize.Width, targetPosition.Y + targetSize.Height / 2);
_edgeRoutingPoints[edge] =
new[]
{
src,
pt,
pt2
};
}
}
else _edgeRoutingPoints[edge] = null;
}
}