GUI layouts¶
Organize GUI controls using folders, tabs, and nested structures for better user experience.
Features:
viser.GuiApi.add_folder()
for grouping related controlsviser.GuiApi.add_tab_group()
andviser.GuiTabGroupHandle.add_tab()
for tabbed interfacesNested folder hierarchies for complex layouts
Context managers for automatic grouping
Source: examples/02_gui/02_layouts.py

Code¶
1import time
2
3import viser
4
5
6def main() -> None:
7 server = viser.ViserServer()
8
9 # Example 1: Organizing with folders
10 with server.gui.add_folder("Camera Controls"):
11 with server.gui.add_folder("Position"):
12 server.gui.add_slider("X", min=-5.0, max=5.0, step=0.1, initial_value=0.0)
13 server.gui.add_slider("Y", min=-5.0, max=5.0, step=0.1, initial_value=2.0)
14 server.gui.add_slider("Z", min=-5.0, max=5.0, step=0.1, initial_value=3.0)
15
16 with server.gui.add_folder("Rotation"):
17 server.gui.add_slider("Pitch", min=-180, max=180, step=1, initial_value=0)
18 server.gui.add_slider("Yaw", min=-180, max=180, step=1, initial_value=0)
19 server.gui.add_slider("Roll", min=-180, max=180, step=1, initial_value=0)
20
21 # Example 2: Scene objects organization
22 with server.gui.add_folder("Scene Objects"):
23 with server.gui.add_folder("Lighting"):
24 server.gui.add_checkbox("Enable Lighting", initial_value=True)
25 server.gui.add_slider(
26 "Intensity", min=0.0, max=2.0, step=0.1, initial_value=1.0
27 )
28 server.gui.add_rgb("Color", initial_value=(255, 255, 255))
29
30 with server.gui.add_folder("Objects"): # GUI objects folder
31 show_axes = server.gui.add_checkbox(
32 "Show Coordinate Axes", initial_value=True
33 )
34 server.gui.add_checkbox("Show Grid", initial_value=False)
35
36 with server.gui.add_folder("Sphere"):
37 sphere_radius = server.gui.add_slider(
38 "Radius", min=0.1, max=2.0, step=0.1, initial_value=0.5
39 )
40 sphere_color = server.gui.add_rgb("Color", initial_value=(255, 0, 0))
41 sphere_visible = server.gui.add_checkbox("Visible", initial_value=True)
42
43 # Example 3: Settings and preferences
44 with server.gui.add_folder("Settings"):
45 with server.gui.add_folder("Display"):
46 server.gui.add_rgb("Background", initial_value=(40, 40, 40))
47 server.gui.add_checkbox("Wireframe Mode", initial_value=False)
48
49 with server.gui.add_folder("Performance"):
50 server.gui.add_slider(
51 "FPS Limit", min=30, max=120, step=10, initial_value=60
52 )
53 server.gui.add_dropdown(
54 "Quality", options=["Low", "Medium", "High"], initial_value="Medium"
55 )
56
57 # Add some visual objects to demonstrate the controls
58 server.scene.add_icosphere(
59 name="demo_sphere",
60 radius=sphere_radius.value,
61 color=(
62 sphere_color.value[0] / 255.0,
63 sphere_color.value[1] / 255.0,
64 sphere_color.value[2] / 255.0,
65 ),
66 position=(0.0, 0.0, 0.0),
67 visible=sphere_visible.value,
68 )
69
70 if show_axes.value:
71 server.scene.add_frame("axes", axes_length=1.0, axes_radius=0.02)
72
73 print("This example shows GUI organization with folders.")
74 print("The sphere demonstrates some interactive controls.")
75
76 print("Explore the organized GUI controls!")
77 print("Notice how folders help group related functionality.")
78
79 while True:
80 time.sleep(0.1)
81
82
83if __name__ == "__main__":
84 main()