@@ -17,27 +17,9 @@ type MapObjectListItemProps = {
17
17
18
18
export function MapObjectListItem ( { map, obj, index } : MapObjectListItemProps ) : JSX . Element {
19
19
20
- const { project, updateMap, updateState, updateProject } = useMapOMaticContext ( ) ;
20
+ const { project, updateMap, updateState } = useMapOMaticContext ( ) ;
21
21
const navigate = useNavigate ( )
22
22
23
- const messageCount = obj . data . message . length
24
- const condsCount = obj . data . item . COND . length
25
- const invisCount = Object . values ( obj . data . item . visi ) . filter ( x => x !== "" ) . length
26
- const name = obj . data . item . name
27
-
28
- function iconShade ( value : number ) : "lightgray" | "black" {
29
- return value === 0 ? "lightgray" : "black"
30
- }
31
-
32
- function getImage ( member : string ) : string {
33
- if ( member . toLowerCase ( ) . endsWith ( ".x" ) )
34
- member = member . replace ( ".x" , "" )
35
- const img = project . images . find ( x => x . filename . toLowerCase ( ) === member . toLowerCase ( ) )
36
- if ( img )
37
- return URL . createObjectURL ( img . data )
38
- return ""
39
- }
40
-
41
23
function resetHighlights ( ) : void {
42
24
updateMap ( produce ( map , draft => {
43
25
draft . data . objects . forEach ( obj => {
@@ -123,18 +105,6 @@ export function MapObjectListItem({ map, obj, index }: MapObjectListItemProps):
123
105
}
124
106
}
125
107
126
- function getBackgroundColor ( obj : MapObject ) : string {
127
- switch ( obj . data . item . type ) {
128
- case MapObjectType . FLOR :
129
- case MapObjectType . Scooby2_floor :
130
- return "#CAF1DE"
131
- case MapObjectType . WALL : return "#F7D8BA"
132
- case MapObjectType . CHAR : return "#FFFFCC"
133
- case MapObjectType . DOOR : return "#CCCCFF"
134
- case MapObjectType . ITEM : return "#FFCCE5"
135
- case MapObjectType . WATER : return "#CCE5FF"
136
- }
137
- }
138
108
139
109
return (
140
110
< Card padding = { "xs" } withBorder key = { obj . random_id }
@@ -190,83 +160,7 @@ export function MapObjectListItem({ map, obj, index }: MapObjectListItemProps):
190
160
< IconCopyPlus />
191
161
</ ActionIcon >
192
162
</ div >
193
- < div >
194
- < Image mah = { 32 } maw = { 32 } src = { getImage ( obj . member ) } alt = { obj . member } />
195
- </ div >
196
- < Group gap = { 5 } >
197
- < HoverCard shadow = { "xl" } disabled = { ! invisCount } >
198
- < HoverCard . Target >
199
- < Indicator size = { 16 } inline disabled = { ! invisCount } color = { "blue" } label = { invisCount } >
200
- < IconGhost color = { iconShade ( invisCount ) } title = "Invisibility" />
201
- </ Indicator >
202
- </ HoverCard . Target >
203
- < HoverCard . Dropdown >
204
- { Object . entries ( obj . data . item . visi ) . filter ( ( [ _ , o ] ) => o ) . map ( ( [ key , val ] ) => (
205
- < div key = { key } > { key } : < Code > { val } </ Code > </ div >
206
- ) ) }
207
- </ HoverCard . Dropdown >
208
- </ HoverCard >
209
- < HoverCard shadow = { "xl" } disabled = { ! condsCount } >
210
- < HoverCard . Target >
211
- < Indicator size = { 16 } inline disabled = { ! condsCount } color = { "blue" } label = { condsCount } >
212
- < IconCodeDots color = { iconShade ( condsCount ) } title = "Conditions" />
213
- </ Indicator >
214
- </ HoverCard . Target >
215
- < HoverCard . Dropdown >
216
- { obj . data . item . COND
217
- . map ( cond => {
218
- const entries = Object . entries ( cond )
219
- return (
220
- < Card withBorder >
221
- < div >
222
- { entries . map ( ( [ key , value ] ) => {
223
- return (
224
- < div key = { key } >
225
- { key } : < Code > { value } </ Code >
226
- </ div >
227
- )
228
- } ) }
229
- </ div >
230
- </ Card >
231
- ) ;
232
- } )
233
- }
234
- </ HoverCard . Dropdown >
235
- </ HoverCard >
236
- < HoverCard shadow = { "xl" } disabled = { ! messageCount } >
237
- < HoverCard . Target >
238
- < Indicator size = { 16 } inline disabled = { ! messageCount } color = { "blue" } label = { messageCount } >
239
- < IconMessage color = { iconShade ( messageCount ) } title = "Messages" />
240
- </ Indicator >
241
- </ HoverCard . Target >
242
- < HoverCard . Dropdown >
243
- < Stack gap = { "xs" } >
244
- { obj . data . message . map ( x => {
245
- return (
246
- < div >
247
- { x . plrAct ? ( < Code > Act: { x . plrAct } </ Code > ) : null }
248
- { x . plrObj ? ( < Code > Obj: { x . plrObj } </ Code > ) : null }
249
- < Text size = { "sm" } >
250
- { x . text . length > 50 ? x . text . slice ( 0 , 50 ) + "..." : x . text }
251
- </ Text >
252
- </ div >
253
- )
254
- } ) }
255
- </ Stack >
256
- </ HoverCard . Dropdown >
257
- </ HoverCard >
258
- < HoverCard shadow = { "xl" } disabled = { ! name } >
259
- < HoverCard . Target >
260
- < Indicator size = { 16 } inline disabled = { ! name } color = { "blue" } label = { 1 } >
261
- < IconTextCaption color = { iconShade ( name . length ) } title = { name ? name : "Name" } />
262
- </ Indicator >
263
- </ HoverCard . Target >
264
- < HoverCard . Dropdown >
265
- < div > < Code > { obj . data . item . type } </ Code > </ div >
266
- < Code > { obj . data . item . name } </ Code >
267
- </ HoverCard . Dropdown >
268
- </ HoverCard >
269
- </ Group >
163
+ < MapObjectPreview key = { obj . random_id } obj = { obj } />
270
164
< ActionIcon
271
165
color = { "red" }
272
166
onClick = { ( ) => removeObj ( obj . random_id ) } >
@@ -275,4 +169,109 @@ export function MapObjectListItem({ map, obj, index }: MapObjectListItemProps):
275
169
</ Group >
276
170
</ Card >
277
171
) ;
172
+ }
173
+
174
+ type MapObjectPreviewProps = {
175
+ obj : MapObject
176
+ }
177
+
178
+ export function MapObjectPreview ( { obj } : MapObjectPreviewProps ) {
179
+ const { project } = useMapOMaticContext ( ) ;
180
+ const messageCount = obj . data . message . length
181
+ const condsCount = obj . data . item . COND . length
182
+ const invisCount = Object . values ( obj . data . item . visi ) . filter ( x => x !== "" ) . length
183
+ const name = obj . data . item . name
184
+
185
+ function iconShade ( value : number ) : "lightgray" | "black" {
186
+ return value === 0 ? "lightgray" : "black"
187
+ }
188
+
189
+ function getImage ( member : string ) : string {
190
+ if ( member . toLowerCase ( ) . endsWith ( ".x" ) )
191
+ member = member . replace ( ".x" , "" )
192
+ const img = project . images . find ( x => x . filename . toLowerCase ( ) === member . toLowerCase ( ) )
193
+ if ( img )
194
+ return URL . createObjectURL ( img . data )
195
+ return ""
196
+ }
197
+
198
+ return (
199
+ < Group key = { obj . random_id } gap = { 5 } >
200
+ < div >
201
+ < Image mah = { 32 } maw = { 32 } src = { getImage ( obj . member ) } alt = { obj . member } />
202
+ </ div >
203
+ < HoverCard shadow = { "xl" } disabled = { ! invisCount } >
204
+ < HoverCard . Target >
205
+ < Indicator size = { 16 } inline disabled = { ! invisCount } color = { "blue" } label = { invisCount } >
206
+ < IconGhost color = { iconShade ( invisCount ) } title = "Invisibility" />
207
+ </ Indicator >
208
+ </ HoverCard . Target >
209
+ < HoverCard . Dropdown >
210
+ { Object . entries ( obj . data . item . visi ) . filter ( ( [ _ , o ] ) => o ) . map ( ( [ key , val ] ) => (
211
+ < div key = { key } > { key } : < Code > { val } </ Code > </ div >
212
+ ) ) }
213
+ </ HoverCard . Dropdown >
214
+ </ HoverCard >
215
+ < HoverCard shadow = { "xl" } disabled = { ! condsCount } >
216
+ < HoverCard . Target >
217
+ < Indicator size = { 16 } inline disabled = { ! condsCount } color = { "blue" } label = { condsCount } >
218
+ < IconCodeDots color = { iconShade ( condsCount ) } title = "Conditions" />
219
+ </ Indicator >
220
+ </ HoverCard . Target >
221
+ < HoverCard . Dropdown >
222
+ { obj . data . item . COND
223
+ . map ( cond => {
224
+ const entries = Object . entries ( cond )
225
+ return (
226
+ < Card key = { obj . random_id } withBorder >
227
+ < div >
228
+ { entries . map ( ( [ key , value ] ) => {
229
+ return (
230
+ < div key = { key } >
231
+ { key } : < Code > { value } </ Code >
232
+ </ div >
233
+ )
234
+ } ) }
235
+ </ div >
236
+ </ Card >
237
+ ) ;
238
+ } )
239
+ }
240
+ </ HoverCard . Dropdown >
241
+ </ HoverCard >
242
+ < HoverCard shadow = { "xl" } disabled = { ! messageCount } >
243
+ < HoverCard . Target >
244
+ < Indicator size = { 16 } inline disabled = { ! messageCount } color = { "blue" } label = { messageCount } >
245
+ < IconMessage color = { iconShade ( messageCount ) } title = "Messages" />
246
+ </ Indicator >
247
+ </ HoverCard . Target >
248
+ < HoverCard . Dropdown >
249
+ < Stack gap = { "xs" } >
250
+ { obj . data . message . map ( x => {
251
+ return (
252
+ < div key = { obj . random_id } >
253
+ { x . plrAct ? ( < Code > Act: { x . plrAct } </ Code > ) : null }
254
+ { x . plrObj ? ( < Code > Obj: { x . plrObj } </ Code > ) : null }
255
+ < Text size = { "sm" } >
256
+ { x . text . length > 50 ? x . text . slice ( 0 , 50 ) + "..." : x . text }
257
+ </ Text >
258
+ </ div >
259
+ )
260
+ } ) }
261
+ </ Stack >
262
+ </ HoverCard . Dropdown >
263
+ </ HoverCard >
264
+ < HoverCard shadow = { "xl" } disabled = { ! name } >
265
+ < HoverCard . Target >
266
+ < Indicator size = { 16 } inline disabled = { ! name } color = { "blue" } label = { 1 } >
267
+ < IconTextCaption color = { iconShade ( name . length ) } title = { name ? name : "Name" } />
268
+ </ Indicator >
269
+ </ HoverCard . Target >
270
+ < HoverCard . Dropdown >
271
+ < div > < Code > { obj . data . item . type } </ Code > </ div >
272
+ < Code > { obj . data . item . name } </ Code >
273
+ </ HoverCard . Dropdown >
274
+ </ HoverCard >
275
+ </ Group >
276
+ )
278
277
}
0 commit comments