Spaces:
Sleeping
Sleeping
Jean-baptiste Aujogue
commited on
Internal state separation across user sessions (#7)
Browse files* fix interface trigger
* use session states for cube and visualizer
- src/rubik/__main__.py +2 -1
- 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 |
-
|
|
|
|
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
|
21 |
-
nonlocal cube
|
22 |
-
nonlocal cube_visualizer
|
23 |
cube = Cube(size)
|
24 |
cube_visualizer = CubeVisualizer(size)
|
25 |
-
return
|
26 |
|
27 |
-
def
|
28 |
-
nonlocal cube
|
29 |
cube.scramble(num_moves, seed=0)
|
30 |
-
return
|
31 |
|
32 |
-
def
|
33 |
-
nonlocal cube
|
34 |
cube.rotate(moves)
|
35 |
-
return
|
36 |
|
37 |
-
def
|
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(
|
59 |
|
60 |
# interactions
|
61 |
-
|
62 |
-
|
63 |
-
|
|
|
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
|