sistemata visualizzazione degli enum

This commit is contained in:
VALLONGOL 2025-12-22 11:25:02 +01:00
parent fd478c324f
commit 33a3741fc2

View File

@ -310,6 +310,14 @@ class MonitorApp(tk.Frame):
return get_enum_items(class_name) return get_enum_items(class_name)
except Exception: except Exception:
return None return None
def _get_enum_for_field(self, field_name):
"""Return enum class for field_name from ENUM_MAP, or None."""
try:
import Grifo_E_1553lib.data_types.enum_map as em
return em.ENUM_MAP.get(field_name)
except Exception:
return None
def show_message_form(self, label: str, editable: bool = True): def show_message_form(self, label: str, editable: bool = True):
"""Build an editable form for message `label` (A messages). """Build an editable form for message `label` (A messages).
@ -333,6 +341,10 @@ class MonitorApp(tk.Frame):
mdb = self._get_message_db() mdb = self._get_message_db()
if mdb is None: if mdb is None:
try:
self.logger.warning(f"show_message_form: MessageDB not available for {label}")
except Exception:
pass
return return
try: try:
msg_wrapper = mdb.getMessage(label) msg_wrapper = mdb.getMessage(label)
@ -340,11 +352,25 @@ class MonitorApp(tk.Frame):
allm = mdb.getAllMessages() allm = mdb.getAllMessages()
msg_wrapper = allm.get(label) msg_wrapper = allm.get(label)
if not msg_wrapper: if not msg_wrapper:
try:
self.logger.warning(f"show_message_form: No wrapper found for {label}")
except Exception:
pass
return return
msg = getattr(msg_wrapper, 'message', None) msg = getattr(msg_wrapper, 'message', None)
if msg is None: if msg is None:
try:
self.logger.warning(f"show_message_form: Wrapper for {label} has no message")
except Exception:
pass
return return
# Log successful retrieval
try:
self.logger.info(f"Building form for {label}, message type: {type(msg)}")
except Exception:
pass
# clear previous form only when we know we're going to build a new one # clear previous form only when we know we're going to build a new one
for w in self.detail_form_container.winfo_children(): for w in self.detail_form_container.winfo_children():
try: try:
@ -353,6 +379,7 @@ class MonitorApp(tk.Frame):
pass pass
self.form_widgets = {} self.form_widgets = {}
self.current_form_label = label self.current_form_label = label
self.current_msg_wrapper = msg_wrapper # Store wrapper for updates
# header with Apply button at top # header with Apply button at top
hdr = tk.Frame(self.detail_form_container) hdr = tk.Frame(self.detail_form_container)
@ -371,6 +398,13 @@ class MonitorApp(tk.Frame):
frm.pack(fill=tk.BOTH, expand=True, padx=6, pady=6) frm.pack(fill=tk.BOTH, expand=True, padx=6, pady=6)
self._build_form_fields(frm, msg, prefix='', editable=editable) self._build_form_fields(frm, msg, prefix='', editable=editable)
# IMPORTANT: Update values after building widgets
try:
self._update_form_values(msg_wrapper)
self.logger.info(f"Form values updated for {label}, {len(self.form_widgets)} widgets")
except Exception as e:
self.logger.error(f"Failed to update form values: {e}")
# show form container # show form container
try: try:
self.detail_form_container.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) self.detail_form_container.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
@ -379,6 +413,7 @@ class MonitorApp(tk.Frame):
except Exception as e: except Exception as e:
try: try:
self.log.insert(tk.END, f"Error building form: {e}\n") self.log.insert(tk.END, f"Error building form: {e}\n")
self.logger.error(f"Error building form for {label}: {e}")
except Exception: except Exception:
pass pass
@ -416,9 +451,9 @@ class MonitorApp(tk.Frame):
if hasattr(val, 'str') and _is_struct_like(getattr(val, 'str')): if hasattr(val, 'str') and _is_struct_like(getattr(val, 'str')):
subfrm = ttk.LabelFrame(parent, text=name) subfrm = ttk.LabelFrame(parent, text=name)
subfrm.pack(fill=tk.X, padx=6, pady=4) subfrm.pack(fill=tk.X, padx=6, pady=4)
# recurse into the .str sub-structure so fields become e.g. settings.spare # recurse into the .str sub-structure - prefix must include .str for correct value resolution
try: try:
self._build_form_fields(subfrm, getattr(val, 'str'), prefix=full, max_depth=max_depth, _depth=_depth+1) self._build_form_fields(subfrm, getattr(val, 'str'), prefix=f"{full}.str", max_depth=max_depth, _depth=_depth+1)
except Exception: except Exception:
pass pass
continue continue
@ -434,10 +469,16 @@ class MonitorApp(tk.Frame):
row_fr.pack(fill=tk.X, padx=2, pady=1) row_fr.pack(fill=tk.X, padx=2, pady=1)
lbl = tk.Label(row_fr, text=name, width=28, anchor=tk.W) lbl = tk.Label(row_fr, text=name, width=28, anchor=tk.W)
lbl.pack(side=tk.LEFT) lbl.pack(side=tk.LEFT)
# enum choices? # enum choices? Check ENUM_MAP using field name
enum_items = None enum_items = None
try: try:
enum_items = self._get_enum_items(val.__class__.__name__) # Try ENUM_MAP first using field name
enum_cls = self._get_enum_for_field(name)
if enum_cls:
enum_items = [(m.name, m.value) for m in enum_cls]
else:
# Fallback to class-based lookup
enum_items = self._get_enum_items(val.__class__.__name__)
except Exception: except Exception:
enum_items = None enum_items = None
widget = None widget = None
@ -1447,6 +1488,10 @@ class MonitorApp(tk.Frame):
msg = getattr(msg_wrapper, 'message', None) msg = getattr(msg_wrapper, 'message', None)
if msg is None: if msg is None:
return return
# DEBUG: Log first 3 fields to see what's happening
debug_count = 0
for full, widget in list(self.form_widgets.items()): for full, widget in list(self.form_widgets.items()):
try: try:
# resolve the value from msg # resolve the value from msg
@ -1462,8 +1507,21 @@ class MonitorApp(tk.Frame):
cur = cur[int(idx)] cur = cur[int(idx)]
else: else:
cur = getattr(cur, p) cur = getattr(cur, p)
val = getattr(cur, 'raw', getattr(cur, 'value', cur))
except Exception: # Extract value - try raw, then value, then the object itself
raw_val = getattr(cur, 'raw', None)
value_val = getattr(cur, 'value', None)
val = raw_val if raw_val is not None else (value_val if value_val is not None else cur)
# DEBUG: Log first few fields
if debug_count < 3:
self.logger.info(f"Field '{full}': cur={type(cur).__name__}, raw={raw_val}, value={value_val}, final_val={val}")
debug_count += 1
except Exception as e:
if debug_count < 3:
self.logger.warning(f"Field '{full}': Exception during value extraction: {e}")
debug_count += 1
val = None val = None
if widget[0] == 'combobox': if widget[0] == 'combobox':