QGIS/python/core/additions/qgssettingsentry.py
2024-11-29 15:38:02 +01:00

178 lines
6.2 KiB
Python

"""
***************************************************************************
qgssettingsentry.py
---------------------
Date : April 2021
Copyright : (C) 2021 by Damiano Lombardi
Email : damiano@opengis.ch
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************
"""
from .metaenum import metaEnumFromValue
from qgis.core import (
QgsSettings,
QgsSettingsTree,
QgsSettingsEntryBase,
QgsLogger,
Qgis,
)
import qgis # required to get base class of enums
class PyQgsSettingsEntryEnumFlag(QgsSettingsEntryBase):
"""
class PyQgsSettingsEntryEnumFlag
An enum settings entry.
since QGIS 3.20
"""
def __init__(
self,
key,
pluginName,
defaultValue,
description="",
options=Qgis.SettingsOptions(),
):
"""
Constructor for PyQgsSettingsEntryEnumFlag.
:param key: argument specifies the final part of the settings key.
:param pluginName: argument is either the plugin name or the settings tree parent element
:param defaultValue: argument specifies the default value for the settings entry.
:param description: argument specifies a description for the settings entry.
"""
# TODO QGIS 4: rename pluginName arg to parent and key to name
self.options = options
defaultValueStr = ""
self.__metaEnum = metaEnumFromValue(defaultValue)
if self.__metaEnum is None or not self.__metaEnum.isValid():
QgsLogger.debug(
f"Invalid metaenum. Enum/Flag probably misses Q_ENUM/Q_FLAG declaration. Settings key: '{self.key()}'"
)
else:
if self.__metaEnum.isFlag():
defaultValueStr = self.__metaEnum.valueToKeys(defaultValue)
else:
defaultValueStr = self.__metaEnum.valueToKey(defaultValue)
self.__enumFlagClass = defaultValue.__class__
if type(pluginName) is str:
parent = QgsSettingsTree.createPluginTreeNode(pluginName)
else:
parent = pluginName
super().__init__(key, parent, defaultValueStr, description, options)
def metaEnum(self):
return self.__metaEnum
def typeId(self):
"""
Defines a custom id since this class has not the same API as the cpp implementation
"""
return "py-enumflag"
def value(self, dynamicKeyPart=None):
"""
Get settings value.
:param dynamicKeyPart: argument specifies the dynamic part of the settings key.
"""
if self.__metaEnum.isFlag():
return QgsSettings().flagValue(
self.key(dynamicKeyPart), self.defaultValue()
)
else:
return QgsSettings().enumValue(
self.key(dynamicKeyPart), self.defaultValue()
)
def valueWithDefaultOverride(self, defaultValueOverride, dynamicKeyPart=None):
"""
Get settings value with a default value override.
:param defaultValueOverride: argument if valid is used instead of the normal default value.
:param dynamicKeyPart: argument specifies the dynamic part of the settings key.
"""
if self.__metaEnum.isFlag():
return QgsSettings().flagValue(
self.key(dynamicKeyPart), defaultValueOverride
)
else:
return QgsSettings().enumValue(
self.key(dynamicKeyPart), defaultValueOverride
)
def defaultValue(self):
"""
Get settings default value.
"""
if self.__metaEnum is None or not self.__metaEnum.isValid():
QgsLogger.debug(
f"Invalid metaenum. Enum/Flag probably misses Q_ENUM/Q_FLAG declaration. Settings key: '{self.key()}'"
)
return -1
defaultValueString = self.defaultValueAsVariant()
if self.__metaEnum.isFlag():
(defaultValue, ok) = self.__metaEnum.keysToValue(defaultValueString)
else:
(defaultValue, ok) = self.__metaEnum.keyToValue(defaultValueString)
if not ok:
QgsLogger.debug(
f"Invalid enum/flag key/s '{self.defaultValueAsVariant()}'."
)
return -1
# cast to the enum class
defaultValue = self.__enumFlagClass(defaultValue)
return defaultValue
def setValue(self, value, dynamicKeyPart: (list, str) = None):
"""
Set settings value.
:param value: the value to set for the setting.
:param dynamicKeyPart: argument specifies the dynamic part of the settings key (a single one a string, or several as a list)
"""
if self.__metaEnum is None or not self.__metaEnum.isValid():
QgsLogger.debug(
f"Invalid metaenum. Enum/Flag probably misses Q_ENUM/Q_FLAG declaration. Settings key: '{self.key()}'"
)
return False
if self.options & Qgis.SettingsOption.SaveEnumFlagAsInt:
enum_flag_key = int(value)
else:
if self.__metaEnum.isFlag():
enum_flag_key = self.__metaEnum.valueToKeys(value)
else:
enum_flag_key = self.__metaEnum.valueToKey(value)
if not enum_flag_key:
QgsLogger.debug(f"Invalid enum/flag value '{value}'.")
return False
if type(dynamicKeyPart) is str:
dynamicKeyPart = [dynamicKeyPart]
elif dynamicKeyPart is None:
dynamicKeyPart = []
return super().setVariantValue(enum_flag_key, dynamicKeyPart)
def settingsType(self):
"""
Get the settings entry type.
"""
return self.SettingsType.EnumFlag