diff --git a/app_state.py b/app_state.py index 9211312..945c528 100644 --- a/app_state.py +++ b/app_state.py @@ -8,7 +8,7 @@ so later rebinding would only ever be seen by the module that did it. import configparser import os -VERSION = "0.0.0.084" +VERSION = "0.0.0.085" PROPERTIES_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), "editor.properties") DEFAULT_GRID_SIZE = 10 DEFAULT_ADD_TIMESTAMP = True diff --git a/device_session.py b/device_session.py index 79172ce..47db2f9 100644 --- a/device_session.py +++ b/device_session.py @@ -142,6 +142,7 @@ class DeviceSession: }) registry[(kit_id, type_id_val)] = slots full_name = f"{kit_name}::{type_name}" + self.sox_client.type_name_map[(kit_id, type_id_val)] = full_name # update type_name on any cached component of this type for c in self.sox_client.cache: if c is not None and c.kit_id == kit_id and c.type_id == type_id_val: diff --git a/main.py b/main.py index e5b3008..e4ea734 100644 --- a/main.py +++ b/main.py @@ -1969,13 +1969,29 @@ def _load_live_schema(ds): """Loads schema kits from the device's schema parts into the editor registry.""" app_state.active_schema_kits.clear() app_state.final_components_registry.clear() - if ds.sox_client and ds.sox_client.schema_parts: - for part in ds.sox_client.schema_parts: - app_state.active_schema_kits[part.name] = f"{part.checksum & 0xFFFFFFFF:08x}" - try: - schema.load_schema_kits_and_manifests() - except Exception: - pass + if not (ds.sox_client and ds.sox_client.schema_parts): + return + + for part in ds.sox_client.schema_parts: + app_state.active_schema_kits[part.name] = f"{part.checksum & 0xFFFFFFFF:08x}" + + # Collect manifests we have, skip missing kits (device may use kits + # not installed on this computer — load what we can) + manifest_paths = [] + missing = [] + for name, checksum in app_state.active_schema_kits.items(): + path = schema.find_manifest_path(name, checksum) + if path: + manifest_paths.append(path) + else: + missing.append(name) + + if manifest_paths: + schema.compile_schema_registry(manifest_paths) + + if missing: + app_state.set_status( + f"Missing kit manifests: {', '.join(missing)}", warn=True) def do_device_disconnect(): diff --git a/sox.py b/sox.py index 59db974..d45bf02 100644 --- a/sox.py +++ b/sox.py @@ -363,6 +363,10 @@ class SoxClient: # each slot dict: {name, id, type_name, is_config, is_runtime, is_action, is_operator, is_as_str} self.slot_registry = {} + # type name map — set externally by device_session + # maps (kit_id, type_id) -> "kit::TypeName" for proper type resolution + self.type_name_map = {} + # event callback: called on main thread via queue self.on_event = None # fn(comp_id, what_char) @@ -853,6 +857,9 @@ class SoxClient: comp.links = links def _resolve_type_name(self, kit_id, type_id_val): + resolved = self.type_name_map.get((kit_id, type_id_val)) + if resolved: + return resolved if self.schema_parts and 0 <= kit_id < len(self.schema_parts): kit_name = self.schema_parts[kit_id].name else: