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 return self._attributes[name].range
37 def get_attribute_allowed(self, name):
38 return self._attributes[name].allowed
40 def get_attribute_readonly(self, name):
41 return self._attributes[name].readonly
43 def is_attribute_modified(self, name):
44 return self._attributes[name].modified
46 def add_attribute(self, name, help, type, value = None, range = None,
47 allowed = None, readonly = False, validation_function = None):
48 if name in self._attributes:
49 raise AttributeError("Attribute %s already exists" % name)
50 attribute = Attribute(name, help, type, value, range, allowed, readonly,
52 self._attributes[name] = attribute
54 def del_attribute(self, name):
55 del self._attributes[name]
57 def has_attribute(self, name):
58 return name in self._attributes
61 self._attributes = dict()
63 class Attribute(object):
64 STRING, BOOL, ENUM, DOUBLE, INTEGER = (
65 "STRING", "BOOL", "ENUM", "DOUBLE", "INTEGER")
67 types = [STRING, BOOL, ENUM, DOUBLE, INTEGER]
69 def __init__(self, name, help, type, value = None, range = None,
70 allowed = None, readonly = False, validation_function = None):
71 if not type in Attribute.types:
72 raise AttributeError("invalid type %s " % type)
77 self._validation_function = validation_function
78 self._readonly = (readonly == True)
79 self._modified = False
80 # range: max and min possible values
82 # list of possible values
83 self._allowed = allowed
110 def validation_function(self):
111 return self._validation_function
116 def set_value(self, value):
117 if self._is_in_range(value) and \
118 self._is_in_allowed_values(value) and \
119 self._is_valid(value):
121 self._modified = True
123 raise RuntimeError("Invalid value %s for attribute %s" %
124 (str(value), self.name))
126 value = property(get_value, set_value)
128 def _is_in_range(self, value):
129 return not self.range or \
130 (value >= self.range[0] and value <= self.range[1])
132 def _is_in_allowed_values(self, value):
133 return not self.allowed or value in self._allowed
135 def _is_valid(self, value):
136 return not self._validation_function or self._validation_function(value)