mr-crocs-adventures/tilorswift/js/dialog/Dialog.js

177 lines
5.7 KiB
JavaScript
Raw Normal View History

import GraphicSet from "../../../js/GraphicSet.js";
import Setting from "../../../js/Setting.js";
import TilorswiftTilesetSelectedEvent from "../events/TilorswiftTilesetSelectedEvent.js";
2024-12-08 16:53:56 +01:00
import {Checkbox} from "./elements/Checkbox.js";
2020-02-09 00:23:58 +01:00
export default class Dialog
{
constructor()
{
this.htmlElement = document.createElement('div');
this.htmlElement.classList.add('dialog');
this.boxElement = document.createElement('div');
this.boxElement.classList.add('dialog-box');
this.htmlElement.appendChild(this.boxElement);
this.messageElement = document.createElement('div');
this.messageElement.classList.add('dialog-message');
this.boxElement.appendChild(this.messageElement);
this.inputAreaElement = document.createElement('div');
this.inputAreaElement.classList.add('dialog-input-area');
this.boxElement.appendChild(this.inputAreaElement);
this.buttonAreaElement = document.createElement('div');
this.buttonAreaElement.classList.add('dialog-button-area');
this.boxElement.appendChild(this.buttonAreaElement);
document.body.appendChild(this.htmlElement);
}
createButton(text)
{
let button = document.createElement('span');
button.classList.add('dialog-button');
button.innerText = text;
this.buttonAreaElement.appendChild(button);
button.addEventListener(
'click',
() => {
this.htmlElement.remove();
}
);
return button;
}
createInputNumber(label, value = 0, min = 0, max = 999999, step = 1)
2020-02-09 00:23:58 +01:00
{
let htmlElement = document.createElement('div');
htmlElement.classList.add('dialog-input-area');
let htmlElementLabel = document.createElement('div');
htmlElementLabel.classList.add('dialog-label');
htmlElementLabel.innerText = label;
let htmlElementInput = document.createElement('input');
htmlElementInput.classList.add('dialog-input');
htmlElementInput.type = 'number';
htmlElementInput.value = value;
htmlElementInput.max = max;
htmlElementInput.min = min;
htmlElementInput.step = step;
2020-02-09 00:23:58 +01:00
htmlElement.appendChild(htmlElementLabel);
htmlElement.appendChild(htmlElementInput);
this.inputAreaElement.appendChild(htmlElement);
return htmlElementInput;
}
2024-12-08 16:53:56 +01:00
createCheckbox(label, value, isChecked = false, onClick = () => {})
{
const checkbox = new Checkbox(label, value, isChecked);
checkbox.onClick = onClick;
this.inputAreaElement.appendChild(checkbox.htmlElement);
return checkbox;
}
createTilesetSelector()
{
let htmlElement = document.createElement('div');
htmlElement.id = 'tileset-selector';
let htmlElementLabel = document.createElement('div');
htmlElementLabel.classList.add('dialog-label');
htmlElementLabel.innerText = 'Terrain';
let htmlAvatarElement = document.createElement('div');
htmlAvatarElement.id = 'tileset-avatar';
2021-09-14 20:11:01 +02:00
htmlAvatarElement.style.backgroundImage = 'url("../' + Setting.TILESET_LOCATION + GraphicSet[0].tileset + '")';
let htmlListElement = document.createElement('div');
htmlListElement.id = 'tileset-list';
htmlElement.appendChild(htmlElementLabel);
htmlElement.appendChild(htmlAvatarElement);
htmlElement.appendChild(htmlListElement);
htmlAvatarElement.addEventListener(
'click',
() => {
htmlListElement.style.display = 'block';
}
);
GraphicSet.forEach(
(graphicSet, index) => {
let htmlTilesetElement = document.createElement('div');
htmlTilesetElement.classList.add('tileset');
let htmlThumbnail = document.createElement('div');
htmlThumbnail.classList.add('tileset-thumbnail');
const image = new Image();
image.src = '../' + Setting.TILESET_LOCATION + graphicSet.tileset;
htmlThumbnail.style.backgroundImage = 'url(' + image.src + ')';
htmlThumbnail.style.backgroundPositionX = -(image.width / graphicSet.tiles) * graphicSet.tilePreview + 'px';
htmlTilesetElement.appendChild(htmlThumbnail);
let htmlTitleElement = document.createElement('div');
htmlTitleElement.classList.add('tileset-title');
htmlTitleElement.innerText = graphicSet.name;
htmlTilesetElement.appendChild(htmlTitleElement);
htmlTilesetElement.addEventListener(
'click',
() => {
htmlListElement.style.display = 'none';
htmlAvatarElement.style.backgroundImage = 'url(' + image.src + ')';
htmlAvatarElement.style.backgroundPositionX = -96 * graphicSet.tilePreview + 'px';
window.dispatchEvent(new TilorswiftTilesetSelectedEvent(index));
}
);
htmlListElement.appendChild(htmlTilesetElement);
}
);
this.inputAreaElement.appendChild(htmlElement);
return htmlElement;
}
2024-12-08 16:53:56 +01:00
createFileInput(types = [])
{
let input = document.createElement('input');
input.type = 'file';
if (types.length > 0) {
for (const t in types) {
types[t] = '.' + types[t]
}
input.accept = types.join(', ');
}
this.inputAreaElement.appendChild(input);
return input;
}
2020-02-09 00:23:58 +01:00
setMessage(message)
{
this.messageElement.innerText = message;
}
close()
{
this.htmlElement.remove();
}
2021-09-14 20:11:01 +02:00
}