X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fobject-snapper.h;h=7f6221f8b3be3659e2cc0293c4436feb22fd7c58;hb=b632ab726ddcf5acea122f867fef25decfb6dbe9;hp=98d457088856bb482adec17ffb4ae3628381aedc;hpb=9c7bdde7adbecbfe254da6fa92e0f3bdc1f47546;p=inkscape.git diff --git a/src/object-snapper.h b/src/object-snapper.h index 98d457088..7f6221f8b 100644 --- a/src/object-snapper.h +++ b/src/object-snapper.h @@ -7,13 +7,17 @@ * * Authors: * Carl Hetherington + * Diederik van Lierop * - * Copyright (C) 2005 Authors + * Copyright (C) 2005 - 2008 Authors * * Released under GNU GPL, read the file 'COPYING' for more information */ #include "snapper.h" +#include "sp-path.h" +#include "splivarot.h" + struct SPNamedView; struct SPItem; @@ -22,46 +26,136 @@ struct SPObject; namespace Inkscape { -class ObjectSnapper : public Snapper +class SnapCandidate + { public: - ObjectSnapper() {} - ObjectSnapper(SPNamedView const *nv, NR::Coord const d); + SnapCandidate(SPItem* item, bool clip_or_mask, NR::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 + */ + NR::Matrix additional_affine; +}; - void setSnapToNodes(bool s) { - _snap_to_nodes = s; - } +class ObjectSnapper : public Snapper +{ - bool getSnapToNodes() const { - return _snap_to_nodes; - } +public: + ObjectSnapper(SPNamedView const *nv, NR::Coord const d); + ~ObjectSnapper(); - void setSnapToPaths(bool s) { - _snap_to_paths = s; - } + 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 - bool getSnapToPaths() const { - return _snap_to_paths; - } + 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 setIncludeItemCenter(bool s) {_include_item_center = s;} + bool getIncludeItemCenter() const {return _include_item_center;} + void setStrictSnapping(bool enabled) {_strict_snapping = enabled;} + void guideSnap(SnappedConstraints &sc, + NR::Point const &p, + NR::Point const &guide_normal) const; -private: - virtual SnappedPoint _doFreeSnap(NR::Point const &p, - std::list const &it) const; + bool ThisSnapperMightSnap() const; + bool GuidesMightSnap() const; + + void freeSnap(SnappedConstraints &sc, + Inkscape::Snapper::PointType const &t, + NR::Point const &p, + bool const &first_point, + NR::Maybe const &bbox_to_snap, + std::vector const *it, + std::vector *unselected_nodes) const; - SnappedPoint _doConstrainedSnap(NR::Point const &p, - NR::Point const &c, - std::list const &it) const; + void constrainedSnap(SnappedConstraints &sc, + Inkscape::Snapper::PointType const &t, + NR::Point const &p, + bool const &first_point, + NR::Maybe const &bbox_to_snap, + ConstraintLine const &c, + std::vector const *it) 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 *_bpaths_to_snap_to; + std::vector *_paths_to_snap_to; + + void _findCandidates(SPObject* parent, + std::vector const *it, + bool const &first_point, + NR::Rect const &bbox_to_snap, + DimensionToSnap snap_dim, + bool const _clip_or_mask, + NR::Matrix const additional_affine) const; + + void _snapNodes(SnappedConstraints &sc, + Inkscape::Snapper::PointType const &t, + NR::Point const &p, + bool const &first_point, + std::vector *unselected_nodes) const; + + void _snapTranslatingGuideToNodes(SnappedConstraints &sc, + Inkscape::Snapper::PointType const &t, + NR::Point const &p, + NR::Point const &guide_normal) const; + + void _collectNodes(Inkscape::Snapper::PointType const &t, + bool const &first_point) const; + + void _snapPaths(SnappedConstraints &sc, + Inkscape::Snapper::PointType const &t, + NR::Point const &p, + bool const &first_point, + std::vector *unselected_nodes, + SPPath const *selected_path) const; + + void _snapPathsConstrained(SnappedConstraints &sc, + Inkscape::Snapper::PointType const &t, + NR::Point const &p, + bool const &first_point, + ConstraintLine const &c) const; + + bool isUnselectedNode(NR::Point const &point, std::vector const *unselected_nodes) const; - void _findCandidates(std::list& c, - SPObject* r, - std::list const &it, - NR::Point const &p) const; + void _collectPaths(Inkscape::Snapper::PointType const &t, + bool const &first_point) const; + + void _clear_paths() const; + NArtBpath const* _getBorderBPath() const; + void _getBorderNodes(std::vector *points) const; - void _snapNodes(Inkscape::SnappedPoint &s, NR::Point const &p, std::list const &cand) const; - void _snapPaths(Inkscape::SnappedPoint &s, NR::Point const &p, std::list const &cand) const; + bool _snap_to_itemnode; + bool _snap_to_itempath; + bool _snap_to_bboxnode; + bool _snap_to_bboxpath; + bool _snap_to_page_border; - bool _snap_to_nodes; - bool _snap_to_paths; + //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; + bool _include_item_center; }; }