summaryrefslogtreecommitdiffstats
path: root/src/snap.h
blob: 9702d011aa5d42f04866ab36d4a21d1f2583d79a (plain)
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
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
#ifndef SEEN_SNAP_H
#define SEEN_SNAP_H

/**
 * \file snap.h
 * \brief SnapManager class.
 *
 * Authors:
 *   Lauris Kaplinski <lauris@kaplinski.com>
 *   Frank Felfe <innerspace@iname.com>
 *   Carl Hetherington <inkscape@carlh.net>
 *   Diederik van Lierop <mail@diedenrezi.nl>
 *
 * Copyright (C) 2006-2007 Johan Engelen <johan@shouraizou.nl>
 * Copyright (C) 2000-2002 Lauris Kaplinski
 *
 * Released under GNU GPL, read the file 'COPYING' for more information
 */

#include <vector>

#include <libnr/nr-coord.h>
#include <libnr/nr-dim2.h>
#include <libnr/nr-forward.h>
#include <libnr/nr-scale.h>

#include "guide-snapper.h"
#include "object-snapper.h"

class SPNamedView;

/// Class to coordinate snapping operations

/**
 *  Each SPNamedView has one of these.  It offers methods to snap points to whatever
 *  snappers are defined (e.g. grid, guides etc.).  It also allows callers to snap
 *  points which have undergone some transformation (e.g. translation, scaling etc.)
 */

class SnapManager
{
public:
    SnapManager(SPNamedView const *v);

    typedef std::list<const Inkscape::Snapper*> SnapperList;

    bool SomeSnapperMightSnap() const;

    Inkscape::SnappedPoint freeSnap(Inkscape::Snapper::PointType t,
                                    NR::Point const &p,
                                    SPItem const *it) const;

    Inkscape::SnappedPoint freeSnap( Inkscape::Snapper::PointType t,
                                      NR::Point const &p,
                                      bool const &first_point,
                                      std::vector<NR::Point> &points_to_snap,
                                      std::list<SPItem const *> const &it) const;

    Inkscape::SnappedPoint constrainedSnap(Inkscape::Snapper::PointType t,
                                           NR::Point const &p,
                                           Inkscape::Snapper::ConstraintLine const &c,
                                           SPItem const *it) const;
    
    Inkscape::SnappedPoint constrainedSnap(Inkscape::Snapper::PointType t,
                                           NR::Point const &p,
                                           bool const &first_point,
                                           std::vector<NR::Point> &points_to_snap,
                                           Inkscape::Snapper::ConstraintLine const &c,
                                           std::list<SPItem const *> const &it) const;
                                           
    Inkscape::SnappedPoint guideSnap(NR::Point const &p,
                                     NR::Point const &guide_normal) const;

    std::pair<NR::Point, bool> freeSnapTranslation(Inkscape::Snapper::PointType t,
                                                   std::vector<NR::Point> const &p,
                                                   std::list<SPItem const *> const &it,
                                                   NR::Point const &tr) const;

    std::pair<NR::Point, bool> constrainedSnapTranslation(Inkscape::Snapper::PointType t,
                                                          std::vector<NR::Point> const &p,
                                                          std::list<SPItem const *> const &it,
                                                          Inkscape::Snapper::ConstraintLine const &c,
                                                          NR::Point const &tr) const;

    std::pair<NR::scale, bool> freeSnapScale(Inkscape::Snapper::PointType t,
                                             std::vector<NR::Point> const &p,
                                             std::list<SPItem const *> const &it,
                                             NR::scale const &s,
                                             NR::Point const &o) const;

    std::pair<NR::scale, bool> constrainedSnapScale(Inkscape::Snapper::PointType t,
                                                    std::vector<NR::Point> const &p,
                                                    std::list<SPItem const *> const &it,
                                                    NR::scale const &s,
                                                    NR::Point const &o) const;

    std::pair<NR::Coord, bool> constrainedSnapStretch(Inkscape::Snapper::PointType t,
                                               std::vector<NR::Point> const &p,
                                               std::list<SPItem const *> const &it,
                                               NR::Coord const &s,
                                               NR::Point const &o,
                                               NR::Dim2 d,
                                               bool uniform) const;

    std::pair<NR::Coord, bool> freeSnapSkew(Inkscape::Snapper::PointType t,
                                            std::vector<NR::Point> const &p,
                                            std::list<SPItem const *> const &it,
                                            NR::Coord const &s,
                                            NR::Point const &o,
                                            NR::Dim2 d) const;
                                            
  	Inkscape::SnappedPoint guideSnap(NR::Point const &p,
                           Inkscape::ObjectSnapper::DimensionToSnap const snap_dim) const;
  

    Inkscape::GuideSnapper guide;      ///< guide snapper
    Inkscape::ObjectSnapper object;    ///< snapper to other objects

    SnapperList getSnappers() const;
    SnapperList getGridSnappers() const;
    
    void setSnapModeBBox(bool enabled);
    void setSnapModeNode(bool enabled);
    void setSnapModeGuide(bool enabled);
    bool getSnapModeBBox() const;
    bool getSnapModeNode() const;
    bool getSnapModeGuide() const;
    
    void setSnapIntersectionGG(bool enabled) {_intersectionGG = enabled;}
    void setSnapIntersectionLS(bool enabled) {_intersectionLS = enabled;}
    bool getSnapIntersectionGG() { return _intersectionGG;}
    bool getSnapIntersectionLS() { return _intersectionLS;}    

    void setIncludeItemCenter(bool enabled)    {
        _include_item_center = enabled;
        // also store a local copy in the object-snapper instead of passing it through many functions
        object.setIncludeItemCenter(enabled);
	}
    
    bool getIncludeItemCenter() const {
        return _include_item_center;
    }
    
    void setSnapEnabledGlobally(bool enabled) {
        _snap_enabled_globally = enabled;   
    }
        
    bool getSnapEnabledGlobally() const {
        return _snap_enabled_globally;   
    }
    
    void toggleSnapEnabledGlobally() {
        _snap_enabled_globally = !_snap_enabled_globally;   
    }
        
protected:
    SPNamedView const *_named_view;

private:

    enum Transformation {
        TRANSLATION,
        SCALE,
        STRETCH,
        SKEW
    };
    
    bool _include_item_center; //If true, snapping nodes will also snap the item's center
    bool _intersectionGG;
    bool _intersectionLS;
    bool _snap_enabled_globally; //Toggles ALL snapping
    
    std::pair<NR::Point, bool> _snapTransformed(Inkscape::Snapper::PointType type,
                                                std::vector<NR::Point> const &points,
                                                std::list<SPItem const *> const &ignore,
                                                bool constrained,
                                                Inkscape::Snapper::ConstraintLine const &constraint,
                                                Transformation transformation_type,
                                                NR::Point const &transformation,
                                                NR::Point const &origin,
                                                NR::Dim2 dim,
                                                bool uniform) const;
                                                
    Inkscape::SnappedPoint findBestSnap(NR::Point const &p, SnappedConstraints &sc, bool constrained) const;
};

#endif /* !SEEN_SNAP_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 :