X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fobject-snapper.cpp;h=6b51f85085e44da72335c5db9f975c2658756b45;hb=9092fa64659033e70bf914a5d83d5470d31cbc27;hp=9a3f61525d91c288060ce1b09b1a7fdc204554d9;hpb=9c7bdde7adbecbfe254da6fa92e0f3bdc1f47546;p=inkscape.git diff --git a/src/object-snapper.cpp b/src/object-snapper.cpp index 9a3f61525..6b51f8508 100644 --- a/src/object-snapper.cpp +++ b/src/object-snapper.cpp @@ -15,6 +15,7 @@ #include "document.h" #include "sp-namedview.h" #include "sp-path.h" +#include "sp-item-group.h" #include "display/curve.h" #include "desktop.h" #include "inkscape.h" @@ -37,8 +38,9 @@ void Inkscape::ObjectSnapper::_findCandidates(std::list& c, std::list const &it, NR::Point const &p) const { - for (SPObject* o = r->children; o != NULL; o = o->next) { - if (SP_IS_ITEM(o)) { + SPDesktop const *desktop = SP_ACTIVE_DESKTOP; + for (SPObject* o = sp_object_first_child(r); o != NULL; o = SP_OBJECT_NEXT(o)) { + if (SP_IS_ITEM(o) && !SP_ITEM(o)->isLocked() && !desktop->itemIsHidden(SP_ITEM(o))) { /* See if this item is on the ignore list */ std::list::const_iterator i = it.begin(); @@ -48,14 +50,17 @@ void Inkscape::ObjectSnapper::_findCandidates(std::list& c, if (i == it.end()) { /* See if the item is within range */ - NR::Rect const b = NR::expand(sp_item_bbox_desktop(SP_ITEM(o)), -getDistance()); - if (b.contains(p)) { - c.push_back(SP_ITEM(o)); + if (SP_IS_GROUP(o)) { + _findCandidates(c, o, it, p); + } else { + NR::Rect const b = NR::expand(sp_item_bbox_desktop(SP_ITEM(o)), -getDistance()); + if (b.contains(p)) { + c.push_back(SP_ITEM(o)); + } } } - } - _findCandidates(c, o, it, p); + } } } @@ -78,10 +83,10 @@ void Inkscape::ObjectSnapper::_snapNodes(Inkscape::SnappedPoint &s, int j = 0; NR::Matrix const i2doc = sp_item_i2doc_affine(*i); - while (sh->curve->bpath[j].code != NR_END) { + while (SP_CURVE_BPATH(sh->curve)[j].code != NR_END) { /* Get this node in desktop coordinates */ - NArtBpath const &bp = sh->curve->bpath[j]; + NArtBpath const &bp = SP_CURVE_BPATH(sh->curve)[j]; NR::Point const n = desktop->doc2dt(bp.c(3) * i2doc); /* Try to snap to this node of the path */ @@ -167,7 +172,7 @@ Inkscape::SnappedPoint Inkscape::ObjectSnapper::_doFreeSnap(NR::Point const &p, Inkscape::SnappedPoint Inkscape::ObjectSnapper::_doConstrainedSnap(NR::Point const &p, - NR::Point const &c, + ConstraintLine const &c, std::list const &it) const { /* FIXME: this needs implementing properly; I think we have to do the