Code

Extensions. Barcode extension refactoring (see https://code.launchpad.net/~doctormo...
[inkscape.git] / src / guide-snapper.cpp
index 1e4eb02d835e49541de517e29900d7198587f292..4f70521e0904a5fd9a4f9e3ee823be462d17266b 100644 (file)
  * Released under GNU GPL, read the file 'COPYING' for more information
  */
 
-#include "libnr/nr-values.h"
-#include "libnr/nr-point-fns.h"
 #include "sp-namedview.h"
+#include "desktop.h"
 #include "sp-guide.h"
 
-Inkscape::GuideSnapper::GuideSnapper(SPNamedView const *nv, NR::Coord const d) : LineSnapper(nv, d)
+Inkscape::GuideSnapper::GuideSnapper(SnapManager *sm, Geom::Coord const d) : LineSnapper(sm, d)
 {
 
 }
 
-Inkscape::GuideSnapper::LineList Inkscape::GuideSnapper::_getSnapLines(NR::Point const &p) const
+/**
+ *  \return Snap tolerance (desktop coordinates); depends on current zoom so that it's always the same in screen pixels
+ */
+Geom::Coord Inkscape::GuideSnapper::getSnapperTolerance() const
+{
+    SPDesktop const *dt = _snapmanager->getDesktop();
+    double const zoom =  dt ? dt->current_zoom() : 1;
+    return _snapmanager->snapprefs.getGuideTolerance() / zoom;
+}
+
+bool Inkscape::GuideSnapper::getSnapperAlwaysSnap() const
+{
+    return _snapmanager->snapprefs.getGuideTolerance() == 10000; //TODO: Replace this threshold of 10000 by a constant; see also tolerance-slider.cpp
+}
+
+Inkscape::GuideSnapper::LineList Inkscape::GuideSnapper::_getSnapLines(Geom::Point const &/*p*/) const
 {
     LineList s;
 
-    if ( NULL == _named_view || ThisSnapperMightSnap() == false) {
+    if ( NULL == _snapmanager->getNamedView() || ThisSnapperMightSnap() == false) {
         return s;
     }
 
-    for (GSList const *l = _named_view->guides; l != NULL; l = l->next) {
-        SPGuide const *g = SP_GUIDE(l->data);
+    SPGuide const *guide_to_ignore = _snapmanager->getGuideToIgnore();
 
-        /* We assume here that guides are horizontal or vertical */
-        if (g->normal == component_vectors[NR::X]) {
-            s.push_back(std::make_pair(NR::X, g->position));
-        } else {
-            s.push_back(std::make_pair(NR::Y, g->position));
+    for (GSList const *l = _snapmanager->getNamedView()->guides; l != NULL; l = l->next) {
+        SPGuide const *g = SP_GUIDE(l->data);
+        if (g != guide_to_ignore) {
+            s.push_back(std::make_pair(g->normal_to_line, g->point_on_line));
         }
     }
 
@@ -49,7 +61,30 @@ Inkscape::GuideSnapper::LineList Inkscape::GuideSnapper::_getSnapLines(NR::Point
  */
 bool Inkscape::GuideSnapper::ThisSnapperMightSnap() const
 {
-    return _named_view == NULL ? false : (_enabled && _snap_to != 0 && _named_view->showguides);
+    if (_snapmanager->getNamedView() == NULL) {
+        return false;
+    }
+
+    return (_snap_enabled && _snapmanager->snapprefs.getSnapToGuides() && _snapmanager->getNamedView()->showguides);
+}
+
+void Inkscape::GuideSnapper::_addSnappedLine(SnappedConstraints &sc, Geom::Point const snapped_point, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num, Geom::Point const normal_to_line, Geom::Point const point_on_line) const
+{
+    SnappedLine dummy = SnappedLine(snapped_point, snapped_distance, source, source_num, Inkscape::SNAPTARGET_GUIDE, getSnapperTolerance(), getSnapperAlwaysSnap(), normal_to_line, point_on_line);
+    sc.guide_lines.push_back(dummy);
+}
+
+void Inkscape::GuideSnapper::_addSnappedLinesOrigin(SnappedConstraints &sc, Geom::Point const origin, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num, bool constrained_snap) const
+{
+    SnappedPoint dummy = SnappedPoint(origin, source, source_num, Inkscape::SNAPTARGET_GUIDE_ORIGIN, snapped_distance, getSnapperTolerance(), getSnapperAlwaysSnap(), constrained_snap, true);
+    sc.points.push_back(dummy);
+}
+
+
+void Inkscape::GuideSnapper::_addSnappedPoint(SnappedConstraints &sc, Geom::Point const snapped_point, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num, bool constrained_snap) const
+{
+    SnappedPoint dummy = SnappedPoint(snapped_point, source, source_num, Inkscape::SNAPTARGET_GUIDE, snapped_distance, getSnapperTolerance(), getSnapperAlwaysSnap(), constrained_snap, true);
+    sc.points.push_back(dummy);
 }
 
 /*