Primitivus: parameters management via XMLUI

This commit is contained in:
Goffi 2010-08-09 21:39:41 +08:00
commit 549d489e83
3 changed files with 66 additions and 14 deletions

View file

@ -81,7 +81,7 @@ class PrimitivusApp(QuickApp):
def __init__(self):
self.CM = QuickContactManagement() #FIXME: not the best place
QuickApp.__init__(self)
QuickApp.__init__(self)
## main loop setup ##
self.main_widget = ProfileManager(self)
@ -183,6 +183,7 @@ class PrimitivusApp(QuickApp):
general = _("General")
menu.addMenu(general, _("Connect"), self.onConnectRequest)
menu.addMenu(general, _("Disconnect"), self.onDisconnectRequest)
menu.addMenu(general, _("Parameters"), self.onParam)
menu.addMenu(general, _("About"), self.onAboutRequest)
menu.addMenu(general, _("Exit"), self.onExitRequest, 'ctrl x')
contact = _("Contact")
@ -236,8 +237,28 @@ class PrimitivusApp(QuickApp):
self.notBar.addPopUp(pop_up_widget)
def notify(self, message):
""""Notify message to user via notification bar"""
self.notBar.addMessage(message)
def addWindow(self, widget):
"""Display a window if possible,
else add it in the notification bar queue
@param widget: BoxWidget"""
assert(len(self.center_part.widget_list)<=2)
wid_idx = len(self.center_part.widget_list)-1
self.center_part.widget_list[wid_idx] = widget
self.menu_roller.removeMenu(_('Chat menu'))
self.contactList.unselectAll()
self.redraw()
def removeWindow(self):
"""Remove window showed on the right column"""
#TODO: to a better Window management than this crappy hack
assert(len(self.center_part.widget_list)<=2)
wid_idx = len(self.center_part.widget_list)-1
self.center_part.widget_list[wid_idx] = urwid.Filler(urwid.Text(''))
self.redraw()
def contactSelected(self, contact_list):
contact = contact_list.get_contact()
if contact:
@ -299,11 +320,7 @@ class PrimitivusApp(QuickApp):
misc['target'] = data['target']
misc['action_back'] = self.bridge.gatewayRegister
ui = XMLUI(self, title=title, xml_data = data['xml'], misc = misc)
assert(len(self.center_part.widget_list)==2)
self.center_part.widget_list[1] = ui
self.menu_roller.removeMenu(_('Chat menu'))
self.contactList.selected = None
self.redraw()
self.addWindow(ui)
else:
error (_("FIXME FIXME FIXME: type [%s] not implemented") % type)
raise NotImplementedError
@ -341,6 +358,10 @@ class PrimitivusApp(QuickApp):
def onDisconnectRequest(self, menu):
self.bridge.disconnect(self.profile)
def onParam(self, menu):
params = XMLUI(self,xml_data=self.bridge.getParamsUI(self.profile))
self.addWindow(params)
def onExitRequest(self, menu):
raise urwid.ExitMainLoop()

View file

@ -100,6 +100,11 @@ class XMLUI(urwid.WidgetWrap):
else:
error(_("FIXME FIXME FIXME: type [%s] is not implemented") % type) #FIXME !
raise NotImplementedError
if self.type == 'param':
if isinstance(ctrl,urwid.Edit):
urwid.connect_signal(ctrl,'change',self.onParamChange)
ctrl._param_category = self._current_category
ctrl._param_name = name
parent.append(ctrl)
def __parseChilds(self, current, elem, wanted = ['layout'], data = None):
@ -129,6 +134,8 @@ class XMLUI(urwid.WidgetWrap):
name = node.getAttribute('name')
if not name or not isinstance(data,custom_widgets.TabsContainer):
raise InvalidXMLUI
if self.type == 'param':
self._current_category = name #XXX: awful hack because params need category and we don't keep parent
tab_cont = data
listbox = tab_cont.addTab(name)
self.__parseChilds(listbox.body, node, ['layout'])
@ -139,7 +146,7 @@ class XMLUI(urwid.WidgetWrap):
def constructUI(self, xml_data):
list_box = urwid.ListBox(urwid.SimpleListWalker([]))
ret_wid = urwid.ListBox(urwid.SimpleListWalker([]))
cat_dom = minidom.parseString(xml_data.encode('utf-8'))
top=cat_dom.documentElement
@ -149,11 +156,16 @@ class XMLUI(urwid.WidgetWrap):
if top.nodeName != "sat_xmlui" or not self.type in ['form', 'param', 'window']:
raise InvalidXMLUI
self.__parseChilds(list_box.body, cat_dom.documentElement)
if self.type == 'param':
self.param_changed = set()
assert list_box.body
if isinstance(list_box.body[0],custom_widgets.TabsContainer):
return list_box.body[0] #xxx: awfull hack cause TabsContainer is a BoxWidget, can't be inside a ListBox
self.__parseChilds(ret_wid.body, cat_dom.documentElement)
assert ret_wid.body
if isinstance(ret_wid.body[0],custom_widgets.TabsContainer):
ret_wid = urwid.Pile([ret_wid.body[0]]) #xxx: awfull hack cause TabsContainer is a BoxWidget, can't be inside a ListBox
if self.type == 'form':
buttons = []
@ -162,9 +174,18 @@ class XMLUI(urwid.WidgetWrap):
buttons.append(urwid.Button(_('Cancel'),self.onFormCancelled))
max_len = max([len(button.get_label()) for button in buttons])
grid_wid = urwid.GridFlow(buttons,max_len+4,1,0,'center')
list_box.body.append(grid_wid)
ret_wid.body.append(grid_wid)
elif self.type == 'param':
assert(isinstance(ret_wid,urwid.Pile))
buttons = []
buttons.append(custom_widgets.CustomButton(_('Save'),self.onSaveParams))
buttons.append(custom_widgets.CustomButton(_('Cancel'),lambda x:self.host.removeWindow()))
max_len = max([button.getSize() for button in buttons])
grid_wid = urwid.GridFlow(buttons,max_len,1,0,'center')
ret_wid.widget_list.append(urwid.Filler(grid_wid))
ret_wid.item_types.append(('weight',1))
return list_box
return ret_wid
def show(self):
"""Show the constructed UI"""
@ -188,6 +209,11 @@ class XMLUI(urwid.WidgetWrap):
id = self.host.bridge.launchAction("button", data, profile_key = self.host.profile)
self.host.current_action_ids.add(id)
def onParamChange(self, widget, text):
"""Called when type is param and a widget to save is modified"""
assert(self.type == "param")
self.param_changed.add(widget)
def onFormSubmitted(self, button):
data = []
for ctrl_name in self.ctrl_list:
@ -207,3 +233,8 @@ class XMLUI(urwid.WidgetWrap):
def onFormCancelled(self, button):
self.host.removePopUp()
def onSaveParams(self, button):
for ctrl in self.param_changed:
self.host.bridge.setParam(ctrl._param_name, ctrl.get_edit_text(), ctrl._param_category, profile_key = self.host.profile)
self.host.removeWindow()

View file

@ -282,7 +282,7 @@ class Param():
return prof_xml
def getParamsUI(self, profile_key='@DEFAULT'):
def getParamsUI(self, profile_key='@DEFAULT@'):
"""Return a SàT XMLUI for parameters, with given profile"""
profile = self.getProfileName(profile_key)
if not profile: