|
|
@ -27,7 +27,6 @@ using System.Windows.Media; |
|
|
|
using System.Windows.Shapes; |
|
|
|
using System.Windows.Shapes; |
|
|
|
using System.Windows; |
|
|
|
using System.Windows; |
|
|
|
using System.Windows.Controls; |
|
|
|
using System.Windows.Controls; |
|
|
|
using System; |
|
|
|
|
|
|
|
using System.Collections.Generic; |
|
|
|
using System.Collections.Generic; |
|
|
|
using System.Diagnostics; |
|
|
|
using System.Diagnostics; |
|
|
|
using System.Linq; |
|
|
|
using System.Linq; |
|
|
@ -40,9 +39,9 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions |
|
|
|
/// </summary>
|
|
|
|
/// </summary>
|
|
|
|
[ExtensionFor(typeof(Polyline))] |
|
|
|
[ExtensionFor(typeof(Polyline))] |
|
|
|
[ExtensionFor(typeof(Polygon))] |
|
|
|
[ExtensionFor(typeof(Polygon))] |
|
|
|
internal class PolyLineHandlerExtension : LineExtensionBase, IKeyDown, IKeyUp |
|
|
|
public class PolyLineHandlerExtension : LineExtensionBase, IKeyDown, IKeyUp |
|
|
|
{ |
|
|
|
{ |
|
|
|
private readonly Dictionary<int, Bounds> _selectedThumbs = new Dictionary<int, Bounds>(); |
|
|
|
private readonly Dictionary<int, Point> _selectedPoints = new Dictionary<int, Point>(); |
|
|
|
private bool _isDragging; |
|
|
|
private bool _isDragging; |
|
|
|
ZoomControl _zoom; |
|
|
|
ZoomControl _zoom; |
|
|
|
|
|
|
|
|
|
|
@ -73,14 +72,14 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions |
|
|
|
if (rt is DesignerThumb) |
|
|
|
if (rt is DesignerThumb) |
|
|
|
(rt as DesignerThumb).IsPrimarySelection = true; |
|
|
|
(rt as DesignerThumb).IsPrimarySelection = true; |
|
|
|
} |
|
|
|
} |
|
|
|
_selectedThumbs.Clear(); |
|
|
|
_selectedPoints.Clear(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private void SelectThumb(MultiPointThumb mprt) |
|
|
|
private void SelectThumb(MultiPointThumb mprt) |
|
|
|
{ |
|
|
|
{ |
|
|
|
PointCollection points = GetPointCollection(); |
|
|
|
PointCollection points = GetPointCollection(); |
|
|
|
Point p = points[mprt.Index]; |
|
|
|
Point p = points[mprt.Index]; |
|
|
|
_selectedThumbs.Add(mprt.Index, new Bounds { X = p.X, Y = p.Y }); |
|
|
|
_selectedPoints.Add(mprt.Index, p); |
|
|
|
|
|
|
|
|
|
|
|
mprt.IsPrimarySelection = false; |
|
|
|
mprt.IsPrimarySelection = false; |
|
|
|
} |
|
|
|
} |
|
|
@ -119,13 +118,13 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions |
|
|
|
else |
|
|
|
else |
|
|
|
{ |
|
|
|
{ |
|
|
|
//if not keyboard ctrl is pressed and selected point is not previously selected, clear selection
|
|
|
|
//if not keyboard ctrl is pressed and selected point is not previously selected, clear selection
|
|
|
|
if (!_selectedThumbs.ContainsKey(mprt.Index) & !Keyboard.IsKeyDown(Key.LeftCtrl) & |
|
|
|
if (!_selectedPoints.ContainsKey(mprt.Index) & !Keyboard.IsKeyDown(Key.LeftCtrl) & |
|
|
|
!Keyboard.IsKeyDown(Key.RightCtrl)) |
|
|
|
!Keyboard.IsKeyDown(Key.RightCtrl)) |
|
|
|
{ |
|
|
|
{ |
|
|
|
ResetThumbs(); |
|
|
|
ResetThumbs(); |
|
|
|
} |
|
|
|
} |
|
|
|
//add selected thumb, if ctrl pressed this could be all points in poly
|
|
|
|
//add selected thumb, if ctrl pressed this could be all points in poly
|
|
|
|
if (!_selectedThumbs.ContainsKey(mprt.Index)) |
|
|
|
if (!_selectedPoints.ContainsKey(mprt.Index)) |
|
|
|
SelectThumb(mprt); |
|
|
|
SelectThumb(mprt); |
|
|
|
_isDragging = false; |
|
|
|
_isDragging = false; |
|
|
|
} |
|
|
|
} |
|
|
@ -174,10 +173,9 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions |
|
|
|
points = pl.Points; |
|
|
|
points = pl.Points; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
foreach (int i in _selectedThumbs.Keys) |
|
|
|
foreach (int i in _selectedPoints.Keys.ToList()) |
|
|
|
{ |
|
|
|
{ |
|
|
|
_selectedThumbs[i].X = points[i].X; |
|
|
|
_selectedPoints[i] = points[i]; |
|
|
|
_selectedThumbs[i].Y = points[i].Y; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
ExtendedItem.Properties.GetProperty(pl != null ? Polyline.PointsProperty : Polygon.PointsProperty).SetValue(points); |
|
|
|
ExtendedItem.Properties.GetProperty(pl != null ? Polyline.PointsProperty : Polygon.PointsProperty).SetValue(points); |
|
|
|
operation.Commit(); |
|
|
|
operation.Commit(); |
|
|
@ -213,8 +211,8 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions |
|
|
|
|
|
|
|
|
|
|
|
Double theta; |
|
|
|
Double theta; |
|
|
|
//if one point selected snapping angle is calculated in relation to previous point
|
|
|
|
//if one point selected snapping angle is calculated in relation to previous point
|
|
|
|
if (_selectedThumbs.Count == 1 && mprt.Index > 0) { |
|
|
|
if (_selectedPoints.Count == 1 && mprt.Index > 0) { |
|
|
|
theta = (180 / Math.PI) * Math.Atan2(_selectedThumbs[mprt.Index].Y + dy - points[mprt.Index - 1].Y, _selectedThumbs[mprt.Index].X + dx - points[mprt.Index - 1].X); |
|
|
|
theta = (180 / Math.PI) * Math.Atan2(_selectedPoints[mprt.Index].Y + dy - points[mprt.Index - 1].Y, _selectedPoints[mprt.Index].X + dx - points[mprt.Index - 1].X); |
|
|
|
} else { //if multiple points snapping angle is calculated in relation to mouse dragging angle
|
|
|
|
} else { //if multiple points snapping angle is calculated in relation to mouse dragging angle
|
|
|
|
theta = (180 / Math.PI) * Math.Atan2(dy, dx); |
|
|
|
theta = (180 / Math.PI) * Math.Atan2(dy, dx); |
|
|
|
} |
|
|
|
} |
|
|
@ -228,7 +226,7 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions |
|
|
|
//if dragging occurs on a point and that point is the only selected, a new node will be added.
|
|
|
|
//if dragging occurs on a point and that point is the only selected, a new node will be added.
|
|
|
|
//_isCtrlDragging is needed since this method is called for every x pixel that the mouse moves
|
|
|
|
//_isCtrlDragging is needed since this method is called for every x pixel that the mouse moves
|
|
|
|
//so it could be many thousands of times during a single dragging
|
|
|
|
//so it could be many thousands of times during a single dragging
|
|
|
|
if (!_isDragging && _selectedThumbs.Count == 1 && (Math.Abs(dx) > 0 || Math.Abs(dy) > 0)) |
|
|
|
if (!_isDragging && _selectedPoints.Count == 1 && (Math.Abs(dx) > 0 || Math.Abs(dy) > 0)) |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
//duplicate point that is selected
|
|
|
|
//duplicate point that is selected
|
|
|
@ -333,29 +331,29 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions |
|
|
|
PointCollection MovePoints(PointCollection pc, double displacementX, double displacementY, double theta, int? snapangle) |
|
|
|
PointCollection MovePoints(PointCollection pc, double displacementX, double displacementY, double theta, int? snapangle) |
|
|
|
{ |
|
|
|
{ |
|
|
|
//iterate all selected points
|
|
|
|
//iterate all selected points
|
|
|
|
foreach (int i in _selectedThumbs.Keys) |
|
|
|
foreach (int i in _selectedPoints.Keys) |
|
|
|
{ |
|
|
|
{ |
|
|
|
Point p = pc[i]; |
|
|
|
Point p = pc[i]; |
|
|
|
|
|
|
|
|
|
|
|
//x and y is calculated from the currentl point
|
|
|
|
//x and y is calculated from the currentl point
|
|
|
|
double x = _selectedThumbs[i].X + displacementX; |
|
|
|
double x = _selectedPoints[i].X + displacementX; |
|
|
|
double y = _selectedThumbs[i].Y + displacementY; |
|
|
|
double y = _selectedPoints[i].Y + displacementY; |
|
|
|
|
|
|
|
|
|
|
|
//if snap is applied
|
|
|
|
//if snap is applied
|
|
|
|
if (snapangle != null) |
|
|
|
if (snapangle != null) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (_selectedThumbs.Count > 0) |
|
|
|
if (_selectedPoints.Count > 0) |
|
|
|
{ |
|
|
|
{ |
|
|
|
//horizontal snap
|
|
|
|
//horizontal snap
|
|
|
|
if (Math.Abs(theta) < snapangle || 180 - Math.Abs(theta) < snapangle) |
|
|
|
if (Math.Abs(theta) < snapangle || 180 - Math.Abs(theta) < snapangle) |
|
|
|
{ |
|
|
|
{ |
|
|
|
//if one point selected use point before as snap point, else snap to movement
|
|
|
|
//if one point selected use point before as snap point, else snap to movement
|
|
|
|
y = _selectedThumbs.Count == 1 ? pc[i - 1].Y : y - displacementY; |
|
|
|
y = _selectedPoints.Count == 1 ? pc[i - 1].Y : y - displacementY; |
|
|
|
} |
|
|
|
} |
|
|
|
else if (Math.Abs(90 - Math.Abs(theta)) < snapangle)//vertical snap
|
|
|
|
else if (Math.Abs(90 - Math.Abs(theta)) < snapangle)//vertical snap
|
|
|
|
{ |
|
|
|
{ |
|
|
|
//if one point selected use point before as snap point, else snap to movement
|
|
|
|
//if one point selected use point before as snap point, else snap to movement
|
|
|
|
x = _selectedThumbs.Count == 1 ? pc[i - 1].X : x - displacementX; |
|
|
|
x = _selectedPoints.Count == 1 ? pc[i - 1].X : x - displacementX; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -371,7 +369,7 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions |
|
|
|
|
|
|
|
|
|
|
|
public bool InvokeDefaultAction |
|
|
|
public bool InvokeDefaultAction |
|
|
|
{ |
|
|
|
{ |
|
|
|
get { return _selectedThumbs.Count == 0 || _selectedThumbs.Count == GetPointCollection().Count - 1; } |
|
|
|
get { return _selectedPoints.Count == 0 || _selectedPoints.Count == GetPointCollection().Count - 1; } |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int _movingDistance; |
|
|
|
int _movingDistance; |
|
|
|