@@ -71,10 +71,11 @@ def _simulate(state: GuiState) -> None:
7171def _render (state : GuiState ) -> None : # pragma: no cover - manual UI
7272 io = imgui .get_io ()
7373 io .config_flags |= imgui .ConfigFlags_ .docking_enable
74- imgui . dock_space_over_viewport ()
74+ dock_id = _dockspace_fullscreen ()
7575
7676 _simulate (state )
7777
78+ imgui .set_next_window_dock_id (dock_id , imgui .Cond_ .first_use_ever )
7879 imgui .begin ("Demo Hub" )
7980
8081 changed , selected_idx = imgui .combo ("Scene" , state .selected_idx , state .scene_ids )
@@ -120,27 +121,73 @@ def _render(state: GuiState) -> None: # pragma: no cover - manual UI
120121
121122 imgui .end ()
122123
123- segments = [Segment2D (seg [0 ], seg [1 ], seg [2 ]) for seg in state .scene .debug_draw_2d ()]
124+ imgui .set_next_window_dock_id (dock_id , imgui .Cond_ .first_use_ever )
125+ segments = [
126+ Segment2D (seg [0 ], seg [1 ], seg [2 ]) for seg in state .scene .debug_draw_2d ()
127+ ]
124128 draw_topdown ("Viewport (XZ top-down)" , segments )
125129
126130
131+ def _dockspace_fullscreen () -> None :
132+ # Fullscreen dockspace so any window (including ImGui demo widgets) can dock.
133+ viewport = imgui .get_main_viewport ()
134+ imgui .set_next_window_pos (viewport .pos )
135+ imgui .set_next_window_size (viewport .size )
136+ imgui .set_next_window_viewport (viewport .id_ )
137+ imgui .push_style_var (imgui .StyleVar_ .window_rounding , 0.0 )
138+ imgui .push_style_var (imgui .StyleVar_ .window_border_size , 0.0 )
139+ imgui .push_style_var (imgui .StyleVar_ .window_padding , (0.0 , 0.0 ))
140+
141+ window_flags = (
142+ imgui .WindowFlags_ .no_title_bar
143+ | imgui .WindowFlags_ .no_collapse
144+ | imgui .WindowFlags_ .no_resize
145+ | imgui .WindowFlags_ .no_move
146+ | imgui .WindowFlags_ .no_bring_to_front_on_focus
147+ | imgui .WindowFlags_ .no_nav_focus
148+ | imgui .WindowFlags_ .no_docking
149+ | imgui .WindowFlags_ .no_background
150+ )
151+
152+ imgui .begin ("MainDockSpaceHost" , flags = window_flags )
153+ imgui .pop_style_var (3 )
154+ dockspace_id = imgui .get_id ("MainDockSpace" )
155+ imgui .dock_space (dockspace_id , (0.0 , 0.0 ), imgui .DockNodeFlags_ .none )
156+ imgui .end ()
157+ return dockspace_id
158+
159+
127160def main (argv : list [str ] | None = None ) -> None :
128- if os .name != "nt" and not os .environ .get ("DISPLAY" ) and not os .environ .get ("WAYLAND_DISPLAY" ):
129- raise SystemExit ("GUI requires a display (set DISPLAY/WAYLAND_DISPLAY or run inside a desktop session)." )
161+ if (
162+ os .name != "nt"
163+ and not os .environ .get ("DISPLAY" )
164+ and not os .environ .get ("WAYLAND_DISPLAY" )
165+ ):
166+ raise SystemExit (
167+ "GUI requires a display (set DISPLAY/WAYLAND_DISPLAY or run inside a desktop session)."
168+ )
130169
131170 registry = build_default_registry ()
132171
133172 parser = argparse .ArgumentParser (description = "ImGui shell for demo_hub scenes" )
134- parser .add_argument ("--scene" , default = "hello_world" , choices = registry .scene_ids , help = "Scene id to start with" )
135- parser .add_argument ("--dt" , type = float , default = 1.0 / 240.0 , help = "Simulation timestep" )
173+ parser .add_argument (
174+ "--scene" ,
175+ default = "hello_world" ,
176+ choices = registry .scene_ids ,
177+ help = "Scene id to start with" ,
178+ )
179+ parser .add_argument (
180+ "--dt" , type = float , default = 1.0 / 240.0 , help = "Simulation timestep"
181+ )
136182 args = parser .parse_args (argv )
137183
138184 logging .basicConfig (level = logging .INFO , format = "%(levelname)s %(message)s" )
139185 logger .info ("Launching GUI shell (scene=%s)" , args .scene )
140186 state = GuiState (registry , args .scene , args .dt )
141187
142188 params = immapp .RunnerParams ()
143- params .app_window_params .window_title = "DART Demo Hub (Python)"
189+ params .docking_params .main_dock_space_node_flags = imgui .DockNodeFlags_ .none
190+ params .app_window_params .window_title = "DART Demo Hub"
144191 params .app_window_params .window_geometry .size = [1280 , 720 ]
145192 params .callbacks .show_gui = lambda : _render (state )
146193 immapp .run (runner_params = params )
0 commit comments