From fcffd7ba615d99d2fd11c1e4bf5ecd8f57b57a2f Mon Sep 17 00:00:00 2001 From: Michael Otto Date: Thu, 9 Oct 2025 12:51:36 +0200 Subject: [PATCH] Dockmanager integriert --- ui/__init__.py | 1 + ui/dockmanager.py | 60 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 ui/dockmanager.py diff --git a/ui/__init__.py b/ui/__init__.py index 59ff36b..17c0c6d 100644 --- a/ui/__init__.py +++ b/ui/__init__.py @@ -1 +1,2 @@ from .tab_projekt import TabProjektWidget +from .dockmanager import DockManager \ No newline at end of file diff --git a/ui/dockmanager.py b/ui/dockmanager.py new file mode 100644 index 0000000..04812be --- /dev/null +++ b/ui/dockmanager.py @@ -0,0 +1,60 @@ +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 + + @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) + + # Dock-Features setzen: schließbar und verschiebbar + dock_widget.setFeatures(QDockWidget.DockWidgetClosable | QDockWidget.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()