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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
|
#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 "libnr/nr-coord.h"
#include "libnr/nr-point.h"
#include "libnr/nr-maybe.h"
#include "snapped-point.h"
#include "snapped-line.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;
};
struct SPNamedView;
struct SPItem;
namespace Inkscape
{
/// Parent for classes that can snap points to something
class Snapper
{
public:
Snapper() {}
Snapper(SPNamedView const *nv, ::NR::Coord const d);
virtual ~Snapper() {}
/// Point types to snap.
typedef int PointType;
static const PointType SNAPPOINT_NODE;
static const PointType SNAPPOINT_BBOX;
static const PointType SNAPPOINT_GUIDE;
void setSnapFrom(PointType t, bool s);
bool getSnapFrom(PointType t) const;
void setSnapperTolerance(NR::Coord t);
NR::Coord getSnapperTolerance() const; //returns the tolerance of the snapper in screen pixels (i.e. independent of zoom)
bool getSnapperAlwaysSnap() const; //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 && _snap_from != 0);} // will likely be overridden by derived classes
void setEnabled(bool s);
bool getEnabled() const {return _snap_enabled;}
void freeSnap(SnappedConstraints &sc,
PointType const &t,
NR::Point const &p,
bool const &first_point,
std::vector<NR::Point> &points_to_snap,
SPItem const *it) const;
void freeSnap(SnappedConstraints &sc,
PointType const &t,
NR::Point const &p,
bool const &first_point,
std::vector<NR::Point> &points_to_snap,
std::list<SPItem const *> const &it,
std::vector<NR::Point> *unselected_nodes) const;
class ConstraintLine
{
public:
ConstraintLine(NR::Point const &d) : _has_point(false), _direction(d) {}
ConstraintLine(NR::Point const &p, NR::Point const &d) : _has_point(true), _point(p), _direction(d) {}
bool hasPoint() const {
return _has_point;
}
NR::Point getPoint() const {
return _point;
}
NR::Point getDirection() const {
return _direction;
}
private:
bool _has_point;
NR::Point _point;
NR::Point _direction;
};
void constrainedSnap(SnappedConstraints &sc,
PointType const &t,
NR::Point const &p,
bool const &first_point,
std::vector<NR::Point> &points_to_snap,
ConstraintLine const &c,
SPItem const *it) const;
void constrainedSnap(SnappedConstraints &sc,
PointType const &t,
NR::Point const &p,
bool const &first_point,
std::vector<NR::Point> &points_to_snap,
ConstraintLine const &c,
std::list<SPItem const *> const &it) const;
protected:
SPNamedView const *_named_view;
int _snap_from; ///< bitmap of point types that we will snap from
bool _snap_enabled; ///< true if this snapper is enabled, otherwise false
private:
NR::Coord _snapper_tolerance; ///< snap tolerance in desktop coordinates
// must be private to enforce the usage of getTolerance(), which retrieves
// the tolerance in screen pixels (making it zoom independent)
/**
* Try to snap a point to whatever this snapper is interested in. Any
* snap that occurs will be to the nearest "interesting" thing (e.g. a
* grid or guide line)
*
* \param p Point to snap (desktop coordinates).
* \param it Items that should not be snapped to.
* \return Snapped point.
*/
virtual void _doFreeSnap(SnappedConstraints &sc,
PointType const &t,
NR::Point const &p,
bool const &first_point,
std::vector<NR::Point> &points_to_snap,
std::list<SPItem const *> const &it,
std::vector<NR::Point> *unselected_nodes) const = 0;
/**
* Try to snap a point to whatever this snapper is interested in, where
* the snap point is constrained to lie along a specified vector from the
* original point.
*
* \param p Point to snap (desktop coordinates).
* \param c Vector to constrain the snap to.
* \param it Items that should not be snapped to.
* \return Snapped point.
*/
virtual void _doConstrainedSnap(SnappedConstraints &sc,
PointType const &t,
NR::Point const &p,
bool const &first_point,
std::vector<NR::Point> &points_to_snap,
ConstraintLine const &c,
std::list<SPItem const *> const &it) const = 0;
};
}
#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 :
|