blue.js/libs/bluepixle_ui.js

129 lines
4.8 KiB
JavaScript
Raw Normal View History

2022-09-16 08:42:55 -06:00
const UP_KEY = "KeyW";
const DOWN_KEY = "KeyS";
const LEFT_KEY = "KeyA";
const RIGHT_KEY = "KeyD";
const ACT_KEY = "KeyE";
const MENU_KEY = "KeyQ";
class bpu_menu {
2022-09-16 08:42:55 -06:00
constructor (frameBufferRef, dimentions, closeable, options, callbackArray) {
this.parentBuffer = frameBufferRef;
this.closeable = "boolean" == typeof closeable ? closeable : true;
this.options = Array.isArray(options) ? options : ["Empty Menu"];
this.callbackArray = Array.isArray(callbackArray) ? callbackArray : options.map(o=>{ return function () { print(o); } });
this.callbackArray = this.callbackArray.map(cb=>{ if ("function" == typeof cb) { return cb; } else { return ()=> { print("Not Implimented") }; } });
this.dimentions = dimentions instanceof vector ? dimentions : new vector([500,500]);
this.renderLayer = new container( new vector([0,0]), this.dimentions);
this.active = false;
this.selectedOption = 0;
this.renderLayer.addShape(new shape("rect", new vector([0,0]), this.dimentions, null, "#ffffff", "#000000", 2));
this.selectorShape = new shape("rect", new vector([5,2]), new vector([this.dimentions.d[0] - 10, 16]), null, "#aaaaaa", "#000000", 2);
this.renderLayer.addShape(this.selectorShape);
// add case for menu with more options than screen allows
this.optionShapes = [];
for (var i = 0; i < this.options.length; i++) {
var thisOption = this.options[i];
this.optionShapes[i] = new shape("text", new vector([10,20+20*i]), new vector([this.dimentions.d[0] - 20,20]), null, "#000000", null, null, {text:thisOption});
this.renderLayer.addShape(this.optionShapes[i]);
}
}
activate () {
this.previousMenu = window.activeMenu;
window.activeMenu = this;
this.active = true;
this.selectedOption = 0;
this.selectorShape.coordinates.d[1] = 8 + 20 * this.selectedOption;
this.parentBuffer.addContainer(this.renderLayer);
}
deactivate () {
window.activeMenu = this.previousMenu;
var layerID = this.parentBuffer.containerArray.indexOf(this.renderLayer);
this.parentBuffer.containerArray.splice(layerID,1);
}
selectItem () {
this.deactivate();
this.callbackArray[this.selectedOption]();
}
move (n) {
this.selectedOption = (this.selectedOption + n + this.options.length) % this.options.length;
this.selectorShape.coordinates.d[1] = 8 + 20 * this.selectedOption;
}
controls (e) {
var input = e.code;
if ((input == MENU_KEY) && this.closeable ) { this.deactivate(); }
if (input == ACT_KEY) { this.selectItem(); }
if (input == UP_KEY) { this.move(-1); }
if (input == DOWN_KEY) { this.move(1); }
}
}
class bpu_dialogBox {
2022-09-16 08:42:55 -06:00
constructor (parentBufferRef) {
this.parentBufferRef = parentBufferRef;
this.messageLayer = new container(new vector([0, parentBufferRef.height - 100]), new vector([parentBufferRef.width, 100]));
this.messageLayer.addShape( new shape("rect", new vector([0,0]), this.messageLayer.size, null, "#ffffff", "#000000", 1));
this.line = [
new shape("text", new vector([30,30]), new vector([this.messageLayer.size.d[0]-20,30]),null, "#000000"),
new shape("text", new vector([30,60]), new vector([this.messageLayer.size.d[0]-20,30]),null, "#000000")
];
this.textQueue = [];
this.messageLayer.addShape( this.line[0] );
this.messageLayer.addShape( this.line[1] );
}
progressMessage () {
if (this.textQueue.length <= 1) {
if (undefined != this.choice) {
this.choice.activate();
this.choice = undefined;
return;
} else {
this.deactivate();
}
}
this.textQueue.shift();
this.line[0].text = "string" == typeof this.textQueue[0] ? this.textQueue[0] : "";
this.line[1].text = "string" == typeof this.textQueue[1] ? this.textQueue[1] : "";
}
activate (message="No message", interactive, choice) {
message = "string" == typeof message ? message : "No valid text";
interactive = "boolean" == typeof interactive ? interactive : false;
this.choice = choice instanceof menu ? choice : undefined;
this.textQueue.push(...message.match(/.{1,50}( |$)/g));
if (!this.parentBufferRef.containerArray.includes(this.messageLayer)) {
this.parentBufferRef.addContainer(this.messageLayer);
}
this.line[0].text = "string" == typeof this.textQueue[0] ? this.textQueue[0] : "";
this.line[1].text = "string" == typeof this.textQueue[1] ? this.textQueue[1] : "";
if (interactive) {
if (undefined != window.activeDialog) { this.previousDialog = window.activeDialog; }
window.activeDialog = this;
} else {
var me = this;
setTimeout(function () { me.progressMessage(); }, 5000); // Not cleaned up properly yet
}
}
deactivate () {
var layerID = this.parentBufferRef.containerArray.indexOf(this.messageLayer);
this.parentBufferRef.containerArray.splice(layerID,1);
if (undefined != this.previousDialog) {
window.activeDialog = this.previousDialog;
this.previousDialog = undefined;
} else {
window.activeDialog = undefined;
}
}
controls (e) {
this.progressMessage();
}
}