X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fsnap.h;h=4c5e57b73c2987a6372d38ebf3e90c93cb6924e9;hb=037c4c3708e40a1f7569b4ea176380958fd1389a;hp=12996f04d0e54e1f3a9243086e4036d0657e88c1;hpb=f750db62ff32f0048fdc228874e70a1ad9af79ae;p=inkscape.git diff --git a/src/snap.h b/src/snap.h index 12996f04d..4c5e57b73 100644 --- a/src/snap.h +++ b/src/snap.h @@ -3,14 +3,17 @@ /** * \file snap.h - * \brief Various snapping methods. + * \brief SnapManager class. * * Authors: * Lauris Kaplinski * Frank Felfe * Carl Hetherington + * Diederik van Lierop * + * Copyright (C) 2006-2007 Johan Engelen * Copyright (C) 2000-2002 Lauris Kaplinski + * Copyright (C) 2000-2008 Authors * * Released under GNU GPL, read the file 'COPYING' for more information */ @@ -21,82 +24,135 @@ #include #include #include -#include "grid-snapper.h" + #include "guide-snapper.h" #include "object-snapper.h" class SPNamedView; +/// Class to coordinate snapping operations + +/** + * Each SPNamedView has one of these. It offers methods to snap points to whatever + * snappers are defined (e.g. grid, guides etc.). It also allows callers to snap + * points which have undergone some transformation (e.g. translation, scaling etc.) + */ + class SnapManager { public: SnapManager(SPNamedView const *v); - - bool willSnapSomething() const; - Inkscape::SnappedPoint freeSnap(Inkscape::Snapper::PointType t, - NR::Point const &p, - SPItem const *it) const; + typedef std::list SnapperList; - Inkscape::SnappedPoint freeSnap(Inkscape::Snapper::PointType t, + bool SomeSnapperMightSnap() const; + + void setup(SPDesktop const *desktop_for_snapindicator = NULL, SPItem const *item_to_ignore = NULL, std::vector *unselected_nodes = NULL); + void setup(SPDesktop const *desktop_for_snapindicator, std::vector &items_to_ignore, std::vector *unselected_nodes = NULL); + + // freeSnapReturnByRef() is preferred over freeSnap(), because it only returns a + // point if snapping has occured (by overwriting p); otherwise p is untouched + void freeSnapReturnByRef(Inkscape::Snapper::PointType point_type, + NR::Point &p, + bool first_point = true, + NR::Maybe const &bbox_to_snap = NR::Nothing()) const; + + Inkscape::SnappedPoint freeSnap(Inkscape::Snapper::PointType point_type, NR::Point const &p, - std::list const &it) const; + bool first_point = true, + NR::Maybe const &bbox_to_snap = NR::Nothing()) const; - Inkscape::SnappedPoint constrainedSnap(Inkscape::Snapper::PointType t, - NR::Point const &p, - Inkscape::Snapper::ConstraintLine const &c, - SPItem const *it) const; + // constrainedSnapReturnByRef() is preferred over constrainedSnap(), because it only returns a + // point, by overwriting p, if snapping has occured; otherwise p is untouched + void constrainedSnapReturnByRef(Inkscape::Snapper::PointType point_type, + NR::Point &p, + Inkscape::Snapper::ConstraintLine const &constraint, + bool first_point = true, + NR::Maybe const &bbox_to_snap = NR::Nothing()) const; - Inkscape::SnappedPoint constrainedSnap(Inkscape::Snapper::PointType t, + Inkscape::SnappedPoint constrainedSnap(Inkscape::Snapper::PointType point_type, NR::Point const &p, - Inkscape::Snapper::ConstraintLine const &c, - std::list const &it) const; - - std::pair freeSnapTranslation(Inkscape::Snapper::PointType t, - std::vector const &p, - std::list const &it, - NR::Point const &tr) const; - - std::pair constrainedSnapTranslation(Inkscape::Snapper::PointType t, - std::vector const &p, - std::list const &it, - Inkscape::Snapper::ConstraintLine const &c, - NR::Point const &tr) const; - - std::pair freeSnapScale(Inkscape::Snapper::PointType t, - std::vector const &p, - std::list const &it, - NR::scale const &s, - NR::Point const &o) const; - - std::pair constrainedSnapScale(Inkscape::Snapper::PointType t, - std::vector const &p, - std::list const &it, - Inkscape::Snapper::ConstraintLine const &c, - NR::scale const &s, - NR::Point const &o) const; - - std::pair freeSnapStretch(Inkscape::Snapper::PointType t, + Inkscape::Snapper::ConstraintLine const &constraint, + bool first_point = true, + NR::Maybe const &bbox_to_snap = NR::Nothing()) const; + + void guideSnap(NR::Point &p, NR::Point const &guide_normal) const; + + Inkscape::SnappedPoint freeSnapTranslation(Inkscape::Snapper::PointType point_type, std::vector const &p, - std::list const &it, - NR::Coord const &s, + NR::Point const &tr) const; + + Inkscape::SnappedPoint constrainedSnapTranslation(Inkscape::Snapper::PointType point_type, + std::vector const &p, + Inkscape::Snapper::ConstraintLine const &constraint, + NR::Point const &tr) const; + + Inkscape::SnappedPoint freeSnapScale(Inkscape::Snapper::PointType point_type, + std::vector const &p, + NR::scale const &s, + NR::Point const &o) const; + + Inkscape::SnappedPoint constrainedSnapScale(Inkscape::Snapper::PointType point_type, + std::vector const &p, + NR::scale const &s, + NR::Point const &o) const; + + Inkscape::SnappedPoint constrainedSnapStretch(Inkscape::Snapper::PointType point_type, + std::vector const &p, + NR::Coord const &s, + NR::Point const &o, + NR::Dim2 d, + bool uniform) const; + + Inkscape::SnappedPoint constrainedSnapSkew(Inkscape::Snapper::PointType point_type, + std::vector const &p, + Inkscape::Snapper::ConstraintLine const &constraint, + NR::Point const &s, // s[0] = skew factor, s[1] = scale factor NR::Point const &o, - NR::Dim2 d, - bool uniform) const; - - std::pair freeSnapSkew(Inkscape::Snapper::PointType t, - std::vector const &p, - std::list const &it, - NR::Coord const &s, - NR::Point const &o, - NR::Dim2 d) const; - - Inkscape::GridSnapper grid; - Inkscape::GuideSnapper guide; - Inkscape::ObjectSnapper object; + NR::Dim2 d) const; + + Inkscape::GuideSnapper guide; ///< guide snapper + Inkscape::ObjectSnapper object; ///< snapper to other objects - typedef std::list SnapperList; SnapperList getSnappers() const; + SnapperList getGridSnappers() const; + + void setSnapModeBBox(bool enabled); + void setSnapModeNode(bool enabled); + void setSnapModeGuide(bool enabled); + bool getSnapModeBBox() const; + bool getSnapModeNode() const; + bool getSnapModeGuide() const; + + void setSnapIntersectionGG(bool enabled) {_intersectionGG = enabled;} + void setSnapIntersectionLS(bool enabled) {_intersectionLS = enabled;} + bool getSnapIntersectionGG() {return _intersectionGG;} + bool getSnapIntersectionLS() {return _intersectionLS;} + + void setIncludeItemCenter(bool enabled) { + _include_item_center = enabled; + // also store a local copy in the object-snapper instead of passing it through many functions + object.setIncludeItemCenter(enabled); + } + + bool getIncludeItemCenter() const { + return _include_item_center; + } + + void setSnapEnabledGlobally(bool enabled) { + _snap_enabled_globally = enabled; + } + + bool getSnapEnabledGlobally() const { + return _snap_enabled_globally; + } + + void toggleSnapEnabledGlobally() { + _snap_enabled_globally = !_snap_enabled_globally; + } + +protected: + SPNamedView const *_named_view; private: @@ -107,16 +163,27 @@ private: SKEW }; - std::pair _snapTransformed(Inkscape::Snapper::PointType type, - std::vector const &points, - std::list const &ignore, - bool constrained, - Inkscape::Snapper::ConstraintLine const &constraint, - Transformation transformation_type, - NR::Point const &transformation, - NR::Point const &origin, - NR::Dim2 dim, - bool uniform) const; + bool _include_item_center; //If true, snapping nodes will also snap the item's center + bool _intersectionGG; + bool _intersectionLS; + bool _snap_enabled_globally; //Toggles ALL snapping + + std::vector *_items_to_ignore; + SPItem const *_item_to_ignore; + SPDesktop const *_desktop_for_snapindicator; + std::vector *_unselected_nodes; + + Inkscape::SnappedPoint _snapTransformed(Inkscape::Snapper::PointType type, + std::vector const &points, + bool constrained, + Inkscape::Snapper::ConstraintLine const &constraint, + Transformation transformation_type, + NR::Point const &transformation, + NR::Point const &origin, + NR::Dim2 dim, + bool uniform) const; + + Inkscape::SnappedPoint findBestSnap(NR::Point const &p, SnappedConstraints &sc, bool constrained) const; }; #endif /* !SEEN_SNAP_H */