vscroll
Version:
Virtual scroll engine
57 lines • 2.03 kB
JavaScript
import { BaseProcessFactory, CommonProcess, ProcessStatus } from './misc/index';
export default class Render extends BaseProcessFactory(CommonProcess.render) {
static run(scroller) {
const { workflow, state, viewport, routines } = scroller;
const { cycle, render, scroll, fetch } = state;
scroller.logger.stat('before new items render');
if (scroll.positionBeforeAsync === null) {
scroll.positionBeforeAsync = viewport.scrollPosition;
}
render.cancel = routines.render(() => {
render.cancel = null;
if (Render.doRender(scroller)) {
workflow.call({
process: Render.process,
status: render.noSize ? ProcessStatus.done : ProcessStatus.next,
payload: { process: cycle.initiator }
});
}
else {
workflow.call({
process: Render.process,
status: ProcessStatus.error,
payload: { error: 'Can not associate item with element' }
});
}
}, { items: fetch.items.map(i => i.get()) });
}
static doRender(scroller) {
const { state, viewport, buffer, logger } = scroller;
const { fetch, render } = state;
render.positionBefore = viewport.scrollPosition;
if (!fetch.isCheck) {
render.sizeBefore = viewport.getScrollableSize();
if (!fetch.items.every(item => Render.processElement(scroller, item))) {
return false;
}
}
buffer.checkDefaultSize();
render.sizeAfter = viewport.getScrollableSize();
logger.stat('after new items render');
logger.log(() => (render.noSize ? 'viewport size has not been changed' : void 0));
return true;
}
static processElement(scroller, item) {
const { viewport, buffer } = scroller;
const element = viewport.findItemElementById(item.nodeId);
if (!element) {
return false;
}
item.element = element;
item.makeVisible();
item.setSize(buffer.getSizeByIndex(item.$index));
buffer.cacheItem(item);
return true;
}
}
//# sourceMappingURL=render.js.map