Inkscape
Vector Graphics Editor
Loading...
Searching...
No Matches
knot.h
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-2.0-or-later
5/*
6 * Authors:
7 * Lauris Kaplinski <lauris@kaplinski.com>
8 *
9 * Copyright (C) 1999-2002 authors
10 * Copyright (C) 2001-2002 Ximian, Inc.
11 *
12 * Released under GNU GPL v2+, read the file 'COPYING' for more information.
13 */
14
15#ifndef SEEN_SP_KNOT_H
16#define SEEN_SP_KNOT_H
17
18#include <cstdint>
19#include <2geom/point.h>
20#include <sigc++/sigc++.h>
21#include <glibmm/ustring.h>
22#include <glibmm/refptr.h>
23#include <gdkmm/cursor.h>
24
26#include "knot-enums.h"
29#include "enums.h"
30#include <sigc++/scoped_connection.h>
31
32class SPDesktop;
33class SPItem;
34
35namespace Inkscape {
36class CanvasItemCtrl;
37struct CanvasEvent;
38struct MotionEvent;
39} // namespace Inkscape
40
50class SPKnot
51{
52public:
53 SPKnot(SPDesktop *desktop, char const *tip, Inkscape::CanvasItemCtrlType type, Glib::ustring const &name = "unknown");
54 virtual ~SPKnot();
55
56 SPKnot(SPKnot const &) = delete;
57 SPKnot &operator=(SPKnot const &) = delete;
58
59 SPDesktop *desktop = nullptr;
61 SPItem *owner = nullptr;
62 SPItem *sub_owner = nullptr;
63 unsigned int flags = SP_KNOT_VISIBLE;
64
66 bool size_set = false;
67 double angle = 0.0;
68 bool is_lpe = false;
74 bool grabbed = false;
75 bool moved = false;
77 int tolerance = 0;
78 bool within_tolerance = false;
79 bool transform_escaped = false; // true iff resize or rotate was cancelled by esc.
80
82 bool shape_set = false;
84 unsigned char *image[SP_KNOT_VISIBLE_STATES];
85 Glib::RefPtr<Gdk::Cursor> _cursors[SP_KNOT_VISIBLE_STATES];
86
87 sigc::scoped_connection _event_connection;
88
89 double pressure = 0.0;
91 // FIXME: signals should NOT need to emit the object they came from, the callee should
92 // be able to figure that out
93 sigc::signal<void (SPKnot *, unsigned int)> click_signal;
94 sigc::signal<void (SPKnot*, unsigned int)> doubleclicked_signal;
95 sigc::signal<void (SPKnot*, unsigned int)> mousedown_signal;
96 sigc::signal<void (SPKnot*, unsigned int)> grabbed_signal;
97 sigc::signal<void (SPKnot *, unsigned int)> ungrabbed_signal;
98 sigc::signal<void (SPKnot *, Geom::Point const &, unsigned int)> moved_signal;
99 sigc::signal<bool (SPKnot*, Inkscape::CanvasEvent const &)> event_signal;
100
101 sigc::signal<bool (SPKnot*, Geom::Point*, unsigned int)> request_signal;
102
103 // TODO: all the members above should eventually become private, accessible via setters/getters
105 void setAnchor(unsigned int i);
106 void setAngle(double i);
107
108 void setImage(unsigned char* normal, unsigned char* mouseover, unsigned char* dragging, unsigned char* selected);
109
110 void setCursor(SPKnotStateType type, Glib::RefPtr<Gdk::Cursor> cursor);
111 void setTip(Glib::ustring &&tip);
112
116 void show();
117
121 void hide();
122
126 void setFlag(unsigned int flag, bool set);
127
131 void updateCtrl();
132
136 void requestPosition(Geom::Point const &pos, unsigned int state);
137
141 void startDragging(Geom::Point const &p, Geom::IntPoint const &xy, uint32_t etime);
142
146 void setPosition(Geom::Point const &p, unsigned int state);
147
151 void moveto(Geom::Point const &p);
155 void selectKnot(bool select);
156
160 Geom::Point position() const { return pos; }
161
165 bool eventHandler(Inkscape::CanvasEvent const &event);
166
167 bool is_visible() const { return (flags & SP_KNOT_VISIBLE) != 0; }
168 bool is_selected() const { return (flags & SP_KNOT_SELECTED) != 0; }
169 bool is_mouseover() const { return (flags & SP_KNOT_MOUSEOVER) != 0; }
170 bool is_dragging() const { return (flags & SP_KNOT_DRAGGING) != 0; }
171 bool is_grabbed() const { return (flags & SP_KNOT_GRABBED) != 0; }
172
174
175 static void ref(SPKnot *knot) { knot->ref_count++; }
176 static void unref(SPKnot *knot);
177
178private:
179 Glib::ustring _tip;
180
181 int ref_count = 1;
182
186 void _setCtrlState();
187};
188
189#endif // SEEN_SP_KNOT_H
190
191/*
192 Local Variables:
193 mode:c++
194 c-file-style:"stroustrup"
195 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
196 indent-tabs-mode:nil
197 fill-column:99
198 End:
199*/
200// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
Cartesian point / 2D vector and related operations.
Enums for CanvasItems.
std::unique_ptr< T, CanvasItemUnlinkDeleter > CanvasItemPtr
Smart pointer used to hold CanvasItems, like std::unique_ptr.
Two-dimensional point with integer coordinates.
Definition int-point.h:57
Two-dimensional point that doubles as a vector.
Definition point.h:66
To do: update description of desktop.
Definition desktop.h:149
Base class for visual SVG elements.
Definition sp-item.h:109
Desktop-bound visual control object.
Definition knot.h:51
bool grabbed
Definition knot.h:74
static void ref(SPKnot *knot)
Definition knot.h:175
Geom::Point drag_origin
Origin of drag.
Definition knot.h:71
sigc::signal< void(SPKnot *, unsigned int)> ungrabbed_signal
Definition knot.h:97
void _setCtrlState()
Set knot control state (dragging/mouseover/normal).
Definition knot.cpp:402
SPItem * owner
Optional Owner Item.
Definition knot.h:61
unsigned char * image[SP_KNOT_VISIBLE_STATES]
Definition knot.h:84
int ref_count
Definition knot.h:181
sigc::signal< void(SPKnot *, Geom::Point const &, unsigned int)> moved_signal
Definition knot.h:98
bool is_visible() const
Definition knot.h:167
sigc::signal< void(SPKnot *, unsigned int)> click_signal
Definition knot.h:93
void setPosition(Geom::Point const &p, unsigned int state)
Move knot to new position and emits "moved" signal.
Definition knot.cpp:342
unsigned int flags
Definition knot.h:63
void handler_request_position(Inkscape::MotionEvent const &event)
Definition knot.cpp:307
Geom::Point pos
Our desktop coordinates.
Definition knot.h:69
void setImage(unsigned char *normal, unsigned char *mouseover, unsigned char *dragging, unsigned char *selected)
Definition knot.cpp:426
void setSize(Inkscape::HandleSize size)
Definition knot.cpp:413
int tolerance
Definition knot.h:77
sigc::signal< void(SPKnot *, unsigned int)> mousedown_signal
Definition knot.h:95
sigc::signal< void(SPKnot *, unsigned int)> grabbed_signal
Definition knot.h:96
Geom::IntPoint xyp
Where drag started.
Definition knot.h:76
void setAngle(double i)
Definition knot.cpp:422
sigc::signal< bool(SPKnot *, Geom::Point *, unsigned int)> request_signal
Definition knot.h:101
bool is_dragging() const
Definition knot.h:170
bool transform_escaped
Definition knot.h:79
bool is_grabbed() const
Definition knot.h:171
sigc::signal< void(SPKnot *, unsigned int)> doubleclicked_signal
Definition knot.h:94
CanvasItemPtr< Inkscape::CanvasItemCtrl > ctrl
Our CanvasItemCtrl.
Definition knot.h:60
sigc::signal< bool(SPKnot *, Inkscape::CanvasEvent const &)> event_signal
Definition knot.h:99
static void unref(SPKnot *knot)
Definition knot.cpp:47
void hide()
Hide knot on its canvas.
Definition knot.cpp:327
bool moved
Definition knot.h:75
virtual ~SPKnot()
Definition knot.cpp:74
Inkscape::HandleSize _size
Always square.
Definition knot.h:65
void setAnchor(unsigned int i)
Definition knot.cpp:418
sigc::scoped_connection _event_connection
Definition knot.h:87
double angle
Angle of mesh handle.
Definition knot.h:67
void show()
Show knot on its canvas.
Definition knot.cpp:322
void setTip(Glib::ustring &&tip)
Definition knot.cpp:438
void requestPosition(Geom::Point const &pos, unsigned int state)
Request or set new position for knot.
Definition knot.cpp:332
bool size_set
Use default size unless explicitly set.
Definition knot.h:66
SPAnchorType anchor
Anchor.
Definition knot.h:72
double pressure
The tablet pen pressure when the knot is being dragged.
Definition knot.h:89
bool shape_set
Use default shape unless explicitly set.
Definition knot.h:82
void setFlag(unsigned int flag, bool set)
Set flag in knot, with side effects.
Definition knot.cpp:362
bool within_tolerance
Definition knot.h:78
Glib::RefPtr< Gdk::Cursor > _cursors[SP_KNOT_VISIBLE_STATES]
Definition knot.h:85
Geom::Point grabbed_rel_pos
Grabbed relative position.
Definition knot.h:70
bool is_selected() const
Definition knot.h:168
bool is_lpe
is lpe knot.
Definition knot.h:68
Inkscape::CanvasItemCtrlShape shape
Shape type.
Definition knot.h:81
SPKnot & operator=(SPKnot const &)=delete
void updateCtrl()
Update knot's control state.
Definition knot.cpp:389
Glib::ustring _tip
Definition knot.h:179
SPKnot(SPKnot const &)=delete
Geom::Point position() const
Returns position of knot.
Definition knot.h:160
SPItem * sub_owner
Optional SubOwner Item.
Definition knot.h:62
bool is_mouseover() const
Definition knot.h:169
SPDesktop * desktop
Desktop we are on.
Definition knot.h:59
void moveto(Geom::Point const &p)
Move knot to new position, without emitting a MOVED signal.
Definition knot.cpp:353
void selectKnot(bool select)
Select knot.
Definition knot.cpp:103
bool eventHandler(Inkscape::CanvasEvent const &event)
Event handler (from CanvasItems).
Definition knot.cpp:108
void setCursor(SPKnotStateType type, Glib::RefPtr< Gdk::Cursor > cursor)
Definition knot.cpp:433
void startDragging(Geom::Point const &p, Geom::IntPoint const &xy, uint32_t etime)
Update knot for dragging and tell canvas an item was grabbed.
Definition knot.cpp:86
Geom::IntPoint size
SPAnchorType
Definition enums.h:18
@ SP_ANCHOR_CENTER
Definition enums.h:28
Some enums used by SPKnot and by related types & functions.
SPKnotStateType
Definition knot-enums.h:19
@ SP_KNOT_SELECTED
Definition knot-enums.h:34
@ SP_KNOT_MOUSEOVER
Definition knot-enums.h:31
@ SP_KNOT_VISIBLE
Definition knot-enums.h:30
@ SP_KNOT_GRABBED
Definition knot-enums.h:33
@ SP_KNOT_DRAGGING
Definition knot-enums.h:32
Helper class to stream background task notifications as a series of messages.
@ CANVAS_ITEM_CTRL_SHAPE_SQUARE
Abstract base class for events.
Movement of the mouse pointer.
Glib::ustring name
Definition toolbars.cpp:55