3
from pida.core.base import BaseConfig
5
class OptionsManager(object):
7
def __init__(self, boss=None):
8
self._client = gconf.client_get_default()
9
self.initialize_gconf()
11
def initialize_gconf(self):
12
self.add_directory('pida')
13
self.add_directory('pida', 'keyboard_shortcuts')
15
def add_directory(self, *parts):
17
'/'.join(['/apps'] + list(parts)),
18
gconf.CLIENT_PRELOAD_NONE
21
def add_service_directory(self, service):
22
self.add_directory('pida', service.get_name())
24
def register_option(self, option):
25
val = self._client.get(option.key)
27
option.set(self._client, option.default)
28
if option.callback is not None:
29
self.add_notify(option, option.callback)
31
def add_notify(self, option, callback, *args):
32
args = tuple([option] + list(args))
35
self._client.notify_add(option.key, callback, args)
37
def get_value(self, option):
38
return option.get(self._client)
40
def set_value(self, option, value):
41
return option.set(self._client, value)
44
class OTypeBase(object):
46
def _getter(self, client):
47
return getattr(client, 'get_%s' % self.gconf_name)
49
def _setter(self, client):
50
return getattr(client, 'set_%s' % self.gconf_name)
52
def get(self, client, key):
53
return self._getter(client)(key)
55
def set(self, client, key, value):
56
return self._setter(client)(key, value)
60
class OTypeString(OTypeBase):
61
"""A string configuration type"""
66
class OTypeBoolean(OTypeBase):
67
"""A Boolean configuration type"""
72
class OTypeInteger(OTypeBase):
73
"""An integer configuration type"""
78
class OTypeStringList(OTypeBase):
79
"""A list of strings configuration type"""
83
def get(self, client, key):
84
return self._getter(client)(key, gconf.VALUE_STRING)
86
def set(self, client, key, value):
87
return self._setter(client)(key, gconf.VALUE_STRING, value)
89
class OTypeFile(OTypeString):
93
class OTypeFont(OTypeString):
97
class OTypeStringOption(OTypeString):
99
"""String from a list of options"""
102
def otype_string_options_factory(options):
103
return type('', (OTypeStringOption,), {'options': options})
106
class OptionItem(object):
108
def __init__(self, group, name, label, rtype, default, doc, callback):
114
self.default = default
115
self.key = self._create_key()
116
self.callback = callback
118
def _create_key(self):
119
return '/apps/pida/%s/%s' % (self.group, self.name)
121
def get(self, client):
122
return self.rtype.get(client, self.key)
124
def set(self, client, value):
125
return self.rtype.set(client, self.key, value)
128
return manager.get_value(self)
130
def set_value(self, value):
131
return manager.set_value(self, value)
133
value = property(get_value, set_value)
135
def add_notify(self, callback, *args):
136
manager.add_notify(self, callback, *args)
139
manager = OptionsManager()
141
class OptionsConfig(BaseConfig):
147
self.create_options()
148
self.register_options()
150
def create_options(self):
151
"""Create the options here"""
153
def register_options(self):
154
self.manager.add_service_directory(self.svc)
155
for option in self._options.values():
156
self.manager.register_option(option)
158
def create_option(self, name, label, rtype, default, doc, callback=None):
159
opt = OptionItem(self.svc.get_name(), name, label, rtype, default, doc,
164
def add_option(self, option):
165
self._options[option.name] = option
167
def get_option(self, optname):
168
return self._options[optname]
170
def get_value(self, optname):
171
return self.manager.get_value(self.get_option(optname))
173
def set_value(self, optname, value):
174
return self.manager.set_value(self.get_option(optname), value)
177
return len(self._options)
179
def iter_options(self):
180
return self._options.values()