Previous thread was abandoned so i making new one , with more information.
I am now using syncWidget to scroll to bottom of a virtual list when new
item is added.
But the problem is this virtuallist implementation automatically resizes
list item height , and when scrolled inside syncWidget , it is not actually
scrolled to the end , but to that widget item’s start.
here is handler for list’s updates:
this.chat_list.getModel().addListener("change", function() {
// qx.ui.core.queue.Manager.flush();
qx.ui.core.queue.Widget.remove(this.chat_list,"scrollBottom");
// normally using the flush should be time enough for the renderer
qx.ui.core.queue.Widget.add(this.chat_list, "scrollBottom");
},this)
I added a work around by counting how many times layer is updated , if it
updated for 3 times , scrolls to button : this._layer.addListener("updated",
this._onUpdated, this); .
Because i observed whenever a new item is added , layer firest updated 3
times and only at the last time it need to actually scroll.
Here is the infinite list with auto-resizing of item height from
stackoverflow.com/questions/21456941/infinite-scroll-in-qooxdoo-with-virtual-list
.
qx.Class.define('phwabe.utils.list.InfiniList', {
extend: qx.ui.list.List,
members: {
__deferredCall: null,
__scrollBottom: false,
__updateCount: 0,
_initLayer: function() {
this.base(arguments);
console.log("initing layer")
this._layer.addListener("updated", this._onUpdated, this);
},
_onUpdated: function(event) {
if (this.__deferredCall === null) {
this.__deferredCall = new qx.util.DeferredCall(function() {
qx.ui.core.queue.Widget.add(this, 'updateSize');
}, this);
}
this.__deferredCall.schedule();
},
_updateSize: function() {
var firstRow = this._layer.getFirstRow();
var rowSize = this._layer.getRowSizes().length;
for (var row = firstRow; row < firstRow + rowSize; row++) {
var widget = this._layer.getRenderedCellWidget(row, 0);
if (widget !== null) {
var height = widget.getSizeHint().height;
this.getPane().getRowConfig().setItemSize(row, height);
}
}
},
_scrollBottom: function(limit) {
if (this.__scrollBottom === true) {
this.scrollToY(1e99)
if (this.__updateCount >= limit) {
this.__scrollBottom = false
}
}
},
syncWidget: function(jobs) {
if (jobs.scrollBottom & jobs.updateSize) {
console.log(jobs)
this.__scrollBottom = true
this.__updateCount = 0
this._updateSize()
this._scrollBottom(5)
console.log("BOTH JOBS no of updates" + this.__updateCount)
this.__updateCount += 1
} else if (jobs.scrollBottom) {
this.__scrollBottom = true
this.__updateCount = 0
} else if (jobs.updateSize) {
this._updateSize()
this._scrollBottom(3)
this.__updateCount += 1
console.log("no of updates" + this.__updateCount)
}
}
}
});
------------------------------------------------------------------------------
_______________________________________________
qooxdoo-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/qooxdoo-devel