2 # -*- coding: utf-8 -*-
4 class AttributesMap(object):
5 """AttributesMap is the base class for every object whose attributes
6 are going to be manipulated by the end-user in a script or GUI.
9 self._attributes = dict()
13 return self._attributes.values()
16 def attributes_name(self):
17 return self._attributes.keys()
19 def set_attribute_value(self, name, value):
20 self._attributes[name].value = value
22 def set_attribute_readonly(self, name, value):
23 self._attributes[name].readonly = value
25 def get_attribute_value(self, name):
26 return self._attributes[name].value
28 def get_attribute_help(self, name):
29 return self._attributes[name].help
31 def get_attribute_type(self, name):
32 return self._attributes[name].type
34 def get_attribute_range(self, name):
35 if not self._attributes[name].range:
37 return self._attributes[name].range
39 def get_attribute_allowed(self, name):
40 return self._attributes[name].allowed
42 def get_attribute_readonly(self, name):
43 return self._attributes[name].readonly
45 def is_attribute_modified(self, name):
46 return self._attributes[name].modified
48 def add_attribute(self, name, help, type, value = None, range = None,
49 allowed = None, readonly = False, validation_function = None):
50 if name in self._attributes:
51 raise AttributeError("Attribute %s already exists" % name)
52 attribute = Attribute(name, help, type, value, range, allowed, readonly,
54 self._attributes[name] = attribute
56 def del_attribute(self, name):
57 del self._attributes[name]
59 def has_attribute(self, name):
60 return name in self._attributes
63 self._attributes = dict()
65 class Attribute(object):
66 STRING, BOOL, ENUM, DOUBLE, INTEGER = (
67 "STRING", "BOOL", "ENUM", "DOUBLE", "INTEGER")
69 types = [STRING, BOOL, ENUM, DOUBLE, INTEGER]
71 def __init__(self, name, help, type, value = None, range = None,
72 allowed = None, readonly = False, validation_function = None):
73 if not type in Attribute.types:
74 raise AttributeError("invalid type %s " % type)
79 self._validation_function = validation_function
80 self._readonly = (readonly == True)
81 self._modified = False
82 # range: max and min possible values
84 # list of possible values
85 self._allowed = allowed
101 return self._modified
112 def validation_function(self):
113 return self._validation_function
118 def set_value(self, value):
119 if self._is_in_range(value) and \
120 self._is_in_allowed_values(value) and \
121 self._is_valid(value):
123 self._modified = True
125 raise RuntimeError("Invalid value %s for attribute %s" %
126 (str(value), self.name))
128 value = property(get_value, set_value)
130 def _is_in_range(self, value):
131 return not self.range or \
132 (value >= self.range[0] and value <= self.range[1])
134 def _is_in_allowed_values(self, value):
135 return not self.allowed or value in self._allowed
137 def _is_valid(self, value):
138 return not self._validation_function or self._validation_function(value)