[gnome-shell] Fix resizing problems with DashDocDisplay



commit 9afb09128b21c4bf48f9ce491d6d9dbca8fb3b40
Author: Owen W. Taylor <otaylor fishsoup net>
Date:   Tue Feb 2 18:33:16 2010 -0500

    Fix resizing problems with DashDocDisplay
    
    - Handle non-uniform child heights properly - use a constant
      grid size as the maximum of all child heights; with the
      previous code, the children might not line up in the two
      columns and the last item could be lost if the second column
      was taller than the first column.
    
    - Call set_skip_paint(child, false) on children that we do
      want visible to override any previous hiding of that child.
    
    - Correctly handle the DashDocDisplay not being allocated at 0, 0;
      children should be allocated starting at 0, 0, not at origin
      of the allocation box passed in.
    
    - Remove an unused skipPaint variable.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=608801

 js/ui/docDisplay.js |   52 +++++++++++++++++++++++++-------------------------
 1 files changed, 26 insertions(+), 26 deletions(-)
---
diff --git a/js/ui/docDisplay.js b/js/ui/docDisplay.js
index 57a8009..1e0e97a 100644
--- a/js/ui/docDisplay.js
+++ b/js/ui/docDisplay.js
@@ -357,34 +357,37 @@ DashDocDisplay.prototype = {
     _getPreferredHeight: function(actor, forWidth, alloc) {
         let children = actor.get_children();
 
-        // Two columns, where we go vertically down first.  So just take
-        // the height of half of the children as our preferred height.
-
-        let firstColumnChildren = Math.ceil(children.length / 2);
+        // The width of an item is our allocated width, minus spacing, divided in half.
+        this._itemWidth = Math.floor((forWidth - DEFAULT_SPACING) / 2);
 
-        let natural = 0;
-        for (let i = 0; i < firstColumnChildren; i++) {
+        let maxNatural = 0;
+        for (let i = 0; i < children.length; i++) {
             let child = children[i];
-            let [minSize, naturalSize] = child.get_preferred_height(-1);
-            natural += naturalSize;
-
-            if (i > 0 && i < children.length - 1) {
-                natural += DEFAULT_SPACING;
-            }
+            let [minSize, naturalSize] = child.get_preferred_height(this._itemWidth);
+            maxNatural = Math.max(maxNatural, naturalSize);
         }
-        alloc.natural_size = natural;
+
+        this._itemHeight = maxNatural;
+
+        let firstColumnChildren = Math.ceil(children.length / 2);
+        alloc.natural_size = (firstColumnChildren * maxNatural +
+                              (firstColumnChildren - 1) * DEFAULT_SPACING);
     },
 
     _allocate: function(actor, box, flags) {
         let width = box.x2 - box.x1;
         let height = box.y2 - box.y1;
 
+        // Make sure this._itemWidth/Height have been computed, even
+        // if the parent actor didn't check our size before allocating.
+        // (Not clear if that is required or not as a Clutter
+        // invariant; this is safe and cheap because of caching.)
+        actor.get_preferred_height(width);
+
         let children = actor.get_children();
 
-        // The width of an item is our allocated width, minus spacing, divided in half.
-        let itemWidth = Math.floor((width - DEFAULT_SPACING) / 2);
-        let x = box.x1;
-        let y = box.y1;
+        let x = 0;
+        let y = 0;
         let columnIndex = 0;
         let i = 0;
         // Loop over the children, going vertically down first.  When we run
@@ -393,9 +396,7 @@ DashDocDisplay.prototype = {
         while (i < children.length) {
             let child = children[i];
 
-            let [minSize, naturalSize] = child.get_preferred_height(-1);
-
-            if (y + naturalSize > box.y2) {
+            if (y + this._itemHeight > box.y2) {
                 // Is this the second column, or we're in
                 // the first column and can't even fit one
                 // item?  In that case, break.
@@ -404,9 +405,9 @@ DashDocDisplay.prototype = {
                 }
                 // Set x to the halfway point.
                 columnIndex += 1;
-                x = x + itemWidth + DEFAULT_SPACING;
+                x = x + this._itemWidth + DEFAULT_SPACING;
                 // And y is back to the top.
-                y = box.y1;
+                y = 0;
                 // Retry this same item, now that we're in the second column.
                 // By looping back to the top here, we re-test the size
                 // again for the second column.
@@ -416,13 +417,13 @@ DashDocDisplay.prototype = {
             let childBox = new Clutter.ActorBox();
             childBox.x1 = x;
             childBox.y1 = y;
-            childBox.x2 = childBox.x1 + itemWidth;
-            childBox.y2 = y + naturalSize;
+            childBox.x2 = childBox.x1 + this._itemWidth;
+            childBox.y2 = y + this._itemHeight;
 
             y = childBox.y2 + DEFAULT_SPACING;
 
-            child.show();
             child.allocate(childBox, flags);
+            this.actor.set_skip_paint(child, false);
 
             i++;
         }
@@ -438,7 +439,6 @@ DashDocDisplay.prototype = {
             this._checkDocExistence = false;
         }
 
-        let skipPaint = [];
         for (; i < children.length; i++)
             this.actor.set_skip_paint(children[i], true);
     },



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]