UI for adding rows and columns.
This commit is contained in:
parent
de3c73a508
commit
d43cd56d65
|
@ -27,7 +27,7 @@ export default class Terrain
|
||||||
this.htmlElement.style.height = this.tileset.getTileHeight() * this.tilesY + 'px';
|
this.htmlElement.style.height = this.tileset.getTileHeight() * this.tilesY + 'px';
|
||||||
|
|
||||||
for (let r = 0; r < this.tilesY; r++) {
|
for (let r = 0; r < this.tilesY; r++) {
|
||||||
this.insertRow();
|
this._insertRow();
|
||||||
}
|
}
|
||||||
|
|
||||||
window.addEventListener(
|
window.addEventListener(
|
||||||
|
@ -48,15 +48,17 @@ export default class Terrain
|
||||||
return this.tileset;
|
return this.tileset;
|
||||||
}
|
}
|
||||||
|
|
||||||
addRows(quantity, index)
|
addRows(index, quantity = 1)
|
||||||
{
|
{
|
||||||
for (let q = 0; q < quantity; q++) {
|
for (let q = 0; q < quantity; q++) {
|
||||||
this.insertRow(index);
|
this._insertRow(index);
|
||||||
this.tilesY++;
|
this.tilesY++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.htmlElement.style.height = this.tileset.getTileHeight() * this.tilesY + 'px';
|
||||||
}
|
}
|
||||||
|
|
||||||
insertRow(index = undefined)
|
_insertRow(index = undefined)
|
||||||
{
|
{
|
||||||
let row = [];
|
let row = [];
|
||||||
let tr = document.createElement('tr');
|
let tr = document.createElement('tr');
|
||||||
|
@ -77,6 +79,32 @@ export default class Terrain
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
addColumns(index, quantity = 1)
|
||||||
|
{
|
||||||
|
for (let c = 0; c < quantity; c++) {
|
||||||
|
this._insertColumn(index);
|
||||||
|
this.tilesX++;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.htmlElement.style.width = this.tileset.getTileWidth() * this.tilesX + 'px';
|
||||||
|
}
|
||||||
|
|
||||||
|
_insertColumn(index = undefined)
|
||||||
|
{
|
||||||
|
if (index === undefined || index > this.tilesX - 1) {
|
||||||
|
index = this.tilesX;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let y = 0; y < this.tilesY; y++) {
|
||||||
|
let field = new Field(this.tileset);
|
||||||
|
this.fields[y] = this.fields[y].slice(0, index).concat(field).concat(this.fields[y].slice(index));
|
||||||
|
|
||||||
|
let htmlRow = this.htmlElement.childNodes[y];
|
||||||
|
htmlRow.insertBefore(field.getElement(), htmlRow.childNodes[index]);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
setFieldIndex(x, y, index)
|
setFieldIndex(x, y, index)
|
||||||
{
|
{
|
||||||
this.fields[y][x].setIndex(index);
|
this.fields[y][x].setIndex(index);
|
||||||
|
|
|
@ -33,13 +33,13 @@ export default class Tilorswift
|
||||||
{
|
{
|
||||||
if (!terrain.hasEntrancePoint()) {
|
if (!terrain.hasEntrancePoint()) {
|
||||||
alert('Es muss ein Startpunkt definiert sein!');
|
alert('Es muss ein Startpunkt definiert sein!');
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
let filename = prompt('Dateiname', 'terrain.json');
|
let filename = prompt('Dateiname', 'terrain.json');
|
||||||
|
|
||||||
if (filename === null) {
|
if (filename === null) {
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
let json = Tilorswift.getTerrainAsJson(terrain);
|
let json = Tilorswift.getTerrainAsJson(terrain);
|
||||||
|
@ -49,5 +49,7 @@ export default class Tilorswift
|
||||||
download.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(json));
|
download.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(json));
|
||||||
download.click();
|
download.click();
|
||||||
download.remove();
|
download.remove();
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
import Dialog from "./Dialog.js";
|
||||||
|
import TilorswiftAddColumnsEvent from "../events/TilorswiftAddColumnsEvent.js";
|
||||||
|
|
||||||
|
export default class DialogAddColumns extends Dialog
|
||||||
|
{
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.inputPosition = this.createInputNumber('Einfügen vor Spalte');
|
||||||
|
this.inputColumns = this.createInputNumber('Anzahl Spalten');
|
||||||
|
this.buttonOk = this.createButton('OK');
|
||||||
|
this.buttonOk.addEventListener(
|
||||||
|
'click',
|
||||||
|
() => {
|
||||||
|
window.dispatchEvent(new TilorswiftAddColumnsEvent(this.getPosition(), this.getColumnCount()));
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
getPosition()
|
||||||
|
{
|
||||||
|
return this.inputPosition.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
getColumnCount()
|
||||||
|
{
|
||||||
|
return this.inputColumns.value;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
import Dialog from "./Dialog.js";
|
||||||
|
import TilorswiftAddRowsEvent from "../events/TilorswiftAddRowsEvent.js";
|
||||||
|
|
||||||
|
export default class DialogAddRows extends Dialog
|
||||||
|
{
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.inputPosition = this.createInputNumber('Einfügen vor Zeile');
|
||||||
|
this.inputRows = this.createInputNumber('Anzahl Zeilen');
|
||||||
|
this.buttonOk = this.createButton('OK');
|
||||||
|
this.buttonOk.addEventListener(
|
||||||
|
'click',
|
||||||
|
() => {
|
||||||
|
window.dispatchEvent(new TilorswiftAddRowsEvent(this.getPosition(), this.getRowsCount()));
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
getPosition()
|
||||||
|
{
|
||||||
|
return this.inputPosition.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
getRowsCount()
|
||||||
|
{
|
||||||
|
return this.inputRows.value;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
import TilorswiftEvent from "./TilorswiftEvent.js";
|
||||||
|
|
||||||
|
export default class TilorswiftAddColumnsClickedEvent extends Event
|
||||||
|
{
|
||||||
|
constructor() {
|
||||||
|
super(TilorswiftEvent.ADD_COLUMNS_CLICKED);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
import TilorswiftEvent from "./TilorswiftEvent.js";
|
||||||
|
|
||||||
|
export default class TilorswiftAddColumnsEvent extends Event
|
||||||
|
{
|
||||||
|
constructor(beforeColumn, columnCount) {
|
||||||
|
super(TilorswiftEvent.ADD_COLUMNS);
|
||||||
|
this.beforeColumn = beforeColumn;
|
||||||
|
this.columnCount = columnCount;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
import TilorswiftEvent from "./TilorswiftEvent.js";
|
||||||
|
|
||||||
|
export default class TilorswiftAddRowsClickedEvent extends Event
|
||||||
|
{
|
||||||
|
constructor() {
|
||||||
|
super(TilorswiftEvent.ADD_ROWS_CLICKED);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
import TilorswiftEvent from "./TilorswiftEvent.js";
|
||||||
|
|
||||||
|
export default class TilorswiftAddRowsEvent extends Event
|
||||||
|
{
|
||||||
|
constructor(beforeRow, rowCount) {
|
||||||
|
super(TilorswiftEvent.ADD_ROWS);
|
||||||
|
this.beforeRow = beforeRow;
|
||||||
|
this.rowCount = rowCount;
|
||||||
|
}
|
||||||
|
}
|
|
@ -3,7 +3,14 @@ const TilorswiftEvent = {
|
||||||
FIELD_ENTERED: 'fieldEntered',
|
FIELD_ENTERED: 'fieldEntered',
|
||||||
BUTTON_TILE_CLICKED: 'buttonTileClicked',
|
BUTTON_TILE_CLICKED: 'buttonTileClicked',
|
||||||
MENU_SAVE_CLICKED: 'menuSaveClicked',
|
MENU_SAVE_CLICKED: 'menuSaveClicked',
|
||||||
|
DIALOG_BUTTON_OK_CLICKED: 'dialogButtonOkClicked',
|
||||||
|
MENU_EDIT_CLICKED: 'menuEditClicked',
|
||||||
SAVED: 'saved',
|
SAVED: 'saved',
|
||||||
|
WIDGET_INSERT_ROWS_CLICKED: 'widgetInsertRowsClicked',
|
||||||
|
ADD_ROWS: 'addRows',
|
||||||
|
ADD_ROWS_CLICKED: 'addRowsClicked',
|
||||||
|
ADD_COLUMNS: 'addColumns',
|
||||||
|
ADD_COLUMNS_CLICKED: 'addColumnsClicked',
|
||||||
};
|
};
|
||||||
|
|
||||||
export default TilorswiftEvent;
|
export default TilorswiftEvent;
|
|
@ -0,0 +1,9 @@
|
||||||
|
import TilorswiftEvent from "./TilorswiftEvent.js";
|
||||||
|
|
||||||
|
export default class TilorswiftMenuEditClickedEvent extends Event
|
||||||
|
{
|
||||||
|
constructor()
|
||||||
|
{
|
||||||
|
super(TilorswiftEvent.MENU_EDIT_CLICKED);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
import TilorswiftEvent from "./TilorswiftEvent.js";
|
||||||
|
|
||||||
|
export default class TilorswiftWidgetInsertRowsClickedEvent extends Event
|
||||||
|
{
|
||||||
|
constructor()
|
||||||
|
{
|
||||||
|
super(TilorswiftEvent.WIDGET_INSERT_ROWS_CLICKED);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,46 @@
|
||||||
|
import Widget from "./Widget.js";
|
||||||
|
import BrushMode from "../BrushMode.js";
|
||||||
|
|
||||||
|
export default class InsertRowsWidget extends Widget
|
||||||
|
{
|
||||||
|
constructor(widgetBar, brush)
|
||||||
|
{
|
||||||
|
super('+Zeile');
|
||||||
|
this.elementRowsInput = document.createElement('input');
|
||||||
|
this.elementButton = document.createElement('img');
|
||||||
|
this.htmlElement = this.createElement();
|
||||||
|
this.widgetBar = widgetBar;
|
||||||
|
this.brush = brush;
|
||||||
|
|
||||||
|
this.elementButton.addEventListener(
|
||||||
|
'click',
|
||||||
|
() => {
|
||||||
|
this.widgetBar.disableWidgets();
|
||||||
|
this.enable();
|
||||||
|
this.brush.mode = BrushMode.ADD_ROWS;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
createElement()
|
||||||
|
{
|
||||||
|
let htmlElement = document.createElement('div');
|
||||||
|
htmlElement.id = 'widget-insert-rows';
|
||||||
|
|
||||||
|
this.elementButton.src = 'graphics/button-add-row.svg';
|
||||||
|
this.elementButton.id = 'widget-insert-rows-button';
|
||||||
|
htmlElement.appendChild(this.elementButton);
|
||||||
|
|
||||||
|
this.elementRowsInput.type = 'number';
|
||||||
|
this.elementRowsInput.id = 'widget-insert-rows-input';
|
||||||
|
this.elementRowsInput.value = 1;
|
||||||
|
htmlElement.appendChild(this.elementRowsInput);
|
||||||
|
|
||||||
|
return htmlElement;
|
||||||
|
}
|
||||||
|
|
||||||
|
getElement()
|
||||||
|
{
|
||||||
|
return this.htmlElement;
|
||||||
|
}
|
||||||
|
}
|
|
@ -14,6 +14,10 @@ import WidgetBar from "./menu/WidgetBar.js";
|
||||||
import EntrancePointWidget from "./menu/EntrancePointWidget.js";
|
import EntrancePointWidget from "./menu/EntrancePointWidget.js";
|
||||||
import Brush from "./Brush.js";
|
import Brush from "./Brush.js";
|
||||||
import BrushMode from "./BrushMode.js";
|
import BrushMode from "./BrushMode.js";
|
||||||
|
import DialogAddRows from "./dialog/DialogAddRows.js";
|
||||||
|
import DialogAddColumns from "./dialog/DialogAddColumns.js";
|
||||||
|
import TilorswiftAddRowsClickedEvent from "./events/TilorswiftAddRowsClickedEvent.js";
|
||||||
|
import TilorswiftAddColumnsClickedEvent from "./events/TilorswiftAddColumnsClickedEvent.js";
|
||||||
|
|
||||||
let loader = new FileLoader('../levels/level.json');
|
let loader = new FileLoader('../levels/level.json');
|
||||||
let image = new Image();
|
let image = new Image();
|
||||||
|
@ -24,10 +28,10 @@ image.onload = function () {
|
||||||
let map = document.getElementById('map');
|
let map = document.getElementById('map');
|
||||||
map.appendChild(terrain.getElement());
|
map.appendChild(terrain.getElement());
|
||||||
|
|
||||||
|
terrain.addColumns(200, 1);
|
||||||
|
|
||||||
let brush = new Brush();
|
let brush = new Brush();
|
||||||
|
|
||||||
let tileset = new Tileset(image, 8, 3);
|
let tileset = new Tileset(image, 8, 3);
|
||||||
|
|
||||||
let widgetBar = new WidgetBar('widget-bar');
|
let widgetBar = new WidgetBar('widget-bar');
|
||||||
|
|
||||||
let tilesetPicker = new TilesetPickerWidget(tileset, brush);
|
let tilesetPicker = new TilesetPickerWidget(tileset, brush);
|
||||||
|
@ -35,10 +39,10 @@ image.onload = function () {
|
||||||
|
|
||||||
let entrancePicker = new EntrancePointWidget(widgetBar, brush);
|
let entrancePicker = new EntrancePointWidget(widgetBar, brush);
|
||||||
widgetBar.addWidget(entrancePicker);
|
widgetBar.addWidget(entrancePicker);
|
||||||
|
|
||||||
document.body.appendChild(widgetBar.getElement());
|
document.body.appendChild(widgetBar.getElement());
|
||||||
|
|
||||||
let mouse = new Mouse();
|
let mouse = new Mouse();
|
||||||
|
|
||||||
let mainbar = new MainMenu('mainbar');
|
let mainbar = new MainMenu('mainbar');
|
||||||
|
|
||||||
let menuFile = new MenuGroup('Datei');
|
let menuFile = new MenuGroup('Datei');
|
||||||
|
@ -48,6 +52,11 @@ image.onload = function () {
|
||||||
|
|
||||||
mainbar.addMenuGroup(menuFile);
|
mainbar.addMenuGroup(menuFile);
|
||||||
|
|
||||||
|
let menuEdit = new MenuGroup('Bearbeiten');
|
||||||
|
menuEdit.addMenuEntry(new MainMenuEntry('Zeilen einfügen...', TilorswiftAddRowsClickedEvent));
|
||||||
|
menuEdit.addMenuEntry(new MainMenuEntry('Spalten einfügen...', TilorswiftAddColumnsClickedEvent));
|
||||||
|
mainbar.addMenuGroup(menuEdit);
|
||||||
|
|
||||||
document.body.appendChild(mainbar.getElement());
|
document.body.appendChild(mainbar.getElement());
|
||||||
|
|
||||||
window.addEventListener(
|
window.addEventListener(
|
||||||
|
@ -91,7 +100,35 @@ image.onload = function () {
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
/* Prevent Firefox's default drag and drop for images */
|
window.addEventListener(
|
||||||
|
TilorswiftEvent.ADD_ROWS_CLICKED,
|
||||||
|
() => {
|
||||||
|
new DialogAddRows();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
window.addEventListener(
|
||||||
|
TilorswiftEvent.ADD_COLUMNS_CLICKED,
|
||||||
|
() => {
|
||||||
|
new DialogAddColumns();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
window.addEventListener(
|
||||||
|
TilorswiftEvent.ADD_ROWS,
|
||||||
|
function (event) {
|
||||||
|
terrain.addRows(event.beforeRow, event.rowCount);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
window.addEventListener(
|
||||||
|
TilorswiftEvent.ADD_COLUMNS,
|
||||||
|
function (event) {
|
||||||
|
terrain.addColumns(event.beforeColumn, event.columnCount);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Prevents Firefox's annoying default drag and drop behavior for images */
|
||||||
document.addEventListener(
|
document.addEventListener(
|
||||||
'dragstart',
|
'dragstart',
|
||||||
function (event) {
|
function (event) {
|
||||||
|
@ -102,8 +139,9 @@ image.onload = function () {
|
||||||
window.addEventListener(
|
window.addEventListener(
|
||||||
TilorswiftEvent.MENU_SAVE_CLICKED,
|
TilorswiftEvent.MENU_SAVE_CLICKED,
|
||||||
function () {
|
function () {
|
||||||
Tilorswift.saveTerrainToFile(terrain);
|
if (Tilorswift.saveTerrainToFile(terrain)) {
|
||||||
window.dispatchEvent(new TilorswiftSavedEvent());
|
window.dispatchEvent(new TilorswiftSavedEvent());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
|
@ -131,6 +131,26 @@ body {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#widget-insert-rows {
|
||||||
|
position: relative;
|
||||||
|
width: 96px;
|
||||||
|
height: 96px;
|
||||||
|
border: 1px solid black;
|
||||||
|
}
|
||||||
|
|
||||||
|
#widget-insert-rows-button {
|
||||||
|
width: 100%;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
#widget-insert-rows-input {
|
||||||
|
position: absolute;
|
||||||
|
width: 80%;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
.field, .button-tile {
|
.field, .button-tile {
|
||||||
border: 0;
|
border: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
|
@ -159,6 +179,60 @@ body {
|
||||||
opacity: 0.5;
|
opacity: 0.5;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.dialog {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
background-color: rgba(0, 0, 0, 0.25);
|
||||||
|
position: fixed;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
z-index: 200;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dialog-box {
|
||||||
|
width: 500px;
|
||||||
|
background-color: #cccccc;
|
||||||
|
color: black;
|
||||||
|
padding: 20px;
|
||||||
|
box-shadow: 0 0 20px black;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dialog-message {
|
||||||
|
text-align: center;
|
||||||
|
color: black;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dialog-button-area {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-evenly;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dialog-label {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dialog-input-area {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dialog-input {
|
||||||
|
width: 100%;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dialog-button {
|
||||||
|
padding: 5px 20px;
|
||||||
|
background-color: grey;
|
||||||
|
font-weight: bold;
|
||||||
|
color: white;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
tr:hover > td > .selection {
|
tr:hover > td > .selection {
|
||||||
opacity: 0.5;
|
opacity: 0.5;
|
||||||
|
|
Loading…
Reference in New Issue