Skip to content

Commit

Permalink
ensure enums are saved as strings in settings
Browse files Browse the repository at this point in the history
  • Loading branch information
3nids authored and nyalldawson committed Oct 25, 2024
1 parent 1dd9ff0 commit 8264a1e
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 29 deletions.
18 changes: 8 additions & 10 deletions python/PyQt6/gui/additions/qgssettingsenumflageditorwrapper.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,29 +46,27 @@ def createWrapper(self, parent=None):

def setWidgetFromSetting(self):
if self.setting:
return self.setWidgetFromVariant(self.setting.value(self.dynamicKeyPartList()))
return self.setWidgetFromVariant(self.setting.valueAsVariant(self.dynamicKeyPartList()))
return False

def setSettingFromWidget(self):
if self.editor:
self.setting.setValue(self.variantValueFromWidget(), self.dynamicKeyPartList())
self.setting.setVariantValue(self.variantValueFromWidget(), self.dynamicKeyPartList())
return True
else:
return False

def variantValueFromWidget(self):
if self.editor:
return self.setting.defaultValue().__class__(self.editor.currentData())
return self.editor.currentData()
return None

def setWidgetFromVariant(self, value):
if self.editor and value is not None:
ok = True
if isinstance(value, str):
value, ok = self.setting.metaEnum().keyToValue(value)
if ok:
idx = self.editor.findData(int(value))
self.editor.setCurrentIndex(idx)
if isinstance(value, int):
value = self.setting.metaEnum().valueToKey(value)
idx = self.editor.findData(value)
self.editor.setCurrentIndex(idx)
return idx >= 0
return False

Expand All @@ -83,7 +81,7 @@ def configureEditorPrivate(self, editor: QComboBox, setting: QgsSettingsEntryBas
value = self.setting.metaEnum().value(i)
key = self.setting.metaEnum().key(i)
text = self.displayStrings.get(value, key)
self.editor.addItem(text, value)
self.editor.addItem(text, key)
return True
else:
return False
Expand Down
18 changes: 8 additions & 10 deletions python/gui/additions/qgssettingsenumflageditorwrapper.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,29 +46,27 @@ def createWrapper(self, parent=None):

def setWidgetFromSetting(self):
if self.setting:
return self.setWidgetFromVariant(self.setting.value(self.dynamicKeyPartList()))
return self.setWidgetFromVariant(self.setting.valueAsVariant(self.dynamicKeyPartList()))
return False

def setSettingFromWidget(self):
if self.editor:
self.setting.setValue(self.variantValueFromWidget(), self.dynamicKeyPartList())
self.setting.setVariantValue(self.variantValueFromWidget(), self.dynamicKeyPartList())
return True
else:
return False

def variantValueFromWidget(self):
if self.editor:
return self.setting.defaultValue().__class__(self.editor.currentData())
return self.editor.currentData()
return None

def setWidgetFromVariant(self, value):
if self.editor and value is not None:
ok = True
if isinstance(value, str):
value, ok = self.setting.metaEnum().keyToValue(value)
if ok:
idx = self.editor.findData(int(value))
self.editor.setCurrentIndex(idx)
if isinstance(value, int):
value = self.setting.metaEnum().valueToKey(value)
idx = self.editor.findData(value)
self.editor.setCurrentIndex(idx)
return idx >= 0
return False

Expand All @@ -83,7 +81,7 @@ def configureEditorPrivate(self, editor: QComboBox, setting: QgsSettingsEntryBas
value = self.setting.metaEnum().value(i)
key = self.setting.metaEnum().key(i)
text = self.displayStrings.get(value, key)
self.editor.addItem(text, value)
self.editor.addItem(text, key)
return True
else:
return False
Expand Down
20 changes: 11 additions & 9 deletions tests/src/python/test_qgssettingseditorregistry.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
from qgis.PyQt.QtWidgets import QComboBox, QSpinBox
from qgis.core import (
QgsLocatorFilter,
QgsSettings,
QgsSettingsTree,
QgsSettingsEntryEnumFlag,
QgsSettingsEntryInteger,
Expand Down Expand Up @@ -50,23 +51,24 @@ def test_settings_registry(self):
self.assertEqual(int_setting.value(), 6)

def test_settings_registry_custom_enumflag_py(self):
self.priority_setting = QgsSettingsEntryEnumFlag("priority", self.settings_node, QgsLocatorFilter.Priority.High)
priority_setting = QgsSettingsEntryEnumFlag("priority", self.settings_node, QgsLocatorFilter.Priority.High)
registry = QgsGui.settingsEditorWidgetRegistry()
registry.addWrapperForSetting(QgsSettingsEnumEditorWidgetWrapper(), self.priority_setting)
registry.addWrapperForSetting(QgsSettingsEnumEditorWidgetWrapper(), priority_setting)

self.editor = registry.createEditor(self.priority_setting, [])
self.assertIsInstance(self.editor, QComboBox)
editor = registry.createEditor(priority_setting, [])
self.assertIsInstance(editor, QComboBox)
wrapper = QgsSettingsEditorWidgetWrapper.fromWidget(editor)

self.assertEqual(self.editor.currentData(), QgsLocatorFilter.Priority.High)
self.assertEqual(editor.currentData(), "High")

self.editor.setCurrentIndex(self.editor.findData(QgsLocatorFilter.Priority.Low))
editor.setCurrentIndex(editor.findData("Low"))

wrapper = QgsSettingsEditorWidgetWrapper.fromWidget(self.editor)
self.assertEqual(wrapper.variantValueFromWidget(), QgsLocatorFilter.Priority.Low)
self.assertEqual(wrapper.variantValueFromWidget(), "Low")

wrapper.setSettingFromWidget()

self.assertEqual(self.priority_setting.value(), QgsLocatorFilter.Priority.Low)
self.assertEqual(priority_setting.value(), QgsLocatorFilter.Priority.Low)
self.assertEqual(QgsSettings().value(f"plugins/{PLUGIN_NAME}/priority"), "Low")


if __name__ == '__main__':
Expand Down

0 comments on commit 8264a1e

Please sign in to comment.