summaryrefslogtreecommitdiffstats
path: root/src/object-edit.cpp
diff options
context:
space:
mode:
authorDiederik van Lierop <mail@diedenrezi.nl>2009-03-13 20:15:31 +0000
committerdvlierop2 <dvlierop2@users.sourceforge.net>2009-03-13 20:15:31 +0000
commit66a5d8abdc01c524d02064b537d7b0d167b15dda (patch)
tree0101736dd4665e61682f965fc76d54c60779ceb7 /src/object-edit.cpp
parentremove desktop-affine.h and refactor sp_desktop_dt2doc_* calls (diff)
downloadinkscape-66a5d8abdc01c524d02064b537d7b0d167b15dda.tar.gz
inkscape-66a5d8abdc01c524d02064b537d7b0d167b15dda.zip
* Implement constrained snapping of knots
* Implement snapping of the rectangle's radius handles * Line snappers: set the snap target in the derived class instead of in findBestSnap() (bzr r7479)
Diffstat (limited to 'src/object-edit.cpp')
-rw-r--r--src/object-edit.cpp15
1 files changed, 9 insertions, 6 deletions
diff --git a/src/object-edit.cpp b/src/object-edit.cpp
index a9cf20298..0719a59d3 100644
--- a/src/object-edit.cpp
+++ b/src/object-edit.cpp
@@ -141,14 +141,15 @@ RectKnotHolderEntityRX::knot_set(Geom::Point const &p, Geom::Point const &/*orig
//In general we cannot just snap this radius to an arbitrary point, as we have only a single
//degree of freedom. For snapping to an arbitrary point we need two DOF. If we're going to snap
//the radius then we should have a constrained snap. snap_knot_position() is unconstrained
+ Geom::Point const s = snap_knot_position_constrained(p, Inkscape::Snapper::ConstraintLine(Geom::Point(rect->x.computed + rect->width.computed, rect->y.computed), Geom::Point(-1, 0)));
if (state & GDK_CONTROL_MASK) {
gdouble temp = MIN(rect->height.computed, rect->width.computed) / 2.0;
- rect->rx.computed = rect->ry.computed = CLAMP(rect->x.computed + rect->width.computed - p[Geom::X], 0.0, temp);
+ rect->rx.computed = rect->ry.computed = CLAMP(rect->x.computed + rect->width.computed - s[Geom::X], 0.0, temp);
rect->rx._set = rect->ry._set = true;
} else {
- rect->rx.computed = CLAMP(rect->x.computed + rect->width.computed - p[Geom::X], 0.0, rect->width.computed / 2.0);
+ rect->rx.computed = CLAMP(rect->x.computed + rect->width.computed - s[Geom::X], 0.0, rect->width.computed / 2.0);
rect->rx._set = true;
}
@@ -190,18 +191,20 @@ RectKnotHolderEntityRY::knot_set(Geom::Point const &p, Geom::Point const &/*orig
//In general we cannot just snap this radius to an arbitrary point, as we have only a single
//degree of freedom. For snapping to an arbitrary point we need two DOF. If we're going to snap
//the radius then we should have a constrained snap. snap_knot_position() is unconstrained
+ Geom::Point const s = snap_knot_position_constrained(p, Inkscape::Snapper::ConstraintLine(Geom::Point(rect->x.computed + rect->width.computed, rect->y.computed), Geom::Point(0, 1)));
- if (state & GDK_CONTROL_MASK) {
+ if (state & GDK_CONTROL_MASK) { // When holding control then rx will be kept equal to ry,
+ // resulting in a perfect circle (and not an ellipse)
gdouble temp = MIN(rect->height.computed, rect->width.computed) / 2.0;
- rect->rx.computed = rect->ry.computed = CLAMP(p[Geom::Y] - rect->y.computed, 0.0, temp);
+ rect->rx.computed = rect->ry.computed = CLAMP(s[Geom::Y] - rect->y.computed, 0.0, temp);
rect->ry._set = rect->rx._set = true;
} else {
if (!rect->rx._set || rect->rx.computed == 0) {
- rect->ry.computed = CLAMP(p[Geom::Y] - rect->y.computed,
+ rect->ry.computed = CLAMP(s[Geom::Y] - rect->y.computed,
0.0,
MIN(rect->height.computed / 2.0, rect->width.computed / 2.0));
} else {
- rect->ry.computed = CLAMP(p[Geom::Y] - rect->y.computed,
+ rect->ry.computed = CLAMP(s[Geom::Y] - rect->y.computed,
0.0,
rect->height.computed / 2.0);
}