plotter/qpreferences.py

Sun, 03 Feb 2008 23:39:27 +0100

author
David Douard <david.douard@logilab.fr>
date
Sun, 03 Feb 2008 23:39:27 +0100
changeset 35
3b7a38af5c42
parent 32
59da528bc470
child 36
cb4124e3e75b
permissions
-rw-r--r--

Refactored the preference system for the qt gpib plotter app. One can now set the colors for plotting pens.

import os
from PyQt4 import QtCore, QtGui, uic
from tools import AbstractRegister 

def fromVariant(v):
    _cvrts = {0: lambda x:None,
              1: lambda x:x.toBool(),
              2: lambda x:x.toInt()[0],
              6: lambda x:x.toDouble()[0],
              10: lambda x:unicode(x.toString()),
              12: lambda x:x.toByteArray(),
              21: lambda x:x.toSize(),
              22: lambda x:x.toSizeF(),
              25: lambda x:x.toPoint(),
              26: lambda x:x.toPointF(),
              64: lambda x:QtGui.QFont(x),
              67: lambda x:QtGui.QColor(x),
              }
    t = v.userType()
    return _cvrts[t](v)

class PreferenceMetaclass(type):
    _widgets = {}
    def __init__(cls, name, bases, dct):
        # called at class creation
        super(type, cls).__init__(name, bases, dct)
        if name != "BaseItem":
            ItemRegister().add(cls)

class BaseItem(object):
    #__metaclass__ = PreferenceMetaclass
    _id = 0
    def __init__(self, default=None, name=None, description=None, group=None):
        self._default = default
        self._id = BaseItem._id
        self._name = name
        self._description = description
        self._group = group
        BaseItem._id += 1

    def validate(self, value):
        return True
    
    def __get__(self, obj, cls):
        if obj is None: #when called from the class, return the Item itself
            return self
        try:
            return obj.getPref(self._id)
        except Exception, e:
            return None

    def __set__(self, obj, value):
        obj.setPref(self._id, value)

class ItemRegister(AbstractRegister):
    _registered_type = BaseItem
    getItem = AbstractRegister.get_class

class PointItem(BaseItem):
    _type = QtCore.QPoint

class SizeItem(BaseItem):
    _type = QtCore.QSize

class ByteArrayItem(BaseItem):
    _type = QtCore.QByteArray
    
class UnicodeItem(BaseItem):
    _type = unicode
    def validate(self, value):
        return isinstance(value, basestring)
        
class IntItem(BaseItem):
    _type = int
    def __init__(self, default=None, name=None, description=None, group=None, min=None, max=None):
        BaseItem.__init__(self, default, name, description, group)
        self._min = min
        self._max = max

    def validate(self, value):
        try:
            value = self._type(value)
        except:
            return False
        if self._min is not None and value<self._min:
            return False
        if self._max is not None and value>self._max:
            return False
        return True

class ColorItem(BaseItem):
    _type = QtGui.QColor

    def validate(self, value):
        try:
            self._type(value)
            return True
        except:
            return False
    
class AbstractPreferences(QtCore.QObject):
    def __init__(self):
        QtCore.QObject.__init__(self)
        self._settings = QtCore.QSettings(QtCore.QSettings.UserScope,
                                          self.ORGANISATION, self.APPLICATION)
        self._prefs = {}
        self.groups = []
        keys = []
        for k in dir(self.__class__):
            item = self.getItem(k)
            if isinstance(item, BaseItem):
                keys.append((k,item))
        keys.sort(key=lambda x: x[1]._id)
        print [x[1]._id for x in keys]
        for k, item in keys:
            self._prefs[item._id] = k
            if item._group not in self.groups:
                self.groups.append(item._group)

    def getItem(self, key):
        return getattr(self.__class__, key)
        #return self._prefs.get(key, None)
    
    def getPref(self, key):
        key = self._prefs.get(key, key)
        default = getattr(self.__class__, key)._default
        if default is not None:
            default = QtCore.QVariant(default)
        else:
            default = QtCore.QVariant()
        val = fromVariant(self._settings.value(key, default))
        return val
    
    def setPref(self, key, value):
        key = self._prefs.get(key, key)
        self._settings.setValue(key, QtCore.QVariant(value))

    def keys(self, group=None):
        return [k for k in self._prefs.values() if not k.startswith('_') and self.getItem(k)._group == group]

    def getName(self, key):
        item = getattr(self.__class__, key)
        return item._name

    def getDescription(self, key):
        item = getattr(self.__class__, key)
        return item._description

    def __getitem__(self, key):
        return getattr(self, key)
    

mercurial