1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
#ifndef SEEN_SNAPPER_H
#define SEEN_SNAPPER_H
/**
* \file src/snapper.h
* \brief Snapper class.
*
* Authors:
* Carl Hetherington <inkscape@carlh.net>
* Diederik van Lierop <mail@diedenrezi.nl>
*
* Released under GNU GPL, read the file 'COPYING' for more information.
*/
#include <map>
#include <list>
#include <boost/optional.hpp>
#include "snapped-point.h"
#include "snapped-line.h"
#include "snapped-curve.h"
#include "snap-preferences.h"
struct SnappedConstraints {
std::list<Inkscape::SnappedPoint> points;
std::list<Inkscape::SnappedLineSegment> lines;
std::list<Inkscape::SnappedLine> grid_lines;
std::list<Inkscape::SnappedLine> guide_lines;
std::list<Inkscape::SnappedCurve> curves;
};
class SnapManager;
struct SPItem;
namespace Inkscape
{
/// Parent for classes that can snap points to something
class Snapper
{
public:
Snapper() {}
Snapper(SnapManager *sm, ::Geom::Coord const t);
virtual ~Snapper() {}
virtual Geom::Coord getSnapperTolerance() const = 0; //returns the tolerance of the snapper in screen pixels (i.e. independent of zoom)
virtual bool getSnapperAlwaysSnap() const = 0; //if true, then the snapper will always snap, regardless of its tolerance
/**
* \return true if this Snapper will snap at least one kind of point.
*/
virtual bool ThisSnapperMightSnap() const {return _snap_enabled;} // will likely be overridden by derived classes
// These four methods are only used for grids, for which snapping can be enabled individually
void setEnabled(bool s);
void setSnapVisibleOnly(bool s);
bool getEnabled() const {return _snap_enabled;}
bool getSnapVisibleOnly() const {return _snap_visible_only;}
virtual void freeSnap(SnappedConstraints &/*sc*/,
SnapPreferences::PointType const &/*t*/,
Geom::Point const &/*p*/,
SnapSourceType const &/*source_type*/,
long /*source_num*/,
Geom::OptRect const &/*bbox_to_snap*/,
std::vector<SPItem const *> const */*it*/,
std::vector<std::pair<Geom::Point, int> > */*unselected_nodes*/) const {};
class ConstraintLine
{
public:
ConstraintLine(Geom::Point const &d) : _has_point(false), _direction(d) {}
ConstraintLine(Geom::Point const &p, Geom::Point const &d) : _has_point(true), _point(p), _direction(d) {}
bool hasPoint() const {
return _has_point;
}
Geom::Point getPoint() const {
return _point;
}
Geom::Point getDirection() const {
return _direction;
}
void setPoint(Geom::Point const &p) {
_point = p;
_has_point = true;
}
Geom::Point projection(Geom::Point const &p) const { // returns the projection of p on this constraintline
Geom::Point const p1_on_cl = _has_point ? _point : p;
Geom::Point const p2_on_cl = p1_on_cl + _direction;
return Geom::projection(p, Geom::Line(p1_on_cl, p2_on_cl));
}
private:
bool _has_point;
Geom::Point _point;
Geom::Point _direction;
};
virtual void constrainedSnap(SnappedConstraints &/*sc*/,
SnapPreferences::PointType const &/*t*/,
Geom::Point const &/*p*/,
SnapSourceType const &/*source_type*/,
long /*source_num*/,
Geom::OptRect const &/*bbox_to_snap*/,
ConstraintLine const &/*c*/,
std::vector<SPItem const *> const */*it*/) const {};
protected:
SnapManager *_snapmanager;
// This is only used for grids, for which snapping can be enabled individually
bool _snap_enabled; ///< true if this snapper is enabled, otherwise false
bool _snap_visible_only;
};
}
#endif /* !SEEN_SNAPPER_H */
/*
Local Variables:
mode:c++
c-file-style:"stroustrup"
c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
indent-tabs-mode:nil
fill-column:99
End:
*/
// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
|