1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
|
from gi.repository import GLib, GObject
ENTRY_DEFAULT=0
ENTRY_COMBO=1
ENTRY_COLOR=2
ENTRY_FONT=3
ENTRY_SPIN=4
ENTRY_SLIDER=5
ENTRY_CHECKBOX=6
ENTRY_RADIO=7
class Setting(GObject.GObject):
__gsignals__ = {'value-changed' :
(GObject.SIGNAL_RUN_FIRST,
GObject.TYPE_NONE,
(GObject.TYPE_PYOBJECT,)),
'sensitivity-changed' :
(GObject.SIGNAL_RUN_FIRST,
GObject.TYPE_NONE,
(GObject.TYPE_BOOLEAN,))}
def __init__(self, name, label, children=[]):
GObject.GObject.__init__(self)
self.name = name
self.label = label
self.children = children
@property
def sensitive(self):
return getattr(self, '_sensitive', True)
@sensitive.setter
def sensitive(self, sensitive):
changed = getattr(self, '_sensitive', sensitive) != sensitive
self._sensitive = sensitive
self.emit('sensitivity-changed', sensitive)
def __len__(self):
return len(self.children)
def __getitem__(self, i):
return self.children[i]
def __setitem__(self, i, v):
self.children[i] = v
def __delitem__(self, i):
del self.children[i]
def __iter__(self):
return self.children.__iter__()
class SettingsGroup(Setting):
pass
class SettingsTopGroup(SettingsGroup):
def __init__(self, label, path, schema_id, children=[]):
SettingsGroup.__init__(self, "_top", label, children)
self.path = path
self.schema_id = schema_id
self._manager = None
def __call__(self):
if self._manager is None:
from caribou.settings.settings_manager import SettingsManager
self._manager = SettingsManager(self)
return self._manager
class ValueSetting(Setting):
variant_type = ''
entry_type=ENTRY_DEFAULT
def __init__(self, name, label, default, short_desc="", long_desc="",
allowed=[], entry_type=ENTRY_DEFAULT, sensitive=None,
user_visible=True, children=[],
insensitive_when_false=[], insensitive_when_true=[]):
Setting.__init__(self, name, label, children)
self.short_desc = short_desc
self.long_desc = long_desc
self.allowed = allowed
self.entry_type = entry_type or self.__class__.entry_type
if sensitive is not None:
self.sensitive = sensitive
self.user_visible = user_visible
self.default = default
self.insensitive_when_false = insensitive_when_false
self.insensitive_when_true = insensitive_when_true
self.hush = False
@property
def value(self):
return getattr(self, '_value', self.default)
@value.setter
def value(self, val):
_val = self.convert_value(val)
if self.allowed and _val not in [a for a, b in self.allowed]:
raise ValueError("'%s' not a valid value" % _val)
self._value = _val
if not self.hush:
self.emit('value-changed', _val)
@property
def gsettings_key(self):
return self.name.replace('_', '-')
@property
def is_true(self):
return bool(self.value)
@property
def gvariant(self):
return GLib.Variant(self.variant_type, self.value)
class BooleanSetting(ValueSetting):
variant_type = 'b'
entry_type = ENTRY_CHECKBOX
def convert_value(self, val):
# Almost anything could be a boolean.
return bool(val)
class IntegerSetting(ValueSetting):
variant_type = 'i'
entry_type = ENTRY_SPIN
def __init__(self, *args, **kwargs):
self.min = kwargs.pop('min', GObject.G_MININT)
self.max = kwargs.pop('max', GObject.G_MAXINT)
ValueSetting.__init__(self, *args, **kwargs)
def convert_value(self, val):
return int(val)
class FloatSetting(ValueSetting):
variant_type = 'd'
entry_type = ENTRY_SPIN
def __init__(self, *args, **kwargs):
self.min = kwargs.pop('min', GObject.G_MINFLOAT)
self.max = kwargs.pop('max', GObject.G_MAXFLOAT)
ValueSetting.__init__(self, *args, **kwargs)
def convert_value(self, val):
return float(val)
class StringSetting(ValueSetting):
variant_type = 's'
def convert_value(self, val):
return str(val)
class ColorSetting(StringSetting):
entry_type = ENTRY_COLOR
class FontSetting(StringSetting):
entry_type = ENTRY_FONT
|