import gtk
import deskbar
from gettext import gettext as _
#This class provides a simple API for generating basic configuration dialogs.
#Usage (place after you defined HANDLER):
#c=Configurator(HANDLER)
#c.add_string("name","description to show in", required=True or False)
#You can add more handlers for different data types here.
class Configurator:
def __init__(self, handlers):
self.UI_OPS={ 'string' : self._dialog_add_string, }
self.items=[]
self.table=None
self.need_config_string="This handler needs configuration."
self.can_config_string="This handler can be reconfigured."
self.value_fetcher={}
for key in handlers.keys():
handlers[key]['requirements']=self.check_requirements
self.name=key
def check_requirements(self):
for item in [i for i in self.items if i['required']!='']:
if not deskbar.GCONF_CLIENT.get_string("/%s/%s"%(self.name,item['name'])):
return (deskbar.Handler.HANDLER_HAS_REQUIREMENTS, item['required'], self.on_configure)
return (deskbar.Handler.HANDLER_IS_CONFIGURABLE, self.can_config_string, self.on_configure)
def _dialog_add_string(self, name, desc, default):
self.table.attach(gtk.Label(desc), 0, 1, self.current_table_row,self.current_table_row+1)
user_entry = gtk.Entry()
t = deskbar.GCONF_CLIENT.get_string("/%s/%s"%(self.name,name))
if t != None:
user_entry.set_text(t)
else:
user_entry.set_text(default)
self.table.attach(user_entry, 1,2,self.current_table_row, self.current_table_row+1)
return user_entry.get_text
def on_configure(self,dialog):
if self.items==[]:
return
dialog = gtk.Dialog(_("%s Configuration"%self.name), dialog,
gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT,
gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))
self.table = gtk.Table(rows=len(self.items), columns=2)
self.current_table_row=0
for item in self.items:
name=item['name']
self.value_fetcher[name]=self.UI_OPS[item['type']](item['name'], item['desc'], item['default'])
self.table.show_all()
dialog.vbox.add(self.table)
response = dialog.run()
dialog.destroy()
if response == gtk.RESPONSE_ACCEPT:
for item in self.items:
name=item['name']
if self.value_fetcher[name]!='':
deskbar.GCONF_CLIENT.set_string("/%s/%s"%(self.name,name), self.value_fetcher[name]())
def add_config_item(self, type, name, desc, default=None, required=''):
if type not in self.UI_OPS.keys():
return 0
item={ 'name' : name,
'desc' : desc,
'type' : type,
'default' : default,
'required' : required }
self.items.append(item)
return 1
def get_value(self,name):
return deskbar.GCONF_CLIENT.get_string("/%s/%s"%(self.name,name))