diff --git a/src/plasmaquick/dialog.cpp b/src/plasmaquick/dialog.cpp index cdf78eb02..216688025 100644 --- a/src/plasmaquick/dialog.cpp +++ b/src/plasmaquick/dialog.cpp @@ -829,19 +829,23 @@ QPoint Dialog::popupPosition(QQuickItem *item, const QSize &size) if (outsideParentWindow) { parentGeometryBounds = item->window()->geometry(); } else { - parentGeometryBounds = QRect(pos.toPoint(), QSize(item->width(), item->height())); + parentGeometryBounds = item->mapRectToScene(item->boundingRect()).toRect(); + if (item->window()) { + parentGeometryBounds.moveTopLeft(item->window()->mapToGlobal(parentGeometryBounds.topLeft())); + pos = parentGeometryBounds.topLeft(); + } } - const QPoint topPoint(pos.x() + (item->boundingRect().width() - size.width()) / 2, + const QPoint topPoint(pos.x() + (item->mapRectToScene(item->boundingRect()).width() - size.width()) / 2, parentGeometryBounds.top() - size.height()); - const QPoint bottomPoint(pos.x() + (item->boundingRect().width() - size.width()) / 2, + const QPoint bottomPoint(pos.x() + (item->mapRectToScene(item->boundingRect()).width() - size.width()) / 2, parentGeometryBounds.bottom()); const QPoint leftPoint(parentGeometryBounds.left() - size.width(), - pos.y() + (item->boundingRect().height() - size.height()) / 2); + pos.y() + (item->mapRectToScene(item->boundingRect()).height() - size.height()) / 2); const QPoint rightPoint(parentGeometryBounds.right(), - pos.y() + (item->boundingRect().height() - size.height()) / 2); + pos.y() + (item->mapRectToScene(item->boundingRect()).height() - size.height()) / 2); QPoint dialogPos; if (d->location == Plasma::Types::TopEdge) { diff --git a/tests/dialog_positioning_parentrotated.qml b/tests/dialog_positioning_parentrotated.qml new file mode 100644 index 000000000..34e95c72d --- /dev/null +++ b/tests/dialog_positioning_parentrotated.qml @@ -0,0 +1,93 @@ +/* + * Copyright 2014 Vishesh Handa + * Copyright 2015 Marco Martin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +import QtQuick 2.0 + +import QtQuick.Controls 1.1 as Controls +import QtQuick.Layouts 1.1 + +import org.kde.plasma.core 2.0 as PlasmaCore +import org.kde.plasma.components 2.0 as PlasmaComponents +import org.kde.plasma.extras 2.0 as PlasmaExtras + +ColumnLayout +{ + height: units.gridUnit * 20 + Controls.Label { + id: label + text: "Press the buttom and make sure the popup is on the correct place" + wrapMode: Text.WordWrap + } + PlasmaComponents.Button { + id: settingsButton + iconSource: "configure" + text: "Press Me" + Layout.alignment: Qt.AlignHCenter + rotation: 90 + + onClicked: { + contextMenu.visible = !contextMenu.visible; + } + } + + PlasmaCore.Dialog { + id: contextMenu + visualParent: settingsButton + + location: PlasmaCore.Types.BottomEdge + type: PlasmaCore.Dialog.PopupMenu + flags: Qt.Popup | Qt.FramelessWindowHint | Qt.WindowDoesNotAcceptFocus + + mainItem: ColumnLayout { + id: menuColumn + Layout.minimumWidth: menuColumn.implicitWidth + Layout.minimumHeight: menuColumn.implicitHeight + spacing: units.smallSpacing + + PlasmaExtras.Heading { + level: 3 + text: "Panel Alignment" + } + + PlasmaComponents.ButtonColumn { + spacing: 0 + Layout.fillWidth: true + PlasmaComponents.ToolButton { + anchors { + left: parent.left + right: parent.right + } + text: "Left" + checkable: true + flat: false + } + PlasmaComponents.ToolButton { + anchors { + left: parent.left + right: parent.right + } + text: "Center" + checkable: true + flat: false + } + } + } + } +}