Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_delegated_tool.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2013 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7#ifndef __KIS_DELEGATED_TOOL_H
8#define __KIS_DELEGATED_TOOL_H
9
10#include <KoPointerEvent.h>
11#include <KoShape.h>
12
13#include <QLayout>
14#include <QPointer>
15
16#include "canvas/kis_canvas2.h"
19#include "kis_tool.h"
21
22#define PRESS_CONDITION_OM(_event, _mode, _button, _modifier) \
23 (this->mode() == (_mode) && (_event)->button() == (_button) && \
24 ((_event)->modifiers() & (_modifier) || \
25 (_event)->modifiers() == Qt::NoModifier))
26
27template <class BaseClass, class DelegateTool, class ActivationPolicy = NoopActivationPolicy>
28 class KisDelegatedTool : public BaseClass
29{
30public:
32 const QCursor &cursor,
33 DelegateTool *delegateTool)
34 : BaseClass(canvas, cursor),
35 m_localTool(delegateTool)
36 {
37 }
38
39 DelegateTool* localTool() const {
40 return m_localTool.data();
41 }
42
43 void activate(const QSet<KoShape*> &shapes) override
44 {
45 BaseClass::activate(shapes);
46 m_localTool->activate(shapes);
47 ActivationPolicy::onActivate(BaseClass::canvas());
48
49 KisInputManager *inputManager = (static_cast<KisCanvas2*>(BaseClass::canvas()))->globalInputManager();
50 if (inputManager) {
51 inputManager->attachPriorityEventFilter(this);
52 }
53 }
54
55 void deactivate() override
56 {
57 m_localTool->deactivate();
58 BaseClass::deactivate();
59
60 KisInputManager *inputManager = (static_cast<KisCanvas2*>(BaseClass::canvas()))->globalInputManager();
61 if (inputManager) {
62 inputManager->detachPriorityEventFilter(this);
63 }
64 }
65
66 void mousePressEvent(KoPointerEvent *event) override
67 {
69 Qt::LeftButton, Qt::ShiftModifier |
70 Qt::ControlModifier | Qt::AltModifier)) {
71
72 this->setMode(KisTool::PAINT_MODE);
73
74 Q_ASSERT(m_localTool);
75 m_localTool->mousePressEvent(event);
76 }
77 else {
78 BaseClass::mousePressEvent(event);
79 }
80 }
81
83 {
85 Qt::LeftButton, Qt::ShiftModifier |
86 Qt::ControlModifier | Qt::AltModifier)) {
87
88 Q_ASSERT(m_localTool);
89 m_localTool->mouseDoubleClickEvent(event);
90 }
91 else {
92 BaseClass::mouseDoubleClickEvent(event);
93 }
94 }
95
96 void mouseMoveEvent(KoPointerEvent *event) override
97 {
98 Q_ASSERT(m_localTool);
99 m_localTool->mouseMoveEvent(event);
100
101 BaseClass::mouseMoveEvent(event);
102 }
103
104 void mouseReleaseEvent(KoPointerEvent *event) override
105 {
106 if (this->mode() == KisTool::PAINT_MODE && event->button() == Qt::LeftButton) {
107 this->setMode(KisTool::HOVER_MODE);
108
109 Q_ASSERT(m_localTool);
110 m_localTool->mouseReleaseEvent(event);
111 }
112 else {
113 BaseClass::mouseReleaseEvent(event);
114 }
115 }
116
117 void paint(QPainter &painter, const KoViewConverter &converter) override
118 {
119 Q_ASSERT(m_localTool);
120 m_localTool->paint(painter, converter);
121 }
122
124 {
125 QList<QPointer<QWidget>> baseWidgetList =
126 BaseClass::createOptionWidgets();
127 QList<QPointer<QWidget>> localWidgetList =
128 m_localTool->createOptionWidgets();
129
130 if (baseWidgetList.size() > 0
131 && dynamic_cast<KisOptionCollectionWidget *>(
132 baseWidgetList.first().data())) {
133 KisOptionCollectionWidget *baseOptionsWidget =
134 dynamic_cast<KisOptionCollectionWidget *>(
135 baseWidgetList.first().data());
136 for (int i = 0; i < localWidgetList.size(); ++i) {
137 QWidget *widget = localWidgetList[i];
140 widget->windowTitle());
141 const QString sectionName = "section" + QString::number(i);
142 section->appendWidget(sectionName + "Widget", widget);
143 baseOptionsWidget->appendWidget(sectionName, section);
144 }
145 } else {
146 baseWidgetList.append(localWidgetList);
147 }
148 return baseWidgetList;
149 }
150
151protected:
152 QScopedPointer<DelegateTool> m_localTool;
153};
154
155#endif /* __KIS_DELEGATED_TOOL_H */
void paint(QPainter &painter, const KoViewConverter &converter) override
void mouseMoveEvent(KoPointerEvent *event) override
QList< QPointer< QWidget > > createOptionWidgets() override
void mousePressEvent(KoPointerEvent *event) override
void deactivate() override
KisDelegatedTool(KoCanvasBase *canvas, const QCursor &cursor, DelegateTool *delegateTool)
void activate(const QSet< KoShape * > &shapes) override
void mouseReleaseEvent(KoPointerEvent *event) override
void mouseDoubleClickEvent(KoPointerEvent *event) override
DelegateTool * localTool() const
QScopedPointer< DelegateTool > m_localTool
Central object to manage canvas input.
void detachPriorityEventFilter(QObject *filter)
detachPriorityEventFilter
void attachPriorityEventFilter(QObject *filter, int priority=0)
attachPriorityEventFilter
Wrapper class around a KisOptionCollectionWidget that also provide a header with a title label and an...
void appendWidget(const QString &id, QWidget *widget)
Insert the given widget with the given id at the end of the list. The list widget takes ownership of ...
Class providing a list of widgets with some addons such as separators, orientation or individual widg...
void appendWidget(const QString &id, QWidget *widget)
Insert the given widget with the given id at the end of the list. The list widget takes ownership of ...
Qt::MouseButton button() const
return button pressed (see QMouseEvent::button());
#define PRESS_CONDITION_OM(_event, _mode, _button, _modifier)
@ PAINT_MODE
Definition kis_tool.h:300
@ HOVER_MODE
Definition kis_tool.h:299