Source code for qtypy.settings

#!/usr/bin/env python3

"""
Pythonic wrapper for QSettings
"""

import contextlib

from PyQt5 import QtCore


[docs]class Settings(QtCore.QSettings): """ Settings class. You can also use this as a context manager so that `sync()` is called on exit. """ def __iter__(self): """ Iterating on a Settings object yields all keys (recursively). Affected by the current group. """ return self.allKeys().__iter__() def __contains__(self, name): """Support for the `in` operator""" return self.contains(name) def __delitem__(self, name): """Support for del settings['name']""" self.remove(name) def __getitem__(self, name): return self.value(name) def __setitem__(self, name, value): self.setValue(name, value) def __enter__(self): return self def __exit__(self, *args): self.sync() def get(self, name, default=None): if default is None: return self[name] return self[name] if name in self else default
[docs] def items(self): """ Yields all key/value pairs (recursively). Affected by the current group. """ for key in self: yield key, self.value(key)
[docs] def keys(self): """ Yield all child keys. Affected by the current group. """ for key in self.childKeys(): yield key
[docs] def keyValues(self): """ Yield all child key/value pairs. Affected by the current group. """ for key in self.childKeys(): yield key, self.value(key)
[docs] def groups(self): """ Yield all child groups. Affected by the current group. """ for group in self.childGroups(): yield group
[docs] @contextlib.contextmanager def grouped(self, name): """ Context manager to enter a settings group. So instead of doing .. code-block:: python settings.beginGroup('spam') try: ... finally: settings.endGroup() you can do .. code-block:: python with settings.grouped('spam'): ... """ self.beginGroup(name) try: yield self finally: self.endGroup()
[docs] def array(self, name): """ Array support. This is used both to read a settings array (through iteration) and to write to it (using `with`). Example of reading: .. code-block:: python for item in settings.array('myarray'): spam = item.value('spam') eggs = item.value('eggs') is equivalent to: .. code-block:: python for index in range(settings.beginReadArray('myarray')): spam = settings.value('spam') eggs = settings.value('eggs') settings.endArray() Example of writing: .. code-block:: python with settings.array('myarray') as items: items.add(spam='spam', eggs='eggs') items.add(spam=42, eggs=13) is equivalent to: .. code-block:: python settings.beginWriteArray('myarray') settings.setArrayIndex(0) settings.setValue('spam', 'spam') settings.setValue('eggs', 'eggs') settings.setArrayIndex(1) settings.setValue('spam', 42) settings.setValue('eggs', 13) settings.endArray() """ class _Array: # pylint: disable=R0903 def __init__(self, settings, name): self.settings = settings self.name = name def __enter__(self): class Adder: # pylint: disable=R0903 def __init__(self, settings): self.settings = settings self.current = 0 def add(self, **kwargs): self.settings.setArrayIndex(self.current) self.current += 1 for name, value in kwargs.items(): self.settings.setValue(name, value) self.settings.beginWriteArray(self.name) return Adder(self.settings) def __exit__(self, *args): self.settings.endArray() def __iter__(self): class Value: # pylint: disable=R0903 def __init__(self, items): self.items = items def value(self, name, default=None): return self.items.get(name, default) def iterator(): size = self.settings.beginReadArray(self.name) try: for i in range(size): self.settings.setArrayIndex(i) yield Value(dict(self.settings.items())) finally: self.settings.endArray() return iterator() return _Array(self, name)