UNPKG

@woosh/meep-engine

Version:

Pure JavaScript game engine. Fully featured and production ready.

88 lines (70 loc) 2.64 kB
import View from "../../View.js"; import ListView from "../../common/ListView.js"; import ButtonView from "../../elements/button/ButtonView.js"; import EmptyView from "../../elements/EmptyView.js"; import { assert } from "../../../core/assert.js"; /** * @template T * @param {List<T>} list * @param {T} element */ function defaultOperationAdd(list, element) { list.add(element); } /** * @template T * @param {List<T>} list * @param {T} element */ function defaultOperationRemove(list, element) { list.removeOneOf(element); } export class NativeListController extends View { /** * @template T * @param {List<T>} model * @param {(T)=>View} elementViewFactory * @param {()=>T} elementFactory * @param {string[]} [classList] * @param {function(List<T>, T)} [operationAdd] Allows user to supply a special operation for adding an element to the list * @param {function(List<T>, T)} [operationRemove] Allows user to supply a special operation for removing an element from the list */ constructor({ model, elementViewFactory, elementFactory, classList = [], operationAdd = defaultOperationAdd, operationRemove = defaultOperationRemove }) { super(); assert.isFunction(elementViewFactory, 'elementViewFactory'); this.el = document.createElement('div'); this.addClass('ui-native-list-controller'); this.addClasses(classList); this.addChild(new ListView(model, { elementFactory(el) { const elementView = elementViewFactory(el); assert.defined(elementView, 'elementView'); assert.equal(elementView.isView, true, 'elementView.isView !== true'); const vWrapper = new EmptyView({ classList: ['element-wrapper'] }); elementView.addClass('wrapped-element'); vWrapper.addChild(elementView); vWrapper.addChild(new ButtonView({ action() { operationRemove(model, el); }, classList: ['remove'] })); return vWrapper; } })); this.addChild(new ButtonView({ action() { const element = elementFactory(); operationAdd(model, element); }, classList: ['add'] })) } }