from qgis.PyQt.QtCore import Qt from qgis.PyQt.QtWidgets import QDockWidget from qgis.utils import iface import inspect class DockManager: """ Zeigt ein Dockwidget an und schließt alle anderen mit dem Namensschema 'sn_dock_'. Der Dockname wird automatisch aus dem Pluginmodul abgeleitet. """ # Standard-Dockbereich: Rechts (wie die Verarbeitungswerkzeuge) # default_area = Qt.RightDockWidgetArea #Qt6 default_area = Qt.DockWidgetArea.RightDockWidgetArea @classmethod def show(cls, dock_widget, area=None): # Falls kein Bereich übergeben wurde, verwende den Standardwert if area is None: area = cls.default_area # Pluginname automatisch aus dem Modulpfad ableiten (z. B. 'sn_plugin1' → 'plugin1') caller_module = inspect.getmodule(inspect.stack()[1][0]) full_module_name = caller_module.__name__ # z. B. 'sn_plugin1.main' plugin_name = full_module_name.split('.')[0] # → 'sn_plugin1' dock_name = f"sn_dock_{plugin_name.replace('sn_', '')}" # → 'sn_dock_plugin1' # Objektname für das Dock setzen, damit es eindeutig identifizierbar ist dock_widget.setObjectName(dock_name) # Nur rechts andocken erlauben, wie bei der Toolbox # dock_widget.setAllowedAreas(Qt.RightDockWidgetArea) #Qt6 dock_widget.setAllowedAreas(Qt.DockWidgetArea.RightDockWidgetArea) # Dock-Features setzen: schließbar und verschiebbar #dock_widget.setFeatures(QDockWidget.DockWidgetClosable | QDockWidget.DockWidgetMovable) #Qt6 dock_widget.setFeatures( QDockWidget.DockWidgetFeature.DockWidgetClosable | QDockWidget.DockWidgetFeature.DockWidgetMovable ) # Alle vorhandenen Dockwidgets im Hauptfenster durchsuchen # und solche mit dem Namensschema 'sn_dock_' schließen – außer dem aktuellen all_docks = iface.mainWindow().findChildren(QDockWidget) for widget in all_docks: if widget.objectName().startswith("sn_dock_") and widget != dock_widget: try: iface.removeDockWidget(widget) widget.close() except Exception: pass # Fehler beim Schließen ignorieren (z. B. falls bereits entfernt) # Neues Dock anzeigen iface.addDockWidget(area, dock_widget) # Tabifizierung verhindern – andere Docks im selben Bereich entfernen for widget in iface.mainWindow().findChildren(QDockWidget): if widget != dock_widget and iface.mainWindow().dockWidgetArea(widget) == area: iface.mainWindow().removeDockWidget(widget) # Breite setzen wie bei der Toolbox (optional, anpassbar) dock_widget.setMinimumWidth(300) dock_widget.setMaximumWidth(400) # Höhe nicht erzwingen – Qt passt sie automatisch an dock_widget.show()