Jean-baptiste Aujogue commited on
Commit
18febbd
·
unverified ·
1 Parent(s): bf0b4f6

Internal state separation across user sessions (#7)

Browse files

* fix interface trigger
* use session states for cube and visualizer

Files changed (2) hide show
  1. src/rubik/__main__.py +2 -1
  2. src/rubik/interface/app.py +15 -19
src/rubik/__main__.py CHANGED
@@ -3,4 +3,5 @@ from fire import Fire
3
  from rubik.interface.app import app
4
 
5
 
6
- Fire({"interface": app})
 
 
3
  from rubik.interface.app import app
4
 
5
 
6
+ if __name__ == "__main__":
7
+ Fire({"interface": app})
src/rubik/interface/app.py CHANGED
@@ -14,29 +14,21 @@ def app(default_size: int = 3, server_port: int = 7860):
14
  - ability to rotate it through a text field.
15
  - display a cube upon creation or update.
16
  """
17
- cube = Cube(default_size)
18
- cube_visualizer = CubeVisualizer(default_size)
19
 
20
- def create_cube(size) -> None:
21
- nonlocal cube
22
- nonlocal cube_visualizer
23
  cube = Cube(size)
24
  cube_visualizer = CubeVisualizer(size)
25
- return
26
 
27
- def scramble_cube(num_moves: int) -> None:
28
- nonlocal cube
29
  cube.scramble(num_moves, seed=0)
30
- return
31
 
32
- def rotate_cube(moves: str) -> None:
33
- nonlocal cube
34
  cube.rotate(moves)
35
- return
36
 
37
- def display_cube() -> go.Figure:
38
- nonlocal cube
39
- nonlocal cube_visualizer
40
  layout_args = {"autosize": False, "width": 600, "height": 600}
41
  return cube_visualizer(cube.coordinates, cube.state, cube.size).update_layout(**layout_args)
42
 
@@ -45,6 +37,9 @@ def app(default_size: int = 3, server_port: int = 7860):
45
  gr.Markdown("Rubik's Cube Interface")
46
  with gr.Row():
47
  with gr.Column(scale=15):
 
 
 
48
  size = gr.Slider(1, 100, value=default_size, step=1, label="Select a size")
49
  create_btn = gr.Button("Generate a Cube")
50
 
@@ -55,12 +50,13 @@ def app(default_size: int = 3, server_port: int = 7860):
55
  rotate_btn = gr.Button("Rotate the Cube")
56
 
57
  with gr.Column(scale=85):
58
- plot = gr.Plot(display_cube(), container=False)
59
 
60
  # interactions
61
- create_btn.click(create_cube, inputs=size).success(display_cube, None, plot)
62
- scramble_btn.click(scramble_cube, inputs=num_moves).success(display_cube, None, plot)
63
- rotate_btn.click(rotate_cube, inputs=moves).success(display_cube, None, plot)
 
64
 
65
  demo.launch(server_name="0.0.0.0", server_port=server_port)
66
  return
 
14
  - ability to rotate it through a text field.
15
  - display a cube upon creation or update.
16
  """
 
 
17
 
18
+ def create(size) -> tuple[gr.State, gr.State]:
 
 
19
  cube = Cube(size)
20
  cube_visualizer = CubeVisualizer(size)
21
+ return cube, cube_visualizer
22
 
23
+ def scramble(num_moves: int, cube: gr.State) -> gr.State:
 
24
  cube.scramble(num_moves, seed=0)
25
+ return cube
26
 
27
+ def rotate(moves: str, cube: gr.State) -> gr.State:
 
28
  cube.rotate(moves)
29
+ return cube
30
 
31
+ def display(cube: gr.State, cube_visualizer: gr.State) -> go.Figure:
 
 
32
  layout_args = {"autosize": False, "width": 600, "height": 600}
33
  return cube_visualizer(cube.coordinates, cube.state, cube.size).update_layout(**layout_args)
34
 
 
37
  gr.Markdown("Rubik's Cube Interface")
38
  with gr.Row():
39
  with gr.Column(scale=15):
40
+ cube = gr.State(None)
41
+ cube_visualizer = gr.State(None)
42
+
43
  size = gr.Slider(1, 100, value=default_size, step=1, label="Select a size")
44
  create_btn = gr.Button("Generate a Cube")
45
 
 
50
  rotate_btn = gr.Button("Rotate the Cube")
51
 
52
  with gr.Column(scale=85):
53
+ plot = gr.Plot(None, container=False)
54
 
55
  # interactions
56
+ demo.load(create, size, [cube, cube_visualizer]).success(display, [cube, cube_visualizer], plot)
57
+ create_btn.click(create, size, [cube, cube_visualizer]).success(display, [cube, cube_visualizer], plot)
58
+ scramble_btn.click(scramble, [num_moves, cube], cube).success(display, [cube, cube_visualizer], plot)
59
+ rotate_btn.click(rotate, [moves, cube], cube).success(display, [cube, cube_visualizer], plot)
60
 
61
  demo.launch(server_name="0.0.0.0", server_port=server_port)
62
  return