X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fsnapper.cpp;h=f8f7705f23d5e3963e72f6a2e51426d0255ad4a9;hb=57eb32794c2df43d60ee8f0a9aa8576567358ce6;hp=fd05809c13af5d54c10525e7a7ed96e48f1dd9b8;hpb=f951374eef04129c6a0d213e7ab4d9ed2095ca69;p=inkscape.git diff --git a/src/snapper.cpp b/src/snapper.cpp index fd05809c1..f8f7705f2 100644 --- a/src/snapper.cpp +++ b/src/snapper.cpp @@ -4,44 +4,53 @@ * * Authors: * Carl Hetherington + * Diederik van Lierop * * Released under GNU GPL, read the file 'COPYING' for more information. */ #include "libnr/nr-values.h" #include "sp-namedview.h" +#include "inkscape.h" +#include "desktop.h" -Inkscape::Snapper::PointType const Inkscape::Snapper::BBOX_POINT = 0x1; -Inkscape::Snapper::PointType const Inkscape::Snapper::SNAP_POINT = 0x2; +Inkscape::Snapper::PointType const Inkscape::Snapper::SNAPPOINT_BBOX = 0x1; +Inkscape::Snapper::PointType const Inkscape::Snapper::SNAPPOINT_NODE = 0x2; +Inkscape::Snapper::PointType const Inkscape::Snapper::SNAPPOINT_GUIDE = 0x4; /** * Construct new Snapper for named view. * \param nv Named view. - * \param d Snap distance. + * \param d Snap tolerance. */ -Inkscape::Snapper::Snapper(SPNamedView const *nv, NR::Coord const d) : _named_view(nv), _distance(d) +Inkscape::Snapper::Snapper(SPNamedView const *nv, NR::Coord const t) : _named_view(nv), _snap_enabled(true), _snapper_tolerance(t) { g_assert(_named_view != NULL); g_assert(SP_IS_NAMEDVIEW(_named_view)); - setSnapTo(BBOX_POINT, true); + setSnapFrom(SNAPPOINT_BBOX | SNAPPOINT_NODE, true); //Snap any point. In v0.45 and earlier, this was controlled in the preferences tab } /** - * Set snap distance. - * \param d New snap distance (desktop coordinates) + * Set snap tolerance. + * \param d New snap tolerance (desktop coordinates) */ -void Inkscape::Snapper::setDistance(NR::Coord const d) +void Inkscape::Snapper::setSnapperTolerance(NR::Coord const d) { - _distance = d; + _snapper_tolerance = d; } /** - * \return Snap distance (desktop coordinates) + * \return Snap tolerance (desktop coordinates); depends on current zoom so that it's always the same in screen pixels */ -NR::Coord Inkscape::Snapper::getDistance() const +NR::Coord Inkscape::Snapper::getSnapperTolerance() const { - return _distance; + return _snapper_tolerance / SP_ACTIVE_DESKTOP->current_zoom(); +} + +bool Inkscape::Snapper::getSnapperAlwaysSnap() const +{ + return _snapper_tolerance == 10000; //TODO: Replace this threshold of 10000 by a constant; see also tolerance-slider.cpp } /** @@ -49,12 +58,12 @@ NR::Coord Inkscape::Snapper::getDistance() const * \param t Point type. * \param s true to snap to this point type, otherwise false; */ -void Inkscape::Snapper::setSnapTo(PointType t, bool s) +void Inkscape::Snapper::setSnapFrom(PointType t, bool s) { if (s) { - _snap_to |= t; + _snap_from |= t; } else { - _snap_to &= ~t; + _snap_from &= ~t; } } @@ -62,21 +71,21 @@ void Inkscape::Snapper::setSnapTo(PointType t, bool s) * \param t Point type. * \return true if snapper will snap this type of point, otherwise false. */ -bool Inkscape::Snapper::getSnapTo(PointType t) const +bool Inkscape::Snapper::getSnapFrom(PointType t) const { - return (_snap_to & t); + return (_snap_from & t); } /** - * \return true if this Snapper will snap at least one kind of point. + * \param s true to enable this snapper, otherwise false. */ -bool Inkscape::Snapper::willSnapSomething() const + +void Inkscape::Snapper::setEnabled(bool s) { - return (_snap_to != 0); + _snap_enabled = s; } - /** * Try to snap a point to whatever this snapper is interested in. Any * snap that occurs will be to the nearest "interesting" thing (e.g. a @@ -88,16 +97,21 @@ bool Inkscape::Snapper::willSnapSomething() const * \return Snapped point. */ -Inkscape::SnappedPoint Inkscape::Snapper::freeSnap(PointType t, +void Inkscape::Snapper::freeSnap(SnappedConstraints &sc, + PointType const &t, NR::Point const &p, + bool const &first_point, + std::vector &points_to_snap, SPItem const *it) const { std::list lit; - lit.push_back(it); - return freeSnap(t, p, lit); + if (it) { + lit.push_back(it); + } + + freeSnap(sc, t, p, first_point, points_to_snap, lit, NULL); } - /** * Try to snap a point to whatever this snapper is interested in. Any * snap that occurs will be to the nearest "interesting" thing (e.g. a @@ -109,15 +123,20 @@ Inkscape::SnappedPoint Inkscape::Snapper::freeSnap(PointType t, * \return Snapped point. */ -Inkscape::SnappedPoint Inkscape::Snapper::freeSnap(PointType t, +void Inkscape::Snapper::freeSnap(SnappedConstraints &sc, + + PointType const &t, NR::Point const &p, - std::list const &it) const + bool const &first_point, + std::vector &points_to_snap, + std::list const &it, + std::vector *unselected_nodes) const { - if (getSnapTo(t) == false) { - return SnappedPoint(p, NR_HUGE); + if (_snap_enabled == false || getSnapFrom(t) == false) { + return; } - return _doFreeSnap(p, it); + _doFreeSnap(sc, t, p, first_point, points_to_snap, it, unselected_nodes); } @@ -134,14 +153,18 @@ Inkscape::SnappedPoint Inkscape::Snapper::freeSnap(PointType t, * \return Snapped point. */ -Inkscape::SnappedPoint Inkscape::Snapper::constrainedSnap(PointType t, +void Inkscape::Snapper::constrainedSnap(SnappedConstraints &sc, + + PointType const &t, NR::Point const &p, - NR::Point const &c, + bool const &first_point, + std::vector &points_to_snap, + ConstraintLine const &c, SPItem const *it) const { std::list lit; lit.push_back(it); - return constrainedSnap(t, p, c, lit); + constrainedSnap(sc, t, p, first_point, points_to_snap, c, lit); } @@ -156,16 +179,19 @@ Inkscape::SnappedPoint Inkscape::Snapper::constrainedSnap(PointType t, * \return Snapped point. */ -Inkscape::SnappedPoint Inkscape::Snapper::constrainedSnap(PointType t, +void Inkscape::Snapper::constrainedSnap(SnappedConstraints &sc, + PointType const &t, NR::Point const &p, - NR::Point const &c, + bool const &first_point, + std::vector &points_to_snap, + ConstraintLine const &c, std::list const &it) const { - if (getSnapTo(t) == false) { - return SnappedPoint(p, NR_HUGE); + if (_snap_enabled == false || getSnapFrom(t) == false) { + return; } - return _doConstrainedSnap(p, c, it); + _doConstrainedSnap(sc, t, p, first_point, points_to_snap, c, it); } /*