preferences.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. # $Id$
  2. from PyQt4 import QtCore
  3. class _Preferences(object):
  4. _conversionMethods = {
  5. QtCore.QVariant.String: QtCore.QVariant.toString,
  6. QtCore.QVariant.StringList: QtCore.QVariant.toStringList,
  7. }
  8. def __init__(self, *args):
  9. self.__preferences = QtCore.QSettings(*args)
  10. def __contains__(self, key):
  11. return self.__preferences.contains(key)
  12. def __getitem__(self, key):
  13. variant = self.__preferences.value(key)
  14. valueType = variant.type()
  15. if valueType == QtCore.QVariant.Invalid:
  16. raise KeyError(key)
  17. try:
  18. converter = self._conversionMethods[valueType]
  19. except KeyError:
  20. raise NotImplementedError(
  21. 'Unsupported variant type (%d)' % valueType
  22. )
  23. return converter(variant)
  24. def __setitem__(self, key, value):
  25. self.__preferences.setValue(key, QtCore.QVariant(value))
  26. def get(self, key, default = None):
  27. try:
  28. return self[key]
  29. except KeyError:
  30. return default
  31. def getList(self, key):
  32. '''Gets a preference as a QStringList.
  33. If the preference does not exist, an empty list is returned.
  34. This method works around the problem that a stored QStringList which
  35. contains a single item is read back as a QString.
  36. '''
  37. try:
  38. value = self[key]
  39. except KeyError:
  40. return QtCore.QStringList()
  41. if isinstance(value, QtCore.QStringList):
  42. return value
  43. elif isinstance(value, QtCore.QString):
  44. return QtCore.QStringList(value)
  45. else:
  46. raise TypeError('%s cannot be converted to list' % type(value))
  47. preferences = _Preferences('openMSX', 'Catapult')