summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDiederik van Lierop <mail@diedenrezi.nl>2011-06-26 20:00:36 +0000
committerDiederik van Lierop <mail@diedenrezi.nl>2011-06-26 20:00:36 +0000
commitbdf703831ff93438d49324ab842052ccaf390a5d (patch)
treef98f378da026d6c5699b0565e2735c02f4f1620c /src
parentDocumentation. Tutorials translation update. (diff)
downloadinkscape-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.h1
-rw-r--r--src/attributes.cpp2
-rw-r--r--src/attributes.h1
-rw-r--r--src/display/canvas-axonomgrid.cpp2
-rw-r--r--src/display/canvas-grid.cpp2
-rw-r--r--src/display/snap-indicator.cpp6
-rw-r--r--src/gradient-context.cpp2
-rw-r--r--src/object-snapper.cpp37
-rw-r--r--src/seltrans.cpp2
-rw-r--r--src/snap-enums.h8
-rw-r--r--src/snap-preferences.cpp27
-rw-r--r--src/snap-preferences.h4
-rw-r--r--src/snap.cpp4
-rw-r--r--src/sp-ellipse.cpp4
-rw-r--r--src/sp-namedview.cpp61
-rw-r--r--src/sp-rect.cpp2
-rw-r--r--src/sp-shape.cpp2
-rw-r--r--src/sp-spiral.cpp2
-rw-r--r--src/sp-star.cpp2
-rw-r--r--src/text-context.cpp2
-rw-r--r--src/ui/icon-names.h2
-rw-r--r--src/widgets/toolbox.cpp27
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);