X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fseltrans.cpp;h=82632d45693b65d416534dc79f7f545a6a8f2080;hb=5e230ff5b88fa5522aeaf72d6222c38e4470557d;hp=21b8a046131aa7115ee12c83fb5a1545d039c115;hpb=070093a95d1f92b43b8bdbbff68d1515205349f3;p=inkscape.git diff --git a/src/seltrans.cpp b/src/seltrans.cpp index 21b8a0461..82632d456 100644 --- a/src/seltrans.cpp +++ b/src/seltrans.cpp @@ -94,8 +94,8 @@ Inkscape::SelTrans::SelTrans(SPDesktop *desktop) : _stamp_cache(NULL), _message_context(desktop->messageStack()) { - //_snap_bbox_type = SPItem::GEOMETRIC_BBOX; //TODO: Get this parameter from UI; hardcoded for the time being - _snap_bbox_type = SPItem::APPROXIMATE_BBOX; + gchar const *prefs_bbox = prefs_get_string_attribute("tools.select", "bounding_box"); + _snap_bbox_type = (prefs_bbox != NULL && strcmp(prefs_bbox, "geometric")==0)? SPItem::GEOMETRIC_BBOX : SPItem::APPROXIMATE_BBOX; g_return_if_fail(desktop != NULL); @@ -112,8 +112,6 @@ Inkscape::SelTrans::SelTrans(SPDesktop *desktop) : _updateHandles(); _selection = sp_desktop_selection(desktop); - - _norm = sp_canvas_item_new(sp_desktop_controls(desktop), SP_TYPE_CTRL, @@ -264,7 +262,12 @@ void Inkscape::SelTrans::grab(NR::Point const &p, gdouble x, gdouble y, bool sho // The selector tool should snap the bbox and the special snappoints, but not path nodes // (The special points are the handles, center, rotation axis, font baseline, ends of spiral, etc.) - // First, get all special points for snapping + // First, determine the bounding box for snapping ... + _bbox = selection->bounds(_snap_bbox_type); + _approximate_bbox = selection->bounds(SPItem::APPROXIMATE_BBOX); // Used for correctly scaling the strokewidth + + + // Next, get all special points for snapping _snap_points = selection->getSnapPoints(); // Excludes path nodes std::vector snap_points_hull = selection->getSnapPointsConvexHull(); // Includes path nodes if (_snap_points.size() > 100) { @@ -289,11 +292,6 @@ void Inkscape::SelTrans::grab(NR::Point const &p, gdouble x, gdouble y, bool sho } } - // Next, determine the bounding box for snapping ... - _bbox = selection->bounds(_snap_bbox_type); - - _approximate_bbox = selection->bounds(SPItem::APPROXIMATE_BBOX); // Used for correctly scaling the strokewidth - _bbox_points.clear(); if (_bbox) { // ... and add the bbox corners to _bbox_points @@ -597,30 +595,10 @@ void Inkscape::SelTrans::_updateVolatileState() return; } - // First, get all special points for snapping - std::vector snap_points_hull = selection->getSnapPointsConvexHull(); // Includes path nodes - // Find bbox hulling all special points, which excludes stroke width. Here we need to include the - // path nodes, for example because a rectangle which has been converted to a path doesn't have - // any other special points - NR::Rect snap_points_bbox; - if ( snap_points_hull.empty() == false ) { - std::vector::iterator i = snap_points_hull.begin(); - snap_points_bbox = NR::Rect(*i, *i); - i++; - while (i != snap_points_hull.end()) { - snap_points_bbox.expandTo(*i); - i++; - } - } - - // Next, determine the bounding box for snapping ... + //Update the bboxes _bbox = selection->bounds(_snap_bbox_type); _approximate_bbox = selection->bounds(SPItem::APPROXIMATE_BBOX); - /*std::cout << "Approximate BBox: " << _approximate_bbox->min() << " - " << _approximate_bbox->max() << std::endl; - std::cout << "Geometric BBox: " << selection->bounds(SPItem::GEOMETRIC_BBOX)->min() << " - " << selection->bounds(SPItem::GEOMETRIC_BBOX)->max() << std::endl; - */ - if (!_bbox) { _empty = true; return; @@ -814,6 +792,11 @@ gboolean Inkscape::SelTrans::handleRequest(SPKnot *knot, NR::Point *position, gu void Inkscape::SelTrans::_selChanged(Inkscape::Selection *selection) { if (!_grabbed) { + // reread in case it changed on the fly: + gchar const *prefs_bbox = prefs_get_string_attribute("tools.select", "bounding_box"); + _snap_bbox_type = (prefs_bbox != NULL && strcmp(prefs_bbox, "geometric")==0)? SPItem::GEOMETRIC_BBOX : SPItem::APPROXIMATE_BBOX; + //SPItem::APPROXIMATE_BBOX will be replaced by SPItem::VISUAL_BBOX, as soon as the latter is implemented properly + _updateVolatileState(); _current.set_identity(); _center_is_set = false; // center(s) may have changed