This repository has been archived on 2026-02-23. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
hammer/src/App.tsx
2025-09-21 15:33:19 +02:00

172 lines
6.8 KiB
TypeScript

import { useEffect, useRef } from "react"
import { Hammer } from "./classes/Hammer";
import pako from "pako";
function App() {
// ? elements
// * Canvas
const canvas = useRef(null);
// * Buttons
const button_set_tilesheet = useRef(null);
const button_import_map = useRef(null);
// * Divs
const div_progress_bar = useRef(null);
const div_progress = useRef(null);
const div_view_tiles = useRef(null);
// * Input (a part)
const inputFileTilesheet = useRef<HTMLInputElement>(null);
const inputFileMap = useRef<HTMLInputElement>(null);
// ? hammer
const hammerRef = useRef<Hammer | null>(null);
useEffect(() => {
hammerRef.current = new Hammer();
hammerRef.current.helements.setElement("canvas", canvas.current);
hammerRef.current.helements.setElement("button_set_tilesheet", button_set_tilesheet.current);
hammerRef.current.helements.setElement("button_import_map", button_import_map.current);
hammerRef.current.helements.setElement("div_progress_bar", div_progress_bar.current);
hammerRef.current.helements.setElement("div_progress", div_progress.current);
hammerRef.current.helements.setElement("div_view_tiles", div_view_tiles.current);
return () => {
hammerRef.current?.hevent.destroy();
}
}, []);
// ? functions
const handleLoadTilesheet = () => {
if (hammerRef.current != null) {
const files = inputFileTilesheet.current?.files;
if (files && files?.length > 0) {
hammerRef.current.loadTileSheet(files[0]);
}
}
}
const handleLoadMap = async () => {
if (hammerRef.current != null) {
const files = inputFileMap.current?.files;
if (files && files.length > 0) {
hammerRef.current.hconsole.push("Importing the current map...");
// ? Verif du format
let filenameSplit = files[0].name.split(".");
if (!["tmpx"].includes(filenameSplit[filenameSplit.length - 1])) {
return hammerRef.current.hconsole.push("File format invalid !", "ERROR")
};
try {
let reader = new FileReader();
reader.readAsArrayBuffer(files[0]);
reader.onload = (evt) => {
if (evt.target) {
// @ts-expect-error
const uncompressed_data = pako.inflate(evt.target.result, {to: "string"});
console.log(uncompressed_data)
const data = JSON.parse(uncompressed_data as string);
if (hammerRef.current) {
const tl = new Image();
tl.src = data.tilesheet;
tl.onload = () => {
if (hammerRef.current) {
hammerRef.current.setTileSheet(tl);
hammerRef.current.heditor.tileMap = data.map;
}
};
}
}
}
} catch (error) {
hammerRef.current.hconsole.push("Error importing map.", "ERROR");
}
}
}
}
return (
<>
<div ref={div_progress_bar} className="progress-bar nodisplay">
<div ref={div_progress} className="progress"></div>
</div>
<div className="div-hammer-container">
<div className="tools">
<button onClick={() => inputFileMap.current?.click()} ref={button_import_map}><img src="/assets/images/import.png" alt="import" />
<span>Import Map (I)</span>
<input type="file" id="inputFileMap" ref={inputFileMap} onChange={handleLoadMap} className="nodisplay" accept=".tmpx" />
</button>
<button onClick={() => { hammerRef.current && hammerRef.current.mapToJson() }}>
<img src="/assets/images/save.png" alt="save" />
<span>Save local copy (ctrl + s)</span>
</button>
<hr />
<button onClick={() => inputFileTilesheet.current?.click()} ref={button_set_tilesheet}>
<img src="/assets/images/palet.png" alt="palet" />
<span>Upload Tilesheet (U)</span>
<input type="file" id="inputFileTS" ref={inputFileTilesheet} onChange={handleLoadTilesheet} className="nodisplay" accept="image/png, image/jpg, image/jpeg" />
</button>
<button onClick={() => { if (hammerRef.current) { hammerRef.current.heditor.tool = "draw"; } }}>
<img src="/assets/images/pen.png" alt="pen" />
<span>Draw (D)</span>
</button>
<button onClick={() => { if (hammerRef.current) { hammerRef.current.heditor.tool = "eraser"; } }}>
<img src="/assets/images/erase.png" alt="erase" />
<span>Erase (E)</span>
</button>
<button>
<img src="/assets/images/bucket.png" alt="bucket" />
<span>Bucket (B)</span>
</button>
<button>
<img src="/assets/images/rect.png" alt="rect" />
<span>Rectangle (R)</span>
</button>
<button>
<img src="/assets/images/measure.png" alt="measure" />
<span>Measure (M)</span>
</button>
<hr />
<button>
<img src="/assets/images/center.png" alt="center" onClick={() => hammerRef.current && hammerRef.current.hcanvas.centerView()} />
<span>Center view (C)</span>
</button>
</div>
<div className="div-container-map">
<div className="container-tiles">
<div ref={div_view_tiles} className="div-scroll-tiles">
</div>
</div>
<div className="div-container-view">
<div className="div-canvas-container">
<canvas ref={canvas} id="canvasHammer"></canvas>
</div>
<div className="div-console" contentEditable="true">
</div>
</div>
</div>
</div>
</>
)
}
export default App