Skip to content

Commit

Permalink
Handle ignored drag events in OpenGLWindow like Qt does it in QWidget…
Browse files Browse the repository at this point in the history
…Window
  • Loading branch information
daschuer committed May 5, 2024
1 parent b75d63b commit a2b1867
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 7 deletions.
42 changes: 35 additions & 7 deletions src/widget/openglwindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@
#include "widget/wglwidget.h"

OpenGLWindow::OpenGLWindow(WGLWidget* pWidget)
: m_pWidget(pWidget) {
: m_pWidget(pWidget),
m_pTrackDropTarget(nullptr) {
setFormat(WaveformWidgetFactory::getSurfaceFormat());
}

Expand Down Expand Up @@ -66,19 +67,46 @@ bool OpenGLWindow::event(QEvent* pEv) {
if (t == QEvent::MouseMove) {
ToolTipQOpenGL::singleton().start(
m_pWidget, dynamic_cast<QMouseEvent*>(pEv)->globalPos());
return result;
}

if (t == QEvent::Leave) {
ToolTipQOpenGL::singleton().stop();
return result;
}

// Drag & Drop events are not delivered correctly when using QApplication::sendEvent
// and even result in a recursive call to this method, so we use our own mechanism.

if (t == QEvent::DragEnter) {
DEBUG_ASSERT(!m_pTrackDropTarget);
TrackDropTarget* pTrackDropTarget = m_pWidget->trackDropTarget();
if (pTrackDropTarget) {
bool ret = pTrackDropTarget->handleDragAndDropEventFromWindow(pEv);
if (pEv->isAccepted()) {
m_pTrackDropTarget = pTrackDropTarget;
}
return ret;
}
pEv->ignore();
return false; // clazy:exclude=base-class-event
}

if (t == QEvent::DragEnter || t == QEvent::DragMove ||
t == QEvent::DragLeave || t == QEvent::Drop) {
// Drag & Drop events are not delivered correctly when using QApplication::sendEvent
// and even result in a recursive call to this method, so we use our own mechanism.
if (m_pWidget->trackDropTarget()) {
return m_pWidget->trackDropTarget()->handleDragAndDropEventFromWindow(pEv);
if (t == QEvent::DragMove) {
if (m_pTrackDropTarget) {
bool ret = m_pTrackDropTarget->handleDragAndDropEventFromWindow(pEv);
return ret;
}
pEv->ignore();
return false; // clazy:exclude=base-class-event
}

if (t == QEvent::DragLeave || t == QEvent::Drop) {
if (m_pTrackDropTarget) {
bool ret = m_pTrackDropTarget->handleDragAndDropEventFromWindow(pEv);
m_pTrackDropTarget = nullptr;
return ret;
}
pEv->ignore();
return false; // clazy:exclude=base-class-event
}
Expand Down
2 changes: 2 additions & 0 deletions src/widget/openglwindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include <QOpenGLWindow>

class WGLWidget;
class TrackDropTarget;

/// Helper class used by wglwidgetqopengl

Expand All @@ -22,4 +23,5 @@ class OpenGLWindow : public QOpenGLWindow {
bool event(QEvent* pEv) override;

WGLWidget* m_pWidget;
TrackDropTarget* m_pTrackDropTarget;
};

0 comments on commit a2b1867

Please sign in to comment.