From: joncruz Date: Sun, 11 Jun 2006 05:24:48 +0000 (+0000) Subject: Applied patch #1503864 X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=46e288e75cd7b4d376ace88c57aec3b47a148a20;p=inkscape.git Applied patch #1503864 --- diff --git a/ChangeLog b/ChangeLog index 213c912bc..6bdb03ed6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2006-06-09 Jon A. Cruz + + * src/object-snapper.cpp, src/selection.cpp, src/selection.h, src/seltrans.cpp: + + Applied patch #1503864. + 2006-06-09 Jon A. Cruz * src/widgets/toolbox.cpp: diff --git a/src/object-snapper.cpp b/src/object-snapper.cpp index 9439fea8b..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); + } } } diff --git a/src/selection.cpp b/src/selection.cpp index 413048f5c..ae11a1432 100644 --- a/src/selection.cpp +++ b/src/selection.cpp @@ -446,6 +446,14 @@ std::vector Selection::getBBoxPoints() const { return p; } +std::vector Selection::getBBoxPointsOuter() const { + std::vector p; + NR::Rect bbox = bounds(); + p.push_back(bbox.min()); + p.push_back(bbox.max()); + return p; +} + void Selection::_removeObjectDescendants(SPObject *obj) { GSList *iter, *next; for ( iter = _objs ; iter ; iter = next ) { diff --git a/src/selection.h b/src/selection.h index c78a1fdbb..be8cd8aff 100644 --- a/src/selection.h +++ b/src/selection.h @@ -271,6 +271,12 @@ public: */ std::vector getBBoxPoints() const; + /** + * @return A vector containing the 2 (top-left and bottom-right) + * corners of the selection bounding box. + */ + std::vector Selection::getBBoxPointsOuter() const; + /** * @brief Connects a slot to be notified of selection changes * diff --git a/src/seltrans.cpp b/src/seltrans.cpp index f6134a01c..6b61beac4 100644 --- a/src/seltrans.cpp +++ b/src/seltrans.cpp @@ -253,8 +253,8 @@ void Inkscape::SelTrans::grab(NR::Point const &p, gdouble x, gdouble y, bool sho _point = p; - _snap_points = selection->getSnapPoints(); - _bbox_points = selection->getBBoxPoints(); + _snap_points = selection->getSnapPointsConvexHull(); + _bbox_points = selection->getBBoxPointsOuter(); gchar const *scale_origin = prefs_get_string_attribute("tools.select", "scale_origin"); bool const origin_on_bbox = (scale_origin == NULL || !strcmp(scale_origin, "bbox"));