@@ -24,7 +24,7 @@ Yome.initialState = () => {
24
24
return { sides : [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ] . map ( ( ) => new Object ( ) ) }
25
25
}
26
26
27
- Yome . state = Yome . state || Yome . initialState ( ) ;
27
+ // Yome.state = Yome.state || Yome.initialState();
28
28
//l(Yome.state)
29
29
30
30
Yome . sideCount = ( st ) => st . sides . length
@@ -33,7 +33,6 @@ Yome.sideCount = (st) => st.sides.length
33
33
Yome . sliceTheta = ( st ) => 2 * Math . PI / Yome . sideCount ( st )
34
34
//l(Yome.sliceTheta(Yome.state))
35
35
36
-
37
36
Yome . rotate = ( theta , point ) => {
38
37
const sint = Math . sin ( theta ) , cost = Math . cos ( theta ) ;
39
38
return { x : ( point . x * cost ) - ( point . y * sint ) ,
@@ -183,14 +182,16 @@ Yome.drawYome = (st) =>
183
182
//Yome.clearPlayArea()
184
183
185
184
//side effecting
186
- Yome . eventHandler = ( f ) =>
187
- ( e => { e . preventDefault ( ) ; f ( e . target . value ) ; Yome . render ( ) } )
185
+ Yome . prevent = ( f ) =>
186
+ ( e => { e . preventDefault ( ) ; f ( e . target . value ) ; } )
188
187
189
188
//side effecting
190
- Yome . changeSideCount = ( new_count ) => {
189
+ Yome . changeSideCount = ( state ) =>
190
+ ( new_count ) => {
191
191
let nArray = Array . apply ( null , Array ( parseInt ( new_count ) ) ) ;
192
- Yome . state . sides = nArray . map ( ( _ , i ) => Yome . state . sides [ i ] || { } ) ;
193
- }
192
+ state . changeState ( ( st ) => st . sides = nArray . map ( ( _ , i ) => st . sides [ i ] || { } ) )
193
+ }
194
+
194
195
//Yome.changeSideCount(6)
195
196
//Yome.changeSideCount(7)
196
197
//Yome.changeSideCount(8)
@@ -202,7 +203,7 @@ Yome.sideOptions = () =>
202
203
Yome . sideCountInput = st =>
203
204
< div className = "top-control" >
204
205
< span > Size of Yome </ span >
205
- < select onChange = { Yome . eventHandler ( Yome . changeSideCount ) }
206
+ < select onChange = { Yome . prevent ( Yome . changeSideCount ( st ) ) }
206
207
value = { Yome . sideCount ( st ) } >
207
208
{ Yome . sideOptions ( ) }
208
209
</ select >
@@ -213,10 +214,13 @@ Yome.sideCountInput = st =>
213
214
214
215
Yome . worldPosition = ( point ) => ( { x : point . x + 250 , y : point . y + 250 } )
215
216
216
- Yome . addRemoveWindow = ( i ) =>
217
+ Yome . addRemoveWindow = ( state , i ) =>
217
218
( _ ) => {
218
- const side = Yome . state . sides [ i ] ;
219
- side . face = ( ! side . face ? "window" : null ) ;
219
+ state . changeState (
220
+ ( st ) => {
221
+ const side = st . sides [ i ] ;
222
+ side . face = ( ! side . face ? "window" : null ) ;
223
+ } )
220
224
}
221
225
222
226
Yome . windowControl = ( st , side , i ) => {
@@ -227,7 +231,7 @@ Yome.windowControl = (st, side, i) => {
227
231
left : pos . x } } >
228
232
< a className = { "window-control-offset " +
229
233
( add ? "add" : "remove" ) }
230
- onClick = { Yome . eventHandler ( Yome . addRemoveWindow ( i ) ) }
234
+ onClick = { Yome . prevent ( Yome . addRemoveWindow ( st , i ) ) }
231
235
href = "#" >
232
236
{ add ? "+ window" : "- window" }
233
237
</ a >
@@ -240,35 +244,51 @@ Yome.windowControls = (st) =>
240
244
// --- Corner Controls
241
245
242
246
// SIDE EFFECT
243
- Yome . addRemoveCornerItem = ( type , side ) =>
244
- ( _ ) => side . corner = ( side . corner ? null : type )
247
+ Yome . addRemoveCornerItem = ( state , type , i ) =>
248
+ ( _ ) =>
249
+ state . changeState ( st => {
250
+ st . sides [ i ] . corner = ( st . sides [ i ] . corner ? null : type )
251
+ } )
245
252
246
253
Yome . cornerControlStateClass = ( type , corner_type ) =>
247
254
( ( ! corner_type ) && "add" ) || ( ( corner_type == type ) && "remove" ) || "hidden"
248
255
249
- Yome . cornerControlLink = ( type , side ) =>
250
- < a className = { Yome . cornerControlStateClass ( type , side . corner ) }
256
+ Yome . cornerControlLink = ( state , type , i ) => {
257
+ const side = state . sides [ i ] ;
258
+ return < a className = { Yome . cornerControlStateClass ( type , side . corner ) }
251
259
key = { type } href = "#"
252
- onClick = { Yome . eventHandler ( Yome . addRemoveCornerItem ( type , side ) ) } >
260
+ onClick = { Yome . prevent ( Yome . addRemoveCornerItem ( state , type , i ) ) } >
253
261
{ ( side . corner ? "- " : "+ " ) + type }
254
262
</ a >
263
+ }
255
264
256
- Yome . cornerControlLinks = ( side , i ) =>
265
+ Yome . cornerControlLinks = ( state , i ) =>
257
266
[ "stove-vent" , "zip-door" , "door-frame" ] . map (
258
- ( t ) => Yome . cornerControlLink ( t , side ) )
267
+ ( t ) => Yome . cornerControlLink ( state , t , i ) )
259
268
260
- Yome . cornerControl = ( st , side , i ) => {
261
- let theta = Yome . sliceTheta ( st ) * ( i + 0.5 ) ,
269
+ Yome . cornerControl = ( st , i ) => {
270
+ let side = st . sides [ i ] ,
271
+ theta = Yome . sliceTheta ( st ) * ( i + 0.5 ) ,
262
272
pos = Yome . worldPosition ( Yome . radialPoint ( 221 , theta ) ) ;
263
273
return < div className = "control-holder" style = { { top : pos . y , left : pos . x } } >
264
274
< div className = "corner-control-offset" >
265
- { Yome . cornerControlLinks ( side , i ) }
275
+ { Yome . cornerControlLinks ( st , i ) }
266
276
</ div >
267
277
</ div >
268
278
}
269
279
280
+ Yome . StateHolder = function ( sides , renderFunc ) {
281
+ this . sides = sides ;
282
+ this . __render = renderFunc ;
283
+ }
284
+
285
+ Yome . StateHolder . prototype . changeState = function ( f ) {
286
+ f ( this ) ;
287
+ this . __render ( )
288
+ }
289
+
270
290
Yome . cornerControls = ( st ) =>
271
- st . sides . map ( ( side , i ) => Yome . cornerControl ( st , side , i ) )
291
+ st . sides . map ( ( _ , i ) => Yome . cornerControl ( st , i ) )
272
292
273
293
// --- Add new code above this line ---
274
294
@@ -282,7 +302,8 @@ Yome.widget = (st) =>
282
302
</ div >
283
303
</ div >
284
304
285
- Yome . render = ( ) =>
286
- React . render ( Yome . widget ( Yome . state ) , document . getElementById ( 'app' ) )
305
+ Yome . state = Yome . state ||
306
+ new Yome . StateHolder ( Yome . initialState ( ) . sides ,
307
+ ( ) => { React . render ( Yome . widget ( Yome . state ) , document . getElementById ( 'app' ) ) } ) ;
287
308
288
- Yome . render ( ) ;
309
+ Yome . state . __render ( )
0 commit comments