# Copyright (C) 2026 Hector van der Aa # Copyright (C) 2026 Association Exergie # SPDX-License-Identifier: GPL-3.0-or-later import dearpygui.dearpygui as dpg import dpg_gauges as dpgg from dynalab.state import AppState from dynalab.tags import ( MENU_FILE_QUIT, MENU_RECORD_CONFIGURATION, MENU_WINDOW_DATA_INPUT, MENU_WINDOW_RECORD, WINDOW_DATA_INPUT_GAUGE_GRID, WINDOW_GROUP_DATA_INPUT, WINDOW_GROUP_RECORD, ) from dynalab.ui.routines import switch_window LOADING_WINDOW_WIDTH = 600 LOADING_WINDOW_HEIGHT = 400 def _loading_content_layout( viewport_size: tuple[int, int], logo_size: tuple[int, int], text_size: tuple[int, int], bottom_margin: int = 24, ) -> tuple[list[float], list[float], float]: viewport_width, viewport_height = viewport_size logo_width, logo_height = logo_size text_width, text_height = text_size logo_pos = [ (viewport_width - logo_width) / 2, (viewport_height - logo_height) / 2, ] text_row_pos = [ 0, max(viewport_height - text_height - bottom_margin, 0), ] text_spacer_width = max((viewport_width - text_width) / 2, 0) return logo_pos, text_row_pos, text_spacer_width def build_loading() -> None: with dpg.window( label="DynaLab", tag="loading_window", width=LOADING_WINDOW_WIDTH, height=LOADING_WINDOW_HEIGHT, no_collapse=True, no_resize=True, no_move=True, no_title_bar=True, ): dpg.set_global_font_scale(0.5) with dpg.group(horizontal=False, tag="loading_logo_group"): dpg.add_image(texture_tag="logo", tag="loading_logo") with dpg.group(horizontal=True, tag="loading_text_row"): dpg.add_spacer(width=0, tag="loading_text_left_spacer") dpg.add_text( default_value="Loading DynaLab", tag="loading_text", color=(150, 150, 150, 255), ) def center_loading_content() -> None: if not dpg.does_item_exist("loading_window"): return dpg.set_item_pos("loading_window", [0, 0]) dpg.set_item_width("loading_window", LOADING_WINDOW_WIDTH) dpg.set_item_height("loading_window", LOADING_WINDOW_HEIGHT) # These may be unavailable before the first rendered frame logo_size = dpg.get_item_rect_size("loading_logo") text_size = dpg.get_item_rect_size("loading_text") if logo_size is None or text_size is None: return logo_pos, text_row_pos, text_spacer_width = _loading_content_layout( (LOADING_WINDOW_WIDTH, LOADING_WINDOW_HEIGHT), logo_size, text_size ) dpg.set_item_pos("loading_logo_group", logo_pos) dpg.set_item_pos("loading_text_row", text_row_pos) dpg.set_item_width("loading_text_left_spacer", text_spacer_width) def build_windows(state: AppState) -> None: with dpg.window(label="DynaLab", tag="main_window", no_collapse=True): with dpg.menu_bar(): with dpg.menu(label="File"): dpg.add_menu_item(tag=MENU_FILE_QUIT, label="Quit", enabled=True) with dpg.menu(label="Record"): dpg.add_menu_item(tag=MENU_RECORD_CONFIGURATION, label="Configuration") with dpg.menu(label="Window"): dpg.add_menu_item( tag=MENU_WINDOW_RECORD, label="Record", callback=switch_window, user_data=state, ) dpg.add_menu_item( tag=MENU_WINDOW_DATA_INPUT, label="Data Input", callback=switch_window, user_data=state, ) with dpg.child_window( tag="content_area", autosize_x=True, height=0, border=False ): # with dpg.group(tag=MENU_WINDOW_DATA_INPUT): with dpg.group(tag=WINDOW_GROUP_DATA_INPUT): state.window_map[MENU_WINDOW_DATA_INPUT] = WINDOW_GROUP_DATA_INPUT with dpgg.gauge_panel( label="Autobreak narrow panel", autosize_x=True, autosize_y=True ): with dpgg.gauge_grid( columns="auto", min_column_width=180, tag=WINDOW_DATA_INPUT_GAUGE_GRID, ): pass with dpg.group(tag=WINDOW_GROUP_RECORD, show=False): state.window_map[MENU_WINDOW_RECORD] = WINDOW_GROUP_RECORD dpg.add_text("Some text")