@@ -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
3233const 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+
5764const gridWidth = 18 ;
5865const gridHeight = 13 ;
5966
6067const 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
88103const 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+
132185const 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 = () => {
174227const 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