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
This commit is contained in:
parent
e40063fc34
commit
9afb09128b
@ -357,34 +357,37 @@ DashDocDisplay.prototype = {
|
|||||||
_getPreferredHeight: function(actor, forWidth, alloc) {
|
_getPreferredHeight: function(actor, forWidth, alloc) {
|
||||||
let children = actor.get_children();
|
let children = actor.get_children();
|
||||||
|
|
||||||
// Two columns, where we go vertically down first. So just take
|
// The width of an item is our allocated width, minus spacing, divided in half.
|
||||||
// the height of half of the children as our preferred height.
|
this._itemWidth = Math.floor((forWidth - DEFAULT_SPACING) / 2);
|
||||||
|
|
||||||
|
let maxNatural = 0;
|
||||||
|
for (let i = 0; i < children.length; i++) {
|
||||||
|
let child = children[i];
|
||||||
|
let [minSize, naturalSize] = child.get_preferred_height(this._itemWidth);
|
||||||
|
maxNatural = Math.max(maxNatural, naturalSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
this._itemHeight = maxNatural;
|
||||||
|
|
||||||
let firstColumnChildren = Math.ceil(children.length / 2);
|
let firstColumnChildren = Math.ceil(children.length / 2);
|
||||||
|
alloc.natural_size = (firstColumnChildren * maxNatural +
|
||||||
let natural = 0;
|
(firstColumnChildren - 1) * DEFAULT_SPACING);
|
||||||
for (let i = 0; i < firstColumnChildren; 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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
alloc.natural_size = natural;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_allocate: function(actor, box, flags) {
|
_allocate: function(actor, box, flags) {
|
||||||
let width = box.x2 - box.x1;
|
let width = box.x2 - box.x1;
|
||||||
let height = box.y2 - box.y1;
|
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();
|
let children = actor.get_children();
|
||||||
|
|
||||||
// The width of an item is our allocated width, minus spacing, divided in half.
|
let x = 0;
|
||||||
let itemWidth = Math.floor((width - DEFAULT_SPACING) / 2);
|
let y = 0;
|
||||||
let x = box.x1;
|
|
||||||
let y = box.y1;
|
|
||||||
let columnIndex = 0;
|
let columnIndex = 0;
|
||||||
let i = 0;
|
let i = 0;
|
||||||
// Loop over the children, going vertically down first. When we run
|
// Loop over the children, going vertically down first. When we run
|
||||||
@ -393,9 +396,7 @@ DashDocDisplay.prototype = {
|
|||||||
while (i < children.length) {
|
while (i < children.length) {
|
||||||
let child = children[i];
|
let child = children[i];
|
||||||
|
|
||||||
let [minSize, naturalSize] = child.get_preferred_height(-1);
|
if (y + this._itemHeight > box.y2) {
|
||||||
|
|
||||||
if (y + naturalSize > box.y2) {
|
|
||||||
// Is this the second column, or we're in
|
// Is this the second column, or we're in
|
||||||
// the first column and can't even fit one
|
// the first column and can't even fit one
|
||||||
// item? In that case, break.
|
// item? In that case, break.
|
||||||
@ -404,9 +405,9 @@ DashDocDisplay.prototype = {
|
|||||||
}
|
}
|
||||||
// Set x to the halfway point.
|
// Set x to the halfway point.
|
||||||
columnIndex += 1;
|
columnIndex += 1;
|
||||||
x = x + itemWidth + DEFAULT_SPACING;
|
x = x + this._itemWidth + DEFAULT_SPACING;
|
||||||
// And y is back to the top.
|
// And y is back to the top.
|
||||||
y = box.y1;
|
y = 0;
|
||||||
// Retry this same item, now that we're in the second column.
|
// Retry this same item, now that we're in the second column.
|
||||||
// By looping back to the top here, we re-test the size
|
// By looping back to the top here, we re-test the size
|
||||||
// again for the second column.
|
// again for the second column.
|
||||||
@ -416,13 +417,13 @@ DashDocDisplay.prototype = {
|
|||||||
let childBox = new Clutter.ActorBox();
|
let childBox = new Clutter.ActorBox();
|
||||||
childBox.x1 = x;
|
childBox.x1 = x;
|
||||||
childBox.y1 = y;
|
childBox.y1 = y;
|
||||||
childBox.x2 = childBox.x1 + itemWidth;
|
childBox.x2 = childBox.x1 + this._itemWidth;
|
||||||
childBox.y2 = y + naturalSize;
|
childBox.y2 = y + this._itemHeight;
|
||||||
|
|
||||||
y = childBox.y2 + DEFAULT_SPACING;
|
y = childBox.y2 + DEFAULT_SPACING;
|
||||||
|
|
||||||
child.show();
|
|
||||||
child.allocate(childBox, flags);
|
child.allocate(childBox, flags);
|
||||||
|
this.actor.set_skip_paint(child, false);
|
||||||
|
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
@ -438,7 +439,6 @@ DashDocDisplay.prototype = {
|
|||||||
this._checkDocExistence = false;
|
this._checkDocExistence = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
let skipPaint = [];
|
|
||||||
for (; i < children.length; i++)
|
for (; i < children.length; i++)
|
||||||
this.actor.set_skip_paint(children[i], true);
|
this.actor.set_skip_paint(children[i], true);
|
||||||
},
|
},
|
||||||
|
Loading…
Reference in New Issue
Block a user