Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qohosplatformdrag.cpp
Go to the documentation of this file.
1// Copyright (C) 2025 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include <qohosplatformdrag.h>
5#include <QtCore/private/qohoslogger_p.h>
6#include <QtCore/qobject.h>
7#include <QtGui/private/qguiapplication_p.h>
8#include <QtGui/qdrag.h>
9#include <QtGui/qwindow.h>
10#include <qohosinputmethodeventhandler.h>
11#include <qohosjsmain.h>
12#include <qohosplatformwindow.h>
13#include <qohosutils.h>
14#include <render/qohosview.h>
15
17
18namespace {
19
21{
22public:
24
25protected:
26 bool eventFilter(QObject *watched, QEvent *event) override;
27};
28
29class QOhosPlatformDragImpl : public QOhosPlatformDrag
30{
31public:
34
35 void handlePreDrop() override;
36
37 void updateDropAction(Qt::DropAction dropAction) override;
38
39protected:
40 Qt::DropAction drag(QDrag *drag) override;
41
42private:
43 void startDrag();
44
45 Qt::DropAction m_dropAction = Qt::IgnoreAction;
46 std::shared_ptr<void> m_activeEventFilterHandle;
47};
48
49std::shared_ptr<void> installDragEventFilter()
50{
51 auto eventFilterObject = std::make_shared<DragEventFilterObject>();
52
53 qApp->installEventFilter(eventFilterObject.get());
54
55 return QtOhos::makeDestroyNotifier(
56 [eventFilterObject]() {
57 qApp->removeEventFilter(eventFilterObject.get());
58 });
59}
60
62{
63 QWindow *currentMouseWindow = QGuiApplicationPrivate::currentMouseWindow;
64 auto *touchedWindow = QOhosPlatformIntegration::instance()->inputMethodEventHandler()->lastTouchedWindowOrNull();
65 auto *qWindow = touchedWindow != nullptr ? touchedWindow : currentMouseWindow;
66 if (qWindow != nullptr) {
67 auto *platformWindow = QOhosPlatformWindow::fromQWindowOrNull(qWindow);
68 return platformWindow != nullptr
69 ? platformWindow->ownedViewOrNull()
70 : nullptr;
71 } else {
72 return nullptr;
73 }
74}
75
77
78bool DragEventFilterObject::eventFilter(QObject *, QEvent *event)
79{
80 switch (event->type()) {
81 case QEvent::ShortcutOverride:
82 case QEvent::KeyPress:
83 case QEvent::KeyRelease:
84 case QEvent::MouseMove:
85 case QEvent::MouseButtonRelease:
86 case QEvent::MouseButtonDblClick:
87 case QEvent::Wheel:
88 return true;
89 default:
90 return false;
91 }
92}
93
95
97
99{
100 m_activeEventFilterHandle.reset();
101}
102
103void QOhosPlatformDragImpl::updateDropAction(Qt::DropAction dropAction)
104{
105 m_dropAction = dropAction;
106}
107
109{
110 auto *initiatorView = findInitiatorViewForDragOrNull();
111 if (initiatorView == nullptr || drag == nullptr || drag->mimeData() == nullptr)
112 return Qt::IgnoreAction;
113
114 m_activeEventFilterHandle = installDragEventFilter();
115
116 auto eventLoop = std::make_shared<QEventLoop>();
117
118 m_dropAction = drag->defaultAction();
119
120 auto dragPixmap = !drag->pixmap().isNull() ? drag->pixmap() : QPlatformDrag::defaultPixmap();
121 initiatorView->startDrag(
122 {dragPixmap.toImage()}, drag->hotSpot(),
123 *drag->mimeData(),
124 [this, eventLoop](Qt::DropAction dropAction) {
125 m_dropAction = dropAction;
126 eventLoop->quit();
127 });
128
129 eventLoop->exec();
130
131 m_activeEventFilterHandle.reset();
132
133 return m_dropAction;
134}
135
136}
137
138QOhosPlatformDrag::QOhosPlatformDrag() = default;
139
140QOhosPlatformDrag::~QOhosPlatformDrag() = default;
141
146
147QT_END_NAMESPACE
static QOhosPlatformIntegration * instance()
QOhosInputMethodEventHandler * inputMethodEventHandler() const
bool eventFilter(QObject *watched, QEvent *event) override
Filters events if this object has been installed as an event filter for the watched object.
Qt::DropAction drag(QDrag *drag) override
void updateDropAction(Qt::DropAction dropAction) override
Combined button and popup list for selecting options.
std::shared_ptr< void > installDragEventFilter()
QOhosView * findInitiatorViewForDragOrNull()
std::unique_ptr< QOhosPlatformDrag > makeQOhosPlatformDrag()