From 8d52accd2de8e047fdcf45b27879b7669033de3f Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Wed, 13 May 2026 00:49:20 +0200 Subject: [PATCH] Implement terrain layer management (add/delete) and refine layer index clamping --- src/app/App.tsx | 55 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/src/app/App.tsx b/src/app/App.tsx index 7453c49a..0b04130e 100644 --- a/src/app/App.tsx +++ b/src/app/App.tsx @@ -9511,7 +9511,12 @@ export function App({ }; const handleTerrainPaintLayerChange = (value: string) => { - setActiveTerrainPaintLayerIndex(clampTerrainPaintLayerIndex(Number(value))); + setActiveTerrainPaintLayerIndex( + clampTerrainPaintLayerIndex( + Number(value), + selectedTerrain?.layers.length + ) + ); }; const handleTerrainLayerMaterialChange = ( @@ -9559,6 +9564,54 @@ export function App({ } }; + const handleAddTerrainLayer = () => { + if (selectedTerrain === null) { + return; + } + + try { + store.executeCommand( + createAddTerrainLayerCommand({ + terrainId: selectedTerrain.id + }) + ); + setActiveTerrainPaintLayerIndex(selectedTerrain.layers.length); + setStatusMessage( + `Added ${getTerrainLayerLabel(selectedTerrain.layers.length).toLowerCase()}.` + ); + } catch (error) { + setStatusMessage(getErrorMessage(error)); + } + }; + + const handleDeleteTerrainLayer = (layerIndex: number) => { + if (selectedTerrain === null) { + return; + } + + try { + store.executeCommand( + createDeleteTerrainLayerCommand({ + terrainId: selectedTerrain.id, + layerIndex + }) + ); + setActiveTerrainPaintLayerIndex((currentLayerIndex) => + clampTerrainPaintLayerIndex( + currentLayerIndex >= layerIndex + ? currentLayerIndex - 1 + : currentLayerIndex, + selectedTerrain.layers.length - 1 + ) + ); + setStatusMessage( + `Removed ${getTerrainLayerLabel(layerIndex).toLowerCase()}.` + ); + } catch (error) { + setStatusMessage(getErrorMessage(error)); + } + }; + const handleCommitTerrainBrushStroke = ( commit: TerrainBrushStrokeCommit ): boolean => {