plugin_gn_tools/gn_tools/gui/dlg_settings.py
2026-03-19 14:06:08 +01:00

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__