1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Snapping things to guides.
6 * Lauris Kaplinski <lauris@kaplinski.com>
7 * Frank Felfe <innerspace@iname.com>
8 * Carl Hetherington <inkscape@carlh.net>
10 * Copyright (C) 1999-2002 Authors
12 * Released under GNU GPL v2+, read the file 'COPYING' for more information.
16 #include "preferences.h"
18 #include "object/sp-guide.h"
19 #include "object/sp-namedview.h"
21 Inkscape::GuideSnapper::GuideSnapper(SnapManager
*sm
, Geom::Coord
const d
) : LineSnapper(sm
, d
)
25 * \return Snap tolerance (desktop coordinates); depends on current zoom so that it's always the same in screen pixels
27 Geom::Coord
Inkscape::GuideSnapper::getSnapperTolerance() const
29 SPDesktop
const *dt
= _snapmanager
->getDesktop();
30 double const zoom
= dt
? dt
->current_zoom() : 1;
31 return _snapmanager
->snapprefs
.getGuideTolerance() / zoom
;
34 bool Inkscape::GuideSnapper::getSnapperAlwaysSnap(SnapSourceType
const &source
) const
36 if (source
== SNAPSOURCE_GUIDE
|| source
== SNAPSOURCE_GUIDE_ORIGIN
)
37 return false; // Don't always snap to other guides
38 return Preferences::get()->getBool("/options/snap/guide/always", false);
41 Inkscape::GuideSnapper::LineList
Inkscape::GuideSnapper::_getSnapLines(Geom::Point
const &/*p*/) const
45 if ( nullptr == _snapmanager
->getNamedView() || ThisSnapperMightSnap() == false) {
49 SPGuide
const *guide_to_ignore
= _snapmanager
->getGuideToIgnore();
50 std::vector
<SPGuide
*> guides
= _snapmanager
->getNamedView()->guides
;
51 for(auto guide
: guides
) {
52 if (guide
!= guide_to_ignore
) {
53 s
.emplace_back(guide
->getNormal(), guide
->getPoint());
61 * \return true if this Snapper will snap at least one kind of point.
63 bool Inkscape::GuideSnapper::ThisSnapperMightSnap() const
65 if (_snapmanager
->getNamedView() == nullptr) {
69 return (_snap_enabled
&& _snapmanager
->snapprefs
.isTargetSnappable(Inkscape::SNAPTARGET_GUIDE
) && _snapmanager
->getNamedView()->showguides
);
72 void Inkscape::GuideSnapper::_addSnappedLine(IntermSnapResults
&isr
, 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
74 SnappedLine dummy
= SnappedLine(snapped_point
, snapped_distance
, source
, source_num
, Inkscape::SNAPTARGET_GUIDE
, getSnapperTolerance(), getSnapperAlwaysSnap(source
), normal_to_line
, point_on_line
);
75 isr
.guide_lines
.push_back(dummy
);
78 void Inkscape::GuideSnapper::_addSnappedLinesOrigin(IntermSnapResults
&isr
, Geom::Point
const &origin
, Geom::Coord
const &snapped_distance
, SnapSourceType
const &source
, long source_num
, bool constrained_snap
) const
80 SnappedPoint dummy
= SnappedPoint(origin
, source
, source_num
, Inkscape::SNAPTARGET_GUIDE_ORIGIN
, snapped_distance
, getSnapperTolerance(), getSnapperAlwaysSnap(source
), constrained_snap
, true);
81 isr
.points
.push_back(dummy
);
84 void Inkscape::GuideSnapper::_addSnappedLinePerpendicularly(IntermSnapResults
&isr
, Geom::Point
const &snapped_point
, Geom::Coord
const &snapped_distance
, SnapSourceType
const &source
, long source_num
, bool constrained_snap
) const
86 SnappedPoint dummy
= SnappedPoint(snapped_point
, source
, source_num
, Inkscape::SNAPTARGET_GUIDE_PERPENDICULAR
, snapped_distance
, getSnapperTolerance(), getSnapperAlwaysSnap(source
), constrained_snap
, true);
87 isr
.points
.push_back(dummy
);
90 void Inkscape::GuideSnapper::_addSnappedPoint(IntermSnapResults
&isr
, Geom::Point
const &snapped_point
, Geom::Coord
const &snapped_distance
, SnapSourceType
const &source
, long source_num
, bool constrained_snap
) const
92 SnappedPoint dummy
= SnappedPoint(snapped_point
, source
, source_num
, Inkscape::SNAPTARGET_GUIDE
, snapped_distance
, getSnapperTolerance(), getSnapperAlwaysSnap(source
), constrained_snap
, true);
93 isr
.points
.push_back(dummy
);
99 c-file-style:"stroustrup"
100 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
105 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :