~valavanisalex/ubuntu/precise/inkscape/fix-943984

« back to all changes in this revision

Viewing changes to inkscape-0.47pre1/src/display/snap-indicator.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Bryce Harrington
  • Date: 2009-07-02 17:09:45 UTC
  • mfrom: (1.1.9 upstream)
  • Revision ID: james.westby@ubuntu.com-20090702170945-nn6d6zswovbwju1t
Tags: 0.47~pre1-0ubuntu1
* New upstream release.
  - Don't constrain maximization on small resolution devices (pre0)
    (LP: #348842)
  - Fixes segfault on startup (pre0)
    (LP: #391149)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/** \file
 
2
 * Provides a class that shows a temporary indicator on the canvas of where the snap was, and what kind of snap
 
3
 *
 
4
 * Authors:
 
5
 *   Johan Engelen
 
6
 *   Diederik van Lierop
 
7
 *
 
8
 * Copyright (C) Johan Engelen 2009 <j.b.c.engelen@utwente.nl>
 
9
 * Copyright (C) Diederik van Lierop 2009 <mail@diedenrezi.nl>
 
10
 *
 
11
 * Released under GNU GPL, read the file 'COPYING' for more information
 
12
 */
 
13
 
 
14
#include "display/snap-indicator.h"
 
15
 
 
16
#include "desktop.h"
 
17
#include "desktop-handles.h"
 
18
#include "display/sodipodi-ctrl.h"
 
19
#include "display/canvas-text.h"
 
20
#include "knot.h"
 
21
#include "preferences.h"
 
22
#include <glibmm/i18n.h>
 
23
 
 
24
namespace Inkscape {
 
25
namespace Display {
 
26
 
 
27
SnapIndicator::SnapIndicator(SPDesktop * desktop)
 
28
    :   _snaptarget(NULL),
 
29
                _snaptarget_tooltip(NULL),
 
30
        _snapsource(NULL),
 
31
        _desktop(desktop)
 
32
{
 
33
}
 
34
 
 
35
SnapIndicator::~SnapIndicator()
 
36
{
 
37
    // remove item that might be present
 
38
        remove_snaptarget();
 
39
        remove_snapsource();
 
40
}
 
41
 
 
42
void
 
43
SnapIndicator::set_new_snaptarget(Inkscape::SnappedPoint const p)
 
44
{
 
45
        remove_snaptarget(); //only display one snaptarget at a time
 
46
 
 
47
    g_assert(_desktop != NULL);
 
48
 
 
49
    /* Commented out for now, because this might hide any snapping bug!
 
50
    if (!p.getSnapped()) {
 
51
       return; // If we haven't snapped, then it is of no use to draw a snapindicator
 
52
    }
 
53
    */
 
54
 
 
55
    Inkscape::Preferences *prefs = Inkscape::Preferences::get();
 
56
    bool value = prefs->getBool("/options/snapindicator/value", true);
 
57
 
 
58
    if (value) {
 
59
        // TRANSLATORS: undefined target for snapping
 
60
        gchar *target_name = _("UNDEFINED");
 
61
        switch (p.getTarget()) {
 
62
                        case SNAPTARGET_UNDEFINED:
 
63
                                target_name = _("UNDEFINED");
 
64
                                break;
 
65
                        case SNAPTARGET_GRID:
 
66
                target_name = _("grid line");
 
67
                break;
 
68
            case SNAPTARGET_GRID_INTERSECTION:
 
69
                target_name = _("grid intersection");
 
70
                break;
 
71
            case SNAPTARGET_GUIDE:
 
72
                target_name = _("guide");
 
73
                break;
 
74
            case SNAPTARGET_GUIDE_INTERSECTION:
 
75
                target_name = _("guide intersection");
 
76
                break;
 
77
            case SNAPTARGET_GRID_GUIDE_INTERSECTION:
 
78
                target_name = _("grid-guide intersection");
 
79
                break;
 
80
            case SNAPTARGET_NODE_CUSP:
 
81
                                target_name = _("cusp node");
 
82
                                break;
 
83
            case SNAPTARGET_NODE_SMOOTH:
 
84
                                target_name = _("smooth node");
 
85
                                break;
 
86
                        case SNAPTARGET_PATH:
 
87
                target_name = _("path");
 
88
                break;
 
89
            case SNAPTARGET_PATH_INTERSECTION:
 
90
                target_name = _("path intersection");
 
91
                break;
 
92
            case SNAPTARGET_BBOX_CORNER:
 
93
                target_name = _("bounding box corner");
 
94
                break;
 
95
            case SNAPTARGET_BBOX_EDGE:
 
96
                target_name = _("bounding box side");
 
97
                break;
 
98
            case SNAPTARGET_GRADIENTS_PARENT_BBOX:
 
99
                target_name = _("bounding box");
 
100
                break;
 
101
            case SNAPTARGET_PAGE_BORDER:
 
102
                target_name = _("page border");
 
103
                                break;
 
104
            case SNAPTARGET_LINE_MIDPOINT:
 
105
                target_name = _("line midpoint");
 
106
                break;
 
107
            case SNAPTARGET_OBJECT_MIDPOINT:
 
108
                target_name = _("object midpoint");
 
109
                break;
 
110
            case SNAPTARGET_ROTATION_CENTER:
 
111
                target_name = _("object rotation center");
 
112
                break;
 
113
            case SNAPTARGET_HANDLE:
 
114
                target_name = _("handle");
 
115
                break;
 
116
            case SNAPTARGET_BBOX_EDGE_MIDPOINT:
 
117
                target_name = _("bounding box side midpoint");
 
118
                break;
 
119
            case SNAPTARGET_BBOX_MIDPOINT:
 
120
                target_name = _("bounding box midpoint");
 
121
                break;
 
122
            case SNAPTARGET_PAGE_CORNER:
 
123
                target_name = _("page corner");
 
124
                break;
 
125
            case SNAPTARGET_CONVEX_HULL_CORNER:
 
126
                target_name = _("convex hull corner");
 
127
                break;
 
128
            case SNAPTARGET_ELLIPSE_QUADRANT_POINT:
 
129
                target_name = _("quadrant point");
 
130
                break;
 
131
            case SNAPTARGET_CENTER:
 
132
                target_name = _("center");
 
133
                                break;
 
134
            case SNAPTARGET_CORNER:
 
135
                target_name = _("corner");
 
136
                                break;
 
137
            case SNAPTARGET_TEXT_BASELINE:
 
138
                target_name = _("text baseline");
 
139
                                break;
 
140
            default:
 
141
                g_warning("Snap target has not yet been defined!");
 
142
                break;
 
143
        }
 
144
 
 
145
        gchar *source_name = _("UNDEFINED");
 
146
                switch (p.getSource()) {
 
147
                        case SNAPSOURCE_UNDEFINED:
 
148
                                source_name = _("UNDEFINED");
 
149
                                break;
 
150
                        case SNAPSOURCE_BBOX_CORNER:
 
151
                                source_name = _("Bounding box corner");
 
152
                                break;
 
153
                        case SNAPSOURCE_BBOX_MIDPOINT:
 
154
                                source_name = _("Bounding box midpoint");
 
155
                                break;
 
156
                        case SNAPSOURCE_BBOX_EDGE_MIDPOINT:
 
157
                                source_name = _("Bounding box side midpoint");
 
158
                                break;
 
159
                        case SNAPSOURCE_NODE_SMOOTH:
 
160
                                source_name = _("Smooth node");
 
161
                                break;
 
162
                        case SNAPSOURCE_NODE_CUSP:
 
163
                                source_name = _("Cusp node");
 
164
                                break;
 
165
                        case SNAPSOURCE_LINE_MIDPOINT:
 
166
                                source_name = _("Line midpoint");
 
167
                                break;
 
168
                        case SNAPSOURCE_OBJECT_MIDPOINT:
 
169
                                source_name = _("Object midpoint");
 
170
                                break;
 
171
                        case SNAPSOURCE_ROTATION_CENTER:
 
172
                                source_name = _("Object rotation center");
 
173
                                break;
 
174
                        case SNAPSOURCE_HANDLE:
 
175
                                source_name = _("Handle");
 
176
                                break;
 
177
                        case SNAPSOURCE_PATH_INTERSECTION:
 
178
                                source_name = _("Path intersection");
 
179
                                break;
 
180
                        case SNAPSOURCE_GUIDE:
 
181
                                source_name = _("Guide");
 
182
                                break;
 
183
                        case SNAPSOURCE_GUIDE_ORIGIN:
 
184
                                source_name = _("Guide origin");
 
185
                                break;
 
186
                        case SNAPSOURCE_CONVEX_HULL_CORNER:
 
187
                                source_name = _("Convex hull corner");
 
188
                                break;
 
189
                        case SNAPSOURCE_ELLIPSE_QUADRANT_POINT:
 
190
                                source_name = _("Quadrant point");
 
191
                                break;
 
192
                        case SNAPSOURCE_CENTER:
 
193
                                source_name = _("Center");
 
194
                                break;
 
195
                        case SNAPSOURCE_CORNER:
 
196
                                source_name = _("Corner");
 
197
                                break;
 
198
                        case SNAPSOURCE_TEXT_BASELINE:
 
199
                                source_name = _("Text baseline");
 
200
                                break;
 
201
                        default:
 
202
                                g_warning("Snap source has not yet been defined!");
 
203
                                break;
 
204
                }
 
205
        //std::cout << "Snapped " << source_name << " to " << target_name << std::endl;
 
206
 
 
207
                remove_snapsource(); // Don't set both the source and target indicators, as these will overlap
 
208
 
 
209
        // Display the snap indicator (i.e. the cross)
 
210
        SPCanvasItem * canvasitem = NULL;
 
211
                if (p.getTarget() == SNAPTARGET_NODE_SMOOTH || p.getTarget() == SNAPTARGET_NODE_CUSP) {
 
212
                        canvasitem = sp_canvas_item_new(sp_desktop_tempgroup (_desktop),
 
213
                                                                                        SP_TYPE_CTRL,
 
214
                                                                                        "anchor", GTK_ANCHOR_CENTER,
 
215
                                                                                        "size", 10.0,
 
216
                                                                                        "stroked", TRUE,
 
217
                                                                                        "stroke_color", 0xf000f0ff,
 
218
                                                                                        "mode", SP_KNOT_MODE_XOR,
 
219
                                                                                        "shape", SP_KNOT_SHAPE_DIAMOND,
 
220
                                                                                        NULL );
 
221
                } else {
 
222
                        canvasitem = sp_canvas_item_new(sp_desktop_tempgroup (_desktop),
 
223
                                                                                        SP_TYPE_CTRL,
 
224
                                                                                        "anchor", GTK_ANCHOR_CENTER,
 
225
                                                                                        "size", 10.0,
 
226
                                                                                        "stroked", TRUE,
 
227
                                                                                        "stroke_color", 0xf000f0ff,
 
228
                                                                                        "mode", SP_KNOT_MODE_XOR,
 
229
                                                                                        "shape", SP_KNOT_SHAPE_CROSS,
 
230
                                                                                        NULL );
 
231
                }
 
232
 
 
233
                const int timeout_val = 1200; // TODO add preference for snap indicator timeout?
 
234
 
 
235
                SP_CTRL(canvasitem)->moveto(p.getPoint());
 
236
                _snaptarget = _desktop->add_temporary_canvasitem(canvasitem, timeout_val);
 
237
 
 
238
                gchar *tooltip_str = g_strconcat(source_name, _(" to "), target_name, NULL);
 
239
                Geom::Point tooltip_pos = p.getPoint() + _desktop->w2d(Geom::Point(15, -15));
 
240
 
 
241
                SPCanvasItem *canvas_tooltip = sp_canvastext_new(sp_desktop_tempgroup(_desktop), _desktop, tooltip_pos, tooltip_str);
 
242
                g_free(tooltip_str);
 
243
 
 
244
                sp_canvastext_set_anchor((SPCanvasText* )canvas_tooltip, -1, 1);
 
245
                _snaptarget_tooltip = _desktop->add_temporary_canvasitem(canvas_tooltip, timeout_val);
 
246
        }
 
247
}
 
248
 
 
249
void
 
250
SnapIndicator::remove_snaptarget()
 
251
{
 
252
    if (_snaptarget) {
 
253
        _desktop->remove_temporary_canvasitem(_snaptarget);
 
254
        _snaptarget = NULL;
 
255
    }
 
256
 
 
257
    if (_snaptarget_tooltip) {
 
258
                _desktop->remove_temporary_canvasitem(_snaptarget_tooltip);
 
259
                _snaptarget_tooltip = NULL;
 
260
        }
 
261
 
 
262
}
 
263
 
 
264
void
 
265
SnapIndicator::set_new_snapsource(std::pair<Geom::Point, int> const p)
 
266
{
 
267
        remove_snapsource();
 
268
 
 
269
    g_assert(_desktop != NULL);
 
270
 
 
271
    Inkscape::Preferences *prefs = Inkscape::Preferences::get();
 
272
    bool value = prefs->getBool("/options/snapindicator/value", true);
 
273
 
 
274
    if (value) {
 
275
        SPCanvasItem * canvasitem = sp_canvas_item_new( sp_desktop_tempgroup (_desktop),
 
276
                                                        SP_TYPE_CTRL,
 
277
                                                        "anchor", GTK_ANCHOR_CENTER,
 
278
                                                        "size", 6.0,
 
279
                                                        "stroked", TRUE,
 
280
                                                        "stroke_color", 0xf000f0ff,
 
281
                                                        "mode", SP_KNOT_MODE_XOR,
 
282
                                                        "shape", SP_KNOT_SHAPE_CIRCLE,
 
283
                                                        NULL );
 
284
 
 
285
        SP_CTRL(canvasitem)->moveto(p.first);
 
286
        _snapsource = _desktop->add_temporary_canvasitem(canvasitem, 1000);
 
287
        }
 
288
}
 
289
 
 
290
void
 
291
SnapIndicator::remove_snapsource()
 
292
{
 
293
    if (_snapsource) {
 
294
        _desktop->remove_temporary_canvasitem(_snapsource);
 
295
        _snapsource = NULL;
 
296
    }
 
297
}
 
298
 
 
299
} //namespace Display
 
300
} /* namespace Inkscape */
 
301
 
 
302
 
 
303
/*
 
304
  Local Variables:
 
305
  mode:c++
 
306
  c-file-style:"stroustrup"
 
307
  c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
 
308
  indent-tabs-mode:nil
 
309
  fill-column:99
 
310
  End:
 
311
*/
 
312
// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=4:softtabstop=4 :