4832cabd70a4a8a2db2c8cbd2afb720a7814df87
[nepi.git] / src / nepi / core / attributes.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 # vim:ts=4:sw=4:et:ai:sts=4
4
5 class AttributesMap(object):
6     """AttributesMap is the base class for every object whose attributes 
7     are going to be manipulated by the end-user in a script or GUI.
8     """
9     def __init__(self):
10         self._attributes = dict()
11
12     @property
13     def attributes_name(self):
14         return set(self._attributes.keys())
15
16     def is_valid_attribute_value(self, name, value):
17         raise NotImplementedError
18
19     def set_attribute_value(self, name, value):
20         if self.is_valid_attribute_value(name, value):
21             self._attributes[name].value = value
22             return True
23         return False
24
25     def set_attribute_readonly(self, name, value):
26         self._attributes[name].readonly = value
27
28     def get_attribute_value(self, name):
29         return self._attributes[name].value
30
31     def get_attribute_help(self, name):
32         return self._attributes[name].help
33
34     def get_attribute_type(self, name):
35         return self._attributes[name].type
36
37     def get_attribute_range(self, name):
38         return self._attributes[name].range
39
40     def get_attribute_allowed(self, name):
41         return self._attributes[name].allowed
42
43     def get_attribute_readonly(self, name):
44         return self._attributes[name].readonly
45
46     def add_attribute(self, name, help, type, value = None, range = None,
47         allowed = None, readonly = False):
48         if name in self._attributes:
49             raise AttributeError('Attribute %s already exists' % name))
50         attribute = Attribute(name, help, type, value, range, allowed, readonly)
51         self._attributes[name] = attribute
52
53     def del_attribute(self, name):
54         del self._attributes[name]
55
56     def has_attribute(self, name):
57         return name in self._attributes    
58     
59     def destroy(self):
60         self._attributes = dict()
61
62 class Attribute(object):
63     STRING , BOOL, ENUM, DOUBLE, INTEGER, ENDPOINT, TIME = (
64                 "STRING", "BOOL", "ENUM", "DOUBLE", "INTEGER", "ENDPOINT", "TIME")
65
66     types = [STRING, BOOL, ENUM, DOUBLE, INTEGER, ENDPOINT, TIME]
67
68     def __init__(self, name, help, type, value = None, range = None,
69         allowed = None, readonly = False):
70         if not type in Attribute.types:
71             raise AttributeError("invalid type %s " % type)
72         self.name = name
73         self.value = value
74         self.type = type
75         self.help = help
76         self.readonly = (readonly == True)
77         self.modified = False
78         # range: max and min possible values
79         self.range = range
80         # list of possible values
81         self.allowed = allowed
82