# `layout_window.py`

## Scopo

Questo modulo visualizza il layout delle corsie come matrice di celle, mostra lo stato di occupazione, consente di cercare una UDC e permette l’export della matrice.

## Flusso operativo

            flowchart TD
        A["open_layout_window()"] --> B["Crea o riporta in primo piano LayoutWindow"]
        B --> C["LayoutWindow.__init__()"]
        C --> D["Costruisce toolbar, host matrice, statistiche"]
        D --> E["_load_corsie()"]
        E --> F["AsyncRunner.run(query_json SQL corsie)"]
        F --> G["_on_select() sulla corsia iniziale"]
        G --> H["_load_matrix(corsia)"]
        H --> I["AsyncRunner.run(query_json SQL matrice)"]
        I --> J["_rebuild_matrix()"]
        J --> K["_refresh_stats()"]

## Ricerca UDC

            flowchart TD
        A["Utente inserisce barcode"] --> B["_search_udc()"]
        B --> C["query_json ricerca pallet -> corsia/colonna/fila"]
        C --> D{"UDC trovata?"}
        D -- No --> E["Messaggio informativo"]
        D -- Si --> F["Seleziona corsia in listbox"]
        F --> G["_load_matrix(corsia)"]
        G --> H["_rebuild_matrix()"]
        H --> I["_highlight_cell_by_labels()"]

## Schema di chiamata essenziale

            flowchart LR
        Init["__init__"] --> Top["_build_top"]
        Init --> Host["_build_matrix_host"]
        Init --> Stats["_build_stats"]
        Init --> LoadCorsie["_load_corsie"]
        LoadCorsie --> Select["_on_select"]
        Select --> LoadMatrix["_load_matrix"]
        LoadMatrix --> Rebuild["_rebuild_matrix"]
        Rebuild --> RefreshStats["_refresh_stats"]
        Search["_search_udc"] --> LoadMatrix
        Export["_export_xlsx"] --> MatrixState["matrix_state / fila_txt / col_txt / udc1"]

## Note

- Il modulo usa un token `_req_counter` per evitare che risposte async vecchie aggiornino la UI fuori ordine.

- La statistica globale viene ricalcolata da query SQL, mentre quella della corsia corrente usa la matrice già caricata in memoria.

- `destroy()` marca la finestra come non più attiva per evitare callback tardive.