diff options
| author | Diederik van Lierop <mail@diedenrezi.nl> | 2008-11-23 13:55:26 +0000 |
|---|---|---|
| committer | dvlierop2 <dvlierop2@users.sourceforge.net> | 2008-11-23 13:55:26 +0000 |
| commit | 6b8572be4bdae9ee79fc42c9d18fd9882dec21aa (patch) | |
| tree | ccfc4f2203495ee82127b0cb596f23a9d9f48803 /src/snap.cpp | |
| parent | Updating the includes on these files because they need to include simple-node... (diff) | |
| download | inkscape-6b8572be4bdae9ee79fc42c9d18fd9882dec21aa.tar.gz inkscape-6b8572be4bdae9ee79fc42c9d18fd9882dec21aa.zip | |
1) Improve the way the distance to the pointer is taken into account when finding the best snap
2) Use this distance also when snapping nodes in the path editor
3) Add a slider in the preferences dialog to control the weighing of this distance
(bzr r6895)
Diffstat (limited to 'src/snap.cpp')
| -rw-r--r-- | src/snap.cpp | 35 |
1 files changed, 19 insertions, 16 deletions
diff --git a/src/snap.cpp b/src/snap.cpp index ebce87c98..f6504efe3 100644 --- a/src/snap.cpp +++ b/src/snap.cpp @@ -209,10 +209,12 @@ Geom::Point SnapManager::multipleOfGridPitch(Geom::Point const &t) const snapper->freeSnap(sc, Inkscape::SnapPreferences::SNAPPOINT_NODE, t_offset, TRUE, Geom::OptRect(), NULL, NULL); // Find the best snap for this grid, including intersections of the grid-lines Inkscape::SnappedPoint s = findBestSnap(t_offset, sc, false); - if (s.getSnapped() && (s.getDistance() < nearest_distance)) { - success = true; + if (s.getSnapped() && (s.getSnapDistance() < nearest_distance)) { + // use getSnapDistance() instead of getWeightedDistance() here because the pointer's position + // doesn't tell us anything about which node to snap + success = true; nearest_multiple = s.getPoint() - to_2geom(grid->origin); - nearest_distance = s.getDistance(); + nearest_distance = s.getSnapDistance(); } } } @@ -448,8 +450,9 @@ Inkscape::SnappedPoint SnapManager::_snapTransformed( } else { snapped_point = freeSnap(type, *j, i == points.begin(), bbox); } - snapped_point.setPointerDistance(Geom::L2(pointer - *i)); } + // std::cout << "dist = " << snapped_point.getSnapDistance() << std::endl; + snapped_point.setPointerDistance(Geom::L2(pointer - *i)); Geom::Point result; Geom::Point scale_metric(NR_HUGE, NR_HUGE); @@ -509,15 +512,15 @@ Inkscape::SnappedPoint SnapManager::_snapTransformed( } } // Store the metric for this transformation as a virtual distance - snapped_point.setDistance(std::abs(result[dim] - transformation[dim])); - snapped_point.setSecondDistance(NR_HUGE); + snapped_point.setSnapDistance(std::abs(result[dim] - transformation[dim])); + snapped_point.setSecondSnapDistance(NR_HUGE); break; case SKEW: result[0] = (snapped_point.getPoint()[dim] - (*i)[dim]) / ((*i)[1 - dim] - origin[1 - dim]); // skew factor result[1] = transformation[1]; // scale factor // Store the metric for this transformation as a virtual distance - snapped_point.setDistance(std::abs(result[0] - transformation[0])); - snapped_point.setSecondDistance(NR_HUGE); + snapped_point.setSnapDistance(std::abs(result[0] - transformation[0])); + snapped_point.setSecondSnapDistance(NR_HUGE); break; default: g_assert_not_reached(); @@ -548,10 +551,10 @@ Inkscape::SnappedPoint SnapManager::_snapTransformed( } } } else { // For all transformations other than scaling - if (best_snapped_point.isOtherOneBetter(snapped_point)) { - best_transformation = result; + if (best_snapped_point.isOtherOneBetter(snapped_point, true)) { + best_transformation = result; best_snapped_point = snapped_point; - } + } } } @@ -572,13 +575,13 @@ Inkscape::SnappedPoint SnapManager::_snapTransformed( } best_metric = std::min(best_scale_metric[0], best_scale_metric[1]); } else { // For all transformations other than scaling - best_metric = best_snapped_point.getDistance(); + best_metric = best_snapped_point.getSnapDistance(); } best_snapped_point.setTransformation(best_transformation); // Using " < 1e6" instead of " < NR_HUGE" for catching some rounding errors // These rounding errors might be caused by NRRects, see bug #1584301 - best_snapped_point.setDistance(best_metric < 1e6 ? best_metric : NR_HUGE); + best_snapped_point.setSnapDistance(best_metric < 1e6 ? best_metric : NR_HUGE); return best_snapped_point; } @@ -810,9 +813,9 @@ Inkscape::SnappedPoint SnapManager::findBestSnap(Geom::Point const &p, SnappedCo for (std::list<Inkscape::SnappedPoint>::const_iterator i = sp_list.begin(); i != sp_list.end(); i++) { // first find out if this snapped point is within snapping range // std::cout << "sp = " << from_2geom((*i).getPoint()); - if ((*i).getDistance() <= (*i).getTolerance()) { + if ((*i).getSnapDistance() <= (*i).getTolerance()) { // if it's the first point, or if it is closer than the best snapped point so far - if (i == sp_list.begin() || bestSnappedPoint.isOtherOneBetter(*i)) { + if (i == sp_list.begin() || bestSnappedPoint.isOtherOneBetter(*i, false)) { // then prefer this point over the previous one bestSnappedPoint = *i; } @@ -829,7 +832,7 @@ Inkscape::SnappedPoint SnapManager::findBestSnap(Geom::Point const &p, SnappedCo } } - // std::cout << "findBestSnap = " << bestSnappedPoint.getPoint() << std::endl; + // std::cout << "findBestSnap = " << bestSnappedPoint.getPoint() << " | dist = " << bestSnappedPoint.getSnapDistance() << std::endl; return bestSnappedPoint; } |
