-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpreload.js
More file actions
108 lines (99 loc) · 3.54 KB
/
preload.js
File metadata and controls
108 lines (99 loc) · 3.54 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
const { contextBridge, Notification, ipcRenderer } = require('electron');
contextBridge.exposeInMainWorld('API', {
onSpritesLoaded: (callback) => {
ipcRenderer.on('sprites-loaded', (event, paths) => {
callback(paths);
});
},
onProjectLoaded: (callback) => {
ipcRenderer.on('project-loaded', (event, projectData) => {
callback(projectData);
});
},
onExportProject: (callback) => {
ipcRenderer.on('export-project', (event, filePath) => {
callback(filePath);
});
},
onShowConfiguration: (callback) => {
ipcRenderer.on('show-configuration', () => {
callback();
});
},
saveProject: (callback) => {
ipcRenderer.on('save-project', (event, path) => {
callback(path);
});
},
saveFile: (data, defaultPath) => {
ipcRenderer.send('save-file', { data, defaultPath });
},
writeFile: (data, filePath) => {
ipcRenderer.send('write-file', { data, filePath });
}
});
function paint(tile) {
if (tile.classList.contains('sprite') && tile.dataset.x !== undefined && tile.dataset.y !== undefined) {
const x = parseInt(tile.dataset.x, 10);
const y = parseInt(tile.dataset.y, 10);
// load the selected sprite onto this tile
const selected = document.querySelector('.sprite.selected');
if (selected) {
tile.dataset.char = selected.dataset.char;
tile.style.backgroundImage = selected.style.backgroundImage;
tile.style.backgroundSize = 'cover';
}
}
}
function erase(tile) {
if (tile.classList.contains('sprite') && tile.dataset.x !== undefined && tile.dataset.y !== undefined) {
tile.innerHTML = '';
tile.style.backgroundImage = '';
delete tile.dataset.char;
}
}
function setupLayer() {
// Create a grid of divs to hold the sprites
const layer = document.getElementById('layer');
// Get config from window or use defaults
const spriteSize = window.config?.spriteSize || 64;
const rows = window.config?.levelRows || 32;
const cols = window.config?.levelCols || 32;
layer.innerHTML = '';
for (let y = 0; y < rows; y++) {
for (let x = 0; x < cols; x++) {
const tile = document.createElement('div');
tile.className = 'sprite';
tile.style.position = 'absolute';
tile.style.width = `${spriteSize}px`;
tile.style.height = `${spriteSize}px`;
tile.style.left = `${x * spriteSize}px`;
tile.style.top = `${y * spriteSize}px`;
tile.dataset.x = x;
tile.dataset.y = y;
layer.appendChild(tile);
}
}
// delete a tile on right click
// Event delegation for tile clicks
let mouseState = { left: false, right: false };
layer.addEventListener('mousedown', (e) => {
mouseState.right = e.button === 2;
mouseState.left = e.button === 0;
e.button === 0 && paint(e.target);
e.button === 2 && erase(e.target);
});
layer.addEventListener('mouseup', (e) => {
mouseState.right = e.button === 2 ? false : mouseState.right;
mouseState.left = e.button === 0 ? false : mouseState.left;
});
layer.addEventListener('mousemove', (e) => {
mouseState.left && paint(e.target);
mouseState.right && erase(e.target);
});
}
// after dom is loaded
window.addEventListener('DOMContentLoaded', () => {
setupLayer();
// Expose a safe API to the renderer process
});