diff options
| author | Diederik van Lierop <mail@diedenrezi.nl> | 2011-06-26 20:00:36 +0000 |
|---|---|---|
| committer | Diederik van Lierop <mail@diedenrezi.nl> | 2011-06-26 20:00:36 +0000 |
| commit | bdf703831ff93438d49324ab842052ccaf390a5d (patch) | |
| tree | f98f378da026d6c5699b0565e2735c02f4f1620c /src | |
| parent | Documentation. Tutorials translation update. (diff) | |
| download | inkscape-bdf703831ff93438d49324ab842052ccaf390a5d.tar.gz inkscape-bdf703831ff93438d49324ab842052ccaf390a5d.zip | |
- Add a third group of snap sources/targets, called ¨others¨ (before we had only ¨bounding box¨ and nodes (see bug #788178)
- Fix the display of the snap source
- Fix snapping of guides to other guides & grids
(bzr r10372)
Diffstat (limited to 'src')
| -rw-r--r-- | src/attributes-test.h | 1 | ||||
| -rw-r--r-- | src/attributes.cpp | 2 | ||||
| -rw-r--r-- | src/attributes.h | 1 | ||||
| -rw-r--r-- | src/display/canvas-axonomgrid.cpp | 2 | ||||
| -rw-r--r-- | src/display/canvas-grid.cpp | 2 | ||||
| -rw-r--r-- | src/display/snap-indicator.cpp | 6 | ||||
| -rw-r--r-- | src/gradient-context.cpp | 2 | ||||
| -rw-r--r-- | src/object-snapper.cpp | 37 | ||||
| -rw-r--r-- | src/seltrans.cpp | 2 | ||||
| -rw-r--r-- | src/snap-enums.h | 8 | ||||
| -rw-r--r-- | src/snap-preferences.cpp | 27 | ||||
| -rw-r--r-- | src/snap-preferences.h | 4 | ||||
| -rw-r--r-- | src/snap.cpp | 4 | ||||
| -rw-r--r-- | src/sp-ellipse.cpp | 4 | ||||
| -rw-r--r-- | src/sp-namedview.cpp | 61 | ||||
| -rw-r--r-- | src/sp-rect.cpp | 2 | ||||
| -rw-r--r-- | src/sp-shape.cpp | 2 | ||||
| -rw-r--r-- | src/sp-spiral.cpp | 2 | ||||
| -rw-r--r-- | src/sp-star.cpp | 2 | ||||
| -rw-r--r-- | src/text-context.cpp | 2 | ||||
| -rw-r--r-- | src/ui/icon-names.h | 2 | ||||
| -rw-r--r-- | src/widgets/toolbox.cpp | 27 |
22 files changed, 119 insertions, 83 deletions
diff --git a/src/attributes-test.h b/src/attributes-test.h index 14696b845..6a9570c37 100644 --- a/src/attributes-test.h +++ b/src/attributes-test.h @@ -349,6 +349,7 @@ struct {char const *attr; bool supported;} const all_attrs[] = { {"inkscape:snap-global", true}, {"inkscape:snap-bbox", true}, {"inkscape:snap-nodes", true}, + {"inkscape:snap-others", true}, {"inkscape:snap-from-guide", true}, {"inkscape:snap-center", true}, {"inkscape:snap-smooth-nodes", true}, diff --git a/src/attributes.cpp b/src/attributes.cpp index 118a90482..334c3447c 100644 --- a/src/attributes.cpp +++ b/src/attributes.cpp @@ -94,6 +94,7 @@ static SPStyleProp const props[] = { {SP_ATTR_INKSCAPE_SNAP_GLOBAL, "inkscape:snap-global"}, {SP_ATTR_INKSCAPE_SNAP_BBOX, "inkscape:snap-bbox"}, {SP_ATTR_INKSCAPE_SNAP_NODES, "inkscape:snap-nodes"}, + {SP_ATTR_INKSCAPE_SNAP_OTHERS, "inkscape:snap-others"}, {SP_ATTR_INKSCAPE_SNAP_FROM_GUIDE, "inkscape:snap-from-guide"}, {SP_ATTR_INKSCAPE_SNAP_CENTER, "inkscape:snap-center"}, {SP_ATTR_INKSCAPE_SNAP_GRIDS, "inkscape:snap-grids"}, @@ -495,6 +496,7 @@ sp_attribute_lookup(gchar const *key) propdict = g_hash_table_new(g_str_hash, g_str_equal); for (i = 1; i < n_attrs; i++) { g_assert(props[i].code == static_cast< gint >(i) ); + // If this g_assert fails, then the sort order of SPAttributeEnum does not match the order in props[]! g_hash_table_insert(propdict, const_cast<void *>(static_cast<void const *>(props[i].name)), GINT_TO_POINTER(props[i].code)); diff --git a/src/attributes.h b/src/attributes.h index 3755268d0..afa396507 100644 --- a/src/attributes.h +++ b/src/attributes.h @@ -94,6 +94,7 @@ enum SPAttributeEnum { SP_ATTR_INKSCAPE_SNAP_GLOBAL, SP_ATTR_INKSCAPE_SNAP_BBOX, SP_ATTR_INKSCAPE_SNAP_NODES, + SP_ATTR_INKSCAPE_SNAP_OTHERS, SP_ATTR_INKSCAPE_SNAP_FROM_GUIDE, SP_ATTR_INKSCAPE_SNAP_CENTER, SP_ATTR_INKSCAPE_SNAP_GRIDS, diff --git a/src/display/canvas-axonomgrid.cpp b/src/display/canvas-axonomgrid.cpp index a9893f09d..dbf7b424d 100644 --- a/src/display/canvas-axonomgrid.cpp +++ b/src/display/canvas-axonomgrid.cpp @@ -769,7 +769,7 @@ void CanvasAxonomGridSnapper::_addSnappedPoint(SnappedConstraints &sc, Geom::Poi bool CanvasAxonomGridSnapper::ThisSnapperMightSnap() const { - return _snap_enabled && _snapmanager->snapprefs.getSnapToGrids() && _snapmanager->snapprefs.getSnapModeBBoxOrNodes(); + return _snap_enabled && _snapmanager->snapprefs.getSnapToGrids() && _snapmanager->snapprefs.getSnapModeAny(); } diff --git a/src/display/canvas-grid.cpp b/src/display/canvas-grid.cpp index 9a12a1d90..2a9e50e3d 100644 --- a/src/display/canvas-grid.cpp +++ b/src/display/canvas-grid.cpp @@ -1072,7 +1072,7 @@ void CanvasXYGridSnapper::_addSnappedPoint(SnappedConstraints &sc, Geom::Point c */ bool CanvasXYGridSnapper::ThisSnapperMightSnap() const { - return _snap_enabled && _snapmanager->snapprefs.getSnapToGrids() && _snapmanager->snapprefs.getSnapModeBBoxOrNodes(); + return _snap_enabled && _snapmanager->snapprefs.getSnapToGrids() && _snapmanager->snapprefs.getSnapModeAny(); } } // namespace Inkscape diff --git a/src/display/snap-indicator.cpp b/src/display/snap-indicator.cpp index c3198cd37..ec4b7e28f 100644 --- a/src/display/snap-indicator.cpp +++ b/src/display/snap-indicator.cpp @@ -138,9 +138,6 @@ SnapIndicator::set_new_snaptarget(Inkscape::SnappedPoint const &p, bool pre_snap case SNAPTARGET_ELLIPSE_QUADRANT_POINT: target_name = _("quadrant point"); break; - case SNAPTARGET_CENTER: - target_name = _("center"); - break; case SNAPTARGET_CORNER: target_name = _("corner"); break; @@ -206,9 +203,6 @@ SnapIndicator::set_new_snaptarget(Inkscape::SnappedPoint const &p, bool pre_snap case SNAPSOURCE_ELLIPSE_QUADRANT_POINT: source_name = _("Quadrant point"); break; - case SNAPSOURCE_CENTER: - source_name = _("Center"); - break; case SNAPSOURCE_CORNER: source_name = _("Corner"); break; diff --git a/src/gradient-context.cpp b/src/gradient-context.cpp index a237bb3c6..33b82b9f4 100644 --- a/src/gradient-context.cpp +++ b/src/gradient-context.cpp @@ -602,7 +602,7 @@ sp_gradient_context_root_handler(SPEventContext *event_context, GdkEvent *event) Geom::Point const motion_w(event->motion.x, event->motion.y); Geom::Point const motion_dt = event_context->desktop->w2d(motion_w); - m.preSnap(Inkscape::SnapCandidatePoint(motion_dt, Inkscape::SNAPSOURCE_NODE_HANDLE)); + m.preSnap(Inkscape::SnapCandidatePoint(motion_dt, Inkscape::SNAPSOURCE_OTHER_HANDLE)); m.unSetup(); } diff --git a/src/object-snapper.cpp b/src/object-snapper.cpp index 682c26869..3088accd2 100644 --- a/src/object-snapper.cpp +++ b/src/object-snapper.cpp @@ -181,7 +181,7 @@ void Inkscape::ObjectSnapper::_collectNodes(Inkscape::SnapSourceType const &t, bool p_is_a_node = t & Inkscape::SNAPSOURCE_NODE_CATEGORY; bool p_is_a_bbox = t & Inkscape::SNAPSOURCE_BBOX_CATEGORY; - bool p_is_other = t & Inkscape::SNAPSOURCE_OTHER_CATEGORY; + bool p_is_other = t & Inkscape::SNAPSOURCE_OTHERS_CATEGORY; // A point considered for snapping should be either a node, a bbox corner or a guide. Pick only ONE! g_assert(!((p_is_a_node && p_is_a_bbox) || (p_is_a_bbox && p_is_other) || (p_is_a_node && p_is_other))); @@ -359,7 +359,7 @@ void Inkscape::ObjectSnapper::_collectPaths(Geom::Point /*p*/, SPItem::BBoxType bbox_type = SPItem::GEOMETRIC_BBOX; bool p_is_a_node = source_type & Inkscape::SNAPSOURCE_NODE_CATEGORY; - bool p_is_other = source_type & Inkscape::SNAPSOURCE_OTHER_CATEGORY; + bool p_is_other = source_type & Inkscape::SNAPSOURCE_OTHERS_CATEGORY; if (_snapmanager->snapprefs.getSnapToBBoxPath()) { Inkscape::Preferences *prefs = Inkscape::Preferences::get(); @@ -369,7 +369,7 @@ void Inkscape::ObjectSnapper::_collectPaths(Geom::Point /*p*/, } // Consider the page border for snapping - if (_snapmanager->snapprefs.getSnapToPageBorder() && _snapmanager->snapprefs.getSnapModeBBoxOrNodes()) { + if (_snapmanager->snapprefs.getSnapToPageBorder() && _snapmanager->snapprefs.getSnapModeAny()) { Geom::PathVector *border_path = _getBorderPathv(); if (border_path != NULL) { _paths_to_snap_to->push_back(Inkscape::SnapCandidatePath(border_path, SNAPTARGET_PAGE_BORDER, Geom::OptRect())); @@ -394,7 +394,7 @@ void Inkscape::ObjectSnapper::_collectPaths(Geom::Point /*p*/, //Build a list of all paths considered for snapping to //Add the item's path to snap to - if (_snapmanager->snapprefs.getSnapToItemPath() && _snapmanager->snapprefs.getSnapModeNode()) { + if (_snapmanager->snapprefs.getSnapToItemPath() && (_snapmanager->snapprefs.getSnapModeNode() || _snapmanager->snapprefs.getSnapModeOthers())) { if (p_is_other || !(_snapmanager->snapprefs.getStrictSnapping() && !p_is_a_node)) { // Snapping to the path of characters is very cool, but for a large // chunk of text this will take ages! So limit snapping to text paths @@ -438,7 +438,7 @@ void Inkscape::ObjectSnapper::_collectPaths(Geom::Point /*p*/, } //Add the item's bounding box to snap to - if (_snapmanager->snapprefs.getSnapToBBoxPath() && _snapmanager->snapprefs.getSnapModeBBox()) { + if (_snapmanager->snapprefs.getSnapToBBoxPath() && (_snapmanager->snapprefs.getSnapModeBBox() || _snapmanager->snapprefs.getSnapModeOthers())) { if (p_is_other || !(_snapmanager->snapprefs.getStrictSnapping() && p_is_a_node)) { // Discard the bbox of a clipped path / mask, because we don't want to snap to both the bbox // of the item AND the bbox of the clipping path at the same time @@ -572,7 +572,6 @@ void Inkscape::ObjectSnapper::_snapPathsConstrained(SnappedConstraints &sc, // Now we can finally do the real snapping, using the paths collected above g_assert(_snapmanager->getDesktop() != NULL); - Geom::Point const p_doc = _snapmanager->getDesktop()->dt2doc(p_proj_on_constraint); Geom::Point direction_vector = c.getDirection(); if (!is_zero(direction_vector)) { @@ -674,16 +673,16 @@ void Inkscape::ObjectSnapper::freeSnap(SnappedConstraints &sc, bool snap_nodes = (_snapmanager->snapprefs.getSnapModeNode() && ( _snapmanager->snapprefs.getSnapToItemNode() || _snapmanager->snapprefs.getSnapSmoothNodes() || - _snapmanager->snapprefs.getSnapLineMidpoints() || - _snapmanager->snapprefs.getSnapObjectMidpoints() + _snapmanager->snapprefs.getSnapLineMidpoints() )) || (_snapmanager->snapprefs.getSnapModeBBox() && ( _snapmanager->snapprefs.getSnapToBBoxNode() || _snapmanager->snapprefs.getSnapBBoxEdgeMidpoints() || _snapmanager->snapprefs.getSnapBBoxMidpoints() - )) || (_snapmanager->snapprefs.getSnapModeBBoxOrNodes() && ( + )) || (_snapmanager->snapprefs.getSnapModeAny() && ( _snapmanager->snapprefs.getIncludeItemCenter() || - _snapmanager->snapprefs.getSnapToPageBorder() - )); + _snapmanager->snapprefs.getSnapToPageBorder() || + _snapmanager->snapprefs.getSnapObjectMidpoints() + )) ; if (snap_nodes) { _snapNodes(sc, p, unselected_nodes); @@ -691,7 +690,7 @@ void Inkscape::ObjectSnapper::freeSnap(SnappedConstraints &sc, if ((_snapmanager->snapprefs.getSnapModeNode() && _snapmanager->snapprefs.getSnapToItemPath()) || (_snapmanager->snapprefs.getSnapModeBBox() && _snapmanager->snapprefs.getSnapToBBoxPath()) || - (_snapmanager->snapprefs.getSnapModeBBoxOrNodes() && _snapmanager->snapprefs.getSnapToPageBorder())) { + (_snapmanager->snapprefs.getSnapModeAny() && _snapmanager->snapprefs.getSnapToPageBorder())) { unsigned n = (unselected_nodes == NULL) ? 0 : unselected_nodes->size(); if (n > 0) { /* While editing a path in the node tool, findCandidates must ignore that path because @@ -741,14 +740,14 @@ void Inkscape::ObjectSnapper::constrainedSnap( SnappedConstraints &sc, bool snap_nodes = (_snapmanager->snapprefs.getSnapModeNode() && ( _snapmanager->snapprefs.getSnapToItemNode() || _snapmanager->snapprefs.getSnapSmoothNodes() || - _snapmanager->snapprefs.getSnapLineMidpoints() || - _snapmanager->snapprefs.getSnapObjectMidpoints() + _snapmanager->snapprefs.getSnapLineMidpoints() )) || (_snapmanager->snapprefs.getSnapModeBBox() && ( _snapmanager->snapprefs.getSnapToBBoxNode() || _snapmanager->snapprefs.getSnapBBoxEdgeMidpoints() || _snapmanager->snapprefs.getSnapBBoxMidpoints() - )) || (_snapmanager->snapprefs.getSnapModeBBoxOrNodes() && ( + )) || (_snapmanager->snapprefs.getSnapModeAny() && ( _snapmanager->snapprefs.getIncludeItemCenter() || + _snapmanager->snapprefs.getSnapObjectMidpoints() || _snapmanager->snapprefs.getSnapToPageBorder() )); @@ -800,16 +799,16 @@ bool Inkscape::ObjectSnapper::ThisSnapperMightSnap() const _snapmanager->snapprefs.getSnapToItemPath() || _snapmanager->snapprefs.getSnapToItemNode() || _snapmanager->snapprefs.getSnapSmoothNodes() || - _snapmanager->snapprefs.getSnapLineMidpoints() || - _snapmanager->snapprefs.getSnapObjectMidpoints() + _snapmanager->snapprefs.getSnapLineMidpoints() )) || (_snapmanager->snapprefs.getSnapModeBBox() && ( _snapmanager->snapprefs.getSnapToBBoxPath() || _snapmanager->snapprefs.getSnapToBBoxNode() || _snapmanager->snapprefs.getSnapBBoxEdgeMidpoints() || _snapmanager->snapprefs.getSnapBBoxMidpoints() - )) || (_snapmanager->snapprefs.getSnapModeBBoxOrNodes() && ( + )) || (_snapmanager->snapprefs.getSnapModeAny() && ( _snapmanager->snapprefs.getSnapToPageBorder() || - _snapmanager->snapprefs.getIncludeItemCenter() + _snapmanager->snapprefs.getIncludeItemCenter() || + _snapmanager->snapprefs.getSnapObjectMidpoints() )); return (_snap_enabled && snap_to_something); diff --git a/src/seltrans.cpp b/src/seltrans.cpp index bb333caca..f95a204a9 100644 --- a/src/seltrans.cpp +++ b/src/seltrans.cpp @@ -359,7 +359,7 @@ void Inkscape::SelTrans::grab(Geom::Point const &p, gdouble x, gdouble y, bool s // points immediately. if (prefs->getBool("/options/snapclosestonly/value", false)) { - if (m.snapprefs.getSnapModeNode()) { + if (m.snapprefs.getSnapModeNode() || m.snapprefs.getSnapModeOthers()) { m.keepClosestPointOnly(_snap_points, p); } else { _snap_points.clear(); // don't keep any point diff --git a/src/snap-enums.h b/src/snap-enums.h index aa5db9328..8988589a1 100644 --- a/src/snap-enums.h +++ b/src/snap-enums.h @@ -39,7 +39,6 @@ enum SnapTargetType { SNAPTARGET_PAGE_CORNER, SNAPTARGET_CONVEX_HULL_CORNER, SNAPTARGET_ELLIPSE_QUADRANT_POINT, - SNAPTARGET_CENTER, // of ellipse SNAPTARGET_CORNER, // of image or of rectangle SNAPTARGET_TEXT_BASELINE, SNAPTARGET_CONSTRAINED_ANGLE, @@ -66,16 +65,15 @@ enum SnapSourceType { SNAPSOURCE_CONVEX_HULL_CORNER, SNAPSOURCE_ELLIPSE_QUADRANT_POINT, SNAPSOURCE_NODE_HANDLE, // eg. nodes in the path editor, handles of stars or rectangles, etc. (tied to a stroke) - SNAPSOURCE_OBJECT_MIDPOINT, // midpoint of rectangles, polygon, etc. //------------------------------------------------------------------- // Other points (e.g. guides, gradient knots) will snap to both bounding boxes and nodes - SNAPSOURCE_OTHER_CATEGORY = 1024, // will be used as a flag and must therefore be a power of two + SNAPSOURCE_OTHERS_CATEGORY = 1024, // will be used as a flag and must therefore be a power of two SNAPSOURCE_ROTATION_CENTER, - SNAPSOURCE_CENTER, // of ellipse + SNAPSOURCE_OBJECT_MIDPOINT, // midpoint of rectangles, ellipses, polygon, etc. SNAPSOURCE_GUIDE, SNAPSOURCE_GUIDE_ORIGIN, SNAPSOURCE_TEXT_BASELINE, - SNAPSOURCE_OTHER_HANDLE, // eg. the handle of a gradient of a connector (ie not being tied to a stroke) + SNAPSOURCE_OTHER_HANDLE, // eg. the handle of a gradient or of a connector (ie not being tied to a stroke) SNAPSOURCE_GRID_PITCH, // eg. when pasting or alt-dragging in the selector tool; not realy a snap source }; diff --git a/src/snap-preferences.cpp b/src/snap-preferences.cpp index 15c976466..816320145 100644 --- a/src/snap-preferences.cpp +++ b/src/snap-preferences.cpp @@ -27,7 +27,7 @@ Inkscape::SnapPreferences::SnapPreferences() : _snap_to_page_border(false), _strict_snapping(true) { - setSnapFrom(SnapSourceType(SNAPSOURCE_BBOX_CATEGORY | SNAPSOURCE_NODE_CATEGORY | SNAPSOURCE_OTHER_CATEGORY), true); //Snap any point. In v0.45 and earlier, this was controlled in the preferences tab + setSnapFrom(SnapSourceType(SNAPSOURCE_BBOX_CATEGORY | SNAPSOURCE_NODE_CATEGORY | SNAPSOURCE_OTHERS_CATEGORY), true); //Snap any point. In v0.45 and earlier, this was controlled in the preferences tab } /* @@ -68,11 +68,26 @@ bool Inkscape::SnapPreferences::getSnapModeNode() const return (_snap_from & Inkscape::SNAPSOURCE_NODE_CATEGORY); } -bool Inkscape::SnapPreferences::getSnapModeBBoxOrNodes() const +void Inkscape::SnapPreferences::setSnapModeOthers(bool enabled) { - return (_snap_from & (Inkscape::SNAPSOURCE_BBOX_CATEGORY | Inkscape::SNAPSOURCE_NODE_CATEGORY) ); + if (enabled) { + _snap_from = SnapSourceType(_snap_from | Inkscape::SNAPSOURCE_OTHERS_CATEGORY); + } else { + _snap_from = SnapSourceType(_snap_from & ~Inkscape::SNAPSOURCE_OTHERS_CATEGORY); + } +} + +bool Inkscape::SnapPreferences::getSnapModeOthers() const +{ + return (_snap_from & Inkscape::SNAPSOURCE_OTHERS_CATEGORY); } + +//bool Inkscape::SnapPreferences::getSnapModeBBoxOrNodes() const +//{ +// return (_snap_from & (Inkscape::SNAPSOURCE_BBOX_CATEGORY | Inkscape::SNAPSOURCE_NODE_CATEGORY) ); +//} + bool Inkscape::SnapPreferences::getSnapModeAny() const { return (_snap_from != 0); @@ -81,15 +96,15 @@ bool Inkscape::SnapPreferences::getSnapModeAny() const void Inkscape::SnapPreferences::setSnapModeGuide(bool enabled) { if (enabled) { - _snap_from = SnapSourceType(_snap_from | Inkscape::SNAPSOURCE_OTHER_CATEGORY); + _snap_from = SnapSourceType(_snap_from | Inkscape::SNAPSOURCE_OTHERS_CATEGORY); } else { - _snap_from = SnapSourceType(_snap_from & ~Inkscape::SNAPSOURCE_OTHER_CATEGORY); + _snap_from = SnapSourceType(_snap_from & ~Inkscape::SNAPSOURCE_OTHERS_CATEGORY); } } bool Inkscape::SnapPreferences::getSnapModeGuide() const { - return (_snap_from & Inkscape::SNAPSOURCE_OTHER_CATEGORY); + return (_snap_from & Inkscape::SNAPSOURCE_OTHERS_CATEGORY); } /** diff --git a/src/snap-preferences.h b/src/snap-preferences.h index cc8f24503..4f3ad6ce6 100644 --- a/src/snap-preferences.h +++ b/src/snap-preferences.h @@ -26,10 +26,12 @@ public: void setSnapModeBBox(bool enabled); void setSnapModeNode(bool enabled); + void setSnapModeOthers(bool enabled); void setSnapModeGuide(bool enabled); bool getSnapModeBBox() const; bool getSnapModeNode() const; - bool getSnapModeBBoxOrNodes() const; + bool getSnapModeOthers() const; + //bool getSnapModeBBoxOrNodes() const; bool getSnapModeAny() const; bool getSnapModeGuide() const; diff --git a/src/snap.cpp b/src/snap.cpp index f8fe8e3fa..bf1613d2c 100644 --- a/src/snap.cpp +++ b/src/snap.cpp @@ -916,7 +916,7 @@ Inkscape::SnappedPoint SnapManager::_snapTransformed( // We might still need to apply a constraint though, if we tried a constrained snap. And // in case of a free snap we might have use for the transformed point, so let's return that // point, whether it's constrained or not - if (best_snapped_point.isOtherSnapBetter(snapped_point, true)) { + if (best_snapped_point.isOtherSnapBetter(snapped_point, true) || points.size() == 1) { // .. so we must keep track of the best non-snapped constrained point best_transformation = result; best_snapped_point = snapped_point; @@ -1440,7 +1440,7 @@ void SnapManager::_displaySnapsource(Inkscape::SnapCandidatePoint const &p) cons if (prefs->getBool("/options/snapclosestonly/value")) { bool p_is_a_node = p.getSourceType() & Inkscape::SNAPSOURCE_NODE_CATEGORY; bool p_is_a_bbox = p.getSourceType() & Inkscape::SNAPSOURCE_BBOX_CATEGORY; - bool p_is_other = p.getSourceType() & Inkscape::SNAPSOURCE_OTHER_CATEGORY; + bool p_is_other = p.getSourceType() & Inkscape::SNAPSOURCE_OTHERS_CATEGORY; g_assert(_desktop != NULL); if (snapprefs.getSnapEnabledGlobally() && (p_is_other || (p_is_a_node && snapprefs.getSnapModeNode()) || (p_is_a_bbox && snapprefs.getSnapModeBBox()))) { diff --git a/src/sp-ellipse.cpp b/src/sp-ellipse.cpp index cf5927fc8..7ebedb816 100644 --- a/src/sp-ellipse.cpp +++ b/src/sp-ellipse.cpp @@ -276,7 +276,7 @@ static void sp_genericellipse_snappoints(SPItem const *item, std::vector<Inkscap g_assert(SP_IS_GENERICELLIPSE(item)); // Help enforcing strict snapping, i.e. only return nodes when we're snapping nodes to nodes or a guide to nodes - if (!(snapprefs->getSnapModeNode() || snapprefs->getSnapModeGuide())) { + if (!(snapprefs->getSnapModeNode() || snapprefs->getSnapModeGuide() || snapprefs->getSnapModeOthers())) { return; } @@ -317,7 +317,7 @@ static void sp_genericellipse_snappoints(SPItem const *item, std::vector<Inkscap // Add the centre, if we have a closed slice or when explicitly asked for if ((snapprefs->getSnapToItemNode() && slice && ellipse->closed) || snapprefs->getSnapObjectMidpoints()) { pt = Geom::Point(cx, cy) * i2d; - p.push_back(Inkscape::SnapCandidatePoint(pt, Inkscape::SNAPSOURCE_CENTER, Inkscape::SNAPTARGET_CENTER)); + p.push_back(Inkscape::SnapCandidatePoint(pt, Inkscape::SNAPSOURCE_OBJECT_MIDPOINT, Inkscape::SNAPTARGET_OBJECT_MIDPOINT)); } // And if we have a slice, also snap to the endpoints diff --git a/src/sp-namedview.cpp b/src/sp-namedview.cpp index 1feb644ad..515658d0b 100644 --- a/src/sp-namedview.cpp +++ b/src/sp-namedview.cpp @@ -251,6 +251,7 @@ static void sp_namedview_build(SPObject *object, SPDocument *document, Inkscape: object->readAttr( "inkscape:snap-global" ); object->readAttr( "inkscape:snap-bbox" ); object->readAttr( "inkscape:snap-nodes" ); + object->readAttr( "inkscape:snap-others" ); object->readAttr( "inkscape:snap-from-guide" ); object->readAttr( "inkscape:snap-center" ); object->readAttr( "inkscape:snap-smooth-nodes" ); @@ -308,8 +309,6 @@ static void sp_namedview_release(SPObject *object) static void sp_namedview_set(SPObject *object, unsigned int key, const gchar *value) { SPNamedView *nv = SP_NAMEDVIEW(object); - // TODO investigate why we grab this and then never use it - SPUnit const &px = sp_unit_get_by_id(SP_UNIT_PX); switch (key) { case SP_ATTR_VIEWONLY: @@ -334,17 +333,17 @@ static void sp_namedview_set(SPObject *object, unsigned int key, const gchar *va object->requestModified(SP_OBJECT_MODIFIED_FLAG); break; case SP_ATTR_GRIDTOLERANCE: - nv->snap_manager.snapprefs.setGridTolerance(value ? g_ascii_strtod(value, NULL) : 10000); - object->requestModified(SP_OBJECT_MODIFIED_FLAG); - break; + nv->snap_manager.snapprefs.setGridTolerance(value ? g_ascii_strtod(value, NULL) : 10000); + object->requestModified(SP_OBJECT_MODIFIED_FLAG); + break; case SP_ATTR_GUIDETOLERANCE: - nv->snap_manager.snapprefs.setGuideTolerance(value ? g_ascii_strtod(value, NULL) : 20); - object->requestModified(SP_OBJECT_MODIFIED_FLAG); - break; + nv->snap_manager.snapprefs.setGuideTolerance(value ? g_ascii_strtod(value, NULL) : 20); + object->requestModified(SP_OBJECT_MODIFIED_FLAG); + break; case SP_ATTR_OBJECTTOLERANCE: - nv->snap_manager.snapprefs.setObjectTolerance(value ? g_ascii_strtod(value, NULL) : 20); - object->requestModified(SP_OBJECT_MODIFIED_FLAG); - break; + nv->snap_manager.snapprefs.setObjectTolerance(value ? g_ascii_strtod(value, NULL) : 20); + object->requestModified(SP_OBJECT_MODIFIED_FLAG); + break; case SP_ATTR_GUIDECOLOR: nv->guidecolor = (nv->guidecolor & 0xff) | (DEFAULTGUIDECOLOR & 0xffffff00); if (value) { @@ -451,9 +450,9 @@ static void sp_namedview_set(SPObject *object, unsigned int key, const gchar *va object->requestModified(SP_OBJECT_MODIFIED_FLAG); break; case SP_ATTR_INKSCAPE_WINDOW_MAXIMIZED: - nv->window_maximized = value ? atoi(value) : 0; - object->requestModified(SP_OBJECT_MODIFIED_FLAG); - break; + nv->window_maximized = value ? atoi(value) : 0; + object->requestModified(SP_OBJECT_MODIFIED_FLAG); + break; case SP_ATTR_INKSCAPE_SNAP_GLOBAL: nv->snap_manager.snapprefs.setSnapEnabledGlobally(value ? sp_str_to_bool(value) : TRUE); object->requestModified(SP_OBJECT_MODIFIED_FLAG); @@ -466,18 +465,22 @@ static void sp_namedview_set(SPObject *object, unsigned int key, const gchar *va nv->snap_manager.snapprefs.setSnapModeNode(value ? sp_str_to_bool(value) : TRUE); object->requestModified(SP_OBJECT_MODIFIED_FLAG); break; + case SP_ATTR_INKSCAPE_SNAP_OTHERS: + nv->snap_manager.snapprefs.setSnapModeOthers(value ? sp_str_to_bool(value) : TRUE); + object->requestModified(SP_OBJECT_MODIFIED_FLAG); + break; case SP_ATTR_INKSCAPE_SNAP_CENTER: nv->snap_manager.snapprefs.setIncludeItemCenter(value ? sp_str_to_bool(value) : FALSE); object->requestModified(SP_OBJECT_MODIFIED_FLAG); break; case SP_ATTR_INKSCAPE_SNAP_GRIDS: - nv->snap_manager.snapprefs.setSnapToGrids(value ? sp_str_to_bool(value) : TRUE); - object->requestModified(SP_OBJECT_MODIFIED_FLAG); - break; + nv->snap_manager.snapprefs.setSnapToGrids(value ? sp_str_to_bool(value) : TRUE); + object->requestModified(SP_OBJECT_MODIFIED_FLAG); + break; case SP_ATTR_INKSCAPE_SNAP_TO_GUIDES: - nv->snap_manager.snapprefs.setSnapToGuides(value ? sp_str_to_bool(value) : TRUE); - object->requestModified(SP_OBJECT_MODIFIED_FLAG); - break; + nv->snap_manager.snapprefs.setSnapToGuides(value ? sp_str_to_bool(value) : TRUE); + object->requestModified(SP_OBJECT_MODIFIED_FLAG); + break; case SP_ATTR_INKSCAPE_SNAP_SMOOTH_NODES: nv->snap_manager.snapprefs.setSnapSmoothNodes(value ? sp_str_to_bool(value) : FALSE); object->requestModified(SP_OBJECT_MODIFIED_FLAG); @@ -487,17 +490,17 @@ static void sp_namedview_set(SPObject *object, unsigned int key, const gchar *va object->requestModified(SP_OBJECT_MODIFIED_FLAG); break; case SP_ATTR_INKSCAPE_SNAP_OBJECT_MIDPOINTS: - nv->snap_manager.snapprefs.setSnapObjectMidpoints(value ? sp_str_to_bool(value) : FALSE); - object->requestModified(SP_OBJECT_MODIFIED_FLAG); - break; + nv->snap_manager.snapprefs.setSnapObjectMidpoints(value ? sp_str_to_bool(value) : FALSE); + object->requestModified(SP_OBJECT_MODIFIED_FLAG); + break; case SP_ATTR_INKSCAPE_SNAP_BBOX_EDGE_MIDPOINTS: - nv->snap_manager.snapprefs.setSnapBBoxEdgeMidpoints(value ? sp_str_to_bool(value) : FALSE); - object->requestModified(SP_OBJECT_MODIFIED_FLAG); - break; + nv->snap_manager.snapprefs.setSnapBBoxEdgeMidpoints(value ? sp_str_to_bool(value) : FALSE); + object->requestModified(SP_OBJECT_MODIFIED_FLAG); + break; case SP_ATTR_INKSCAPE_SNAP_BBOX_MIDPOINTS: - nv->snap_manager.snapprefs.setSnapBBoxMidpoints(value ? sp_str_to_bool(value) : FALSE); - object->requestModified(SP_OBJECT_MODIFIED_FLAG); - break; + nv->snap_manager.snapprefs.setSnapBBoxMidpoints(value ? sp_str_to_bool(value) : FALSE); + object->requestModified(SP_OBJECT_MODIFIED_FLAG); + break; case SP_ATTR_INKSCAPE_SNAP_FROM_GUIDE: nv->snap_manager.snapprefs.setSnapModeGuide(value ? sp_str_to_bool(value) : TRUE); object->requestModified(SP_OBJECT_MODIFIED_FLAG); diff --git a/src/sp-rect.cpp b/src/sp-rect.cpp index 94a453ae6..db5a62f8f 100644 --- a/src/sp-rect.cpp +++ b/src/sp-rect.cpp @@ -567,7 +567,7 @@ static void sp_rect_snappoints(SPItem const *item, std::vector<Inkscape::SnapCan g_assert(SP_IS_RECT(item)); // Help enforcing strict snapping, i.e. only return nodes when we're snapping nodes to nodes or a guide to nodes - if (!(snapprefs->getSnapModeNode() || snapprefs->getSnapModeGuide())) { + if (!(snapprefs->getSnapModeNode() || snapprefs->getSnapModeGuide() || snapprefs->getSnapModeOthers())) { return; } diff --git a/src/sp-shape.cpp b/src/sp-shape.cpp index ea79b6cee..24b6b8025 100644 --- a/src/sp-shape.cpp +++ b/src/sp-shape.cpp @@ -1190,7 +1190,7 @@ void SPShape::sp_shape_snappoints(SPItem const *item, std::vector<Inkscape::Snap } // Help enforcing strict snapping, i.e. only return nodes when we're snapping nodes to nodes or a guide to nodes - if (!(snapprefs->getSnapModeNode() || snapprefs->getSnapModeGuide())) { + if (!(snapprefs->getSnapModeNode() || snapprefs->getSnapModeGuide() || snapprefs->getSnapModeOthers())) { return; } diff --git a/src/sp-spiral.cpp b/src/sp-spiral.cpp index 05c6bc9cd..a772e057d 100644 --- a/src/sp-spiral.cpp +++ b/src/sp-spiral.cpp @@ -529,7 +529,7 @@ static void sp_spiral_snappoints(SPItem const *item, std::vector<Inkscape::SnapC } // Help enforcing strict snapping, i.e. only return nodes when we're snapping nodes to nodes or a guide to nodes - if (!(snapprefs->getSnapModeNode() || snapprefs->getSnapModeGuide())) { + if (!(snapprefs->getSnapModeNode() || snapprefs->getSnapModeGuide() || snapprefs->getSnapModeOthers())) { return; } diff --git a/src/sp-star.cpp b/src/sp-star.cpp index 39efe2537..17ddf7279 100644 --- a/src/sp-star.cpp +++ b/src/sp-star.cpp @@ -557,7 +557,7 @@ static void sp_star_snappoints(SPItem const *item, std::vector<Inkscape::SnapCan } // Help enforcing strict snapping, i.e. only return nodes when we're snapping nodes to nodes or a guide to nodes - if (!(snapprefs->getSnapModeNode() || snapprefs->getSnapModeGuide())) { + if (!(snapprefs->getSnapModeNode() || snapprefs->getSnapModeGuide() || snapprefs->getSnapModeOthers())) { return; } diff --git a/src/text-context.cpp b/src/text-context.cpp index b709d4d24..3ef346ebe 100644 --- a/src/text-context.cpp +++ b/src/text-context.cpp @@ -675,7 +675,7 @@ sp_text_context_root_handler(SPEventContext *const event_context, GdkEvent *cons Geom::Point const motion_w(event->motion.x, event->motion.y); Geom::Point motion_dt(desktop->w2d(motion_w)); - m.preSnap(Inkscape::SnapCandidatePoint(motion_dt, Inkscape::SNAPSOURCE_NODE_HANDLE)); + m.preSnap(Inkscape::SnapCandidatePoint(motion_dt, Inkscape::SNAPSOURCE_OTHER_HANDLE)); m.unSetup(); } break; diff --git a/src/ui/icon-names.h b/src/ui/icon-names.h index f7c16b0ed..cf459b563 100644 --- a/src/ui/icon-names.h +++ b/src/ui/icon-names.h @@ -458,6 +458,8 @@ "snap-nodes" #define INKSCAPE_ICON_SNAP_NODES_CENTER \ "snap-nodes-center" +#define INKSCAPE_ICON_SNAP_OTHERS \ + "snap-nodes-others" #define INKSCAPE_ICON_SNAP_NODES_CUSP \ "snap-nodes-cusp" #define INKSCAPE_ICON_SNAP_NODES_INTERSECTION \ diff --git a/src/widgets/toolbox.cpp b/src/widgets/toolbox.cpp index bfdd4a916..7789484fd 100644 --- a/src/widgets/toolbox.cpp +++ b/src/widgets/toolbox.cpp @@ -2176,6 +2176,10 @@ static void toggle_snap_callback(GtkToggleAction *act, gpointer data) //data poi v = nv->snap_manager.snapprefs.getSnapIntersectionCS(); sp_repr_set_boolean(repr, "inkscape:snap-intersection-paths", !v); break; + case SP_ATTR_INKSCAPE_SNAP_OTHERS: + v = nv->snap_manager.snapprefs.getSnapModeOthers(); + sp_repr_set_boolean(repr, "inkscape:snap-others", !v); + break; case SP_ATTR_INKSCAPE_SNAP_CENTER: v = nv->snap_manager.snapprefs.getIncludeItemCenter(); sp_repr_set_boolean(repr, "inkscape:snap-center", !v); @@ -2244,6 +2248,8 @@ void setup_snap_toolbox(GtkWidget *toolbox, SPDesktop *desktop) " <toolitem action='ToggleSnapToItemNode' />" " <toolitem action='ToggleSnapToSmoothNodes' />" " <toolitem action='ToggleSnapToFromLineMidpoints' />" + " <separator />" + " <toolitem action='ToggleSnapFromOthers' />" " <toolitem action='ToggleSnapToFromObjectCenters' />" " <toolitem action='ToggleSnapToFromRotationCenter' />" " <separator />" @@ -2370,6 +2376,14 @@ void setup_snap_toolbox(GtkWidget *toolbox, SPDesktop *desktop) } { + InkToggleAction* act = ink_toggle_action_new("ToggleSnapFromOthers", + _("Others"), _("Snap other points (centers, guide origins, gradient handles, etc.)"), INKSCAPE_ICON_SNAP_OTHERS, secondarySize, SP_ATTR_INKSCAPE_SNAP_OTHERS); + + gtk_action_group_add_action( mainActions->gobj(), GTK_ACTION( act ) ); + g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(toggle_snap_callback), toolbox ); + } + + { InkToggleAction* act = ink_toggle_action_new("ToggleSnapToFromObjectCenters", _("Object Centers"), _("Snap from and to centers of objects"), INKSCAPE_ICON_SNAP_NODES_CENTER, secondarySize, SP_ATTR_INKSCAPE_SNAP_OBJECT_MIDPOINTS); @@ -2476,7 +2490,8 @@ void ToolboxFactory::updateSnapToolbox(SPDesktop *desktop, SPEventContext * /*ev Glib::RefPtr<Gtk::Action> act7 = mainActions->get_action("ToggleSnapToItemNode"); Glib::RefPtr<Gtk::Action> act8 = mainActions->get_action("ToggleSnapToSmoothNodes"); Glib::RefPtr<Gtk::Action> act9 = mainActions->get_action("ToggleSnapToFromLineMidpoints"); - Glib::RefPtr<Gtk::Action> act10 = mainActions->get_action("ToggleSnapToFromObjectCenters"); + Glib::RefPtr<Gtk::Action> act10 = mainActions->get_action("ToggleSnapFromOthers"); + Glib::RefPtr<Gtk::Action> act10b = mainActions->get_action("ToggleSnapToFromObjectCenters"); Glib::RefPtr<Gtk::Action> act11 = mainActions->get_action("ToggleSnapToFromRotationCenter"); Glib::RefPtr<Gtk::Action> act12 = mainActions->get_action("ToggleSnapToPageBorder"); //Glib::RefPtr<Gtk::Action> act13 = mainActions->get_action("ToggleSnapToGridGuideIntersections"); @@ -2524,10 +2539,14 @@ void ToolboxFactory::updateSnapToolbox(SPDesktop *desktop, SPEventContext * /*ev gtk_action_set_sensitive(GTK_ACTION(act8->gobj()), c1 && c3); gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(act9->gobj()), nv->snap_manager.snapprefs.getSnapLineMidpoints()); gtk_action_set_sensitive(GTK_ACTION(act9->gobj()), c1 && c3); - gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(act10->gobj()), nv->snap_manager.snapprefs.getSnapObjectMidpoints()); - gtk_action_set_sensitive(GTK_ACTION(act10->gobj()), c1 && c3); + + bool const c5 = nv->snap_manager.snapprefs.getSnapModeOthers(); + gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(act10->gobj()), c5); + gtk_action_set_sensitive(GTK_ACTION(act10->gobj()), c1); + gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(act10b->gobj()), nv->snap_manager.snapprefs.getSnapObjectMidpoints()); + gtk_action_set_sensitive(GTK_ACTION(act10b->gobj()), c1 && c5); gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(act11->gobj()), nv->snap_manager.snapprefs.getIncludeItemCenter()); - gtk_action_set_sensitive(GTK_ACTION(act11->gobj()), c1 && c3); + gtk_action_set_sensitive(GTK_ACTION(act11->gobj()), c1 && c5); gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(act12->gobj()), nv->snap_manager.snapprefs.getSnapToPageBorder()); gtk_action_set_sensitive(GTK_ACTION(act12->gobj()), c1); |
