@@ -225,6 +225,7 @@ def ModelController(model: solara.Reactive[Model], play_interval=100):
225
225
play_interval (int, optional): Interval for playing the model steps in milliseconds.
226
226
"""
227
227
playing = solara .use_reactive (False )
228
+ running = solara .use_reactive (True )
228
229
original_model = solara .use_reactive (None )
229
230
230
231
def save_initial_model ():
@@ -236,19 +237,23 @@ def save_initial_model():
236
237
solara .use_effect (save_initial_model , [model .value ])
237
238
238
239
async def step ():
239
- while playing .value :
240
+ while playing .value and running . value :
240
241
await asyncio .sleep (play_interval / 1000 )
241
242
do_step ()
242
243
243
- solara .lab .use_task (step , dependencies = [playing .value ], prefer_threaded = False )
244
+ solara .lab .use_task (
245
+ step , dependencies = [playing .value , running .value ], prefer_threaded = False
246
+ )
244
247
245
248
def do_step ():
246
249
"""Advance the model by one step."""
247
250
model .value .step ()
251
+ running .value = model .value .running
248
252
249
253
def do_reset ():
250
254
"""Reset the model to its initial state."""
251
255
playing .value = False
256
+ running .value = True
252
257
model .value = copy .deepcopy (original_model .value )
253
258
254
259
def do_play_pause ():
@@ -261,9 +266,13 @@ def do_play_pause():
261
266
label = "▶" if not playing .value else "❚❚" ,
262
267
color = "primary" ,
263
268
on_click = do_play_pause ,
269
+ disabled = not running .value ,
264
270
)
265
271
solara .Button (
266
- label = "Step" , color = "primary" , on_click = do_step , disabled = playing .value
272
+ label = "Step" ,
273
+ color = "primary" ,
274
+ on_click = do_step ,
275
+ disabled = playing .value or not running .value ,
267
276
)
268
277
269
278
0 commit comments