diff options
| author | Jon A. Cruz <jon@joncruz.org> | 2006-06-11 05:24:48 +0000 |
|---|---|---|
| committer | joncruz <joncruz@users.sourceforge.net> | 2006-06-11 05:24:48 +0000 |
| commit | 80a6db8c1fd8a95721b11875541f9e5e5b41fd1b (patch) | |
| tree | 44f697db940d03da2cf1b9298e6ed97f7de48aab /src | |
| parent | updates from Aleksandar (diff) | |
| download | inkscape-80a6db8c1fd8a95721b11875541f9e5e5b41fd1b.tar.gz inkscape-80a6db8c1fd8a95721b11875541f9e5e5b41fd1b.zip | |
Applied patch #1503864
(bzr r1202)
Diffstat (limited to 'src')
| -rw-r--r-- | src/object-snapper.cpp | 19 | ||||
| -rw-r--r-- | src/selection.cpp | 8 | ||||
| -rw-r--r-- | src/selection.h | 6 | ||||
| -rw-r--r-- | src/seltrans.cpp | 4 |
4 files changed, 28 insertions, 9 deletions
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<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); + } } } 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<NR::Point> Selection::getBBoxPoints() const { return p; } +std::vector<NR::Point> Selection::getBBoxPointsOuter() const { + std::vector<NR::Point> 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 @@ -272,6 +272,12 @@ public: std::vector<NR::Point> getBBoxPoints() const; /** + * @return A vector containing the 2 (top-left and bottom-right) + * corners of the selection bounding box. + */ + std::vector<NR::Point> Selection::getBBoxPointsOuter() const; + + /** * @brief Connects a slot to be notified of selection changes * * This method connects the given slot such that it will 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")); |
