Skip to content

scenex.imgui #

ImGui controls for SceneX.

Functions:

add_imgui_controls #

add_imgui_controls(view: View) -> None

Add imgui controls to the given canvas.

Source code in src/scenex/imgui/_controls.py
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
def add_imgui_controls(view: View) -> None:
    """Add imgui controls to the given canvas."""
    snx_canvas_model = view.canvas
    snx_canvas_adaptor = snx_canvas_model._get_adaptor()
    snx_view_adaptor = view._get_adaptor()
    render_canv = snx_canvas_model._get_native()

    if not (
        isinstance(snx_canvas_adaptor, PygfxCanvasAdaptor)
        and isinstance(snx_view_adaptor, PygfxViewAdaptor)
        and isinstance(render_canv, BaseRenderCanvas)
    ):
        raise NotImplementedError(
            "Imgui controls can currently only be added to a canvas backed by pygfx."
        )

    imgui_renderer = ImguiRenderer(
        device=snx_view_adaptor._renderer.device,
        canvas=render_canv,  # pyright: ignore[reportArgumentType] (incorrect hint)
    )

    if implot.get_current_context() is None:
        implot.create_context()  # must run after ImGui context exists

    @imgui_renderer.set_gui  # type: ignore [misc]
    def _update_gui() -> imgui.ImDrawData:
        imgui.new_frame()
        render_imgui_view_controls(view)
        imgui.end_frame()
        imgui.render()
        return imgui.get_draw_data()

    @render_canv.request_draw
    def _update() -> None:
        snx_canvas_adaptor._draw()
        imgui_renderer.render()