Code

factor in object's matrix expansion when querying blur radius
[inkscape.git] / src / object-snapper.cpp
index 9a3f61525d91c288060ce1b09b1a7fdc204554d9..6b51f85085e44da72335c5db9f975c2658756b45 100644 (file)
@@ -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<SPItem*>& c,
                                               std::list<SPItem const *> 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<SPItem const *>::const_iterator i = it.begin();
@@ -48,14 +50,17 @@ void Inkscape::ObjectSnapper::_findCandidates(std::list<SPItem*>& 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<SPItem const *> const &it) const
 {
     /* FIXME: this needs implementing properly; I think we have to do the