neft
Version:
Universal Platform
82 lines (67 loc) • 1.94 kB
JavaScript
const { Renderer, assert, utils, signal } = Neft;
const { setPropertyValue } = Renderer.itemUtils;
const { emitSignal } = signal.Emitter;
const { Impl } = Renderer;
const PREVENT_CLICK_MIN_PX = 10;
class Scrollable extends Renderer.Native {}
Scrollable.__name__ = 'Scrollable';
Scrollable.Initialize = (item) => {
item.on('contentXChange', function (val) {
setPropertyValue(this, 'contentX', val);
});
item.on('contentYChange', function (val) {
setPropertyValue(this, 'contentY', val);
});
let pressX = 0, pressY = 0, prevented = false;
item.pointer.onPress((event) => {
pressX = event.x;
pressY = event.y;
prevented = false;
});
item.pointer.onMove((event) => {
if (prevented) {
return;
}
const dx = Math.abs(pressX - event.x);
const dy = Math.abs(pressY - event.y);
if (Math.sqrt(dx * dx + dy * dy) > PREVENT_CLICK_MIN_PX) {
event.preventClick = true;
prevented = true;
}
});
};
Scrollable.defineProperty({
enabled: true,
type: 'item',
name: 'contentItem',
defaultValue: null,
setter: function (_super) {
return function (val) {
if (val != null) {
val.parent = null;
val._parent = this;
emitSignal(val, 'onParentChange', null);
}
_super.call(this, val);
};
}
});
Scrollable.defineProperty({
enabled: true,
type: 'number',
name: 'contentX',
defaultValue: 0
});
Scrollable.defineProperty({
enabled: true,
type: 'number',
name: 'contentY',
defaultValue: 0
});
if (process.env.NEFT_HTML) {
Impl.addTypeImplementation('Scrollable', require('./impl/css/scrollable'));
}
if (process.env.NEFT_WEBGL) {
Impl.addTypeImplementation('Scrollable', require('./impl/base/scrollable'));
}
module.exports = Scrollable;