Browse Source

Fix Path drawing and Selecting of Points

pull/633/head
jogibear9988 11 years ago
parent
commit
9a3c7026a4
  1. 1
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Controls/ControlStyles.xaml
  2. 2
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Controls/Thumbs/PointThumb.cs
  3. 21
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Extensions/DrawPathExtension.cs
  4. 107
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Extensions/PathHandlerExtension.cs

1
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Controls/ControlStyles.xaml

@ -97,6 +97,7 @@
<Trigger Property="IsPrimarySelection" Value="False"> <Trigger Property="IsPrimarySelection" Value="False">
<Setter TargetName="thumbRectangle" Property="Stroke" Value="White" /> <Setter TargetName="thumbRectangle" Property="Stroke" Value="White" />
<Setter TargetName="thumbRectangle" Property="Fill" Value="Black" /> <Setter TargetName="thumbRectangle" Property="Fill" Value="Black" />
<Setter TargetName="thumbElipse" Property="Fill" Value="Black" />
</Trigger> </Trigger>
<Trigger Property="IsEnabled" Value="False"> <Trigger Property="IsEnabled" Value="False">
<Setter TargetName="thumbRectangle" Property="Fill" Value="Gray" /> <Setter TargetName="thumbRectangle" Property="Fill" Value="Gray" />

2
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Controls/Thumbs/PointThumb.cs

@ -18,8 +18,6 @@
using System.Windows; using System.Windows;
using ICSharpCode.WpfDesign.Adorners; using ICSharpCode.WpfDesign.Adorners;
using ICSharpCode.WpfDesign.Designer.Extensions;
using System.Diagnostics;
using System.Windows.Data; using System.Windows.Data;
namespace ICSharpCode.WpfDesign.Designer.Controls namespace ICSharpCode.WpfDesign.Designer.Controls

21
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Extensions/DrawPathExtension.cs

@ -85,7 +85,7 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions
{ {
private ChangeGroup changeGroup; private ChangeGroup changeGroup;
private DesignItem newLine; private DesignItem newLine;
private Point startPoint; private Point sP;
private PathFigure figure; private PathFigure figure;
private DesignItem geometry; private DesignItem geometry;
@ -95,9 +95,8 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions
this.positionRelativeTo = relativeTo; this.positionRelativeTo = relativeTo;
this.changeGroup = changeGroup; this.changeGroup = changeGroup;
this.figure = figure; this.figure = figure;
figure.Segments.Add(new LineSegment());
startPoint = Mouse.GetPosition(null); sP = Mouse.GetPosition(null);
geometry = newLine.Properties[Path.DataProperty].Value; geometry = newLine.Properties[Path.DataProperty].Value;
} }
@ -110,20 +109,26 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions
protected override void OnMouseMove(object sender, MouseEventArgs e) protected override void OnMouseMove(object sender, MouseEventArgs e)
{ {
var delta = e.GetPosition(null) - startPoint; var delta = e.GetPosition(null) - sP;
var point = new Point(delta.X, delta.Y); var point = new Point(delta.X, delta.Y);
var segment = figure.Segments.Last(); var segment = figure.Segments.LastOrDefault() as LineSegment;
if (segment is LineSegment) if (Mouse.LeftButton == MouseButtonState.Pressed)
{ {
((LineSegment)segment).Point = point; if (segment == null || segment.Point != point)
{
figure.Segments.Add(new LineSegment(point, false));
segment = figure.Segments.Last() as LineSegment;}
} }
segment.Point = point;
geometry.Properties[PathGeometry.FiguresProperty].SetValue(figure.ToString()); geometry.Properties[PathGeometry.FiguresProperty].SetValue(figure.ToString());
} }
protected override void OnMouseUp(object sender, MouseButtonEventArgs e) protected override void OnMouseUp(object sender, MouseButtonEventArgs e)
{ {
var delta = e.GetPosition(null) - startPoint; var delta = e.GetPosition(null) - sP;
var point = new Point(delta.X, delta.Y); var point = new Point(delta.X, delta.Y);
figure.Segments.Add(new LineSegment(point, false)); figure.Segments.Add(new LineSegment(point, false));

107
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Extensions/PathHandlerExtension.cs

@ -51,6 +51,7 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions
ToArcSegment, ToArcSegment,
} }
//A modifieable Point on the Path
protected class PathPoint : INotifyPropertyChanged protected class PathPoint : INotifyPropertyChanged
{ {
public PathPoint(Point point, Object @object, Object parentObject, Action<Point> setLambda) public PathPoint(Point point, Object @object, Object parentObject, Action<Point> setLambda)
@ -91,6 +92,7 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions
public event PropertyChangedEventHandler PropertyChanged; public event PropertyChangedEventHandler PropertyChanged;
} }
//A Thumb wich displays the Point
protected class PathThumb : PointThumb protected class PathThumb : PointThumb
{ {
public PathThumb(Point point, int index, PathPoint pathpoint) : base(point) public PathThumb(Point point, int index, PathPoint pathpoint) : base(point)
@ -106,6 +108,7 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions
public PathPoint PathPoint { get; set; } public PathPoint PathPoint { get; set; }
} }
//A Converter for the RealtiveTo Point (on PolyLineSegment, ...)
protected class RelativeToPointConverter : IValueConverter protected class RelativeToPointConverter : IValueConverter
{ {
PathPoint pathPoint; PathPoint pathPoint;
@ -131,36 +134,55 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions
private Control[] segmentContextMenu = null; private Control[] segmentContextMenu = null;
private Control[] arcSegmentContextMenu = null; private Control[] arcSegmentContextMenu = null;
private Control[] pathFigureContextMenu = null;
private List<PathPoint> pathPoints = null; private List<PathPoint> pathPoints = null;
public PathHandlerExtension() public PathHandlerExtension()
{ {
var mnu0 = new MenuItem() { Header = "insert Point" }; BuildMenus();
}
var mnu1 = new MenuItem() { Header = "to Line Segment" };
mnu1.Click += (s, e) => ConvertPart(((DependencyObject)s).TryFindParent<PathThumb>(), PathPartConvertType.ToLineSegment); protected virtual void BuildMenus()
var mnu2 = new MenuItem() {Header = "to Bezier Segment"}; {
mnu2.Click += (s, e) => ConvertPart(((DependencyObject)s).TryFindParent<PathThumb>(), PathPartConvertType.ToBezierSegment); var menuList = new List<Control>();
var mnu3 = new MenuItem() {Header = "to Quadric Bezier Segment"}; var menuItem = new MenuItem() { Header = "insert Point" };
mnu3.Click += (s, e) => ConvertPart(((DependencyObject)s).TryFindParent<PathThumb>(), PathPartConvertType.ToQuadricBezierSegment); menuList.Add(menuItem);
var mnu4 = new MenuItem() { Header = "to Arc Segment" }; menuItem = new MenuItem() { Header = "to Line Segment" };
mnu4.Click += (s, e) => ConvertPart(((DependencyObject)s).TryFindParent<PathThumb>(), PathPartConvertType.ToArcSegment); menuItem.Click += (s, e) => ConvertPart(((DependencyObject)s).TryFindParent<PathThumb>(), PathPartConvertType.ToLineSegment);
menuList.Add(menuItem);
var mnu5 = new MenuItem() { Header = "is Stroked", IsChecked = true }; menuItem = new MenuItem() {Header = "to Bezier Segment"};
var mnu6 = new MenuItem() { Header = "is Smooth Join", IsChecked = true }; menuItem.Click += (s, e) => ConvertPart(((DependencyObject)s).TryFindParent<PathThumb>(), PathPartConvertType.ToBezierSegment);
menuList.Add(menuItem);
menuItem = new MenuItem() {Header = "to Quadric Bezier Segment"};
var mnu7 = new MenuItem() { Header = "is large Arc", IsChecked = true }; menuItem.Click += (s, e) => ConvertPart(((DependencyObject)s).TryFindParent<PathThumb>(), PathPartConvertType.ToQuadricBezierSegment);
var mnu8 = new MenuItem() { Header = "Rotation Angle", IsChecked = true }; menuList.Add(menuItem);
var mnu9 = new MenuItem() { Header = "SweepDirection", IsChecked = true }; menuItem = new MenuItem() { Header = "to Arc Segment" };
menuItem.Click += (s, e) => ConvertPart(((DependencyObject)s).TryFindParent<PathThumb>(), PathPartConvertType.ToArcSegment);
menuList.Add(menuItem);
menuList.Add(new Separator());
menuItem = new MenuItem() { Header = "is Stroked", IsChecked = true };
menuList.Add(menuItem);
menuItem = new MenuItem() { Header = "is Smooth Join", IsChecked = true };
menuList.Add(menuItem);
segmentContextMenu = menuList.ToArray();
menuItem = new MenuItem() { Header = "is large Arc", IsChecked = true };
menuList.Add(menuItem);
menuItem = new MenuItem() { Header = "Rotation Angle", IsChecked = true };
menuList.Add(menuItem);
menuItem = new MenuItem() { Header = "SweepDirection", IsChecked = true };
menuList.Add(menuItem);
arcSegmentContextMenu = menuList.ToArray();
segmentContextMenu = new Control[] {mnu0, new Separator(), mnu1, mnu2, mnu3, mnu4, new Separator(), mnu5, mnu6}; menuList.Clear();
arcSegmentContextMenu = new Control[] { new Separator(), mnu7, mnu8, mnu9 }; menuItem = new MenuItem() { Header = "is Closed", IsChecked = true };
menuList.Add(menuItem);
pathFigureContextMenu = menuList.ToArray();
} }
#region thumb methods #region thumb methods
protected DesignerThumb CreateThumb(PlacementAlignment alignment, Cursor cursor, int index, PathPoint pathpoint) protected virtual PathThumb CreateThumb(PlacementAlignment alignment, Cursor cursor, int index, PathPoint pathpoint)
{ {
var point = pathpoint.Point; var point = pathpoint.Point;
var transform = ((Shape)this.ExtendedItem.View).RenderedGeometry.Transform; var transform = ((Shape)this.ExtendedItem.View).RenderedGeometry.Transform;
@ -169,7 +191,9 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions
var designerThumb = new PathThumb(point, index, pathpoint) {Cursor = cursor}; var designerThumb = new PathThumb(point, index, pathpoint) {Cursor = cursor};
if (pathpoint.TargetPathPoint == null && (pathpoint.Object is LineSegment || pathpoint.Object is PolyLineSegment || pathpoint.Object is BezierSegment || pathpoint.Object is QuadraticBezierSegment || pathpoint.Object is ArcSegment)) { if (pathpoint.TargetPathPoint == null && (pathpoint.Object is LineSegment || pathpoint.Object is PolyLineSegment || pathpoint.Object is BezierSegment || pathpoint.Object is QuadraticBezierSegment || pathpoint.Object is ArcSegment)) {
designerThumb.OperationMenu = segmentContextMenu; designerThumb.OperationMenu = pathpoint.Object is ArcSegment ? arcSegmentContextMenu : segmentContextMenu;
} else if (pathpoint.Object is PathFigure) {
designerThumb.OperationMenu = pathFigureContextMenu;
} }
if (pathpoint.TargetPathPoint != null) { if (pathpoint.TargetPathPoint != null) {
@ -275,38 +299,17 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions
var mprt = sender as PathThumb; var mprt = sender as PathThumb;
if (mprt != null) if (mprt != null)
{ {
////shift+ctrl will remove selected point //if not keyboard ctrl is pressed and selected point is not previously selected, clear selection
//if ((Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift)) && if (!_selectedThumbs.ContainsKey(mprt.Index) & !Keyboard.IsKeyDown(Key.LeftCtrl) &
// (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))) !Keyboard.IsKeyDown(Key.RightCtrl))
//{
// //unselect all points
// ResetThumbs();
// //iterate thumbs to lower index of remaining thumbs
// foreach (PathThumb m in adornerPanel.Children) {
// if (m.Index > mprt.Index)
// m.Index--;
// }
// //remove point and thumb
// pathPoints.RemoveAt(mprt.Index);
// adornerPanel.Children.Remove(mprt);
// Invalidate();
//}
//else
{ {
//if not keyboard ctrl is pressed and selected point is not previously selected, clear selection ResetThumbs();
if (!_selectedThumbs.ContainsKey(mprt.Index) & !Keyboard.IsKeyDown(Key.LeftCtrl) &
!Keyboard.IsKeyDown(Key.RightCtrl))
{
ResetThumbs();
}
//add selected thumb, if ctrl pressed this could be all points in poly
if (!_selectedThumbs.ContainsKey(mprt.Index))
SelectThumb(mprt);
_isDragging = false;
} }
//add selected thumb, if ctrl pressed this could be all points in poly
if (!_selectedThumbs.ContainsKey(mprt.Index))
SelectThumb(mprt);
_isDragging = false;
} }
} }

Loading…
Cancel
Save