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
|
#ifndef SEEN_OBJECT_SNAPPER_H
#define SEEN_OBJECT_SNAPPER_H
/**
* \file object-snapper.h
* \brief Snapping things to objects.
*
* Authors:
* Carl Hetherington <inkscape@carlh.net>
*
* Copyright (C) 2005 Authors
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
#include "snapper.h"
#include "sp-path.h"
#include "splivarot.h"
struct SPNamedView;
struct SPItem;
struct SPObject;
namespace Inkscape
{
class ObjectSnapper : public Snapper
{
public:
ObjectSnapper(SPNamedView const *nv, NR::Coord const d);
~ObjectSnapper();
enum DimensionToSnap {SNAP_X, SNAP_Y, SNAP_XY};
void setSnapToItemNode(bool s) {
_snap_to_itemnode = s;
}
bool getSnapToItemNode() const {
return _snap_to_itemnode;
}
void setSnapToItemPath(bool s) {
_snap_to_itempath = s;
}
bool getSnapToItemPath() const {
return _snap_to_itempath;
}
void setSnapToBBoxNode(bool s) {
_snap_to_bboxnode = s;
}
bool getSnapToBBoxNode() const {
return _snap_to_bboxnode;
}
void setSnapToBBoxPath(bool s) {
_snap_to_bboxpath = s;
}
bool getSnapToBBoxPath() const {
return _snap_to_bboxpath;
}
void setIncludeItemCenter(bool s) {
_include_item_center = s;
}
bool getIncludeItemCenter() const {
return _include_item_center;
}
void setStrictSnapping(bool enabled) {
_strict_snapping = enabled;
}
SnappedPoint guideSnap(NR::Point const &p,
DimensionToSnap const snap_dim) const;
bool ThisSnapperMightSnap() const;
private:
//store some lists of candidates, points and paths, so we don't have to rebuild them for each point we want to snap
std::vector<SPItem*> *_candidates;
std::vector<NR::Point> *_points_to_snap_to;
std::vector<Path*> *_paths_to_snap_to;
SnappedPoint _doFreeSnap(Inkscape::Snapper::PointType const &t,
NR::Point const &p,
bool const &first_point,
std::vector<NR::Point> &points_to_snap,
std::list<SPItem const *> const &it) const;
SnappedPoint _doConstrainedSnap(Inkscape::Snapper::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;
void _findCandidates(SPObject* r,
std::list<SPItem const *> const &it,
bool const &first_point,
std::vector<NR::Point> &points_to_snap,
DimensionToSnap const snap_dim) const;
void _snapNodes(Inkscape::Snapper::PointType const &t,
Inkscape::SnappedPoint &s,
NR::Point const &p,
bool const &first_point,
DimensionToSnap const snap_dim) const;
void _snapPaths(Inkscape::Snapper::PointType const &t,
Inkscape::SnappedPoint &s,
NR::Point const &p,
bool const &first_point) const;
bool _snap_to_itemnode;
bool _snap_to_itempath;
bool _snap_to_bboxnode;
bool _snap_to_bboxpath;
//If enabled, then bbox corners will only snap to bboxes,
//and nodes will only snap to nodes and paths. We will not
//snap bbox corners to nodes, or nodes to bboxes.
//(snapping to grids and guides is not affected by this)
bool _strict_snapping;
bool _include_item_center;
};
}
#endif
|