X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fobject-snapper.h;h=6bde3dd391a531fd7fc75bea43b0df780e67903d;hb=42382dfb4164b919ffcdf03766da9f8be4e43b42;hp=9972677e0c301c1461b2960a2834c6f05380ca90;hpb=2b7ee786ac3f40bb6b0d6e19f565b802f29f50e0;p=inkscape.git diff --git a/src/object-snapper.h b/src/object-snapper.h index 9972677e0..6bde3dd39 100644 --- a/src/object-snapper.h +++ b/src/object-snapper.h @@ -17,6 +17,7 @@ #include "snapper.h" #include "sp-path.h" #include "splivarot.h" +#include "snap-candidate.h" struct SPNamedView; struct SPItem; @@ -25,23 +26,6 @@ struct SPObject; namespace Inkscape { -class SnapCandidate - -{ -public: - SnapCandidate(SPItem* item, bool clip_or_mask, Geom::Matrix _additional_affine); - ~SnapCandidate(); - - SPItem* item; // An item that is to be considered for snapping to - bool clip_or_mask; // If true, then item refers to a clipping path or a mask - - /* To find out the absolute position of a clipping path or mask, we not only need to know - * the transformation of the clipping path or mask itself, but also the transformation of - * the object to which the clip or mask is being applied; that transformation is stored here - */ - Geom::Matrix additional_affine; -}; - class ObjectSnapper : public Snapper { @@ -49,110 +33,84 @@ public: ObjectSnapper(SnapManager *sm, Geom::Coord const d); ~ObjectSnapper(); - enum DimensionToSnap { - GUIDE_TRANSL_SNAP_X, // For snapping a vertical guide (normal in the X-direction) to objects, - GUIDE_TRANSL_SNAP_Y, // For snapping a horizontal guide (normal in the Y-direction) to objects - ANGLED_GUIDE_TRANSL_SNAP, // For snapping an angled guide, while translating it accross the desktop - ANGLED_GUIDE_ROT_SNAP, // For snapping an angled guide, while rotating it around some pivot point - TRANSL_SNAP_XY}; // All other cases; for snapping to objects, other than guides - - void setSnapToItemNode(bool s) {_snap_to_itemnode = s;} - bool getSnapToItemNode() const {return _snap_to_itemnode;} - void setSnapToItemPath(bool s) {_snap_to_itempath = s;} - bool getSnapToItemPath() const {return _snap_to_itempath;} - void setSnapToBBoxNode(bool s) {_snap_to_bboxnode = s;} - bool getSnapToBBoxNode() const {return _snap_to_bboxnode;} - void setSnapToBBoxPath(bool s) {_snap_to_bboxpath = s;} - bool getSnapToBBoxPath() const {return _snap_to_bboxpath;} - void setSnapToPageBorder(bool s) {_snap_to_page_border = s;} - bool getSnapToPageBorder() const {return _snap_to_page_border;} - void guideSnap(SnappedConstraints &sc, + void guideFreeSnap(SnappedConstraints &sc, Geom::Point const &p, - Geom::Point const &guide_normal) const; - - bool ThisSnapperMightSnap() const; - bool GuidesMightSnap() const; - - void freeSnap(SnappedConstraints &sc, - Inkscape::SnapPreferences::PointType const &t, - Geom::Point const &p, - bool const &first_point, - Geom::OptRect const &bbox_to_snap, - std::vector const *it, - std::vector *unselected_nodes) const; - - void constrainedSnap(SnappedConstraints &sc, - Inkscape::SnapPreferences::PointType const &t, - Geom::Point const &p, - bool const &first_point, - Geom::OptRect const &bbox_to_snap, - ConstraintLine const &c, - std::vector const *it) const; + Geom::Point const &guide_normal) const; + + void guideConstrainedSnap(SnappedConstraints &sc, + Geom::Point const &p, + Geom::Point const &guide_normal, + SnapConstraint const &c) const; + + bool ThisSnapperMightSnap() const; + + Geom::Coord getSnapperTolerance() const; //returns the tolerance of the snapper in screen pixels (i.e. independent of zoom) + bool getSnapperAlwaysSnap() const; //if true, then the snapper will always snap, regardless of its tolerance + + void freeSnap(SnappedConstraints &sc, + Inkscape::SnapCandidatePoint const &p, + Geom::OptRect const &bbox_to_snap, + std::vector const *it, + std::vector *unselected_nodes) const; + + void constrainedSnap(SnappedConstraints &sc, + Inkscape::SnapCandidatePoint const &p, + Geom::OptRect const &bbox_to_snap, + SnapConstraint const &c, + std::vector const *it, + std::vector *unselected_nodes) const; private: //store some lists of candidates, points and paths, so we don't have to rebuild them for each point we want to snap - std::vector *_candidates; - std::vector *_points_to_snap_to; - std::vector *_paths_to_snap_to; + std::vector *_candidates; + std::vector *_points_to_snap_to; + std::vector *_paths_to_snap_to; void _findCandidates(SPObject* parent, std::vector const *it, bool const &first_point, Geom::Rect const &bbox_to_snap, - DimensionToSnap snap_dim, bool const _clip_or_mask, Geom::Matrix const additional_affine) const; void _snapNodes(SnappedConstraints &sc, - Inkscape::SnapPreferences::PointType const &t, - Geom::Point const &p, // in desktop coordinates - bool const &first_point, - std::vector *unselected_nodes) const; // in desktop coordinates + Inkscape::SnapCandidatePoint const &p, // in desktop coordinates + std::vector *unselected_nodes, + SnapConstraint const &c = SnapConstraint(), + Geom::Point const &p_proj_on_constraint = Geom::Point()) const; - void _snapTranslatingGuideToNodes(SnappedConstraints &sc, - Inkscape::SnapPreferences::PointType const &t, + void _snapTranslatingGuide(SnappedConstraints &sc, Geom::Point const &p, Geom::Point const &guide_normal) const; - void _collectNodes(Inkscape::SnapPreferences::PointType const &t, + void _collectNodes(Inkscape::SnapSourceType const &t, bool const &first_point) const; void _snapPaths(SnappedConstraints &sc, - Inkscape::SnapPreferences::PointType const &t, - Geom::Point const &p, // in desktop coordinates - bool const &first_point, - std::vector *unselected_nodes, // in desktop coordinates + Inkscape::SnapCandidatePoint const &p, // in desktop coordinates + std::vector *unselected_nodes, // in desktop coordinates SPPath const *selected_path) const; void _snapPathsConstrained(SnappedConstraints &sc, - Inkscape::SnapPreferences::PointType const &t, - Geom::Point const &p, // in desktop coordinates - bool const &first_point, - ConstraintLine const &c) const; + Inkscape::SnapCandidatePoint const &p, // in desktop coordinates + SnapConstraint const &c, + Geom::Point const &p_proj_on_constraint) const; - bool isUnselectedNode(Geom::Point const &point, std::vector const *unselected_nodes) const; + bool isUnselectedNode(Geom::Point const &point, std::vector const *unselected_nodes) const; - void _collectPaths(Inkscape::SnapPreferences::PointType const &t, - bool const &first_point) const; + void _collectPaths(Geom::Point p, + Inkscape::SnapSourceType const source_type, + bool const &first_point) const; void _clear_paths() const; Geom::PathVector* _getBorderPathv() const; Geom::PathVector* _getPathvFromRect(Geom::Rect const rect) const; - void _getBorderNodes(std::vector *points) const; - - bool _snap_to_itemnode; - bool _snap_to_itempath; - bool _snap_to_bboxnode; - bool _snap_to_bboxpath; - bool _snap_to_page_border; - - //If enabled, then bbox corners will only snap to bboxes, - //and nodes will only snap to nodes and paths. We will not - //snap bbox corners to nodes, or nodes to bboxes. - //(snapping to grids and guides is not affected by this) - bool _strict_snapping; -}; - -} + void _getBorderNodes(std::vector *points) const; + +}; // end of ObjectSnapper class + +void getBBoxPoints(Geom::OptRect const bbox, std::vector *points, bool const isTarget, bool const includeCorners, bool const includeLineMidpoints, bool const includeObjectMidpoints); + +} // end of namespace Inkscape #endif