[gnome-shell] Fix resizing problems with DashDocDisplay
- From: Owen Taylor <otaylor src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gnome-shell] Fix resizing problems with DashDocDisplay
- Date: Wed, 3 Feb 2010 18:56:10 +0000 (UTC)
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]