var inputpanel = { title: "untitled", toString() { return this.title; }, value: "", on: false, pos: [20, window.size.y - 20], wh: [100, 100], anchor: [0, 1], padding: [5, -15], gui() { this.win ??= Mum.window({ width: this.wh.x, height: this.wh.y, color: Color.black.alpha(0.1), anchor: this.anchor, padding: this.padding, }); var itms = this.guibody(); if (!Array.isArray(itms)) itms = [itms]; if (this.title) this.win.items = [Mum.column({ items: [Mum.text({ str: this.title }), ...itms] })]; else this.win.items = itms; this.win.draw([100, window.size.y - 50]); }, guibody() { return [Mum.text({ str: this.value, color: Color.green }), Mum.button({ str: "SUBMIT", action: this.submit.bind(this) })]; }, open() { this.on = true; this.value = ""; this.start(); this.keycb(); }, start() {}, close() { player[0].uncontrol(this); this.on = false; if ("on_close" in this) this.on_close(); }, action() {}, closeonsubmit: true, submit() { if (!this.submit_check()) return; this.action(); if (this.closeonsubmit) this.close(); }, submit_check() { return true; }, keycb() {}, caret: 0, reset_value() { this.value = ""; this.caret = 0; }, input_backspace_pressrep() { this.value = this.value.slice(0, -1); this.keycb(); }, }; inputpanel.inputs = {}; inputpanel.inputs.block = true; inputpanel.inputs.post = function () { this.keycb(); }; inputpanel.inputs.char = function (c) { this.value = this.value.slice(0, this.caret) + c + this.value.slice(this.caret); this.caret++; }; inputpanel.inputs["C-d"] = function () { this.value = this.value.slice(0, this.caret) + this.value.slice(this.caret + 1); }; inputpanel.inputs["C-d"].rep = true; inputpanel.inputs.tab = function () { this.value = input.tabcomplete(this.value, this.assets); this.caret = this.value.length; }; inputpanel.inputs.escape = function () { this.close(); }; inputpanel.inputs["C-b"] = function () { if (this.caret === 0) return; this.caret--; }; inputpanel.inputs["C-b"].rep = true; inputpanel.inputs["C-u"] = function () { this.value = this.value.slice(this.caret); this.caret = 0; }; inputpanel.inputs["C-f"] = function () { if (this.caret === this.value.length) return; this.caret++; }; inputpanel.inputs["C-f"].rep = true; inputpanel.inputs["C-a"] = function () { this.caret = 0; }; inputpanel.inputs["C-e"] = function () { this.caret = this.value.length; }; inputpanel.inputs.backspace = function () { if (this.caret === 0) return; this.value = this.value.slice(0, this.caret - 1) + this.value.slice(this.caret); this.caret--; }; inputpanel.inputs.backspace.rep = true; inputpanel.inputs.enter = function () { this.submit(); }; inputpanel.inputs["C-k"] = function () { this.value = this.value.slice(0, this.caret); }; inputpanel.inputs.lm = function () { gui.controls.check_submit(); }; var notifypanel = Object.copy(inputpanel, { title: "notification", msg: "Refusing to save. File already exists.", action() { this.close(); }, guibody() { return Mum.column({ items: [Mum.text({ str: this.msg }), Mum.button({ str: "OK", action: this.close.bind(this) })], }); }, }); var gen_notify = function (val, fn) { var panel = Object.create(notifypanel); panel.msg = val; panel.yes = fn; panel.inputs = {}; panel.inputs.y = function () { panel.yes(); panel.close(); }; panel.inputs.y.doc = "Confirm yes."; panel.inputs.enter = function () { panel.close(); }; panel.inputs.enter.doc = "Close."; return panel; }; var listpanel = Object.copy(inputpanel, { assets: [], allassets: [], mumlist: {}, submit_check() { if (this.assets.length === 0) return false; this.value = this.assets[0]; return true; }, start() { this.assets = this.allassets.slice(); this.caret = 0; this.mumlist = []; this.assets.forEach(function (x) { this.mumlist[x] = Mum.text({ str: x, action: this.action, color: Color.blue, hovered: { color: Color.red }, selectable: true, }); }, this); }, keycb() { if (this.value) this.assets = this.allassets.filter(x => x.startsWith(this.value)); else this.assets = this.allassets.slice(); for (var m in this.mumlist) this.mumlist[m].hide = true; this.assets.forEach(function (x) { this.mumlist[x].hide = false; }, this); }, guibody() { var a = [Mum.text({ str: this.value, color: Color.green, caret: this.caret })]; var b = a.concat(Object.values(this.mumlist)); return Mum.column({ items: b, offset: [0, -10] }); }, }); return { inputpanel, gen_notify, notifypanel, listpanel };