Code

Applied patch #1503864
authorjoncruz <joncruz@users.sourceforge.net>
Sun, 11 Jun 2006 05:24:48 +0000 (05:24 +0000)
committerjoncruz <joncruz@users.sourceforge.net>
Sun, 11 Jun 2006 05:24:48 +0000 (05:24 +0000)
ChangeLog
src/object-snapper.cpp
src/selection.cpp
src/selection.h
src/seltrans.cpp

index 213c912bc305d69d15816f7316bdea810dd212ef..6bdb03ed6701fbdb6a39a64f9466605a6d9e6975 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2006-06-09  Jon A. Cruz  <jon@joncruz.org>
+
+       * src/object-snapper.cpp, src/selection.cpp, src/selection.h, src/seltrans.cpp:
+
+         Applied patch #1503864.
+
 2006-06-09  Jon A. Cruz  <jon@joncruz.org>
 
        * src/widgets/toolbox.cpp:
index 9439fea8b0d854e526c7ccbc2763b456ee17ae14..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);
+        }
     }
 }
 
index 413048f5c230f037312914b0b1bc0a806cd6e5d4..ae11a1432717c7a69453ed42cf188a1fa755aeb5 100644 (file)
@@ -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 ) {
index c78a1fdbb04fd09fa0219768b1addd85a55b062b..be8cd8aff520aac35e2b7e74832eafe644f89637 100644 (file)
@@ -271,6 +271,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
      *
index f6134a01c985cece95299382e1af11009ca25444..6b61beac49b796eb6d804b691b7f7d59ac2208b6 100644 (file)
@@ -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"));