step 3: add widget shell and renderer foundation

This commit is contained in:
2026-07-02 14:20:22 +02:00
parent 34fd60c34e
commit 41e44a23bc
13 changed files with 683 additions and 84 deletions

View File

@@ -0,0 +1,78 @@
# pyright: reportGeneralTypeIssues=false
from collections.abc import Generator
import dearpygui.dearpygui as dpg
import pytest
import dpg_gauges as dpgg
from dpg_gauges.state import clear_registry, get_gauge_state
@pytest.fixture
def dpg_context() -> Generator[None]:
clear_registry()
dpgg.configure()
dpg.create_context()
try:
yield
finally:
clear_registry()
dpg.destroy_context()
def test_dpg_gauge_shell_registers_before_yield(dpg_context: None) -> None:
with (
dpg.window(label="Smoke"),
dpgg.digital_gauge(tag="speed", label="Speed", value=42, width=180, height=80) as config,
):
state = get_gauge_state("speed")
assert config.tag == "speed"
assert state.renderer is not None
assert dpg.does_item_exist(state.container_tag)
assert state.drawlist_tag is not None
assert dpg.does_item_exist(state.drawlist_tag)
def test_runtime_update_redraws_attached_gauge(dpg_context: None) -> None:
with dpg.window(label="Smoke"):
dpgg.digital_gauge(tag="rpm", label="RPM", value=1000, max_value=8000, width=200, height=90)
dpgg.set_value("rpm", 2500)
state = get_gauge_state("rpm")
debug = dpgg.get_gauge_debug_state("rpm")
assert state.displayed_value == 2500
assert state.dirty == 0
assert debug["renderer"]["drawlist_tag"] == "rpm__drawlist"
assert "rpm__value" in debug["renderer"]["layers"]["dynamic"]
def test_hidden_gauge_preserves_configured_size(dpg_context: None) -> None:
with dpg.window(label="Hidden"):
dpgg.digital_gauge(tag="hidden", value=1, width=160, height=70, show=False)
state = get_gauge_state("hidden")
assert state.measured_width == 160
assert state.measured_height == 70
assert state.last_nonzero_width == 160
assert state.last_nonzero_height == 70
dpgg.set_show("hidden", True)
assert dpg.does_item_exist(state.container_tag)
assert state.config.show is True
def test_panel_and_grid_are_lightweight_containers(dpg_context: None) -> None:
with (
dpg.window(label="Dashboard"),
dpgg.gauge_panel(tag="engine", label="Engine", width=300, height=180) as panel,
dpgg.gauge_grid(tag="engine_grid", columns=2) as grid,
):
assert panel == "engine"
assert grid == "engine_grid"
dpgg.digital_gauge(tag="temp", label="Temp", value=90, width=120, height=60)
assert dpg.does_item_exist("engine")
assert dpg.does_item_exist("engine_grid")
assert get_gauge_state("temp").renderer is not None