Skip to content

Commit d0cc9d8

Browse files
committed
Enable full-screen docking in demo hub GUI
1 parent 15e4347 commit d0cc9d8

File tree

2 files changed

+55
-7
lines changed

2 files changed

+55
-7
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ gh-pages/
8686
# ImGui configuration
8787
imgui.ini
8888
DART_Demo_Hub__Python_.ini
89+
DART_Demo_Hub*.ini
8990

9091
# Temporary directory for dependencies
9192
.deps/

python/demo_hub/gui/app.py

Lines changed: 54 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,11 @@ def _simulate(state: GuiState) -> None:
7171
def _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+
127160
def 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

Comments
 (0)