Skip to content

Commit 331cf4c

Browse files
author
tpoole
committed
Added exchange and rotate
1 parent 75a68e7 commit 331cf4c

File tree

1 file changed

+61
-8
lines changed

1 file changed

+61
-8
lines changed

tiles/script.js

Lines changed: 61 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,16 @@ const imageData = [
99
[ "https://img.tile.expert/img_lb/aleluia/color-art/per_sito/minimali/b_aleluia_color_art_pf013_color_art_blue.webp?64", 30, ],
1010
];
1111

12-
const resetTileSelection = () => {
13-
const imagesContainer = document.getElementById("tiles");
14-
imagesContainer.innerHTML = "";
12+
const tilesContainer = document.getElementById("tiles");
13+
const resetTilesAvailable = () => {
14+
tilesContainer.innerHTML = "";
1515
imageData.forEach((img, i) => {
16-
const container = imagesContainer.appendChild(document.createElement("div"));
16+
const container = tilesContainer.appendChild(document.createElement("div"));
1717
container.style = "display: inline-block;";
1818
const elem = container.appendChild(document.createElement("img"));
1919
elem.style = "width: 50px; margin: 5px;";
2020
elem.src = img[0];
21+
elem.id = `image-${i}`;
2122
const index = container.appendChild(document.createElement("p"));
2223
index.style = "text-align: center;";
2324
index.innerHTML = i;
@@ -27,7 +28,7 @@ const resetTileSelection = () => {
2728
remaining.innerHTML = img[1];
2829
});
2930
};
30-
resetTileSelection();
31+
resetTilesAvailable();
3132

3233
const getRemaining = (index) => {
3334
const elem = document.getElementById(`remaining-${index}`)
@@ -54,13 +55,21 @@ const getImageElement = (index, rotation) => {
5455
return document.getElementById("tiles").childNodes[index].childNodes[0];
5556
};
5657

58+
const selectedTile = { column: -1, row: -1 };
59+
const resetSelectedTile = () => {
60+
selectedTile.column = -1;
61+
selectedTile.row = -1;
62+
};
63+
5764
const gridWidth = 18;
5865
const gridHeight = 13;
5966

6067
const renderCanvas = () => {
6168
const tileData = parseDataFromTextArea();
6269
if (!tileData[0][0]) return;
6370

71+
ctx.clearRect(0, 0, canvas.width, canvas.height);
72+
6473
const tileSize = getTileSize();
6574

6675
const getCoordFromLineIndex = (row, column) => {
@@ -80,10 +89,16 @@ const renderCanvas = () => {
8089
ctx.translate(-tileSize/2, -tileSize/2);
8190
const image = getImageElement(index, rotation);
8291
ctx.drawImage(image, 0, 0, tileSize, tileSize);
92+
if (row === selectedTile.row && column === selectedTile.column) {
93+
ctx.beginPath();
94+
ctx.strokeStyle = "red";
95+
ctx.rect(0, 0, tileSize, tileSize);
96+
ctx.stroke();
97+
}
8398
ctx.restore();
8499
}
85100
}
86-
}
101+
};
87102

88103
const getTileSize = () => {
89104
return canvas.width / (gridWidth + 1);
@@ -129,8 +144,46 @@ const writeDataToTextArea = (inputData) => {
129144
data.value = inputData.map(row => row.join(" ")).join("\n");
130145
};
131146

147+
const getIndexFromCoord = (tileSize, x, y) => {
148+
let [column, row] = [x, y].map(d => parseInt(d/tileSize));
149+
if (column == 5) return null;
150+
if (column > 5) column--;
151+
return { row, column };
152+
};
153+
154+
canvas.addEventListener('mousedown', (event) => {
155+
const clicked = getIndexFromCoord(getTileSize(), event.offsetX, event.offsetY);
156+
if (!clicked) return;
157+
158+
if (event.shiftKey) {
159+
const data = parseDataFromTextArea();
160+
const item = data[clicked.row][clicked.column];
161+
data[clicked.row][clicked.column] = `${item[0]}${(parseInt(item[1]) + 1)%4}`;
162+
writeDataToTextArea(data);
163+
writeDataToCondensed(data);
164+
} else if (selectedTile.column === -1) {
165+
selectedTile.column = clicked.column;
166+
selectedTile.row = clicked.row;
167+
} else {
168+
if (!(clicked.column === selectedTile.column && clicked.row === selectedTile.row)) {
169+
const data = parseDataFromTextArea();
170+
const tmp = data[selectedTile.row][selectedTile.column];
171+
data[selectedTile.row][selectedTile.column] = data[clicked.row][clicked.column];
172+
data[clicked.row][clicked.column] = tmp;
173+
writeDataToTextArea(data);
174+
writeDataToCondensed(data);
175+
}
176+
resetSelectedTile();
177+
}
178+
renderCanvas();
179+
});
180+
181+
tilesContainer.addEventListener('mousedown', (event) => {
182+
if (selectedTile.x === -1) return;
183+
});
184+
132185
const randomise = () => {
133-
resetTileSelection();
186+
resetTilesAvailable();
134187
const tileData = [[]];
135188
for (let row = 0; row < gridHeight; row++) {
136189
for (let column = 0; column < gridWidth; column++) {
@@ -174,7 +227,7 @@ const renderCondesnsed = () => {
174227
const renderTextArea = () => {
175228
const tileData = parseDataFromTextArea();
176229
writeDataToCondensed(tileData);
177-
resetTileSelection();
230+
resetTilesAvailable();
178231
tileData.forEach(rowData => {
179232
rowData.forEach(tileData => {
180233
const tileIndex = tileData[0];

0 commit comments

Comments
 (0)