X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fobject-edit.cpp;h=1d81aa7f5a86ef2854d5b9771d52c117de8969a0;hb=99f8079bc0a32aef279e4af06de4cbf4bd853563;hp=ea0291159bfd896ad9bb4224a5ed4b66f1ee37e0;hpb=69c9ed09bc39129d04ebc6de145badce52000b76;p=inkscape.git diff --git a/src/object-edit.cpp b/src/object-edit.cpp index ea0291159..1d81aa7f5 100644 --- a/src/object-edit.cpp +++ b/src/object-edit.cpp @@ -25,8 +25,7 @@ #include "sp-spiral.h" #include "sp-offset.h" #include "sp-flowtext.h" -#include "prefs-utils.h" -#include "desktop-affine.h" +#include "preferences.h" #include "style.h" #include "desktop.h" #include "desktop-handles.h" @@ -41,7 +40,6 @@ #include "object-edit.h" #include -#include #include "xml/repr.h" @@ -97,60 +95,61 @@ sp_item_knot_holder(SPItem *item, SPDesktop *desktop) /* handle for horizontal rounding radius */ class RectKnotHolderEntityRX : public KnotHolderEntity { public: - virtual NR::Point knot_get(); - virtual void knot_set(NR::Point const &p, NR::Point const &origin, guint state); + virtual Geom::Point knot_get(); + virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state); virtual void knot_click(guint state); }; /* handle for vertical rounding radius */ class RectKnotHolderEntityRY : public KnotHolderEntity { public: - virtual NR::Point knot_get(); - virtual void knot_set(NR::Point const &p, NR::Point const &origin, guint state); + virtual Geom::Point knot_get(); + virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state); virtual void knot_click(guint state); }; /* handle for width/height adjustment */ class RectKnotHolderEntityWH : public KnotHolderEntity { public: - virtual NR::Point knot_get(); - virtual void knot_set(NR::Point const &p, NR::Point const &origin, guint state); + virtual Geom::Point knot_get(); + virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state); protected: - void set_internal(NR::Point const &p, NR::Point const &origin, guint state); + void set_internal(Geom::Point const &p, Geom::Point const &origin, guint state); }; /* handle for x/y adjustment */ class RectKnotHolderEntityXY : public KnotHolderEntity { public: - virtual NR::Point knot_get(); - virtual void knot_set(NR::Point const &p, NR::Point const &origin, guint state); + virtual Geom::Point knot_get(); + virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state); }; -NR::Point +Geom::Point RectKnotHolderEntityRX::knot_get() { SPRect *rect = SP_RECT(item); - return NR::Point(rect->x.computed + rect->width.computed - rect->rx.computed, rect->y.computed); + return Geom::Point(rect->x.computed + rect->width.computed - rect->rx.computed, rect->y.computed); } void -RectKnotHolderEntityRX::knot_set(NR::Point const &p, NR::Point const &/*origin*/, guint state) +RectKnotHolderEntityRX::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint state) { SPRect *rect = SP_RECT(item); //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[NR::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[NR::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; } @@ -176,34 +175,36 @@ RectKnotHolderEntityRX::knot_click(guint state) update_knot(); } -NR::Point +Geom::Point RectKnotHolderEntityRY::knot_get() { SPRect *rect = SP_RECT(item); - return NR::Point(rect->x.computed + rect->width.computed, rect->y.computed + rect->ry.computed); + return Geom::Point(rect->x.computed + rect->width.computed, rect->y.computed + rect->ry.computed); } void -RectKnotHolderEntityRY::knot_set(NR::Point const &p, NR::Point const &/*origin*/, guint state) +RectKnotHolderEntityRY::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint state) { SPRect *rect = SP_RECT(item); //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[NR::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[NR::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[NR::Y] - rect->y.computed, + rect->ry.computed = CLAMP(s[Geom::Y] - rect->y.computed, 0.0, rect->height.computed / 2.0); } @@ -246,62 +247,78 @@ static void sp_rect_clamp_radii(SPRect *rect) } } -NR::Point +Geom::Point RectKnotHolderEntityWH::knot_get() { SPRect *rect = SP_RECT(item); - return NR::Point(rect->x.computed + rect->width.computed, rect->y.computed + rect->height.computed); + return Geom::Point(rect->x.computed + rect->width.computed, rect->y.computed + rect->height.computed); } void -RectKnotHolderEntityWH::set_internal(NR::Point const &p, NR::Point const &origin, guint state) +RectKnotHolderEntityWH::set_internal(Geom::Point const &p, Geom::Point const &origin, guint state) { SPRect *rect = SP_RECT(item); - NR::Point const s = snap_knot_position(p); + + Geom::Point s = p; if (state & GDK_CONTROL_MASK) { // original width/height when drag started - gdouble const w_orig = (origin[NR::X] - rect->x.computed); - gdouble const h_orig = (origin[NR::Y] - rect->y.computed); + gdouble const w_orig = (origin[Geom::X] - rect->x.computed); + gdouble const h_orig = (origin[Geom::Y] - rect->y.computed); //original ratio - gdouble const ratio = (w_orig / h_orig); + gdouble ratio = (w_orig / h_orig); // mouse displacement since drag started - gdouble const minx = s[NR::X] - origin[NR::X]; - gdouble const miny = s[NR::Y] - origin[NR::Y]; + gdouble minx = p[Geom::X] - origin[Geom::X]; + gdouble miny = p[Geom::Y] - origin[Geom::Y]; - if (fabs(minx) > fabs(miny)) { + Geom::Point p_handle(rect->x.computed + rect->width.computed, rect->y.computed + rect->height.computed); + if (fabs(minx) > fabs(miny)) { // snap to horizontal or diagonal - rect->width.computed = MAX(w_orig + minx, 0); if (minx != 0 && fabs(miny/minx) > 0.5 * 1/ratio && (SGN(minx) == SGN(miny))) { // closer to the diagonal and in same-sign quarters, change both using ratio + s = snap_knot_position_constrained(p, Inkscape::Snapper::ConstraintLine(p_handle, Geom::Point(-ratio, -1))); + minx = s[Geom::X] - origin[Geom::X]; + miny = s[Geom::Y] - origin[Geom::Y]; rect->height.computed = MAX(h_orig + minx / ratio, 0); } else { // closer to the horizontal, change only width, height is h_orig + s = snap_knot_position_constrained(p, Inkscape::Snapper::ConstraintLine(p_handle, Geom::Point(-1, 0))); + minx = s[Geom::X] - origin[Geom::X]; + miny = s[Geom::Y] - origin[Geom::Y]; rect->height.computed = MAX(h_orig, 0); } + rect->width.computed = MAX(w_orig + minx, 0); } else { // snap to vertical or diagonal - rect->height.computed = MAX(h_orig + miny, 0); if (miny != 0 && fabs(minx/miny) > 0.5 * ratio && (SGN(minx) == SGN(miny))) { // closer to the diagonal and in same-sign quarters, change both using ratio + s = snap_knot_position_constrained(p, Inkscape::Snapper::ConstraintLine(p_handle, Geom::Point(-ratio, -1))); + minx = s[Geom::X] - origin[Geom::X]; + miny = s[Geom::Y] - origin[Geom::Y]; rect->width.computed = MAX(w_orig + miny * ratio, 0); } else { // closer to the vertical, change only height, width is w_orig + s = snap_knot_position_constrained(p, Inkscape::Snapper::ConstraintLine(p_handle, Geom::Point(0, -1))); + minx = s[Geom::X] - origin[Geom::X]; + miny = s[Geom::Y] - origin[Geom::Y]; rect->width.computed = MAX(w_orig, 0); } + rect->height.computed = MAX(h_orig + miny, 0); + } rect->width._set = rect->height._set = true; } else { // move freely - rect->width.computed = MAX(s[NR::X] - rect->x.computed, 0); - rect->height.computed = MAX(s[NR::Y] - rect->y.computed, 0); + s = snap_knot_position(p); + rect->width.computed = MAX(s[Geom::X] - rect->x.computed, 0); + rect->height.computed = MAX(s[Geom::Y] - rect->y.computed, 0); rect->width._set = rect->height._set = true; } @@ -311,22 +328,22 @@ RectKnotHolderEntityWH::set_internal(NR::Point const &p, NR::Point const &origin } void -RectKnotHolderEntityWH::knot_set(NR::Point const &p, NR::Point const &origin, guint state) +RectKnotHolderEntityWH::knot_set(Geom::Point const &p, Geom::Point const &origin, guint state) { set_internal(p, origin, state); update_knot(); } -NR::Point +Geom::Point RectKnotHolderEntityXY::knot_get() { SPRect *rect = SP_RECT(item); - return NR::Point(rect->x.computed, rect->y.computed); + return Geom::Point(rect->x.computed, rect->y.computed); } void -RectKnotHolderEntityXY::knot_set(NR::Point const &p, NR::Point const &origin, guint state) +RectKnotHolderEntityXY::knot_set(Geom::Point const &p, Geom::Point const &origin, guint state) { SPRect *rect = SP_RECT(item); @@ -335,58 +352,71 @@ RectKnotHolderEntityXY::knot_set(NR::Point const &p, NR::Point const &origin, gu gdouble opposite_y = (rect->y.computed + rect->height.computed); // original width/height when drag started - gdouble w_orig = opposite_x - origin[NR::X]; - gdouble h_orig = opposite_y - origin[NR::Y]; + gdouble w_orig = opposite_x - origin[Geom::X]; + gdouble h_orig = opposite_y - origin[Geom::Y]; - NR::Point const s = snap_knot_position(p); + Geom::Point s = p; + Geom::Point p_handle(rect->x.computed, rect->y.computed); // mouse displacement since drag started - gdouble minx = s[NR::X] - origin[NR::X]; - gdouble miny = s[NR::Y] - origin[NR::Y]; + gdouble minx = p[Geom::X] - origin[Geom::X]; + gdouble miny = p[Geom::Y] - origin[Geom::Y]; if (state & GDK_CONTROL_MASK) { //original ratio gdouble ratio = (w_orig / h_orig); if (fabs(minx) > fabs(miny)) { - // snap to horizontal or diagonal - rect->x.computed = MIN(s[NR::X], opposite_x); - rect->width.computed = MAX(w_orig - minx, 0); if (minx != 0 && fabs(miny/minx) > 0.5 * 1/ratio && (SGN(minx) == SGN(miny))) { // closer to the diagonal and in same-sign quarters, change both using ratio - rect->y.computed = MIN(origin[NR::Y] + minx / ratio, opposite_y); + s = snap_knot_position_constrained(p, Inkscape::Snapper::ConstraintLine(p_handle, Geom::Point(-ratio, -1))); + minx = s[Geom::X] - origin[Geom::X]; + miny = s[Geom::Y] - origin[Geom::Y]; + rect->y.computed = MIN(origin[Geom::Y] + minx / ratio, opposite_y); rect->height.computed = MAX(h_orig - minx / ratio, 0); } else { // closer to the horizontal, change only width, height is h_orig - rect->y.computed = MIN(origin[NR::Y], opposite_y); + s = snap_knot_position_constrained(p, Inkscape::Snapper::ConstraintLine(p_handle, Geom::Point(-1, 0))); + minx = s[Geom::X] - origin[Geom::X]; + miny = s[Geom::Y] - origin[Geom::Y]; + rect->y.computed = MIN(origin[Geom::Y], opposite_y); rect->height.computed = MAX(h_orig, 0); } - + rect->x.computed = MIN(s[Geom::X], opposite_x); + rect->width.computed = MAX(w_orig - minx, 0); } else { - // snap to vertical or diagonal - rect->y.computed = MIN(s[NR::Y], opposite_y); - rect->height.computed = MAX(h_orig - miny, 0); if (miny != 0 && fabs(minx/miny) > 0.5 *ratio && (SGN(minx) == SGN(miny))) { // closer to the diagonal and in same-sign quarters, change both using ratio - rect->x.computed = MIN(origin[NR::X] + miny * ratio, opposite_x); + s = snap_knot_position_constrained(p, Inkscape::Snapper::ConstraintLine(p_handle, Geom::Point(-ratio, -1))); + minx = s[Geom::X] - origin[Geom::X]; + miny = s[Geom::Y] - origin[Geom::Y]; + rect->x.computed = MIN(origin[Geom::X] + miny * ratio, opposite_x); rect->width.computed = MAX(w_orig - miny * ratio, 0); } else { // closer to the vertical, change only height, width is w_orig - rect->x.computed = MIN(origin[NR::X], opposite_x); + s = snap_knot_position_constrained(p, Inkscape::Snapper::ConstraintLine(p_handle, Geom::Point(0, -1))); + minx = s[Geom::X] - origin[Geom::X]; + miny = s[Geom::Y] - origin[Geom::Y]; + rect->x.computed = MIN(origin[Geom::X], opposite_x); rect->width.computed = MAX(w_orig, 0); } - + rect->y.computed = MIN(s[Geom::Y], opposite_y); + rect->height.computed = MAX(h_orig - miny, 0); } rect->width._set = rect->height._set = rect->x._set = rect->y._set = true; } else { // move freely - rect->x.computed = MIN(s[NR::X], opposite_x); + s = snap_knot_position(p); + minx = s[Geom::X] - origin[Geom::X]; + miny = s[Geom::Y] - origin[Geom::Y]; + + rect->x.computed = MIN(s[Geom::X], opposite_x); rect->width.computed = MAX(w_orig - minx, 0); - rect->y.computed = MIN(s[NR::Y], opposite_y); + rect->y.computed = MIN(s[Geom::Y], opposite_y); rect->height.computed = MAX(h_orig - miny, 0); rect->width._set = rect->height._set = rect->x._set = rect->y._set = true; } @@ -414,11 +444,11 @@ RectKnotHolder::RectKnotHolder(SPDesktop *desktop, SPItem *item, SPKnotHolderRel "to make the horizontal radius the same"), SP_KNOT_SHAPE_CIRCLE, SP_KNOT_MODE_XOR); entity_wh->create(desktop, item, this, - _("Adjust the width and height of the rectangle; with Ctrl" + _("Adjust the width and height of the rectangle; with Ctrl " "to lock ratio or stretch in one dimension only"), SP_KNOT_SHAPE_SQUARE, SP_KNOT_MODE_XOR); entity_xy->create(desktop, item, this, - _("Adjust the width and height of the rectangle; with Ctrl" + _("Adjust the width and height of the rectangle; with Ctrl " "to lock ratio or stretch in one dimension only"), SP_KNOT_SHAPE_SQUARE, SP_KNOT_MODE_XOR); entity.push_back(entity_rx); @@ -433,27 +463,27 @@ RectKnotHolder::RectKnotHolder(SPDesktop *desktop, SPItem *item, SPKnotHolderRel class Box3DKnotHolderEntity : public KnotHolderEntity { public: - virtual NR::Point knot_get() = 0; - virtual void knot_set(NR::Point const &p, NR::Point const &origin, guint state) = 0; + virtual Geom::Point knot_get() = 0; + virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state) = 0; - NR::Point knot_get_generic(SPItem *item, unsigned int knot_id); - void knot_set_generic(SPItem *item, unsigned int knot_id, NR::Point const &p, guint state); + Geom::Point knot_get_generic(SPItem *item, unsigned int knot_id); + void knot_set_generic(SPItem *item, unsigned int knot_id, Geom::Point const &p, guint state); }; -NR::Point +Geom::Point Box3DKnotHolderEntity::knot_get_generic(SPItem *item, unsigned int knot_id) { return box3d_get_corner_screen(SP_BOX3D(item), knot_id); } void -Box3DKnotHolderEntity::knot_set_generic(SPItem *item, unsigned int knot_id, NR::Point const &new_pos, guint state) +Box3DKnotHolderEntity::knot_set_generic(SPItem *item, unsigned int knot_id, Geom::Point const &new_pos, guint state) { - NR::Point const s = snap_knot_position(new_pos); + Geom::Point const s = snap_knot_position(new_pos); g_assert(item != NULL); SPBox3D *box = SP_BOX3D(item); - NR::Matrix const i2d (from_2geom(sp_item_i2d_affine (item))); + Geom::Matrix const i2d (sp_item_i2d_affine (item)); Box3D::Axis movement; if ((knot_id < 4) != (state & GDK_SHIFT_MASK)) { @@ -469,167 +499,167 @@ Box3DKnotHolderEntity::knot_set_generic(SPItem *item, unsigned int knot_id, NR:: class Box3DKnotHolderEntity0 : public Box3DKnotHolderEntity { public: - virtual NR::Point knot_get(); - virtual void knot_set(NR::Point const &p, NR::Point const &origin, guint state); + virtual Geom::Point knot_get(); + virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state); }; class Box3DKnotHolderEntity1 : public Box3DKnotHolderEntity { public: - virtual NR::Point knot_get(); - virtual void knot_set(NR::Point const &p, NR::Point const &origin, guint state); + virtual Geom::Point knot_get(); + virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state); }; class Box3DKnotHolderEntity2 : public Box3DKnotHolderEntity { public: - virtual NR::Point knot_get(); - virtual void knot_set(NR::Point const &p, NR::Point const &origin, guint state); + virtual Geom::Point knot_get(); + virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state); }; class Box3DKnotHolderEntity3 : public Box3DKnotHolderEntity { public: - virtual NR::Point knot_get(); - virtual void knot_set(NR::Point const &p, NR::Point const &origin, guint state); + virtual Geom::Point knot_get(); + virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state); }; class Box3DKnotHolderEntity4 : public Box3DKnotHolderEntity { public: - virtual NR::Point knot_get(); - virtual void knot_set(NR::Point const &p, NR::Point const &origin, guint state); + virtual Geom::Point knot_get(); + virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state); }; class Box3DKnotHolderEntity5 : public Box3DKnotHolderEntity { public: - virtual NR::Point knot_get(); - virtual void knot_set(NR::Point const &p, NR::Point const &origin, guint state); + virtual Geom::Point knot_get(); + virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state); }; class Box3DKnotHolderEntity6 : public Box3DKnotHolderEntity { public: - virtual NR::Point knot_get(); - virtual void knot_set(NR::Point const &p, NR::Point const &origin, guint state); + virtual Geom::Point knot_get(); + virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state); }; class Box3DKnotHolderEntity7 : public Box3DKnotHolderEntity { public: - virtual NR::Point knot_get(); - virtual void knot_set(NR::Point const &p, NR::Point const &origin, guint state); + virtual Geom::Point knot_get(); + virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state); }; class Box3DKnotHolderEntityCenter : public KnotHolderEntity { public: - virtual NR::Point knot_get(); - virtual void knot_set(NR::Point const &p, NR::Point const &origin, guint state); + virtual Geom::Point knot_get(); + virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state); }; -NR::Point +Geom::Point Box3DKnotHolderEntity0::knot_get() { return knot_get_generic(item, 0); } -NR::Point +Geom::Point Box3DKnotHolderEntity1::knot_get() { return knot_get_generic(item, 1); } -NR::Point +Geom::Point Box3DKnotHolderEntity2::knot_get() { return knot_get_generic(item, 2); } -NR::Point +Geom::Point Box3DKnotHolderEntity3::knot_get() { return knot_get_generic(item, 3); } -NR::Point +Geom::Point Box3DKnotHolderEntity4::knot_get() { return knot_get_generic(item, 4); } -NR::Point +Geom::Point Box3DKnotHolderEntity5::knot_get() { return knot_get_generic(item, 5); } -NR::Point +Geom::Point Box3DKnotHolderEntity6::knot_get() { return knot_get_generic(item, 6); } -NR::Point +Geom::Point Box3DKnotHolderEntity7::knot_get() { return knot_get_generic(item, 7); } -NR::Point +Geom::Point Box3DKnotHolderEntityCenter::knot_get() { return box3d_get_center_screen(SP_BOX3D(item)); } void -Box3DKnotHolderEntity0::knot_set(NR::Point const &new_pos, NR::Point const &/*origin*/, guint state) +Box3DKnotHolderEntity0::knot_set(Geom::Point const &new_pos, Geom::Point const &/*origin*/, guint state) { knot_set_generic(item, 0, new_pos, state); } void -Box3DKnotHolderEntity1::knot_set(NR::Point const &new_pos, NR::Point const &/*origin*/, guint state) +Box3DKnotHolderEntity1::knot_set(Geom::Point const &new_pos, Geom::Point const &/*origin*/, guint state) { knot_set_generic(item, 1, new_pos, state); } void -Box3DKnotHolderEntity2::knot_set(NR::Point const &new_pos, NR::Point const &/*origin*/, guint state) +Box3DKnotHolderEntity2::knot_set(Geom::Point const &new_pos, Geom::Point const &/*origin*/, guint state) { knot_set_generic(item, 2, new_pos, state); } void -Box3DKnotHolderEntity3::knot_set(NR::Point const &new_pos, NR::Point const &/*origin*/, guint state) +Box3DKnotHolderEntity3::knot_set(Geom::Point const &new_pos, Geom::Point const &/*origin*/, guint state) { knot_set_generic(item, 3, new_pos, state); } void -Box3DKnotHolderEntity4::knot_set(NR::Point const &new_pos, NR::Point const &/*origin*/, guint state) +Box3DKnotHolderEntity4::knot_set(Geom::Point const &new_pos, Geom::Point const &/*origin*/, guint state) { knot_set_generic(item, 4, new_pos, state); } void -Box3DKnotHolderEntity5::knot_set(NR::Point const &new_pos, NR::Point const &/*origin*/, guint state) +Box3DKnotHolderEntity5::knot_set(Geom::Point const &new_pos, Geom::Point const &/*origin*/, guint state) { knot_set_generic(item, 5, new_pos, state); } void -Box3DKnotHolderEntity6::knot_set(NR::Point const &new_pos, NR::Point const &/*origin*/, guint state) +Box3DKnotHolderEntity6::knot_set(Geom::Point const &new_pos, Geom::Point const &/*origin*/, guint state) { knot_set_generic(item, 6, new_pos, state); } void -Box3DKnotHolderEntity7::knot_set(NR::Point const &new_pos, NR::Point const &/*origin*/, guint state) +Box3DKnotHolderEntity7::knot_set(Geom::Point const &new_pos, Geom::Point const &/*origin*/, guint state) { knot_set_generic(item, 7, new_pos, state); } void -Box3DKnotHolderEntityCenter::knot_set(NR::Point const &new_pos, NR::Point const &origin, guint state) +Box3DKnotHolderEntityCenter::knot_set(Geom::Point const &new_pos, Geom::Point const &origin, guint state) { - NR::Point const s = snap_knot_position(new_pos); + Geom::Point const s = snap_knot_position(new_pos); SPBox3D *box = SP_BOX3D(item); - NR::Matrix const i2d (from_2geom(sp_item_i2d_affine (item))); + Geom::Matrix const i2d (sp_item_i2d_affine (item)); box3d_set_center (SP_BOX3D(item), s * i2d, origin * i2d, !(state & GDK_SHIFT_MASK) ? Box3D::XY : Box3D::Z, state & GDK_CONTROL_MASK); @@ -696,28 +726,28 @@ Box3DKnotHolder::Box3DKnotHolder(SPDesktop *desktop, SPItem *item, SPKnotHolderR class ArcKnotHolderEntityStart : public KnotHolderEntity { public: - virtual NR::Point knot_get(); - virtual void knot_set(NR::Point const &p, NR::Point const &origin, guint state); + virtual Geom::Point knot_get(); + virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state); }; class ArcKnotHolderEntityEnd : public KnotHolderEntity { public: - virtual NR::Point knot_get(); - virtual void knot_set(NR::Point const &p, NR::Point const &origin, guint state); + virtual Geom::Point knot_get(); + virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state); virtual void knot_click(guint state); }; class ArcKnotHolderEntityRX : public KnotHolderEntity { public: - virtual NR::Point knot_get(); - virtual void knot_set(NR::Point const &p, NR::Point const &origin, guint state); + virtual Geom::Point knot_get(); + virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state); virtual void knot_click(guint state); }; class ArcKnotHolderEntityRY : public KnotHolderEntity { public: - virtual NR::Point knot_get(); - virtual void knot_set(NR::Point const &p, NR::Point const &origin, guint state); + virtual Geom::Point knot_get(); + virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state); virtual void knot_click(guint state); }; @@ -728,10 +758,10 @@ public: * -1 : outside */ static gint -sp_genericellipse_side(SPGenericEllipse *ellipse, NR::Point const &p) +sp_genericellipse_side(SPGenericEllipse *ellipse, Geom::Point const &p) { - gdouble dx = (p[NR::X] - ellipse->cx.computed) / ellipse->rx.computed; - gdouble dy = (p[NR::Y] - ellipse->cy.computed) / ellipse->ry.computed; + gdouble dx = (p[Geom::X] - ellipse->cx.computed) / ellipse->rx.computed; + gdouble dy = (p[Geom::Y] - ellipse->cy.computed) / ellipse->ry.computed; gdouble s = dx * dx + dy * dy; if (s < 1.0) return 1; @@ -740,17 +770,18 @@ sp_genericellipse_side(SPGenericEllipse *ellipse, NR::Point const &p) } void -ArcKnotHolderEntityStart::knot_set(NR::Point const &p, NR::Point const &/*origin*/, guint state) +ArcKnotHolderEntityStart::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint state) { - int snaps = prefs_get_int_attribute("options.rotationsnapsperpi", "value", 12); + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + int snaps = prefs->getInt("/options/rotationsnapsperpi/value", 12); SPGenericEllipse *ge = SP_GENERICELLIPSE(item); SPArc *arc = SP_ARC(item); ge->closed = (sp_genericellipse_side(ge, p) == -1) ? TRUE : FALSE; - NR::Point delta = p - NR::Point(ge->cx.computed, ge->cy.computed); - NR::scale sc(ge->rx.computed, ge->ry.computed); + Geom::Point delta = p - Geom::Point(ge->cx.computed, ge->cy.computed); + Geom::Scale sc(ge->rx.computed, ge->ry.computed); ge->start = atan2(delta * sc.inverse()); if ( ( state & GDK_CONTROL_MASK ) && snaps ) @@ -761,7 +792,7 @@ ArcKnotHolderEntityStart::knot_set(NR::Point const &p, NR::Point const &/*origin ((SPObject *)arc)->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG); } -NR::Point +Geom::Point ArcKnotHolderEntityStart::knot_get() { SPGenericEllipse *ge = SP_GENERICELLIPSE(item); @@ -771,17 +802,18 @@ ArcKnotHolderEntityStart::knot_get() } void -ArcKnotHolderEntityEnd::knot_set(NR::Point const &p, NR::Point const &/*origin*/, guint state) +ArcKnotHolderEntityEnd::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint state) { - int snaps = prefs_get_int_attribute("options.rotationsnapsperpi", "value", 12); + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + int snaps = prefs->getInt("/options/rotationsnapsperpi/value", 12); SPGenericEllipse *ge = SP_GENERICELLIPSE(item); SPArc *arc = SP_ARC(item); ge->closed = (sp_genericellipse_side(ge, p) == -1) ? TRUE : FALSE; - NR::Point delta = p - NR::Point(ge->cx.computed, ge->cy.computed); - NR::scale sc(ge->rx.computed, ge->ry.computed); + Geom::Point delta = p - Geom::Point(ge->cx.computed, ge->cy.computed); + Geom::Scale sc(ge->rx.computed, ge->ry.computed); ge->end = atan2(delta * sc.inverse()); if ( ( state & GDK_CONTROL_MASK ) && snaps ) @@ -792,7 +824,7 @@ ArcKnotHolderEntityEnd::knot_set(NR::Point const &p, NR::Point const &/*origin*/ ((SPObject *)arc)->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG); } -NR::Point +Geom::Point ArcKnotHolderEntityEnd::knot_get() { SPGenericEllipse *ge = SP_GENERICELLIPSE(item); @@ -815,13 +847,13 @@ ArcKnotHolderEntityEnd::knot_click(guint state) void -ArcKnotHolderEntityRX::knot_set(NR::Point const &p, NR::Point const &/*origin*/, guint state) +ArcKnotHolderEntityRX::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint state) { SPGenericEllipse *ge = SP_GENERICELLIPSE(item); - NR::Point const s = snap_knot_position(p); + Geom::Point const s = snap_knot_position(p); - ge->rx.computed = fabs( ge->cx.computed - s[NR::X] ); + ge->rx.computed = fabs( ge->cx.computed - s[Geom::X] ); if ( state & GDK_CONTROL_MASK ) { ge->ry.computed = ge->rx.computed; @@ -830,12 +862,12 @@ ArcKnotHolderEntityRX::knot_set(NR::Point const &p, NR::Point const &/*origin*/, ((SPObject *)item)->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG); } -NR::Point +Geom::Point ArcKnotHolderEntityRX::knot_get() { SPGenericEllipse *ge = SP_GENERICELLIPSE(item); - return (NR::Point(ge->cx.computed, ge->cy.computed) - NR::Point(ge->rx.computed, 0)); + return (Geom::Point(ge->cx.computed, ge->cy.computed) - Geom::Point(ge->rx.computed, 0)); } void @@ -850,13 +882,13 @@ ArcKnotHolderEntityRX::knot_click(guint state) } void -ArcKnotHolderEntityRY::knot_set(NR::Point const &p, NR::Point const &/*origin*/, guint state) +ArcKnotHolderEntityRY::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint state) { SPGenericEllipse *ge = SP_GENERICELLIPSE(item); - NR::Point const s = snap_knot_position(p); + Geom::Point const s = snap_knot_position(p); - ge->ry.computed = fabs( ge->cy.computed - s[NR::Y] ); + ge->ry.computed = fabs( ge->cy.computed - s[Geom::Y] ); if ( state & GDK_CONTROL_MASK ) { ge->rx.computed = ge->ry.computed; @@ -865,12 +897,12 @@ ArcKnotHolderEntityRY::knot_set(NR::Point const &p, NR::Point const &/*origin*/, ((SPObject *)item)->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG); } -NR::Point +Geom::Point ArcKnotHolderEntityRY::knot_get() { SPGenericEllipse *ge = SP_GENERICELLIPSE(item); - return (NR::Point(ge->cx.computed, ge->cy.computed) - NR::Point(0, ge->ry.computed)); + return (Geom::Point(ge->cx.computed, ge->cy.computed) - Geom::Point(0, ge->ry.computed)); } void @@ -898,7 +930,7 @@ ArcKnotHolder::ArcKnotHolder(SPDesktop *desktop, SPItem *item, SPKnotHolderRelea _("Adjust ellipse height, with Ctrl to make circle"), SP_KNOT_SHAPE_SQUARE, SP_KNOT_MODE_XOR); entity_start->create(desktop, item, this, - _("Position the start point of the arc or segment; with Ctrl" + _("Position the start point of the arc or segment; with Ctrl " "to snap angle; drag inside the ellipse for arc, outside for segment"), SP_KNOT_SHAPE_CIRCLE, SP_KNOT_MODE_XOR); entity_end->create(desktop, item, this, @@ -917,26 +949,26 @@ ArcKnotHolder::ArcKnotHolder(SPDesktop *desktop, SPItem *item, SPKnotHolderRelea class StarKnotHolderEntity1 : public KnotHolderEntity { public: - virtual NR::Point knot_get(); - virtual void knot_set(NR::Point const &p, NR::Point const &origin, guint state); + virtual Geom::Point knot_get(); + virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state); virtual void knot_click(guint state); }; class StarKnotHolderEntity2 : public KnotHolderEntity { public: - virtual NR::Point knot_get(); - virtual void knot_set(NR::Point const &p, NR::Point const &origin, guint state); + virtual Geom::Point knot_get(); + virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state); virtual void knot_click(guint state); }; void -StarKnotHolderEntity1::knot_set(NR::Point const &p, NR::Point const &/*origin*/, guint state) +StarKnotHolderEntity1::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint state) { SPStar *star = SP_STAR(item); - NR::Point const s = snap_knot_position(p); + Geom::Point const s = snap_knot_position(p); - NR::Point d = s - star->center; + Geom::Point d = s - to_2geom(star->center); double arg1 = atan2(d); double darg1 = arg1 - star->arg[0]; @@ -956,14 +988,14 @@ StarKnotHolderEntity1::knot_set(NR::Point const &p, NR::Point const &/*origin*/, } void -StarKnotHolderEntity2::knot_set(NR::Point const &p, NR::Point const &/*origin*/, guint state) +StarKnotHolderEntity2::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint state) { SPStar *star = SP_STAR(item); - NR::Point const s = snap_knot_position(p); + Geom::Point const s = snap_knot_position(p); if (star->flatsided == false) { - NR::Point d = s - star->center; + Geom::Point d = s - to_2geom(star->center); double arg1 = atan2(d); double darg1 = arg1 - star->arg[1]; @@ -984,7 +1016,7 @@ StarKnotHolderEntity2::knot_set(NR::Point const &p, NR::Point const &/*origin*/, } } -NR::Point +Geom::Point StarKnotHolderEntity1::knot_get() { g_assert(item != NULL); @@ -995,7 +1027,7 @@ StarKnotHolderEntity1::knot_get() } -NR::Point +Geom::Point StarKnotHolderEntity2::knot_get() { g_assert(item != NULL); @@ -1060,15 +1092,15 @@ StarKnotHolder::StarKnotHolder(SPDesktop *desktop, SPItem *item, SPKnotHolderRel class SpiralKnotHolderEntityInner : public KnotHolderEntity { public: - virtual NR::Point knot_get(); - virtual void knot_set(NR::Point const &p, NR::Point const &origin, guint state); + virtual Geom::Point knot_get(); + virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state); virtual void knot_click(guint state); }; class SpiralKnotHolderEntityOuter : public KnotHolderEntity { public: - virtual NR::Point knot_get(); - virtual void knot_set(NR::Point const &p, NR::Point const &origin, guint state); + virtual Geom::Point knot_get(); + virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state); }; @@ -1079,19 +1111,26 @@ public: * [control] constrain inner arg to round per PI/4 */ void -SpiralKnotHolderEntityInner::knot_set(NR::Point const &p, NR::Point const &/*origin*/, guint state) +SpiralKnotHolderEntityInner::knot_set(Geom::Point const &p, Geom::Point const &origin, guint state) { - int snaps = prefs_get_int_attribute("options.rotationsnapsperpi", "value", 12); + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + int snaps = prefs->getInt("/options/rotationsnapsperpi/value", 12); SPSpiral *spiral = SP_SPIRAL(item); - gdouble dx = p[NR::X] - spiral->cx; - gdouble dy = p[NR::Y] - spiral->cy; + gdouble dx = p[Geom::X] - spiral->cx; + gdouble dy = p[Geom::Y] - spiral->cy; + + gdouble moved_y = p[Geom::Y] - origin[Geom::Y]; if (state & GDK_MOD1_MASK) { // adjust divergence by vertical drag, relative to rad - double new_exp = (spiral->rad + dy)/(spiral->rad); - spiral->exp = new_exp > 0? new_exp : 0; + if (spiral->rad > 0) { + double exp_delta = 0.1*moved_y/(spiral->rad); // arbitrary multiplier to slow it down + spiral->exp += exp_delta; + if (spiral->exp < 1e-3) + spiral->exp = 1e-3; + } } else { // roll/unroll from inside gdouble arg_t0; @@ -1121,14 +1160,15 @@ SpiralKnotHolderEntityInner::knot_set(NR::Point const &p, NR::Point const &/*ori * [control] constrain inner arg to round per PI/4 */ void -SpiralKnotHolderEntityOuter::knot_set(NR::Point const &p, NR::Point const &/*origin*/, guint state) +SpiralKnotHolderEntityOuter::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint state) { - int snaps = prefs_get_int_attribute("options.rotationsnapsperpi", "value", 12); + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + int snaps = prefs->getInt("/options/rotationsnapsperpi/value", 12); SPSpiral *spiral = SP_SPIRAL(item); - gdouble dx = p[NR::X] - spiral->cx; - gdouble dy = p[NR::Y] - spiral->cy; + gdouble dx = p[Geom::X] - spiral->cx; + gdouble dy = p[Geom::Y] - spiral->cy; if (state & GDK_SHIFT_MASK) { // rotate without roll/unroll spiral->arg = atan2(dy, dx) - 2.0*M_PI*spiral->revo; @@ -1193,7 +1233,7 @@ SpiralKnotHolderEntityOuter::knot_set(NR::Point const &p, NR::Point const &/*ori ((SPObject *)spiral)->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG); } -NR::Point +Geom::Point SpiralKnotHolderEntityInner::knot_get() { SPSpiral *spiral = SP_SPIRAL(item); @@ -1201,7 +1241,7 @@ SpiralKnotHolderEntityInner::knot_get() return sp_spiral_get_xy(spiral, spiral->t0); } -NR::Point +Geom::Point SpiralKnotHolderEntityOuter::knot_get() { SPSpiral *spiral = SP_SPIRAL(item); @@ -1244,12 +1284,12 @@ SpiralKnotHolder::SpiralKnotHolder(SPDesktop *desktop, SPItem *item, SPKnotHolde class OffsetKnotHolderEntity : public KnotHolderEntity { public: - virtual NR::Point knot_get(); - virtual void knot_set(NR::Point const &p, NR::Point const &origin, guint state); + virtual Geom::Point knot_get(); + virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state); }; void -OffsetKnotHolderEntity::knot_set(NR::Point const &p, NR::Point const &/*origin*/, guint /*state*/) +OffsetKnotHolderEntity::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint /*state*/) { SPOffset *offset = SP_OFFSET(item); @@ -1261,12 +1301,12 @@ OffsetKnotHolderEntity::knot_set(NR::Point const &p, NR::Point const &/*origin*/ } -NR::Point +Geom::Point OffsetKnotHolderEntity::knot_get() { SPOffset *offset = SP_OFFSET(item); - NR::Point np; + Geom::Point np; sp_offset_top_point(offset,&np); return np; } @@ -1287,20 +1327,20 @@ OffsetKnotHolder::OffsetKnotHolder(SPDesktop *desktop, SPItem *item, SPKnotHolde // sense logically. class FlowtextKnotHolderEntity : public RectKnotHolderEntityWH { public: - virtual NR::Point knot_get(); - virtual void knot_set(NR::Point const &p, NR::Point const &origin, guint state); + virtual Geom::Point knot_get(); + virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state); }; -NR::Point +Geom::Point FlowtextKnotHolderEntity::knot_get() { SPRect *rect = SP_RECT(item); - return NR::Point(rect->x.computed + rect->width.computed, rect->y.computed + rect->height.computed); + return Geom::Point(rect->x.computed + rect->width.computed, rect->y.computed + rect->height.computed); } void -FlowtextKnotHolderEntity::knot_set(NR::Point const &p, NR::Point const &origin, guint state) +FlowtextKnotHolderEntity::knot_set(Geom::Point const &p, Geom::Point const &origin, guint state) { set_internal(p, origin, state); }