|
7 | 7 | from datetime import datetime |
8 | 8 | from pathlib import Path |
9 | 9 |
|
10 | | -from imgui_bundle import imgui, immapp |
| 10 | +from imgui_bundle import hello_imgui, imgui, immapp |
11 | 11 |
|
12 | 12 | from demo_hub.core import Recorder, build_default_registry |
13 | 13 | from demo_hub.gui.primitives import Segment2D |
14 | | -from demo_hub.gui.viewport import draw_topdown |
| 14 | +from demo_hub.gui.viewport import draw_topdown_contents |
15 | 15 |
|
16 | 16 | logger = logging.getLogger(__name__) |
17 | 17 |
|
@@ -69,15 +69,11 @@ def _simulate(state: GuiState) -> None: |
69 | 69 |
|
70 | 70 |
|
71 | 71 | def _render(state: GuiState) -> None: # pragma: no cover - manual UI |
72 | | - io = imgui.get_io() |
73 | | - io.config_flags |= imgui.ConfigFlags_.docking_enable |
74 | | - dock_id = _dockspace_fullscreen() |
| 72 | + # Legacy entry point; the real UI is composed via hello_imgui dockable windows. |
| 73 | + imgui.text("GUI is built via dockable windows.") |
75 | 74 |
|
76 | | - _simulate(state) |
77 | | - |
78 | | - imgui.set_next_window_dock_id(dock_id, imgui.Cond_.first_use_ever) |
79 | | - imgui.begin("Demo Hub") |
80 | 75 |
|
| 76 | +def _draw_controls(state: GuiState) -> None: |
81 | 77 | changed, selected_idx = imgui.combo("Scene", state.selected_idx, state.scene_ids) |
82 | 78 | if changed: |
83 | 79 | state.switch_scene(selected_idx) |
@@ -118,44 +114,15 @@ def _render(state: GuiState) -> None: # pragma: no cover - manual UI |
118 | 114 | imgui.text("State") |
119 | 115 | for key, value in state_payload.items(): |
120 | 116 | imgui.text(f"{key}: {value}") |
| 117 | + imgui.separator() |
| 118 | + imgui.text(f"frames: {state.step_count}") |
121 | 119 |
|
122 | | - imgui.end() |
123 | 120 |
|
124 | | - imgui.set_next_window_dock_id(dock_id, imgui.Cond_.first_use_ever) |
| 121 | +def _draw_viewport(state: GuiState) -> None: |
125 | 122 | segments = [ |
126 | 123 | Segment2D(seg[0], seg[1], seg[2]) for seg in state.scene.debug_draw_2d() |
127 | 124 | ] |
128 | | - draw_topdown("Viewport (XZ top-down)", segments) |
129 | | - |
130 | | - |
131 | | -def _dockspace_fullscreen() -> None: |
132 | | - # Follow Dear ImGui's recommended fullscreen dockspace pattern. |
133 | | - dockspace_flags = imgui.DockNodeFlags_.none |
134 | | - window_flags = ( |
135 | | - imgui.WindowFlags_.no_title_bar |
136 | | - | imgui.WindowFlags_.no_collapse |
137 | | - | imgui.WindowFlags_.no_resize |
138 | | - | imgui.WindowFlags_.no_move |
139 | | - | imgui.WindowFlags_.no_bring_to_front_on_focus |
140 | | - | imgui.WindowFlags_.no_nav_focus |
141 | | - | imgui.WindowFlags_.no_docking |
142 | | - ) |
143 | | - viewport = imgui.get_main_viewport() |
144 | | - imgui.set_next_window_pos(viewport.pos) |
145 | | - imgui.set_next_window_size(viewport.size) |
146 | | - imgui.set_next_window_viewport(viewport.id_) |
147 | | - imgui.push_style_var(imgui.StyleVar_.window_rounding, 0.0) |
148 | | - imgui.push_style_var(imgui.StyleVar_.window_border_size, 0.0) |
149 | | - imgui.push_style_var(imgui.StyleVar_.window_padding, (0.0, 0.0)) |
150 | | - if dockspace_flags & imgui.DockNodeFlags_.passthru_central_node: |
151 | | - window_flags |= imgui.WindowFlags_.no_background |
152 | | - |
153 | | - imgui.begin("MainDockSpaceHost", flags=window_flags) |
154 | | - imgui.pop_style_var(3) |
155 | | - dockspace_id = imgui.get_id("MainDockSpace") |
156 | | - imgui.dock_space(dockspace_id, (0.0, 0.0), dockspace_flags) |
157 | | - imgui.end() |
158 | | - return dockspace_id |
| 125 | + draw_topdown_contents(segments) |
159 | 126 |
|
160 | 127 |
|
161 | 128 | def main(argv: list[str] | None = None) -> None: |
@@ -188,9 +155,33 @@ def main(argv: list[str] | None = None) -> None: |
188 | 155 |
|
189 | 156 | params = immapp.RunnerParams() |
190 | 157 | params.docking_params.main_dock_space_node_flags = imgui.DockNodeFlags_.none |
| 158 | + params.docking_params.layout_condition = ( |
| 159 | + hello_imgui.DockingLayoutCondition.first_use_ever |
| 160 | + ) |
| 161 | + params.docking_params.dockable_windows = [ |
| 162 | + hello_imgui.DockableWindow( |
| 163 | + "Demo Hub", |
| 164 | + "MainDockSpace", |
| 165 | + lambda: _draw_controls(state), |
| 166 | + ), |
| 167 | + hello_imgui.DockableWindow( |
| 168 | + "Viewport (XZ top-down)", |
| 169 | + "MainDockSpace", |
| 170 | + lambda: _draw_viewport(state), |
| 171 | + ), |
| 172 | + ] |
| 173 | + |
| 174 | + def _pre_new_frame() -> None: |
| 175 | + io = imgui.get_io() |
| 176 | + io.config_flags |= imgui.ConfigFlags_.docking_enable |
| 177 | + _simulate(state) |
| 178 | + |
| 179 | + params.callbacks.pre_new_frame = _pre_new_frame |
| 180 | + params.imgui_window_params.default_imgui_window_type = ( |
| 181 | + hello_imgui.DefaultImGuiWindowType.provide_full_screen_dock_space |
| 182 | + ) |
191 | 183 | params.app_window_params.window_title = "DART Demo Hub" |
192 | 184 | params.app_window_params.window_geometry.size = [1280, 720] |
193 | | - params.callbacks.show_gui = lambda: _render(state) |
194 | 185 | immapp.run(runner_params=params) |
195 | 186 |
|
196 | 187 |
|
|
0 commit comments