@woosh/meep-engine
Version:
Pure JavaScript game engine. Fully featured and production ready.
81 lines (59 loc) • 1.93 kB
JavaScript
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;
}
}