diff --git a/__init__.py b/__init__.py index b1c14f9..7510e49 100644 --- a/__init__.py +++ b/__init__.py @@ -1,31 +1,3 @@ -# -*- coding: utf-8 -*- -# import debugpy - -# _debugger_started = False - def classFactory(iface): from .main import Verfahrensgebiet - # start_debugger() return Verfahrensgebiet(iface) - -# def start_debugger(): -# global _debugger_started - -# if _debugger_started: -# return # Schon gestartet – nichts tun - -# try: -# debugpy.listen(5678) -# _debugger_started = True -# print("Debugger wartet auf Verbindung...") -# except RuntimeError: -# print("Debugger läuft bereits – Verbindung wird erwartet...") - -# if debugpy.is_client_connected(): -# print("Debugger verbunden – Plugin läuft") -# else: -# try: -# debugpy.wait_for_client() -# print("Debugger verbunden – Plugin läuft") -# except RuntimeError as e: -# print(f"Fehler beim Warten auf Debugger: {e}") diff --git a/assets/20250908_134217_image.png b/assets/20250908_134217_image.png deleted file mode 100644 index b921c45..0000000 Binary files a/assets/20250908_134217_image.png and /dev/null differ diff --git a/assets/20250908_134247_image.png b/assets/20250908_134247_image.png deleted file mode 100644 index 076ca7e..0000000 Binary files a/assets/20250908_134247_image.png and /dev/null differ diff --git a/icons/icon.png b/icons/icon.png deleted file mode 100644 index a4cdc61..0000000 Binary files a/icons/icon.png and /dev/null differ diff --git a/main.py b/main.py index 87b4db0..1c8dcd4 100644 --- a/main.py +++ b/main.py @@ -1,92 +1,34 @@ -# Import grundlegender Qt- und QGIS-Komponenten -from qgis.PyQt.QtCore import QSettings, QTranslator, QCoreApplication, Qt -from qgis.PyQt.QtGui import QIcon -from qgis.PyQt.QtWidgets import QAction, QMessageBox from qgis.utils import plugins - -# Import der generierten Ressourcen (z. B. Icons) -from .resources import * - -# Import der gemeinsamen UI-Klasse für Menü und Symbolleiste +from qgis.PyQt.QtGui import QIcon from sn_basis.ui.navigation import Navigation - -# Import des Dockwidgets, das beim Ausführen des Plugins angezeigt wird -from .ui.sn_verfahrensgebiet_dockwidget import VerfahrensgebietDockWidget -import os.path +from sn_basis.ui.dockmanager import DockManager +from .ui.dockwidget import DockWidget class Verfahrensgebiet: - """ - Hauptklasse des Plugins. Verwaltet die Initialisierung, GUI-Integration und das Dockwidget. - """ - def __init__(self, iface): - # iface: QGIS-Schnittstelle zur Interaktion mit der Anwendung self.iface = iface - self.plugin_dir = os.path.dirname(__file__) # Pfad zum Plugin-Verzeichnis - - self.actions = [] # Platzhalter für spätere Aktionsverwaltung (optional) - self.pluginIsActive = False # Statusflag, ob das Plugin aktiv ist - self.dockwidget = None # Referenz auf das Dockwidget + self.ui = None + self.dockwidget = None def initGui(self): - """ - Wird beim Laden des Plugins aufgerufen. Fügt Menüeintrag und Symbolleistenaktion hinzu. - """ - self.action_text = "Verfahrensgebiet" # Einheitlicher Text für Menü und Toolbar - icon = QIcon(":/sn_plugin1/icons/icon.png") # Icon aus Ressourcen laden - self.ui = Navigation() # Gemeinsame UI-Instanz für Menü und Toolbar - self.ui.add_action(self.action_text, self.run, icon, tooltip="Öffnet Verfahrensgebiet") - - def onClosePlugin(self): - """ - Wird aufgerufen, wenn das Dockwidget geschlossen wird. Setzt den Aktivitätsstatus zurück. - """ - try: - self.dockwidget.closingPlugin.disconnect(self.onClosePlugin) - except Exception: - pass - self.pluginIsActive = False + # Basis-Plugin muss geladen sein! + basis = plugins.get("sn_basis") + if basis and basis.ui: + self.action = basis.ui.add_action("Verfahrensgebiet", self.run, tooltip="Öffnet Verfahrensgebiet", priority=10) + basis.ui.finalize_menu_and_toolbar() def unload(self): - """ - Wird beim Deaktivieren des Plugins aufgerufen. Entfernt Menü- und Toolbar-Eintrag. - """ - if hasattr(self, "ui"): - self.ui.remove_action(self.action_text) - + if self.ui: + self.ui.remove_all() if self.dockwidget: - try: - self.iface.removeDockWidget(self.dockwidget) - except Exception: - pass + self.iface.removeDockWidget(self.dockwidget) self.dockwidget.deleteLater() self.dockwidget = None def run(self): - """ - Wird beim Klick auf Menüeintrag oder Symbolleistenaktion ausgeführt. - Zeigt das Dockwidget an. - """ - if 'sn_basis' not in plugins: - QMessageBox.warning(None, "Abhängigkeit fehlt", - "Das Plugin 'LNO Sachsen | Basisfunktionen' ist nicht installiert oder nicht aktiviert.\nBitte installieren und aktivieren, um fortzufahren.") - return # Plugin nicht starten - - # Prüfen, ob das eigene Dockwidget existiert und aktuell sichtbar ist - dock_visible = self.dockwidget is not None and self.dockwidget.isVisible() + from sn_verfahrensgebiet.ui.dockwidget import DockWidget + self.dockwidget = DockWidget(self.iface.mainWindow()) + self.dockwidget.setObjectName("sn_dock_verfahrensgebiet") + DockManager.show(self.dockwidget) - if not dock_visible: - # Pluginstatus setzen, damit z. B. beim Schließen korrekt zurückgesetzt werden kann - self.pluginIsActive = True - # Falls noch kein Dockwidget existiert, wird es jetzt erzeugt - if self.dockwidget is None: - self.dockwidget = VerfahrensgebietDockWidget() - self.dockwidget.closingPlugin.connect(self.onClosePlugin) - - # Dock anzeigen und ggf. andere Docks schließen - from sn_basis.ui.dockmanager import DockManager - DockManager.show(self.dockwidget) - else: - # Falls das eigene Dock bereits sichtbar ist, wird keine Aktion ausgeführt - pass diff --git a/metadata.txt b/metadata.txt index 12ee702..219b713 100644 --- a/metadata.txt +++ b/metadata.txt @@ -1,23 +1,13 @@ [general] name=LNO Sachsen | Verfahrensgebiet qgisMinimumVersion=3.0 -description=Dieses Plugin ist ein Test -version=25.10.1 +description=Plugin zum Erzeugen eines Objektes "Verfahrensgebiet" +version=25.11.1 author=Michael Otto email=michael.otto@landkreis-mittelsachsen.de - -about=Provide a brief description of the plugin and its purpose. - -supportsQt6=True - -hasProcessingProvider=no -tags=python - +about=Plugin zum Erzeugen eines Objektes "Verfahrensgebiet" category=Plugins -icon=icon.png -experimental=True - -deprecated=False - -server=False - +homepage=https://entwicklung.vln-sn.de/AG_QGIS/Plugin_SN_Verfahrensgebiet +repository=https://entwicklung.vln-sn.de/AG_QGIS/Repository +supportsQt6=true +experimental=true \ No newline at end of file diff --git a/resources.py b/resources.py deleted file mode 100644 index 6ce1293..0000000 --- a/resources.py +++ /dev/null @@ -1,102 +0,0 @@ -# -*- coding: utf-8 -*- - -# Resource object code -# -# Created by: The Resource Compiler for PyQt5 (Qt v5.15.2) -# -# WARNING! All changes made in this file will be lost! - -# from PyQt5 import QtCore #Qt6 -from qgis.PyQt import QtCore - -qt_resource_data = b"\ -\x00\x00\x02\x5f\ -\x89\ -\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ -\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ -\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0e\xc3\x00\x00\x0e\xc3\ -\x01\xc7\x6f\xa8\x64\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ -\x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ -\x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x01\xec\x49\x44\ -\x41\x54\x58\x85\xed\x96\x4f\x4b\x54\x51\x18\xc6\x7f\x8f\xdc\x60\ -\x5c\x95\x21\x8c\x90\xe4\xd4\xa2\x75\x9b\x5c\xe7\x4a\x23\x62\x08\ -\xdc\xda\xa6\x0f\x20\x41\x0b\x21\x68\x53\x8b\x96\x2e\x12\xa1\x6d\ -\xa0\x5f\x20\x12\xbf\x80\x6e\x5a\x24\x09\x6e\x24\xff\x20\xa1\x09\ -\xb3\xc9\x9c\x19\x32\xde\x16\xf7\x1d\x3a\x5c\xef\xf5\xde\x1c\x1d\ -\x25\xe6\x85\xcb\xb9\xf7\x37\xef\xb9\xef\x73\xce\x79\xce\x99\x2b\ -\xe0\x07\x50\xe2\x62\xa2\x1e\x01\x57\x80\x3e\xa0\xd9\xe1\xe2\x25\ -\xe0\x7b\xe4\x0f\x47\x66\xf6\xab\x93\xd5\x25\x45\x00\x3d\x9d\x2c\ -\x9a\x16\x5d\x01\x97\x5f\x80\xa4\x3e\x49\x6f\x25\x55\x03\x56\x96\ -\x34\x23\x69\xec\x84\x7e\x77\x24\xcd\x4a\x7a\x93\x57\xa3\x01\x94\ -\xcc\x8c\xb4\x0b\xb8\x0f\x18\xf0\x22\x60\x0f\x9d\x3d\x4b\xc9\x8f\ -\x80\x49\xe0\xc0\x73\xf6\x33\xde\xdb\x0b\xd4\x8b\x2c\xc1\x2d\x6f\ -\x37\x02\x36\xe4\xed\x66\x62\xd4\x77\x81\x4f\xc0\x34\xf0\xb9\xc0\ -\xbb\x89\xf2\x53\xa8\x14\x15\x00\xbc\x06\xae\x02\x8f\x81\x65\x60\ -\xf7\xd4\x02\x24\x8d\x00\xa3\x40\x6b\x9d\x9f\x04\x3e\x78\xe0\xed\ -\x53\x49\x4b\x66\x36\xe7\xcf\x2f\x81\x35\x33\xab\x4b\x2a\xe7\x15\ -\x6f\x45\xaa\x07\x80\x57\x40\x0d\x38\x02\x7e\xfb\x7d\x2d\x85\x7d\ -\xc8\x58\xe3\x32\x05\x3c\x90\x29\x20\x48\xdc\xf4\x51\x85\xec\x1b\ -\xb0\x92\xd5\xe7\x5f\x04\x9c\x68\x42\x3f\xaf\x6f\x00\x5b\x01\x2b\ -\x01\x03\x21\x6b\x27\xf2\x76\xc1\x20\xb1\x4f\xb6\x03\x56\x01\x94\ -\x60\xa7\x8e\x54\x13\x4a\xea\xf1\x42\xf7\x1c\xfd\x94\x74\xdb\xef\ -\x87\x03\x36\x64\x66\x6d\xcf\xc4\x31\x0f\x78\x61\x2b\x78\x55\xda\ -\xf1\x40\xd6\x36\xfc\x02\x8c\x03\x13\x40\x15\x98\x02\xbe\xfa\x6f\ -\x13\xc0\x23\xe0\x39\xb1\x41\x77\xce\x7c\x06\x02\x95\xef\x7d\x14\ -\x03\x01\x9b\x77\x76\xfd\xdc\x77\x01\xf1\x89\xd7\x04\xf6\x12\xec\ -\xc0\xcc\x6a\xed\x8e\x1c\xf2\x77\xc1\x4d\x60\xdb\x5c\x72\x20\x20\ -\xd5\x78\x92\xde\x49\x32\x49\xc6\xdf\x63\xb8\xbf\xc5\x24\x35\x25\ -\xf5\x86\x7d\xf2\xfe\x0b\x16\x80\xf5\x04\xfb\x08\xac\x66\xe4\x2f\ -\x12\x4f\x7b\x56\x1c\x92\xf8\xf8\x15\xb1\x07\xae\x99\x59\x23\x47\ -\xcc\x99\x86\xcf\x44\xed\xf2\x7f\x11\x75\x05\x74\x05\xfc\xf7\x02\ -\x5a\x07\x51\x5d\xd2\x45\xd4\x6f\xfc\x01\xf3\xb6\x83\x46\x54\x23\ -\xdb\x20\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ -" - -qt_resource_name = b"\ -\x00\x0a\ -\x07\x34\x98\xd1\ -\x00\x73\ -\x00\x6e\x00\x5f\x00\x70\x00\x6c\x00\x75\x00\x67\x00\x69\x00\x6e\x00\x31\ -\x00\x05\ -\x00\x6f\xa6\x53\ -\x00\x69\ -\x00\x63\x00\x6f\x00\x6e\x00\x73\ -\x00\x08\ -\x0a\x61\x5a\xa7\ -\x00\x69\ -\x00\x63\x00\x6f\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\ -" - -qt_resource_struct_v1 = b"\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\ -\x00\x00\x00\x1a\x00\x02\x00\x00\x00\x01\x00\x00\x00\x03\ -\x00\x00\x00\x2a\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ -" - -qt_resource_struct_v2 = b"\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ -\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\ -\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x1a\x00\x02\x00\x00\x00\x01\x00\x00\x00\x03\ -\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x2a\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ -\x00\x00\x01\x99\x28\x6e\x23\x10\ -" - -qt_version = [int(v) for v in QtCore.qVersion().split('.')] -if qt_version < [5, 8, 0]: - rcc_version = 1 - qt_resource_struct = qt_resource_struct_v1 -else: - rcc_version = 2 - qt_resource_struct = qt_resource_struct_v2 - -def qInitResources(): - QtCore.qRegisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data) - -def qCleanupResources(): - QtCore.qUnregisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data) - -qInitResources() diff --git a/resources.qrc b/resources.qrc deleted file mode 100644 index ea9d1ea..0000000 --- a/resources.qrc +++ /dev/null @@ -1,5 +0,0 @@ - - - icons/icon.png - - diff --git a/scripts/compile.bat b/scripts/compile.bat deleted file mode 100644 index c6f2bb6..0000000 --- a/scripts/compile.bat +++ /dev/null @@ -1,11 +0,0 @@ -@echo off -REM Wechsle ins Plugin-Hauptverzeichnis (eine Ebene über /scripts) -cd /d %~dp0\.. - -call "C:\Program Files\QGIS 3.34.5\bin\o4w_env.bat" - -REM Kompiliere die Ressourcen-Datei -pyrcc5 resources.qrc -o resources.py - -@echo on -echo Ressourcen wurden erfolgreich kompiliert. diff --git a/ui/__init__.py b/ui/__init__.py deleted file mode 100644 index d1f4eb2..0000000 --- a/ui/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .tab_verfahrensgebiet import TabVerfahrensgebietWidget \ No newline at end of file diff --git a/ui/dockwidget.py b/ui/dockwidget.py new file mode 100644 index 0000000..efa2f38 --- /dev/null +++ b/ui/dockwidget.py @@ -0,0 +1,24 @@ +from qgis.PyQt.QtWidgets import QDockWidget, QTabWidget, QWidget, QVBoxLayout, QLabel +from sn_basis.ui.tabs.settings_tab import SettingsTab +from sn_verfahrensgebiet.ui.tabs.tab_a import TabA +from sn_verfahrensgebiet.ui.tabs.tab_b import TabB + +class DockWidget(QDockWidget): + def __init__(self, parent=None): + super().__init__(parent) + self.setWindowTitle("LNO Sachsen | Verfahrensgebiet") + + # TabWidget erzeugen + tabs = QTabWidget() + + # Tab A + tabs.addTab(TabA(), "Tab A") + + # Tab B + tabs.addTab(TabB(), "Tab B") + + # Gemeinsamer Tab + tabs.addTab(SettingsTab(), "Projekteigenschaften") + + # TabWidget ins Dock setzen + self.setWidget(tabs) diff --git a/ui/sn_verfahrensgebiet_dockwidget.py b/ui/sn_verfahrensgebiet_dockwidget.py deleted file mode 100644 index 3f1cc61..0000000 --- a/ui/sn_verfahrensgebiet_dockwidget.py +++ /dev/null @@ -1,31 +0,0 @@ -from qgis.PyQt.QtWidgets import QDockWidget, QTabWidget, QVBoxLayout, QWidget -from qgis.PyQt.QtCore import pyqtSignal - -from sn_basis.ui.tab_projekt import TabProjektWidget - -from ..ui import TabVerfahrensgebietWidget - -class VerfahrensgebietDockWidget(QDockWidget): - - closingPlugin = pyqtSignal() - - def __init__(self, parent=None): - super().__init__(parent) - - self.setWindowTitle("LNO Sachsen | Verfahrensgebiet") - - container = QWidget() - layout = QVBoxLayout(container) - - self.tabWidget = QTabWidget() - layout.addWidget(self.tabWidget) - - self.setWidget(container) - - # Tabs hinzufügen - self.tabWidget.addTab(TabVerfahrensgebietWidget(self), "Verfahrensgebiet") - self.tabWidget.addTab(TabProjektWidget(self), "Projekt") - - def closeEvent(self, event): - self.closingPlugin.emit() - event.accept() \ No newline at end of file diff --git a/ui/tab_verfahrensgebiet.py b/ui/tab_verfahrensgebiet.py deleted file mode 100644 index ea4718c..0000000 --- a/ui/tab_verfahrensgebiet.py +++ /dev/null @@ -1,12 +0,0 @@ -# tab_info.py -from qgis.PyQt import uic -from qgis.PyQt.QtWidgets import QWidget -import os - -FORM_CLASS, _ = uic.loadUiType(os.path.join( - os.path.dirname(__file__), 'tab_verfahrensgebiet.ui')) - -class TabVerfahrensgebietWidget(QWidget, FORM_CLASS): - def __init__(self, parent=None): - super().__init__(parent) - self.setupUi(self) diff --git a/ui/tab_verfahrensgebiet.ui b/ui/tab_verfahrensgebiet.ui deleted file mode 100644 index 0e9f56a..0000000 --- a/ui/tab_verfahrensgebiet.ui +++ /dev/null @@ -1,32 +0,0 @@ - - - Form - - - - 0 - 0 - 538 - 295 - - - - Form - - - - - 40 - 50 - 47 - 13 - - - - Tab 2 - - - - - - diff --git a/ui/tabs/tab_a.py b/ui/tabs/tab_a.py new file mode 100644 index 0000000..3321207 --- /dev/null +++ b/ui/tabs/tab_a.py @@ -0,0 +1,10 @@ +from qgis.PyQt.QtWidgets import QWidget, QVBoxLayout, QLabel, QLineEdit + +class TabA(QWidget): + def __init__(self, parent=None): + super().__init__(parent) + layout = QVBoxLayout() + layout.addWidget(QLabel("Plugin1 – Tab A")) + layout.addWidget(QLineEdit("Feld A1")) + layout.addWidget(QLineEdit("Feld A2")) + self.setLayout(layout) diff --git a/ui/tabs/tab_b.py b/ui/tabs/tab_b.py new file mode 100644 index 0000000..0a97ca3 --- /dev/null +++ b/ui/tabs/tab_b.py @@ -0,0 +1,9 @@ +from qgis.PyQt.QtWidgets import QWidget, QVBoxLayout, QLabel, QTextEdit + +class TabB(QWidget): + def __init__(self, parent=None): + super().__init__(parent) + layout = QVBoxLayout() + layout.addWidget(QLabel("Plugin1 – Tab B")) + layout.addWidget(QTextEdit("Mehrzeiliger Text für Plugin1")) + self.setLayout(layout)