Files
Plugin_SN_Basis/ui/dockmanager.py
2025-10-09 12:51:36 +02:00

61 lines
2.6 KiB
Python
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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()