4.1 KiB
4.1 KiB
GUI Adapter - Modifiche per Compatibilità Profili
Problema Risolto
Il modulo GUI (gui.py) utilizzava la vecchia API di ProfileManager che aveva un attributo .profiles (lista di FlashProfile). Con la ristrutturazione del sistema di profili, ProfileManager ora gestisce targets (FlashTarget) e models (FlashModel) separatamente.
Soluzione: Adapter Pattern
Ho implementato la classe GUIProfileAdapter che:
- Wrappa il nuovo
ProfileManager - Espone un'interfaccia compatibile con il vecchio codice GUI
- Converte automaticamente i dati tra nuovo e vecchio formato
Struttura dell'Adapter
class GUIProfileAdapter:
def __init__(self, manager: ProfileManager):
self.manager = manager # Nuovo ProfileManager
@property
def profiles(self) -> List[FlashProfile]:
"""Converte targets in FlashProfile legacy."""
# Per ogni target:
# - Recupera il modello associato
# - Crea FlashProfile con i dati combinati
# - Usa global_config per IP e porta
def get_profile(self, name: str) -> Optional[FlashProfile]:
"""Recupera target come FlashProfile."""
# Converte singolo target in FlashProfile
# Altri metodi per compatibilità...
Conversione dei Dati
Quando il GUI richiede un FlashProfile, l'adapter:
- Recupera il
FlashTargetper nome - Recupera il
FlashModelassociato tramiteid_model - Combina i dati:
name←target.id_targetslot_address←target.slot_address(formattato hex)ip,port←global_configbase_address←model.user_start(area user)size←model.user_stop - model.user_start + 1binary_path←target.binary_path
Modifiche al GUI
FlasherGUI.init()
Prima:
self.profile_manager = ProfileManager()
if not self.profile_manager.profiles:
# ...
Dopo:
# Inizializzazione posticipata dopo creazione log widget
self.profile_manager: Optional[GUIProfileAdapter] = None
def _initialize_profiles(self):
base_manager = ProfileManager()
# Carica da targets.ini se disponibile
if not base_manager.targets:
targets_ini = Path("_OLD/Vecchia_app/FpgaBeamMeUp/targets.ini")
if targets_ini.exists():
base_manager.load_from_ini(targets_ini)
# ...
# Wrappa in adapter
self.profile_manager = GUIProfileAdapter(base_manager)
ProfileManagerDialog
Aggiornato per usare manager.profiles come property anziché accesso diretto all'attributo:
profiles = self.manager.profiles # Chiama la property
for profile in profiles:
# ...
Type Hints
Aggiornati i type hints per riflettere l'uso di GUIProfileAdapter:
def __init__(self, parent: tk.Tk, manager: GUIProfileAdapter, ...)
Vantaggi
- Nessuna modifica alla logica GUI: Il codice dell'interfaccia rimane invariato
- Uso trasparente della nuova struttura: Sotto il cofano usa targets e models
- Caricamento automatico: Legge
targets.iniall'avvio se disponibile - Retrocompatibilità: Il vecchio codice continua a funzionare
- Migrazione graduale: Si può aggiornare il GUI in futuro per usare direttamente la nuova API
Limitazioni Attuali
L'adapter è read-only per alcune operazioni:
add_profile()eupdate_profile()sono stub (non completamente implementati)- Questo è intenzionale: la gestione dei profili tramite GUI sarà deprecata
- Gli utenti dovrebbero modificare
flash_profiles.jsondirettamente o usare gli script di utility
Test
✓ Applicazione avviata senza errori
✓ Caricamento automatico da targets.ini
✓ Visualizzazione corretta di 9 target
✓ Nessun errore di tipo o attributo
Prossimi Passi
- Implementare completamente
add_profileeupdate_profilenell'adapter - Migliorare il dialog di gestione profili per supportare selezione modello
- Aggiungere validazione dei profili prima di usarli
- Mostrare informazioni avanzate (aree Golden/User, settori, ecc.) nell'interfaccia