[kde-workspace/frameworks-scratch] plasma/desktop/containments/desktop/package/contents/ui: crashes--: Rework applet handle anchoring

Sebastian Kügler sebas at kde.org
Sat Sep 21 02:55:58 UTC 2013


Git commit 3f050cea05e2a6a6f746998f26c76222a99d055f by Sebastian Kügler.
Committed on 21/09/2013 at 02:40.
Pushed by sebas into branch 'frameworks-scratch'.

crashes--: Rework applet handle anchoring

Use a property to track the parent item. This makes it easier to do the
re-anchoring of the applet handle on size changes. One effect is that
property bindings are apparently triggered in a more deterministic way.
A nice side effect is that this simplifies the code a bit.
Lesson: be *very* careful when swapping out individual properties in
javascript code, rather rely more on property bindings to do the work
for you.

IOW: This fixes a nasty crasher in the applet handle.

CCMAIL:plasma-devel at kde.org

M  +2    -1    plasma/desktop/containments/desktop/package/contents/ui/AppletAppearance.qml
M  +15   -22   plasma/desktop/containments/desktop/package/contents/ui/AppletHandle.qml

http://commits.kde.org/kde-workspace/3f050cea05e2a6a6f746998f26c76222a99d055f

diff --git a/plasma/desktop/containments/desktop/package/contents/ui/AppletAppearance.qml b/plasma/desktop/containments/desktop/package/contents/ui/AppletAppearance.qml
index 7d10595..257adff 100644
--- a/plasma/desktop/containments/desktop/package/contents/ui/AppletAppearance.qml
+++ b/plasma/desktop/containments/desktop/package/contents/ui/AppletAppearance.qml
@@ -63,7 +63,8 @@ Item {
     visible: false
 
     onHeightChanged: {
-        if (appletHandle.source != "") {
+        if (appletHandle.source != "" && appletHandle.visible) {
+            print("updateHeight");
             appletHandle.item.updateHeight();
         }
         //print("handleMerged : " + appletItem.handleMerged + " min, height " + mini + ", " + appletHandle.height);
diff --git a/plasma/desktop/containments/desktop/package/contents/ui/AppletHandle.qml b/plasma/desktop/containments/desktop/package/contents/ui/AppletHandle.qml
index 3817083..7274079 100644
--- a/plasma/desktop/containments/desktop/package/contents/ui/AppletHandle.qml
+++ b/plasma/desktop/containments/desktop/package/contents/ui/AppletHandle.qml
@@ -26,63 +26,56 @@ import "plasmapackage:/code/LayoutManager.js" as LayoutManager
 Item {
     id: appletHandle
 
-    //z: dragMouseArea.z + 1
     opacity: appletItem.controlsOpacity
     width: appletItem.handleWidth
     height: appletItem.handleHeight
+    //z: dragMouseArea.z + 1
 
     property int buttonMargin: 6
     property int minimumHeight:  6 * (root.iconSize + buttonMargin)
+    property Item buttonsParent: appletHandle
 
     signal removeApplet
 
     function updateHeight() {
-        // Does the handle's height fit into the frame?
         var mini = appletHandle.minimumHeight + margins.top + margins.bottom;
-        //print(" = == = = == updateHeight mini:" + mini)
         if (height > mini) {
             appletItem.handleMerged = true;
-//             print("merged handle");
             height = appletItem.handleMerged ? appletItem.height : minimumHeight
-            //print(" height: " + height);
-            buttonColumn.anchors.right = appletHandle.right;
-        } else {
+            buttonsParent = appletHandle;
+        } else if (appletItem.handleMerged) {
             appletItem.handleMerged = false;
-//             print("separate handle");
-            //appletHandle.anchors.right = appletHandle.parent.right;
-            buttonColumn.anchors.verticalCenter = appletItem.verticalCenter;
-            buttonColumn.anchors.top = noBackgroundHandle.top
-            buttonColumn.anchors.bottom = noBackgroundHandle.bottom
-            buttonColumn.anchors.right = noBackgroundHandle.right
+            buttonsParent = noBackgroundHandle;
         }
     }
     PlasmaCore.FrameSvgItem {
         id: noBackgroundHandle
 
         width: handleWidth + margins.left + margins.right - 4
-        height: handleMerged ? appletItem.handleHeight + noBackgroundHandle.margins.top + noBackgroundHandle.margins.bottom : appletItem.handleHeight
-        visible: opacity > 0
+        height: (backgroundHints != "NoBackground") ? appletItem.handleHeight : appletItem.handleHeight + noBackgroundHandle.margins.top + noBackgroundHandle.margins.bottom
+        visible: controlsOpacity > 0
         z: plasmoidBackground.z - 10
 
         anchors {
-            verticalCenter: parent.verticalCenter
-            left: parent.right
+            verticalCenter: buttonsParent.verticalCenter
+            left: buttonsParent.right
             leftMargin: handleMerged ? ((1-controlsOpacity) * appletItem.handleWidth) * -1 - appletItem.handleWidth * 2 + 2 : ((1-controlsOpacity) * appletItem.handleWidth) * -1 - appletItem.handleWidth
         }
-        opacity: (backgroundHints == "NoBackground" || !handleMerged) ? controlsOpacity : 0
         smooth: true
         imagePath: (backgroundHints == "NoBackground" || !handleMerged) ? "widgets/background" : ""
-        Rectangle { color: Qt.rgba(0,0,0,0); border.width: 3; border.color: "orange"; opacity: 1; visible: debug; anchors.fill: parent; }
+        //Rectangle { color: Qt.rgba(0,0,0,0); border.width: 3; border.color: "orange"; opacity: 1; visible: debug; anchors.fill: parent; }
     }
 
     Column {
         id: buttonColumn
         width: handleWidth
+        parent: buttonsParent
         anchors {
             top: parent.top
-            topMargin: (!appletItem.hasBackground) ? noBackgroundHandle.margins.top : appletItem.margins.top
-            bottomMargin: appletItem.margins.bottom
-            right: appletItem.handleMerged ? parent.right : noBackgroundHandle.right
+            topMargin: (!appletItem.hasBackground || !handleMerged) ? noBackgroundHandle.margins.top : appletItem.margins.top
+            bottom: parent.bottom
+            bottomMargin: (!appletItem.hasBackground && !handleMerged) ? noBackgroundHandle.margins.bottom : appletItem.margins.bottom
+            right: parent.right
             rightMargin: appletItem.handleMerged ? -buttonMargin : noBackgroundHandle.margins.right - buttonMargin
         }
         spacing: buttonMargin*2



More information about the Plasma-devel mailing list