X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fobject-snapper.h;h=caf643f730e867b89f498b701f03c2eff56daa8a;hb=3160bbbab034cde9669d9dbe736bd834b9cb0352;hp=189e96e3e249c925303a8c55edd967a4605b70f6;hpb=bb0e337c0688f02d4b8686cf499068117cd021ef;p=inkscape.git diff --git a/src/object-snapper.h b/src/object-snapper.h index 189e96e3e..caf643f73 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" +#include "snap-candidate.h" struct SPNamedView; struct SPItem; @@ -24,45 +28,92 @@ namespace Inkscape class ObjectSnapper : public Snapper { + public: - ObjectSnapper(SPNamedView const *nv, NR::Coord const d); + 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 + TRANSL_SNAP_XY}; // All other cases; for snapping to objects, other than guides + + void guideFreeSnap(SnappedConstraints &sc, + Geom::Point const &p, + Geom::Point const &guide_normal) const; + + void guideConstrainedSnap(SnappedConstraints &sc, + Geom::Point const &p, + Geom::Point const &guide_normal, + ConstraintLine const &c) const; + + bool ThisSnapperMightSnap() const; + bool GuidesMightSnap() const; - void setSnapToNodes(bool s) { - _snap_to_nodes = s; - } + 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 - bool getSnapToNodes() const { - return _snap_to_nodes; - } + void freeSnap(SnappedConstraints &sc, + Inkscape::SnapCandidatePoint const &p, + Geom::OptRect const &bbox_to_snap, + std::vector const *it, + std::vector *unselected_nodes) const; - void setSnapToPaths(bool s) { - _snap_to_paths = s; - } + void constrainedSnap(SnappedConstraints &sc, + Inkscape::SnapCandidatePoint const &p, + Geom::OptRect const &bbox_to_snap, + ConstraintLine const &c, + std::vector const *it) const; - bool getSnapToPaths() const { - return _snap_to_paths; - } - private: - SnappedPoint _doFreeSnap(NR::Point const &p, - std::list const &it) const; - - SnappedPoint _doConstrainedSnap(NR::Point const &p, - NR::Point const &c, - std::list const &it) const; - - void _findCandidates(std::list& c, - SPObject* r, - std::list const &it, - NR::Point const &p) 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_nodes; - bool _snap_to_paths; -}; - -} + //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; + + 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::SnapCandidatePoint const &p, + std::vector *unselected_nodes) const; // in desktop coordinates + + void _snapTranslatingGuideToNodes(SnappedConstraints &sc, + Geom::Point const &p, + Geom::Point const &guide_normal) const; + + void _collectNodes(Inkscape::SnapSourceType const &t, + bool const &first_point) const; + + void _snapPaths(SnappedConstraints &sc, + Inkscape::SnapCandidatePoint const &p, // in desktop coordinates + std::vector *unselected_nodes, // in desktop coordinates + SPPath const *selected_path) const; + + void _snapPathsConstrained(SnappedConstraints &sc, + Inkscape::SnapCandidatePoint const &p, // in desktop coordinates + ConstraintLine const &c) const; + + bool isUnselectedNode(Geom::Point const &point, std::vector const *unselected_nodes) const; + + void _collectPaths(Inkscape::SnapCandidatePoint const &p, + 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; + +}; // 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