Change in plasma-framework[master]: Consider visualParent rotation in popupPosition

Marco Martin (Code Review) noreply at kde.org
Thu Apr 2 14:52:24 UTC 2015


Marco Martin has uploaded a new change for review.

  https://gerrit.vesnicky.cesnet.cz/r/438

Change subject: Consider visualParent rotation in popupPosition
......................................................................

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
---
M src/plasmaquick/dialog.cpp
A tests/dialog_positioning_parentrotated.qml
2 files changed, 102 insertions(+), 5 deletions(-)


  git pull ssh://gerrit.vesnicky.cesnet.cz:29418/plasma-framework refs/changes/38/438/1

diff --git a/src/plasmaquick/dialog.cpp b/src/plasmaquick/dialog.cpp
index cdf78eb..2166880 100644
--- a/src/plasmaquick/dialog.cpp
+++ b/src/plasmaquick/dialog.cpp
@@ -829,19 +829,23 @@
     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 0000000..34e95c7
--- /dev/null
+++ b/tests/dialog_positioning_parentrotated.qml
@@ -0,0 +1,93 @@
+/*
+ *   Copyright 2014 Vishesh Handa <vhanda at kde.org>
+ *   Copyright 2015 Marco Martin <mart at 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
+                }
+            }
+        }
+    }
+}

-- 
To view, visit https://gerrit.vesnicky.cesnet.cz/r/438
To unsubscribe, visit https://gerrit.vesnicky.cesnet.cz/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I13a5509d95a7498382155abf3c3d195708de56a6
Gerrit-PatchSet: 1
Gerrit-Project: plasma-framework
Gerrit-Branch: master
Gerrit-Owner: Marco Martin <notmart at gmail.com>
Gerrit-Reviewer: David Edmundson <david at davidedmundson.co.uk>
Gerrit-Reviewer: Kevin Ottens <ervin at kde.org>


More information about the Plasma-devel mailing list