Source code for pyqt_reactive.forms.parameter_form_tree_index
"""Tree index authority for nested parameter form managers."""
from __future__ import annotations
from typing import Any, Optional
from PyQt6.QtWidgets import QWidget
[docs]
class ParameterFormTreeIndex:
"""Indexes nested managers and groupbox widgets for a form-manager tree."""
[docs]
def __init__(self, root_manager: Any) -> None:
self.root_manager = root_manager
self._groupbox_cache: dict[str, Optional[QWidget]] = {}
[docs]
def root(self) -> Any:
manager = self.root_manager
while manager._parent_manager is not None:
manager = manager._parent_manager
return manager
[docs]
def owning_groupbox(self, manager: Any) -> Optional[QWidget]:
parent = manager._parent_manager
if parent is None:
return None
for name, nested in parent.nested_managers.items():
if nested is manager:
return parent.widgets.get(name)
return None
[docs]
def nested_manager_for_prefix(self, prefix: str) -> Optional[Any]:
return self._nested_manager_recursive(prefix, self.root_manager)
[docs]
def matching_prefix(self, path: str) -> Optional[str]:
return self._matching_prefix_recursive(path, self.root_manager)
[docs]
def groupbox_for_prefix(self, prefix: str) -> Optional[QWidget]:
if prefix not in self._groupbox_cache:
self._groupbox_cache[prefix] = self._groupbox_recursive(prefix, self.root_manager)
return self._groupbox_cache[prefix]
[docs]
def direct_child_groupboxes(self) -> list[tuple[str, Any, QWidget]]:
result = []
for param_name, nested_manager in self.root_manager.nested_managers.items():
groupbox = self.root_manager.widgets.get(param_name)
if groupbox is not None:
result.append((param_name, nested_manager, groupbox))
return result
def _nested_manager_recursive(self, prefix: str, manager: Any) -> Optional[Any]:
for nested_manager in manager.nested_managers.values():
if nested_manager.field_id == prefix:
return nested_manager
result = self._nested_manager_recursive(prefix, nested_manager)
if result is not None:
return result
return None
def _matching_prefix_recursive(self, path: str, manager: Any) -> Optional[str]:
for nested_manager in manager.nested_managers.values():
prefix = nested_manager.field_id
if path.startswith(prefix + ".") or path == prefix:
deeper = self._matching_prefix_recursive(path, nested_manager)
return deeper if deeper else prefix
return None
def _groupbox_recursive(self, prefix: str, manager: Any) -> Optional[QWidget]:
for param_name, nested_manager in manager.nested_managers.items():
if nested_manager.field_id == prefix:
return manager.widgets.get(param_name)
result = self._groupbox_recursive(prefix, nested_manager)
if result is not None:
return result
return None