/
qgslayoutviewtool.h
235 lines (191 loc) · 6.78 KB
/
qgslayoutviewtool.h
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
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
/***************************************************************************
qgslayoutviewtool.h
-------------------
Date : July 2017
Copyright : (C) 2017 Nyall Dawson
Email : nyall dot dawson at gmail dot com
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#ifndef QGSLAYOUTVIEWTOOL_H
#define QGSLAYOUTVIEWTOOL_H
#include "qgis.h"
#include "qgis_gui.h"
#include <QCursor>
#include <QAction>
#include <QPointer>
class QMouseEvent;
class QWheelEvent;
class QKeyEvent;
class QgsLayoutView;
class QgsLayoutViewMouseEvent;
class QgsLayout;
class QgsLayoutItem;
#ifdef SIP_RUN
% ModuleHeaderCode
#include <qgslayoutviewtooladditem.h>
% End
#endif
/**
* \ingroup gui
* Abstract base class for all layout view tools.
* Layout view tools are user interactive tools for manipulating and adding items
* to QgsLayoutView widgets.
* \since QGIS 3.0
*/
class GUI_EXPORT QgsLayoutViewTool : public QObject
{
#ifdef SIP_RUN
SIP_CONVERT_TO_SUBCLASS_CODE
if ( dynamic_cast<QgsLayoutViewToolAddItem *>( sipCpp ) != NULL )
sipType = sipType_QgsLayoutViewToolAddItem;
else
sipType = NULL;
SIP_END
#endif
Q_OBJECT
public:
//! Flags for controlling how a tool behaves
enum Flag
{
FlagSnaps = 1 << 1, //!< Tool utilizes snapped coordinates.
};
Q_DECLARE_FLAGS( Flags, Flag )
~QgsLayoutViewTool() override;
/**
* Returns the current combination of flags set for the tool.
* \see setFlags()
*/
QgsLayoutViewTool::Flags flags() const;
/**
* Mouse move event for overriding. Default implementation does nothing.
*/
virtual void layoutMoveEvent( QgsLayoutViewMouseEvent *event );
/**
* Mouse double-click event for overriding. Default implementation does nothing.
*/
virtual void layoutDoubleClickEvent( QgsLayoutViewMouseEvent *event );
/**
* Mouse press event for overriding. Default implementation does nothing.
* Note that subclasses must ensure that they correctly handle cases
* when a layoutPressEvent is called without a corresponding
* layoutReleaseEvent (e.g. due to tool being changed mid way
* through a press-release operation).
*/
virtual void layoutPressEvent( QgsLayoutViewMouseEvent *event );
/**
* Mouse release event for overriding. Default implementation does nothing.
* Note that subclasses must ensure that they correctly handle cases
* when a layoutPressEvent is called without a corresponding
* layoutReleaseEvent (e.g. due to tool being changed mid way
* through a press-release operation).
*/
virtual void layoutReleaseEvent( QgsLayoutViewMouseEvent *event );
/**
* Mouse wheel event for overriding. Default implementation does nothing.
*/
virtual void wheelEvent( QWheelEvent *event );
/**
* Key press event for overriding. Default implementation does nothing.
*/
virtual void keyPressEvent( QKeyEvent *event );
/**
* Key release event for overriding. Default implementation does nothing.
*/
virtual void keyReleaseEvent( QKeyEvent *event );
/**
* Associates an \a action with this tool. When the setLayoutTool
* method of QgsLayoutView is called the action's state will be set to on.
* Usually this will cause a toolbutton to appear pressed in and
* the previously used toolbutton to pop out.
* \see action()
*/
void setAction( QAction *action );
/**
* Returns the action associated with the tool or nullptr if no action is associated.
* \see setAction()
*/
QAction *action();
/**
* Sets a user defined \a cursor for use when the tool is active.
*/
void setCursor( const QCursor &cursor );
/**
* Called when tool is set as the currently active layout tool.
* Overridden implementations must take care to call the base class implementation.
*/
virtual void activate();
/**
* Called when tool is deactivated.
* Overridden implementations must take care to call the base class implementation.
*/
virtual void deactivate();
/**
* Returns a user-visible, translated name for the tool.
*/
QString toolName() const { return mToolName; }
/**
* Returns the view associated with the tool.
* \see layout()
*/
QgsLayoutView *view() const;
/**
* Returns the layout associated with the tool.
* \see view()
*/
QgsLayout *layout() const;
/**
* Returns a list of items which should be ignored while snapping events
* for this tool.
*/
virtual QList< QgsLayoutItem * > ignoredSnapItems() const;
signals:
/**
* Emitted when the tool is activated.
*/
void activated();
/**
* Emitted when the tool is deactivated.
*/
void deactivated();
/**
* Emitted when an \a item is "focused" by the tool, i.e. it should become the active
* item and should have its properties displayed in any designer windows.
*/
void itemFocused( QgsLayoutItem *item );
protected:
/**
* Sets the combination of \a flags that will be used for the tool.
* \see flags()
*/
void setFlags( const QgsLayoutViewTool::Flags flags );
/**
* Constructor for QgsLayoutViewTool, taking a layout \a view and
* tool \a name as parameters.
*/
QgsLayoutViewTool( QgsLayoutView *view SIP_TRANSFERTHIS, const QString &name );
/**
* Returns true if a mouse press/release operation which started at
* \a startViewPoint and ended at \a endViewPoint should be considered
* a "click and drag". If false is returned, the operation should be
* instead treated as just a click on \a startViewPoint.
*/
bool isClickAndDrag( QPoint startViewPoint, QPoint endViewPoint ) const;
private:
//! Pointer to layout view.
QgsLayoutView *mView = nullptr;
QgsLayoutViewTool::Flags mFlags = nullptr;
//! Cursor used by tool
QCursor mCursor = Qt::ArrowCursor;
//! Optional action associated with tool
QPointer< QAction > mAction;
//! Translated name of the map tool
QString mToolName;
friend class TestQgsLayoutView;
};
#endif // QGSLAYOUTVIEWTOOL_H