diff --git a/declarativeimports/core/dialog.cpp b/declarativeimports/core/dialog.cpp index d47ab1329..dddcb9fd4 100644 --- a/declarativeimports/core/dialog.cpp +++ b/declarativeimports/core/dialog.cpp @@ -95,6 +95,71 @@ void Dialog::updatePopUpEnabledBorders() } } +QPoint Dialog::popupPosition(QQuickItem *item, const QSize &size) +{ + auto visualparent = item; + + if (visualparent && visualparent->window() && visualparent->window()->screen()) { + updatePopUpEnabledBorders(); + + QPointF parenttopleftf = visualparent->mapToGlobal(QPointF(0, 0)); + QPoint parenttopleft = parenttopleftf.toPoint(); + QScreen *screen = visualparent->window()->screen(); + QRect screengeometry = screen->geometry(); + + int x = 0; + int y = 0; + + if (m_edge == Plasma::Types::LeftEdge || m_edge == Plasma::Types::RightEdge) { + y = parenttopleft.y() + (visualparent->height()/2) - (size.height()/2); + } else { + x = parenttopleft.x() + (visualparent->width()/2) - (size.width()/2); + } + + int popupmargin = qMax(0, appletsPopUpMargin()); + + if (m_edge == Plasma::Types::LeftEdge) { + x = parenttopleft.x() + visualparent->width() + popupmargin; + } else if (m_edge == Plasma::Types::RightEdge) { + x = parenttopleft.x() - size.width() - popupmargin; + } else if (m_edge == Plasma::Types::TopEdge) { + y = parenttopleft.y() + visualparent->height() + popupmargin; + } else { // bottom case + y = parenttopleft.y() - size.height() - popupmargin; + } + + x = qBound(screengeometry.x(), x, screengeometry.right()-1); + y = qBound(screengeometry.y(), y, screengeometry.bottom()-1); + + QRect appletslayoutgeometry = appletsLayoutGeometryFromContainment(); + + if (isRespectingAppletsLayoutGeometry() && !appletslayoutgeometry.isEmpty()) { + QPoint appletsglobaltopleft = visualparent->window()->mapToGlobal(appletslayoutgeometry.topLeft()); + + QRect appletsglobalgeometry(appletsglobaltopleft.x(), appletsglobaltopleft.y(), appletslayoutgeometry.width(), appletslayoutgeometry.height()); + + if (m_edge == Plasma::Types::LeftEdge || m_edge == Plasma::Types::RightEdge) { + int bottomy = appletsglobalgeometry.bottom()-size.height(); + + if (appletsglobalgeometry.height() >= size.height()) { + y = qBound(appletsglobalgeometry.y(), y, bottomy + 1); + } + } else { + int rightx = appletsglobalgeometry.right()-size.width(); + + if (appletsglobalgeometry.width() >= size.width()) { + x = qBound(appletsglobalgeometry.x(), x, rightx + 1); + } + } + } + + return QPoint(x,y); + } + + return PlasmaQuick::Dialog::popupPosition(item, size); +} + +/* void Dialog::adjustGeometry(const QRect &geom) { auto visualparent = visualParent(); @@ -160,7 +225,7 @@ void Dialog::adjustGeometry(const QRect &geom) PlasmaQuick::Dialog::adjustGeometry(geom); } - +*/ bool Dialog::event(QEvent *e) { diff --git a/declarativeimports/core/dialog.h b/declarativeimports/core/dialog.h index b1ee5a47a..68ab5e30d 100644 --- a/declarativeimports/core/dialog.h +++ b/declarativeimports/core/dialog.h @@ -46,12 +46,14 @@ public: Plasma::Types::Location edge() const; void setEdge(const Plasma::Types::Location &edge); + QPoint popupPosition(QQuickItem *item, const QSize &size) override; + signals: void containsMouseChanged(); void edgeChanged(); protected: - void adjustGeometry(const QRect &geom) override; + // void adjustGeometry(const QRect &geom) override; bool event(QEvent *e) override;