summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJon A. Cruz <jon@joncruz.org>2006-06-11 05:24:48 +0000
committerjoncruz <joncruz@users.sourceforge.net>2006-06-11 05:24:48 +0000
commit80a6db8c1fd8a95721b11875541f9e5e5b41fd1b (patch)
tree44f697db940d03da2cf1b9298e6ed97f7de48aab /src
parentupdates from Aleksandar (diff)
downloadinkscape-80a6db8c1fd8a95721b11875541f9e5e5b41fd1b.tar.gz
inkscape-80a6db8c1fd8a95721b11875541f9e5e5b41fd1b.zip
Applied patch #1503864
(bzr r1202)
Diffstat (limited to 'src')
-rw-r--r--src/object-snapper.cpp19
-rw-r--r--src/selection.cpp8
-rw-r--r--src/selection.h6
-rw-r--r--src/seltrans.cpp4
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"));