mirror of
https://github.com/qgis/QGIS.git
synced 2025-02-24 00:47:57 -05:00
178 lines
6.2 KiB
Python
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
|