vscroll
Version:
Virtual scroll engine
87 lines • 2.79 kB
JavaScript
import { BaseProcessFactory, CommonProcess, ProcessStatus } from './misc/index';
import { Direction } from '../inputs/index';
export default class PreClip extends BaseProcessFactory(CommonProcess.preClip) {
static run(scroller) {
PreClip.prepareClip(scroller);
scroller.workflow.call({
process: PreClip.process,
status: ProcessStatus.next,
payload: {
doClip: scroller.state.clip.doClip
}
});
}
static prepareClip(scroller) {
const { fetch, clip } = scroller.state;
if (PreClip.shouldNotClip(scroller)) {
return;
}
const firstIndex = fetch.first.indexBuffer;
const lastIndex = fetch.last.indexBuffer;
scroller.logger.log(() => `looking for ${fetch.direction ? 'anti-' + fetch.direction + ' ' : ''}items ` +
`that are out of [${firstIndex}..${lastIndex}] range`);
if (PreClip.isBackward(scroller, firstIndex)) {
PreClip.prepareClipByDirection(scroller, Direction.backward, firstIndex);
}
if (PreClip.isForward(scroller, lastIndex)) {
PreClip.prepareClipByDirection(scroller, Direction.forward, lastIndex);
}
if (!clip.doClip) {
scroller.logger.log('skipping clip [no items to clip]');
}
return;
}
static shouldNotClip(scroller) {
const { settings, buffer, state } = scroller;
if (settings.infinite && !state.clip.force) {
scroller.logger.log('skipping clip [infinite mode]');
return true;
}
if (!buffer.size) {
scroller.logger.log('skipping clip [empty buffer]');
return true;
}
if (state.cycle.isInitial) {
scroller.logger.log('skipping clip [initial cycle]');
return true;
}
return false;
}
static isBackward(scroller, firstIndex) {
const { buffer, state } = scroller;
const { clip, fetch } = state;
if (clip.force) {
return clip.forceBackward;
}
if (fetch.direction !== Direction.backward) {
if (firstIndex - 1 >= buffer.absMinIndex) {
return true;
}
}
return false;
}
static isForward(scroller, lastIndex) {
const { buffer, state } = scroller;
const { clip, fetch } = state;
if (clip.force) {
return clip.forceForward;
}
if (fetch.direction !== Direction.forward) {
if (lastIndex + 1 <= buffer.absMaxIndex) {
return true;
}
}
return false;
}
static prepareClipByDirection(scroller, direction, edgeIndex) {
const forward = direction === Direction.forward;
scroller.buffer.items.forEach(item => {
if ((!forward && item.$index < edgeIndex) || (forward && item.$index > edgeIndex)) {
item.toRemove = true;
item.removeDirection = direction;
scroller.state.clip.doClip = true;
}
});
}
}
//# sourceMappingURL=preClip.js.map