diff --git a/bec_widgets/widgets/editors/monaco/monaco_dock.py b/bec_widgets/widgets/editors/monaco/monaco_dock.py index 663a90f7..c977dd29 100644 --- a/bec_widgets/widgets/editors/monaco/monaco_dock.py +++ b/bec_widgets/widgets/editors/monaco/monaco_dock.py @@ -6,7 +6,7 @@ from typing import Any, cast from bec_lib.logger import bec_logger from bec_lib.macro_update_handler import has_executable_code -from qtpy.QtCore import QEvent, QTimer, Signal +from qtpy.QtCore import Signal from qtpy.QtWidgets import QFileDialog, QMessageBox, QToolButton, QWidget from bec_widgets.widgets.containers.dock_area.basic_dock_area import DockAreaWidget @@ -36,12 +36,12 @@ class MonacoDock(DockAreaWidget): **kwargs, ) self.dock_manager.focusedDockWidgetChanged.connect(self._on_focus_event) - self.dock_manager.installEventFilter(self) self._last_focused_editor: CDockWidget | None = None self.focused_editor.connect(self._on_last_focused_editor_changed) initial_editor = self.add_editor() if isinstance(initial_editor, CDockWidget): self.last_focused_editor = initial_editor + self._install_manager_scan_and_fix_guards() def _create_editor_widget(self) -> MonacoWidget: """Create a configured Monaco editor widget.""" @@ -73,7 +73,8 @@ class MonacoDock(DockAreaWidget): logger.info(f"Editor '{widget.current_file}' has unsaved changes: {widget.get_text()}") self.save_enabled.emit(widget.modified) - def _update_tab_title_for_modification(self, dock: CDockWidget, modified: bool): + @staticmethod + def _update_tab_title_for_modification(dock: CDockWidget, modified: bool): """Update the tab title to show modification status with a dot indicator.""" current_title = dock.windowTitle() @@ -98,14 +99,12 @@ class MonacoDock(DockAreaWidget): return active_sig = signatures[signature.get("activeSignature", 0)] - active_param = signature.get("activeParameter", 0) # TODO: Add highlight for active_param - # Get signature label and documentation label = active_sig.get("label", "") doc_obj = active_sig.get("documentation", {}) documentation = doc_obj.get("value", "") if isinstance(doc_obj, dict) else str(doc_obj) - # Format the markdown output + # Format the Markdown output markdown = f"```python\n{label}\n```\n\n{documentation}" self.signature_help.emit(markdown) @@ -156,9 +155,10 @@ class MonacoDock(DockAreaWidget): if self.last_focused_editor is dock: self.last_focused_editor = None # After topology changes, make sure single-tab areas get a plus button - QTimer.singleShot(0, self._scan_and_fix_areas) + self._scan_and_fix_areas() - def reset_widget(self, widget: MonacoWidget): + @staticmethod + def reset_widget(widget: MonacoWidget): """ Reset the given Monaco editor widget to its initial state. @@ -193,23 +193,23 @@ class MonacoDock(DockAreaWidget): # pylint: disable=protected-access area._monaco_plus_btn = plus_btn - def _scan_and_fix_areas(self): + def _install_manager_scan_and_fix_guards(self) -> None: + """ + Track ADS structural changes to trigger scan and fix of dock areas for plus button injection. + """ + self.dock_manager.dockAreaCreated.connect(self._scan_and_fix_areas) + self.dock_manager.dockWidgetAdded.connect(self._scan_and_fix_areas) + self.dock_manager.stateRestored.connect(self._scan_and_fix_areas) + self.dock_manager.restoringState.connect(self._scan_and_fix_areas) + self.dock_manager.focusedDockWidgetChanged.connect(self._scan_and_fix_areas) + self._scan_and_fix_areas() + + def _scan_and_fix_areas(self, *_arg): # Find all dock areas under this manager and ensure each single-tab area has a plus button areas = self.dock_manager.findChildren(CDockAreaWidget) for a in areas: self._ensure_area_plus(a) - def eventFilter(self, obj, event): - # Track dock manager events - if obj is self.dock_manager and event.type() in ( - QEvent.Type.ChildAdded, - QEvent.Type.ChildRemoved, - QEvent.Type.LayoutRequest, - ): - QTimer.singleShot(0, self._scan_and_fix_areas) - - return super().eventFilter(obj, event) - def add_editor( self, area: Any | None = None, title: str | None = None, tooltip: str | None = None ) -> CDockWidget: @@ -258,7 +258,7 @@ class MonacoDock(DockAreaWidget): if area_widget is not None: self._ensure_area_plus(area_widget) - QTimer.singleShot(0, self._scan_and_fix_areas) + self._scan_and_fix_areas() self.last_focused_editor = dock return dock