Browse Source

Path insert Point

pull/633/head
jogibear9988 11 years ago
parent
commit
4b0126ea76
  1. 172
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Extensions/PathHandlerExtension.cs

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

@ -79,6 +79,8 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions
} }
} }
public PathPoint ParentPathPoint {get; set;}
public Point ReferencePoint { get; private set; } public Point ReferencePoint { get; private set; }
public object Object { get; private set; } public object Object { get; private set; }
@ -132,53 +134,55 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions
private bool _isDragging; private bool _isDragging;
ZoomControl _zoom; ZoomControl _zoom;
private Control[] segmentContextMenu = null;
private Control[] arcSegmentContextMenu = null;
private Control[] pathFigureContextMenu = null;
private List<PathPoint> pathPoints = null; private List<PathPoint> pathPoints = null;
public PathHandlerExtension() protected virtual Control[] BuildMenu(PathPoint pathpoint)
{
BuildMenus();
}
protected virtual void BuildMenus()
{ {
var menuList = new List<Control>(); var menuList = new List<Control>();
var menuItem = new MenuItem() { Header = "insert Point" }; MenuItem menuItem = null;
menuList.Add(menuItem);
menuItem = new MenuItem() { Header = "to Line Segment" }; if (pathpoint.TargetPathPoint == null && (pathpoint.Object is LineSegment || pathpoint.Object is PolyLineSegment || pathpoint.Object is BezierSegment || pathpoint.Object is QuadraticBezierSegment || pathpoint.Object is ArcSegment)) {
menuItem.Click += (s, e) => ConvertPart(((DependencyObject)s).TryFindParent<PathThumb>(), PathPartConvertType.ToLineSegment); menuItem = new MenuItem() { Header = "insert Point" };
menuList.Add(menuItem); menuItem.Click += (s, e) => ConvertPart(((DependencyObject)s).TryFindParent<PathThumb>(), PathPartConvertType.insertPoint);
menuItem = new MenuItem() {Header = "to Bezier Segment"}; menuList.Add(menuItem);
menuItem.Click += (s, e) => ConvertPart(((DependencyObject)s).TryFindParent<PathThumb>(), PathPartConvertType.ToBezierSegment); menuItem = new MenuItem() { Header = "to Line Segment" };
menuList.Add(menuItem); menuItem.Click += (s, e) => ConvertPart(((DependencyObject)s).TryFindParent<PathThumb>(), PathPartConvertType.ToLineSegment);
menuItem = new MenuItem() {Header = "to Quadric Bezier Segment"}; menuList.Add(menuItem);
menuItem.Click += (s, e) => ConvertPart(((DependencyObject)s).TryFindParent<PathThumb>(), PathPartConvertType.ToQuadricBezierSegment); menuItem = new MenuItem() {Header = "to Bezier Segment"};
menuList.Add(menuItem); menuItem.Click += (s, e) => ConvertPart(((DependencyObject)s).TryFindParent<PathThumb>(), PathPartConvertType.ToBezierSegment);
menuItem = new MenuItem() { Header = "to Arc Segment" }; menuList.Add(menuItem);
menuItem.Click += (s, e) => ConvertPart(((DependencyObject)s).TryFindParent<PathThumb>(), PathPartConvertType.ToArcSegment); menuItem = new MenuItem() {Header = "to Quadric Bezier Segment"};
menuList.Add(menuItem); menuItem.Click += (s, e) => ConvertPart(((DependencyObject)s).TryFindParent<PathThumb>(), PathPartConvertType.ToQuadricBezierSegment);
menuList.Add(new Separator()); menuList.Add(menuItem);
menuItem = new MenuItem() { Header = "is Stroked", IsChecked = true }; menuItem = new MenuItem() { Header = "to Arc Segment" };
menuList.Add(menuItem); menuItem.Click += (s, e) => ConvertPart(((DependencyObject)s).TryFindParent<PathThumb>(), PathPartConvertType.ToArcSegment);
menuItem = new MenuItem() { Header = "is Smooth Join", IsChecked = true }; menuList.Add(menuItem);
menuList.Add(menuItem); menuList.Add(new Separator());
segmentContextMenu = menuList.ToArray(); menuItem = new MenuItem() { Header = "is Stroked", IsChecked = ((PathSegment)pathpoint.Object).IsStroked };
menuItem.Click += (s, e) => ChangeIsStroked(((DependencyObject)s).TryFindParent<PathThumb>(), (MenuItem)s);
menuItem = new MenuItem() { Header = "is large Arc", IsChecked = true }; menuList.Add(menuItem);
menuList.Add(menuItem); menuItem = new MenuItem() { Header = "is Smooth Join", IsChecked = ((PathSegment)pathpoint.Object).IsSmoothJoin };
menuItem = new MenuItem() { Header = "Rotation Angle", IsChecked = true }; menuList.Add(menuItem);
menuList.Add(menuItem); }
menuItem = new MenuItem() { Header = "SweepDirection", IsChecked = true }; if (pathpoint.Object is ArcSegment) {
menuList.Add(menuItem); menuItem = new MenuItem() { Header = "is large Arc", IsChecked = ((ArcSegment)pathpoint.Object).IsLargeArc };
arcSegmentContextMenu = menuList.ToArray(); menuList.Add(menuItem);
menuItem = new MenuItem() { Header = "Rotation Angle", IsChecked = true };
menuList.Clear(); menuList.Add(menuItem);
menuItem = new MenuItem() { Header = "is Closed", IsChecked = true }; menuItem = new MenuItem() { Header = "Clockwise SweepDirection", IsChecked = ((ArcSegment)pathpoint.Object).SweepDirection == SweepDirection.Clockwise };
menuList.Add(menuItem); menuList.Add(menuItem);
pathFigureContextMenu = menuList.ToArray(); }
if (pathpoint.Object is PathFigure) {
menuItem = new MenuItem() { Header = "is Closed", IsChecked = ((PathFigure)pathpoint.Object).IsClosed };
menuItem.Click += (s, e) => ChangeIsClosed(((DependencyObject)s).TryFindParent<PathThumb>(), (MenuItem)s);
menuList.Add(menuItem);
}
if (!menuList.Any())
return null;
return menuList.ToArray();
} }
#region thumb methods #region thumb methods
@ -189,12 +193,7 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions
point = transform.Transform(point); point = transform.Transform(point);
var designerThumb = new PathThumb(point, index, pathpoint) {Cursor = cursor}; var designerThumb = new PathThumb(point, index, pathpoint) {Cursor = cursor};
designerThumb.OperationMenu = BuildMenu(pathpoint);
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 = pathpoint.Object is ArcSegment ? arcSegmentContextMenu : segmentContextMenu;
} else if (pathpoint.Object is PathFigure) {
designerThumb.OperationMenu = pathFigureContextMenu;
}
if (pathpoint.TargetPathPoint != null) { if (pathpoint.TargetPathPoint != null) {
designerThumb.IsEllipse = true; designerThumb.IsEllipse = true;
@ -234,11 +233,13 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions
var poly = pathSegment as PolyLineSegment; var poly = pathSegment as PolyLineSegment;
var lst = poly.Points.Take(senderThumb.PathPoint.PolyLineIndex); var lst = poly.Points.Take(senderThumb.PathPoint.PolyLineIndex);
var lst2 = poly.Points.Skip(senderThumb.PathPoint.PolyLineIndex + 1); var lst2 = poly.Points.Skip(senderThumb.PathPoint.PolyLineIndex + 1);
var p = poly.Points[senderThumb.PathPoint.PolyLineIndex];
pathFigure.Segments.RemoveAt(idx); pathFigure.Segments.RemoveAt(idx);
var p1 = new PolyLineSegment(); var p1 = new PolyLineSegment();
p1.Points.AddRange(lst); p1.Points.AddRange(lst);
pathFigure.Segments.Insert(idx, p1); pathFigure.Segments.Insert(idx, p1);
pathFigure.Segments.Insert(idx+1, new LineSegment()); pathSegment = new LineSegment() {Point = p};
pathFigure.Segments.Insert(idx+1, pathSegment);
var p2 = new PolyLineSegment(); var p2 = new PolyLineSegment();
p2.Points.AddRange(lst2); p2.Points.AddRange(lst2);
pathFigure.Segments.Insert(idx+2, p2); pathFigure.Segments.Insert(idx+2, p2);
@ -247,11 +248,13 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions
pathFigure.Segments.RemoveAt(idx); pathFigure.Segments.RemoveAt(idx);
var midp = senderThumb.PathPoint.ParentPathPoint.Point - ((senderThumb.PathPoint.ParentPathPoint.Point - point) / 2);
PathSegment newSegment = null; PathSegment newSegment = null;
switch (convertType) switch (convertType)
{ {
case PathPartConvertType.ToBezierSegment: case PathPartConvertType.ToBezierSegment:
newSegment = new BezierSegment() { Point1 = point - new Vector(40, 40), Point2 = point + new Vector(-40, 40), Point3 = point }; newSegment = new BezierSegment() { Point1 = midp - new Vector(40, 40), Point2 = midp + new Vector(-40, 40), Point3 = point };
break; break;
case PathPartConvertType.ToQuadricBezierSegment: case PathPartConvertType.ToQuadricBezierSegment:
newSegment = new QuadraticBezierSegment() { Point1 = point - new Vector(40, 40), Point2 = point }; newSegment = new QuadraticBezierSegment() { Point1 = point - new Vector(40, 40), Point2 = point };
@ -259,6 +262,10 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions
case PathPartConvertType.ToArcSegment: case PathPartConvertType.ToArcSegment:
newSegment = new ArcSegment() { Point = point, Size = new Size(20, 20) }; newSegment = new ArcSegment() { Point = point, Size = new Size(20, 20) };
break; break;
case PathPartConvertType.insertPoint:
pathFigure.Segments.Insert(idx, pathSegment);
newSegment = new LineSegment() { Point = midp, };
break;
default: default:
newSegment = new LineSegment() { Point = point }; newSegment = new LineSegment() { Point = point };
break; break;
@ -270,6 +277,20 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions
this.ExtendedItem.ReapplyAllExtensions(); this.ExtendedItem.ReapplyAllExtensions();
} }
private void ChangeIsClosed(PathThumb senderThumb, MenuItem menuItem)
{
var figure = senderThumb.PathPoint.Object as PathFigure;
figure.IsClosed = !figure.IsClosed;
menuItem.IsChecked = figure.IsClosed;
}
private void ChangeIsStroked(PathThumb senderThumb, MenuItem menuItem)
{
var segment = senderThumb.PathPoint.Object as PathSegment;
segment.IsStroked = !segment.IsStroked;
menuItem.IsChecked = segment.IsStroked;
}
private void ResetThumbs() private void ResetThumbs()
{ {
foreach (FrameworkElement rt in adornerPanel.Children) foreach (FrameworkElement rt in adornerPanel.Children)
@ -334,6 +355,8 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions
var designPanel = ExtendedItem.Services.DesignPanel as DesignPanel; var designPanel = ExtendedItem.Services.DesignPanel as DesignPanel;
_zoom = designPanel.TryFindParent<ZoomControl>(); _zoom = designPanel.TryFindParent<ZoomControl>();
//Move a Virtual Design Item arround... (for Snaplines, raster, ...)
//And Resfresh the Points after Positioning that Item!
if (resizeBehavior != null) if (resizeBehavior != null)
operation = PlacementOperation.Start(extendedItemArray, PlacementType.MovePoint); operation = PlacementOperation.Start(extendedItemArray, PlacementType.MovePoint);
else else
@ -346,22 +369,25 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions
void ChangeOperation(List<PathPoint> points) void ChangeOperation(List<PathPoint> points)
{ {
//this is for SharpDevelop built in undo functionality //this is for SharpDevelop built in undo functionality
if (operation != null) // if (operation != null)
{ // {
var info = operation.PlacedItems[0]; // var info = operation.PlacedItems[0];
var result = info.OriginalBounds; // var result = info.OriginalBounds;
//
IEnumerable<double> xs = points.Select(x => x.Point.X); // IEnumerable<double> xs = points.Select(x => x.Point.X);
IEnumerable<double> ys = points.Select(y => y.Point.Y); // IEnumerable<double> ys = points.Select(y => y.Point.Y);
result.X = (double)(info.Item.Properties.GetAttachedProperty(Canvas.LeftProperty).ValueOnInstance); // result.X = (double)(info.Item.Properties.GetAttachedProperty(Canvas.LeftProperty).ValueOnInstance);
result.Y = (double)(info.Item.Properties.GetAttachedProperty(Canvas.TopProperty).ValueOnInstance); // result.Y = (double)(info.Item.Properties.GetAttachedProperty(Canvas.TopProperty).ValueOnInstance);
result.Width = xs.Max() - xs.Min(); // result.Width = xs.Max() - xs.Min();
result.Height = ys.Max() - ys.Min(); // result.Height = ys.Max() - ys.Min();
//
info.Bounds = result.Round(); // info.Bounds = result.Round();
operation.CurrentContainerBehavior.BeforeSetPosition(operation); //
operation.CurrentContainerBehavior.SetPosition(info); //
} //
// operation.CurrentContainerBehavior.BeforeSetPosition(operation);
// operation.CurrentContainerBehavior.SetPosition(info);
// }
} }
void CommitOperation() void CommitOperation()
@ -486,20 +512,22 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions
foreach(var figure in g.Figures) { foreach(var figure in g.Figures) {
list.Add(new PathPoint(figure.StartPoint, figure, null, (p) => figure.StartPoint = p)); list.Add(new PathPoint(figure.StartPoint, figure, null, (p) => figure.StartPoint = p));
foreach (var s in figure.Segments) { foreach (var s in figure.Segments) {
var parentp = list.Last();
if (s is LineSegment) if (s is LineSegment)
list.Add(new PathPoint(((LineSegment)s).Point, s, figure, (p) => ((LineSegment)s).Point = p)); list.Add(new PathPoint(((LineSegment)s).Point, s, figure, (p) => ((LineSegment)s).Point = p){ParentPathPoint = parentp});
else if (s is PolyLineSegment) else if (s is PolyLineSegment)
{ {
var poly = s as PolyLineSegment; var poly = s as PolyLineSegment;
for (int n = 0; n < poly.Points.Count; n++) for (int n = 0; n < poly.Points.Count; n++)
{ {
var closure_n = n; var closure_n = n;
list.Add(new PathPoint(poly.Points[closure_n], s, figure, (p) => poly.Points[closure_n] = p) { PolyLineIndex = closure_n }); list.Add(new PathPoint(poly.Points[closure_n], s, figure, (p) => poly.Points[closure_n] = p) { PolyLineIndex = closure_n, ParentPathPoint = parentp });
parentp = list.Last();
} }
} }
else if (s is BezierSegment) else if (s is BezierSegment)
{ {
var pathp = new PathPoint(((BezierSegment)s).Point3, s, figure, (p) => ((BezierSegment)s).Point3 = p); var pathp = new PathPoint(((BezierSegment)s).Point3, s, figure, (p) => ((BezierSegment)s).Point3 = p){ParentPathPoint = parentp};
var previous = list.Last(); var previous = list.Last();
list.Add(new PathPoint(((BezierSegment)s).Point1, s, figure, (p) => ((BezierSegment)s).Point1 = p) { TargetPathPoint = previous }); list.Add(new PathPoint(((BezierSegment)s).Point1, s, figure, (p) => ((BezierSegment)s).Point1 = p) { TargetPathPoint = previous });
list.Add(new PathPoint(((BezierSegment)s).Point2, s, figure, (p) => ((BezierSegment)s).Point2 = p) { TargetPathPoint = pathp }); list.Add(new PathPoint(((BezierSegment)s).Point2, s, figure, (p) => ((BezierSegment)s).Point2 = p) { TargetPathPoint = pathp });
@ -507,14 +535,14 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions
} }
else if (s is QuadraticBezierSegment) else if (s is QuadraticBezierSegment)
{ {
var pathp = new PathPoint(((QuadraticBezierSegment)s).Point2, s, figure, (p) => ((QuadraticBezierSegment)s).Point2 = p); var pathp = new PathPoint(((QuadraticBezierSegment)s).Point2, s, figure, (p) => ((QuadraticBezierSegment)s).Point2 = p){ParentPathPoint = parentp};
list.Add(new PathPoint(((QuadraticBezierSegment)s).Point1, s, figure, (p) => ((QuadraticBezierSegment)s).Point1 = p) { TargetPathPoint = pathp }); list.Add(new PathPoint(((QuadraticBezierSegment)s).Point1, s, figure, (p) => ((QuadraticBezierSegment)s).Point1 = p) { TargetPathPoint = pathp });
list.Add(pathp); list.Add(pathp);
} }
else if (s is ArcSegment) else if (s is ArcSegment)
{ {
var arc = ((ArcSegment)s); var arc = ((ArcSegment)s);
var pathp = new PathPoint(arc.Point, s, figure, (p) => arc.Point = p); var pathp = new PathPoint(arc.Point, s, figure, (p) => arc.Point = p){ParentPathPoint = parentp};
list.Add(new PathPoint(arc.Point - new Vector(arc.Size.Width, arc.Size.Height), s, figure, (p) => arc.Size = new Size(Math.Abs(arc.Point.X - p.X), Math.Abs(arc.Point.Y - p.Y))) { TargetPathPoint = pathp }); list.Add(new PathPoint(arc.Point - new Vector(arc.Size.Width, arc.Size.Height), s, figure, (p) => arc.Size = new Size(Math.Abs(arc.Point.X - p.X), Math.Abs(arc.Point.Y - p.Y))) { TargetPathPoint = pathp });
list.Add(pathp); list.Add(pathp);
} }

Loading…
Cancel
Save