UNPKG

@woosh/meep-engine

Version:

Pure JavaScript game engine. Fully featured and production ready.

156 lines (120 loc) 3.57 kB
import { assert } from "../../core/assert.js"; import domify from "../DOM.js"; import View from "../View.js"; /** * @extends View */ export class LocalizedLabelView extends View { /** * * @param {string} id * @param {object} [seed] * @param {Localization} [localization] * @param {string[]} [classList] * @param {GMLEngine} [gml] if supplied, string will be compiled first * @param {string} [tag=div] HTML element tag */ constructor({ id, seed, localization = null, classList = [], gml, tag = 'div' }) { super(); assert.isString(id, 'id'); /** * @private * @type {Localization} */ this.localization = null; /** * * @type {GMLEngine} */ this.gml = gml; /** * * @type {Object} */ this.seed = seed; /** * * @type {string} */ this.key = id; const $el = domify(tag); this.$el = $el; this.el = $el.el; this.addClass('label'); classList.forEach(c => this.addClass(c)); this.needsUpdate = true; this.on.linked.add(() => { if (this.localization !== null && this.localization.locale.getValue() !== this.__localeKey) { //locale key has changed this.needsUpdate = true; } if (this.needsUpdate) { this.update(); } }); /** * Cached locale key * @type {String} * @private */ this.__localeKey = null; // watch for locale changes this.setLocalization(localization); } updateLocale() { if (this.isLinked) { this.update(); } else { this.needsUpdate = true; } } setLocalization(localization) { if (localization === this.localization) { return; } if (this.localization !== null) { this.unbindSignal(this.localization.locale.onChanged, this.updateLocale, this); } this.localization = localization; if (localization !== null) { this.bindSignal(localization.locale.onChanged, this.updateLocale, this); } } setKey(key) { if (key === this.key) { //no change return; } this.key = key; if (this.isLinked) { this.update(); } else { this.needsUpdate = true; } } update() { const localization = this.localization; const gml = this.gml; const seed = this.seed; const id = this.key; const $el = this.$el; assert.notEqual(localization, undefined, 'localization is undefined'); assert.notEqual(localization, null, 'localization is null'); let value; try { value = localization.getString(id, seed); } catch (e) { console.error(e); value = `failed to localize @${id}`; } this.__localeKey = localization.locale.getValue(); if (gml === undefined) { $el.text(value); } else { this.removeAllChildren(); //compile gml.compile(value, this); } this.needsUpdate = false; } }