UNPKG

@woosh/meep-engine

Version:

Pure JavaScript game engine. Fully featured and production ready.

81 lines (59 loc) 1.93 kB
import { TypeEditor } from "../../TypeEditor.js"; import { assert } from "../../../../../src/core/assert.js"; import EmptyView from "../../../../../src/view/elements/EmptyView.js"; import { CheckboxView } from "../../../../../src/view/elements/CheckboxView.js"; import ObservedBoolean from "../../../../../src/core/model/ObservedBoolean.js"; /** * * @param {Object} parent * @param {FieldDescriptor} field * @param {string} key * @param {Object<number>} definition */ function make_flag_editor(parent, field, key, definition) { const mask = definition[key]; function get_field_value() { return field.adapter.read(parent, field.name); } function read() { const flags = get_field_value(); return (flags & mask) !== 0; } const flag = new ObservedBoolean(read()); const r = new CheckboxView({ value: flag }); r.attr({ // Tooltip title: key }) flag.onChanged.add((v) => { const flags = get_field_value(); let new_flags; if (v) { new_flags = flags | mask; } else { new_flags = flags & ~(mask); } field.adapter.write(parent, field.name, new_flags); }); return r; } export class BitFlagsEditor extends TypeEditor { /** * * @param {Object<number>} definition */ constructor(definition) { super(); assert.defined(definition, 'definition'); this.definition = definition; } build(parent, field, registry) { const flag_names = Object.keys(this.definition); const r = new EmptyView(); for (let i = 0; i < flag_names.length; i++) { const flag_key = flag_names[i]; r.addChild(make_flag_editor(parent, field, flag_key, this.definition)); } return r; } }