Consider visualParent rotation in popupPosition

if there are transforms in the scene, to correctly compute the position the
transform is needed to be accounter for.
QQuickITem::mapRectToScene does consider tranforms.
this adresses bug 345787 where the toolbox may be rotated.

BUG:345787
Change-Id: I13a5509d95a7498382155abf3c3d195708de56a6
This commit is contained in:
Marco Martin 2015-04-02 15:56:38 +02:00
parent 48dd5963d3
commit 6dfc6e38dd
2 changed files with 102 additions and 5 deletions

View File

@ -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) {

View File

@ -0,0 +1,93 @@
/*
* Copyright 2014 Vishesh Handa <vhanda@kde.org>
* Copyright 2015 Marco Martin <mart@kde.org>
*
* 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
}
}
}
}
}