From f56363c161e2e468422928fb1e3c829a0e6d5284 Mon Sep 17 00:00:00 2001 From: Marco Martin Date: Tue, 21 Oct 2014 12:36:32 +0200 Subject: [PATCH 1/2] prototype for forwarding screen edge fake events we need a visual margin in panels, but still manage screen edges: just forward events at screen edges to the proper area hardcoded for now, needs to take info from qml --- shell/panelview.cpp | 54 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/shell/panelview.cpp b/shell/panelview.cpp index 9260c184e..89c975766 100644 --- a/shell/panelview.cpp +++ b/shell/panelview.cpp @@ -671,6 +671,60 @@ bool PanelView::event(QEvent *e) m_unhideTimer.start(); } } + + switch (e->type()) { + case QEvent::MouseMove: + case QEvent::MouseButtonPress: + case QEvent::MouseButtonRelease: { + QMouseEvent *me = static_cast(e); + + if (me->pos().y() < 5) { + QMouseEvent me2(me->type(), QPoint(me->localPos().x(), 15), QPoint(me->windowPos().x(), 15), QPoint(me->screenPos().x(), y()+15), me->button(), me->buttons(), me->modifiers()); + + QCoreApplication::sendEvent(this, &me2); + return true; + } + break; + } + + case QEvent::DragEnter: { + QDragEnterEvent *de = static_cast(e); + if (de->pos().y() < 5) { + QDragEnterEvent de2(QPoint(de->pos().x(), 15), de->possibleActions(), de->mimeData(), de->mouseButtons(), de->keyboardModifiers()); + + QCoreApplication::sendEvent(this, &de2); + return true; + } + break; + } + //DragLeave just works + case QEvent::DragLeave: + break; + case QEvent::DragMove: { + QDragMoveEvent *de = static_cast(e); + if (de->pos().y() < 5) { + QDragMoveEvent de2(QPoint(de->pos().x(), 15), de->possibleActions(), de->mimeData(), de->mouseButtons(), de->keyboardModifiers()); + + QCoreApplication::sendEvent(this, &de2); + return true; + } + break; + } + case QEvent::Drop: { + QDropEvent *de = static_cast(e); + if (de->pos().y() < 5) { + QDropEvent de2(QPoint(de->pos().x(), 15), de->possibleActions(), de->mimeData(), de->mouseButtons(), de->keyboardModifiers()); + + QCoreApplication::sendEvent(this, &de2); + return true; + } + break; + } + + default: + break; + } + return View::event(e); } From bd0673a7e8b4c14dea2942842a147edb12c1aaab Mon Sep 17 00:00:00 2001 From: Marco Martin Date: Tue, 21 Oct 2014 13:40:11 +0200 Subject: [PATCH 2/2] proper event translation for all panel locations --- shell/panelview.cpp | 48 +++++++++++++++++++++++++++++++++++++-------- shell/panelview.h | 2 ++ 2 files changed, 42 insertions(+), 8 deletions(-) diff --git a/shell/panelview.cpp b/shell/panelview.cpp index 89c975766..8148ccd35 100644 --- a/shell/panelview.cpp +++ b/shell/panelview.cpp @@ -678,8 +678,12 @@ bool PanelView::event(QEvent *e) case QEvent::MouseButtonRelease: { QMouseEvent *me = static_cast(e); - if (me->pos().y() < 5) { - QMouseEvent me2(me->type(), QPoint(me->localPos().x(), 15), QPoint(me->windowPos().x(), 15), QPoint(me->screenPos().x(), y()+15), me->button(), me->buttons(), me->modifiers()); + if (!containmentContainsPosition(me->windowPos())) { + QMouseEvent me2(me->type(), + positionAdjustedForContainment(me->windowPos()), + positionAdjustedForContainment(me->windowPos()), + positionAdjustedForContainment(me->windowPos()) + position(), + me->button(), me->buttons(), me->modifiers()); QCoreApplication::sendEvent(this, &me2); return true; @@ -689,8 +693,9 @@ bool PanelView::event(QEvent *e) case QEvent::DragEnter: { QDragEnterEvent *de = static_cast(e); - if (de->pos().y() < 5) { - QDragEnterEvent de2(QPoint(de->pos().x(), 15), de->possibleActions(), de->mimeData(), de->mouseButtons(), de->keyboardModifiers()); + if (!containmentContainsPosition(de->pos())) { + QDragEnterEvent de2(positionAdjustedForContainment(de->pos()).toPoint(), + de->possibleActions(), de->mimeData(), de->mouseButtons(), de->keyboardModifiers()); QCoreApplication::sendEvent(this, &de2); return true; @@ -702,8 +707,9 @@ bool PanelView::event(QEvent *e) break; case QEvent::DragMove: { QDragMoveEvent *de = static_cast(e); - if (de->pos().y() < 5) { - QDragMoveEvent de2(QPoint(de->pos().x(), 15), de->possibleActions(), de->mimeData(), de->mouseButtons(), de->keyboardModifiers()); + if (!containmentContainsPosition(de->pos())) { + QDragMoveEvent de2(positionAdjustedForContainment(de->pos()).toPoint(), + de->possibleActions(), de->mimeData(), de->mouseButtons(), de->keyboardModifiers()); QCoreApplication::sendEvent(this, &de2); return true; @@ -712,8 +718,9 @@ bool PanelView::event(QEvent *e) } case QEvent::Drop: { QDropEvent *de = static_cast(e); - if (de->pos().y() < 5) { - QDropEvent de2(QPoint(de->pos().x(), 15), de->possibleActions(), de->mimeData(), de->mouseButtons(), de->keyboardModifiers()); + if (!containmentContainsPosition(de->pos())) { + QDropEvent de2(positionAdjustedForContainment(de->pos()).toPoint(), + de->possibleActions(), de->mimeData(), de->mouseButtons(), de->keyboardModifiers()); QCoreApplication::sendEvent(this, &de2); return true; @@ -728,6 +735,31 @@ bool PanelView::event(QEvent *e) return View::event(e); } +bool PanelView::containmentContainsPosition(const QPointF &point) +{ + QQuickItem *containmentItem = containment()->property("_plasma_graphicObject").value(); + + if (!containmentItem) { + return false; + } + + return QRectF(containmentItem->mapToScene(QPoint(0,0)), QSizeF(containmentItem->width(), containmentItem->height())).contains(point); +} + +QPointF PanelView::positionAdjustedForContainment(const QPointF &point) +{ + QQuickItem *containmentItem = containment()->property("_plasma_graphicObject").value(); + + if (!containmentItem) { + return point; + } + + QRectF containmentRect(containmentItem->mapToScene(QPoint(0,0)), QSizeF(containmentItem->width(), containmentItem->height())); + + return QPointF(qBound(containmentRect.left() + 2, point.x(), containmentRect.right() - 2), + qBound(containmentRect.top() + 2, point.y(), containmentRect.bottom() - 2)); +} + void PanelView::updateMask() { if (KWindowSystem::compositingActive()) { diff --git a/shell/panelview.h b/shell/panelview.h index 51c76f852..c9cf86339 100644 --- a/shell/panelview.h +++ b/shell/panelview.h @@ -165,6 +165,8 @@ private Q_SLOTS: private: void integrateScreen(); + bool containmentContainsPosition(const QPointF &point); + QPointF positionAdjustedForContainment(const QPointF &point); int m_offset; int m_maxLength;