170 lines
4.9 KiB
Python
Executable File
170 lines
4.9 KiB
Python
Executable File
#! python3 # noqa: E265
|
|
|
|
"""
|
|
Plugin settings form integrated into QGIS 'Options' menu.
|
|
"""
|
|
|
|
# standard
|
|
import platform
|
|
from functools import partial
|
|
from pathlib import Path
|
|
from urllib.parse import quote
|
|
|
|
# PyQGIS
|
|
from qgis.core import Qgis, QgsApplication
|
|
from qgis.gui import QgsOptionsPageWidget, QgsOptionsWidgetFactory
|
|
from qgis.PyQt import uic
|
|
from qgis.PyQt.QtCore import QUrl
|
|
from qgis.PyQt.QtGui import QDesktopServices, QIcon
|
|
|
|
# project
|
|
from gn_tools.__about__ import (
|
|
__icon_path__,
|
|
__title__,
|
|
__uri_homepage__,
|
|
__uri_tracker__,
|
|
__version__,
|
|
)
|
|
from gn_tools.toolbelt import PlgLogger, PlgOptionsManager
|
|
from gn_tools.toolbelt.preferences import PlgSettingsStructure
|
|
|
|
# ############################################################################
|
|
# ########## Globals ###############
|
|
# ##################################
|
|
|
|
FORM_CLASS, _ = uic.loadUiType(
|
|
Path(__file__).parent / "{}.ui".format(Path(__file__).stem)
|
|
)
|
|
|
|
|
|
# ############################################################################
|
|
# ########## Classes ###############
|
|
# ##################################
|
|
|
|
|
|
class ConfigOptionsPage(FORM_CLASS, QgsOptionsPageWidget):
|
|
"""Settings form embedded into QGIS 'options' menu."""
|
|
|
|
def __init__(self, parent):
|
|
super().__init__(parent)
|
|
self.log = PlgLogger().log
|
|
self.plg_settings = PlgOptionsManager()
|
|
|
|
# load UI and set objectName
|
|
self.setupUi(self)
|
|
self.setObjectName("mOptionsPage{}".format(__title__))
|
|
|
|
report_context_message = quote(
|
|
"> Reported from plugin settings\n\n"
|
|
f"- operating system: {platform.system()} "
|
|
f"{platform.release()}_{platform.version()}\n"
|
|
f"- QGIS: {Qgis.QGIS_VERSION}\n"
|
|
f"- plugin version: {__version__}\n"
|
|
)
|
|
|
|
# header
|
|
self.lbl_title.setText(f"{__title__} - Version {__version__}")
|
|
|
|
# customization
|
|
self.btn_help.setIcon(QIcon(QgsApplication.iconPath("mActionHelpContents.svg")))
|
|
self.btn_help.pressed.connect(
|
|
partial(QDesktopServices.openUrl, QUrl(__uri_homepage__))
|
|
)
|
|
|
|
|
|
self.btn_report.setIcon(
|
|
QIcon(QgsApplication.iconPath("console/iconSyntaxErrorConsole.svg"))
|
|
)
|
|
|
|
self.btn_reset.setIcon(QIcon(QgsApplication.iconPath("mActionUndo.svg")))
|
|
self.btn_reset.pressed.connect(self.reset_settings)
|
|
|
|
# load previously saved settings
|
|
self.load_settings()
|
|
|
|
def apply(self):
|
|
"""Called to permanently apply the settings shown in the options page (e.g. \
|
|
save them to QgsSettings objects). This is usually called when the options \
|
|
dialog is accepted."""
|
|
settings = self.plg_settings.get_plg_settings()
|
|
|
|
# misc
|
|
settings.debug_mode = self.opt_debug.isChecked()
|
|
settings.version = __version__
|
|
|
|
# param
|
|
settings.domain_url = self.edit_url.text()
|
|
|
|
# dump new settings into QgsSettings
|
|
self.plg_settings.save_from_object(settings)
|
|
|
|
if __debug__:
|
|
self.log(
|
|
message="DEBUG - Settings successfully saved.",
|
|
log_level=Qgis.MessageLevel.NoLevel,
|
|
)
|
|
|
|
def load_settings(self):
|
|
"""Load options from QgsSettings into UI form."""
|
|
settings = self.plg_settings.get_plg_settings()
|
|
|
|
# global
|
|
self.opt_debug.setChecked(settings.debug_mode)
|
|
self.lbl_version_saved_value.setText(settings.version)
|
|
|
|
# param
|
|
self.edit_url.setText(settings.domain_url)
|
|
|
|
def reset_settings(self):
|
|
"""Reset settings to default values (set in preferences.py module)."""
|
|
default_settings = PlgSettingsStructure()
|
|
|
|
# dump default settings into QgsSettings
|
|
self.plg_settings.save_from_object(default_settings)
|
|
|
|
# update the form
|
|
self.load_settings()
|
|
|
|
|
|
class PlgOptionsFactory(QgsOptionsWidgetFactory):
|
|
"""Factory for options widget."""
|
|
|
|
def __init__(self):
|
|
"""Constructor."""
|
|
super().__init__()
|
|
|
|
def icon(self) -> QIcon:
|
|
"""Returns plugin icon, used to as tab icon in QGIS options tab widget.
|
|
|
|
:return: _description_
|
|
:rtype: QIcon
|
|
"""
|
|
return QIcon(str(__icon_path__))
|
|
|
|
def createWidget(self, parent) -> ConfigOptionsPage:
|
|
"""Create settings widget.
|
|
|
|
:param parent: Qt parent where to include the options page.
|
|
:type parent: QObject
|
|
|
|
:return: options page for tab widget
|
|
:rtype: ConfigOptionsPage
|
|
"""
|
|
return ConfigOptionsPage(parent)
|
|
|
|
def title(self) -> str:
|
|
"""Returns plugin title, used to name the tab in QGIS options tab widget.
|
|
|
|
:return: plugin title from about module
|
|
:rtype: str
|
|
"""
|
|
return __title__
|
|
|
|
def helpId(self) -> str:
|
|
"""Returns plugin help URL.
|
|
|
|
:return: plugin homepage url from about module
|
|
:rtype: str
|
|
"""
|
|
return __uri_homepage__
|