X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fobject-snapper.cpp;h=6b51f85085e44da72335c5db9f975c2658756b45;hb=9092fa64659033e70bf914a5d83d5470d31cbc27;hp=3d583b70950e2959efe7c8b6bdd466b369549558;hpb=44cbde9ad07b4ab019ca52d8355cf959dbbece8e;p=inkscape.git diff --git a/src/object-snapper.cpp b/src/object-snapper.cpp index 3d583b709..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 */ @@ -116,8 +121,10 @@ void Inkscape::ObjectSnapper::_snapPaths(Inkscape::SnappedPoint &s, NR::Point const p_it = p_doc * i2doc.inverse(); Path *livarot_path = Path_for_item(*i, true, true); - if (livarot_path) - livarot_path->ConvertWithBackData(0.01); + if (!livarot_path) + continue; + + livarot_path->ConvertWithBackData(0.01); /* Look for the nearest position on this SPItem to our snap point */ NR::Maybe const o = get_nearest_position_on_Path(livarot_path, p_it); @@ -142,6 +149,10 @@ void Inkscape::ObjectSnapper::_snapPaths(Inkscape::SnappedPoint &s, Inkscape::SnappedPoint Inkscape::ObjectSnapper::_doFreeSnap(NR::Point const &p, std::list const &it) const { + if ( NULL == _named_view ) { + return SnappedPoint(p, NR_HUGE); + } + /* Get a list of all the SPItems that we will try to snap to */ std::list cand; _findCandidates(cand, sp_document_root(_named_view->document), it, p); @@ -161,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