Krita Source Code Documentation
Loading...
Searching...
No Matches
KisInputManager::Private::CanvasSwitcher Class Reference

#include <kis_input_manager_p.h>

+ Inheritance diagram for KisInputManager::Private::CanvasSwitcher:

Public Member Functions

void addCanvas (KisCanvas2 *canvas)
 
 CanvasSwitcher (Private *_d, QObject *p)
 
bool eventFilter (QObject *object, QEvent *event) override
 
void removeCanvas (KisCanvas2 *canvas)
 

Private Member Functions

void setupFocusThreshold (QObject *object)
 

Private Attributes

QMap< QObject *, QPointer< KisCanvas2 > > canvasResolver
 
KisInputManager::Private * d
 
int eatOneMouseStroke
 
KisTimedSignalThreshold focusSwitchThreshold
 
KisSignalAutoConnectionsStore thresholdConnections
 

Detailed Description

Definition at line 82 of file kis_input_manager_p.h.

Constructor & Destructor Documentation

◆ CanvasSwitcher()

KisInputManager::Private::CanvasSwitcher::CanvasSwitcher ( Private * _d,
QObject * p )

Definition at line 92 of file kis_input_manager_p.cpp.

93 : QObject(p),
94 d(_d),
95 eatOneMouseStroke(false),
97{
98}
const Params2D p
static const int InputWidgetsThreshold

Member Function Documentation

◆ addCanvas()

void KisInputManager::Private::CanvasSwitcher::addCanvas ( KisCanvas2 * canvas)

Definition at line 109 of file kis_input_manager_p.cpp.

110{
111 if (!canvas) return;
112
113 QObject *canvasWidget = canvas->canvasWidget();
114
115 if (!canvasResolver.contains(canvasWidget)) {
116 canvasResolver.insert(canvasWidget, canvas);
117 } else {
118 // just a sanity cheek to find out if we are
119 // trying to add two canvases concurrently.
121 }
122
123 if (canvas != d->canvas) {
124 d->q->setupAsEventFilter(canvasWidget);
125 canvasWidget->installEventFilter(this);
126
127 setupFocusThreshold(canvasWidget);
129
130 d->canvas = canvas;
131 d->toolProxy = qobject_cast<KisToolProxy*>(canvas->toolProxy());
132 }
133}
QMap< QObject *, QPointer< KisCanvas2 > > canvasResolver
QPointer< KisToolProxy > toolProxy
QPointer< KisCanvas2 > canvas
void setupAsEventFilter(QObject *receiver)
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
Definition kis_assert.h:130

References KisInputManager::Private::canvas, KisInputManager::d, KIS_SAFE_ASSERT_RECOVER_NOOP, KisInputManager::Private::q, KisInputManager::setupAsEventFilter(), and KisInputManager::Private::toolProxy.

◆ eventFilter()

bool KisInputManager::Private::CanvasSwitcher::eventFilter ( QObject * object,
QEvent * event )
override

Definition at line 176 of file kis_input_manager_p.cpp.

177{
178 if (canvasResolver.contains(object)) {
179 switch (event->type()) {
180 case QEvent::FocusIn: {
181 QFocusEvent *fevent = static_cast<QFocusEvent*>(event);
182 KisCanvas2 *canvas = canvasResolver.value(object);
183
184 // only relevant canvases from the same main window should be
185 // registered in the switcher
187
188 if (canvas != d->canvas) {
189 eatOneMouseStroke = 2 * (fevent->reason() == Qt::MouseFocusReason);
190 }
191
192 d->canvas = canvas;
193 d->toolProxy = qobject_cast<KisToolProxy*>(canvas->toolProxy());
194
195 d->q->setupAsEventFilter(object);
196
197 object->removeEventFilter(this);
198 object->installEventFilter(this);
199
200 setupFocusThreshold(object);
202
203 const QPoint globalPos = QCursor::pos();
204 const QPoint localPos = d->canvas->canvasWidget()->mapFromGlobal(globalPos);
205 QWidget *canvasWindow = d->canvas->canvasWidget()->window();
206 const QPoint windowsPos = canvasWindow ? canvasWindow->mapFromGlobal(globalPos) : localPos;
207
208 QEnterEvent event(localPos, windowsPos, globalPos);
209 d->q->eventFilter(object, &event);
210 break;
211 }
212 case QEvent::FocusOut: {
214 break;
215 }
216 case QEvent::Enter: {
217 break;
218 }
219 case QEvent::Leave: {
221 break;
222 }
223 case QEvent::Wheel: {
224 QWidget *widget = static_cast<QWidget*>(object);
225 widget->setFocus();
226 break;
227 }
228 case QEvent::MouseButtonPress:
229 case QEvent::MouseButtonRelease:
230 case QEvent::TabletPress:
231 case QEvent::TabletRelease:
233
234 if (eatOneMouseStroke) {
236 return true;
237 }
238 break;
239 case QEvent::MouseButtonDblClick:
241 if (eatOneMouseStroke) {
242 return true;
243 }
244 break;
245 case QEvent::MouseMove:
246 case QEvent::TabletMove: {
247 QWidget *widget = static_cast<QWidget*>(object);
248
249 if (!widget->hasFocus()) {
250 const int delay =
251 isInputWidget(QApplication::focusWidget()) ?
253
256 }
257 }
258 break;
259 default:
260 break;
261 }
262 }
263 return QObject::eventFilter(object, event);
264}
bool eventFilter(QObject *object, QEvent *event) override
void setDelayThreshold(int delay, int cancelDelay=-1)
#define KIS_SAFE_ASSERT_RECOVER_BREAK(cond)
Definition kis_assert.h:127
static const int OtherWidgetsThreshold
bool isInputWidget(QWidget *w)

References KisInputManager::Private::canvas, KisInputManager::d, KisInputManager::eventFilter(), InputWidgetsThreshold, isInputWidget(), KIS_SAFE_ASSERT_RECOVER_BREAK, OtherWidgetsThreshold, KisInputManager::Private::q, KisInputManager::setupAsEventFilter(), and KisInputManager::Private::toolProxy.

◆ removeCanvas()

void KisInputManager::Private::CanvasSwitcher::removeCanvas ( KisCanvas2 * canvas)

Definition at line 135 of file kis_input_manager_p.cpp.

136{
137 QObject *widget = canvas->canvasWidget();
138
139 canvasResolver.remove(widget);
140
141 if (d->eventsReceiver == widget) {
143 }
144
145 widget->removeEventFilter(this);
146
147 if (d->canvas == canvas) {
148 d->canvas = 0;
149 d->toolProxy = 0;
150 }
151}

References KisInputManager::Private::canvas, KisInputManager::d, KisInputManager::Private::eventsReceiver, KisInputManager::Private::q, KisInputManager::setupAsEventFilter(), and KisInputManager::Private::toolProxy.

◆ setupFocusThreshold()

void KisInputManager::Private::CanvasSwitcher::setupFocusThreshold ( QObject * object)
private

Definition at line 100 of file kis_input_manager_p.cpp.

101{
102 QWidget *widget = qobject_cast<QWidget*>(object);
104
106 thresholdConnections.addConnection(&focusSwitchThreshold, SIGNAL(timeout()), widget, SLOT(setFocus()));
107}
KisSignalAutoConnectionsStore thresholdConnections
void addConnection(Sender sender, Signal signal, Receiver receiver, Method method, Qt::ConnectionType type=Qt::AutoConnection)
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128

References KIS_SAFE_ASSERT_RECOVER_RETURN.

Member Data Documentation

◆ canvasResolver

QMap<QObject*, QPointer<KisCanvas2> > KisInputManager::Private::CanvasSwitcher::canvasResolver
private

Definition at line 95 of file kis_input_manager_p.h.

◆ d

KisInputManager::Private* KisInputManager::Private::CanvasSwitcher::d
private

Definition at line 94 of file kis_input_manager_p.h.

◆ eatOneMouseStroke

int KisInputManager::Private::CanvasSwitcher::eatOneMouseStroke
private

Definition at line 96 of file kis_input_manager_p.h.

◆ focusSwitchThreshold

KisTimedSignalThreshold KisInputManager::Private::CanvasSwitcher::focusSwitchThreshold
private

Definition at line 97 of file kis_input_manager_p.h.

◆ thresholdConnections

KisSignalAutoConnectionsStore KisInputManager::Private::CanvasSwitcher::thresholdConnections
private

Definition at line 98 of file kis_input_manager_p.h.


The documentation for this class was generated from the following files: