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
qooxdoo-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/qooxdoo-devel

Reply via email to