Primitivus now implement showDialog + new "newAlert" bridge method to show a dialog from core
This commit is contained in:
parent
fded7958f4
commit
b3bff009e8
6 changed files with 74 additions and 20 deletions
|
|
@ -693,18 +693,23 @@ class GenericDialog(urwid.WidgetWrap):
|
|||
buttons = None
|
||||
|
||||
if "OK/CANCEL" in style:
|
||||
buttons = [urwid.Button(_("Cancel"), kwargs['cancel_cb']),
|
||||
urwid.Button(_("Ok"), kwargs['ok_cb'], kwargs['ok_value'])]
|
||||
cancel_arg = [kwargs['cancel_value']] if kwargs.has_key('cancel_value') else []
|
||||
ok_arg = [kwargs['ok_value']] if kwargs.has_key('ok_value') else []
|
||||
buttons = [urwid.Button(_("Cancel"), kwargs['cancel_cb'], *cancel_arg),
|
||||
urwid.Button(_("Ok"), kwargs['ok_cb'], *ok_arg)]
|
||||
elif "YES/NO" in style:
|
||||
buttons = [urwid.Button(_("Yes"), kwargs['yes_cb']),
|
||||
urwid.Button(_("No"), kwargs['no_cb'], kwargs['yes_value'])]
|
||||
yes_arg = [kwargs['yes_value']] if kwargs.has_key('yes_value') else []
|
||||
no_arg = [kwargs['no_value']] if kwargs.has_key('no_value') else []
|
||||
buttons = [urwid.Button(_("Yes"), kwargs['yes_cb'], *yes_arg),
|
||||
urwid.Button(_("No"), kwargs['no_cb'], *no_arg)]
|
||||
if "OK" in style:
|
||||
buttons = [urwid.Button(_("Ok"), kwargs['ok_cb'], kwargs['ok_value'])]
|
||||
ok_arg = [kwargs['ok_value']] if kwargs.has_key('ok_value') else []
|
||||
buttons = [urwid.Button(_("Ok"), kwargs['ok_cb'], *ok_arg)]
|
||||
if buttons:
|
||||
buttons_flow = urwid.GridFlow(buttons, max([len(button.get_label()) for button in buttons])+4, 1, 1, 'center')
|
||||
body_content = urwid.SimpleListWalker(widgets_lst)
|
||||
frame_body = urwid.ListBox(body_content)
|
||||
frame = urwid.Frame(frame_body, frame_header, buttons_flow if buttons else None)
|
||||
frame = FocusFrame(frame_body, frame_header, buttons_flow if buttons else None, 'footer' if buttons else 'body')
|
||||
decorated_frame = urwid.LineBox(frame)
|
||||
urwid.WidgetWrap.__init__(self, decorated_frame)
|
||||
|
||||
|
|
@ -715,14 +720,14 @@ class InputDialog(GenericDialog):
|
|||
|
||||
def __init__(self, title, instrucions, style=['OK/CANCEL'], default_txt = '', **kwargs):
|
||||
instr_wid = urwid.Text(instrucions+':')
|
||||
edit_box = urwid.Edit(edit_text=default_txt)
|
||||
edit_box = AdvancedEdit(edit_text=default_txt)
|
||||
GenericDialog.__init__(self, [instr_wid,edit_box], title, style, ok_value=edit_box, **kwargs)
|
||||
|
||||
class ConfirmDialog(GenericDialog):
|
||||
"""Dialog with buttons for confirm or cancel an action"""
|
||||
|
||||
def __init__(self, title, style=['YES/NO'], **kwargs):
|
||||
GenericDialog.__init__(self, [], title, style, yes_value=None, **kwargs)
|
||||
GenericDialog.__init__(self, [], title, style, **kwargs)
|
||||
|
||||
class Alert(GenericDialog):
|
||||
"""Dialog with just a message and a OK button"""
|
||||
|
|
|
|||
|
|
@ -312,6 +312,34 @@ class PrimitivusApp(QuickApp):
|
|||
if JID(self.contactList.selected).short != sender.short:
|
||||
self.contactList.putAlert(sender)
|
||||
|
||||
def _dialogOkCb(self, widget, data):
|
||||
self.removePopUp()
|
||||
answer_cb = data[0]
|
||||
answer_data = [data[1]] if data[1] else []
|
||||
answer_cb(True, *answer_data)
|
||||
|
||||
def _dialogCancelCb(self, widget, data):
|
||||
self.removePopUp()
|
||||
answer_cb = data[0]
|
||||
answer_data = [data[1]] if data[1] else []
|
||||
answer_cb(False, *answer_data)
|
||||
|
||||
|
||||
def showDialog(self, message, title="", type="info", answer_cb = None, answer_data = None):
|
||||
if type == 'info':
|
||||
popup = custom_widgets.Alert(unicode(title), unicode(message), ok_cb=answer_cb or self.removePopUp) #FIXME: remove unicode here when DBus Bridge will no return dbus.String anymore
|
||||
flags = wx.OK | wx.ICON_INFORMATION
|
||||
elif type == 'error':
|
||||
popup = custom_widgets.Alert(unicode(title), unicode(message), ok_cb=answer_cb or self.removePopUp) #FIXME: remove unicode here when DBus Bridge will no return dbus.String anymore
|
||||
elif type == 'yes/no':
|
||||
popup = custom_widgets.ConfirmDialog(unicode(message),
|
||||
yes_cb=self._dialogOkCb, yes_value = (answer_cb, answer_data),
|
||||
no_cb=self._dialogCancelCb, no_value = (answer_cb, answer_data))
|
||||
else:
|
||||
popup = custom_widgets.Alert(unicode(title), unicode(message), ok_cb=answer_cb or self.removePopUp) #FIXME: remove unicode here when DBus Bridge will no return dbus.String anymore
|
||||
error(_('unmanaged dialog type: %s'), type)
|
||||
self.showPopUp(popup)
|
||||
|
||||
def onNotification(self, notBar):
|
||||
"""Called when a new notification has been received"""
|
||||
if not isinstance(self.main_widget, custom_widgets.FocusFrame):
|
||||
|
|
|
|||
|
|
@ -48,6 +48,7 @@ class QuickApp():
|
|||
self.bridge.register("disconnected", self.disconnected)
|
||||
self.bridge.register("newContact", self.newContact)
|
||||
self.bridge.register("newMessage", self.newMessage)
|
||||
self.bridge.register("newAlert", self.newAlert)
|
||||
self.bridge.register("presenceUpdate", self.presenceUpdate)
|
||||
self.bridge.register("roomJoined", self.roomJoined)
|
||||
self.bridge.register("roomUserJoined", self.roomUserJoined)
|
||||
|
|
@ -199,6 +200,13 @@ class QuickApp():
|
|||
self.current_action_ids_cb = {}
|
||||
self.chat_wins[win.short].printMessage(sender, msg, profile)
|
||||
|
||||
def newAlert(self, msg, title, type, profile):
|
||||
if not self.check_profile(profile):
|
||||
return
|
||||
assert type in ['INFO','ERROR']
|
||||
self.showDialog(unicode(msg),unicode(title),type.lower())
|
||||
|
||||
|
||||
def setStatusOnline(self, online=True):
|
||||
pass
|
||||
|
||||
|
|
@ -344,7 +352,14 @@ class QuickApp():
|
|||
debug (_("Cards played are not valid: %s") % invalid_cards)
|
||||
if self.chat_wins.has_key(room_jid):
|
||||
self.chat_wins[room_jid].getGame("Tarot").invalidCards(phase, played_cards, invalid_cards)
|
||||
|
||||
|
||||
def _subscribe_cb(self, answer, data):
|
||||
entity, profile = data
|
||||
if answer:
|
||||
self.bridge.subscription("subscribed", entity.short, profile_key = profile)
|
||||
else:
|
||||
self.bridge.subscription("unsubscribed", entity.short, profile_key = profile)
|
||||
|
||||
def subscribe(self, type, raw_jid, profile):
|
||||
"""Called when a subsciption management signal is received"""
|
||||
if not self.check_profile(profile):
|
||||
|
|
@ -358,13 +373,9 @@ class QuickApp():
|
|||
self.showDialog(_("The contact %s has refused your subscription") % entity.short, _('Subscription refusal'), 'error')
|
||||
elif type=="subscribe":
|
||||
# this is a subscriptionn request, we have to ask for user confirmation
|
||||
answer = self.showDialog(_("The contact %s wants to subscribe to your presence.\nDo you accept ?") % entity.short, _('Subscription confirmation'), 'yes/no')
|
||||
if answer:
|
||||
self.bridge.subscription("subscribed", entity.short, profile_key = profile)
|
||||
else:
|
||||
self.bridge.subscription("unsubscribed", entity.short, profile_key = profile)
|
||||
answer = self.showDialog(_("The contact %s wants to subscribe to your presence.\nDo you accept ?") % entity.short, _('Subscription confirmation'), 'yes/no', answer_cb = self._subscribe_cb, answer_data=(entity, profile))
|
||||
|
||||
def showDialog(self, message, title, type="info"):
|
||||
def showDialog(self, message, title, type="info", answer_cb = None):
|
||||
raise NotImplementedError
|
||||
|
||||
def showAlert(self, message):
|
||||
|
|
|
|||
|
|
@ -206,7 +206,7 @@ class MainWindow(wx.Frame, QuickApp):
|
|||
popup.Show()
|
||||
wx.CallLater(5000,popup.Destroy)
|
||||
|
||||
def showDialog(self, message, title="", type="info"):
|
||||
def showDialog(self, message, title="", type="info", answer_cb = None, answer_data = None):
|
||||
if type == 'info':
|
||||
flags = wx.OK | wx.ICON_INFORMATION
|
||||
elif type == 'error':
|
||||
|
|
@ -219,7 +219,9 @@ class MainWindow(wx.Frame, QuickApp):
|
|||
dlg = wx.MessageDialog(self, message, title, flags)
|
||||
answer = dlg.ShowModal()
|
||||
dlg.Destroy()
|
||||
return True if (answer == wx.ID_YES or answer == wx.ID_OK) else False
|
||||
if answer_cb:
|
||||
data = [answer_data] if answer_data else []
|
||||
answer_cb(True if (answer == wx.ID_YES or answer == wx.ID_OK) else False, *data)
|
||||
|
||||
def setStatusOnline(self, online=True):
|
||||
"""enable/disable controls, must be called when local user online status change"""
|
||||
|
|
|
|||
|
|
@ -63,6 +63,11 @@ class DbusObject(dbus.service.Object):
|
|||
def newMessage(self, from_jid, msg, type, to, profile):
|
||||
debug("new message signal (from:%s msg:%s type:%s to:%s) sended", from_jid, msg, type, to)
|
||||
|
||||
@dbus.service.signal(const_INT_PREFIX+const_COMM_SUFFIX,
|
||||
signature='ssss')
|
||||
def newAlert(self, msg, title, type, profile):
|
||||
debug("new alert signal (title:%s type:%s msg:%s profile:%s) sended", type, title, msg, profile)
|
||||
|
||||
@dbus.service.signal(const_INT_PREFIX+const_COMM_SUFFIX,
|
||||
signature='ssia{ss}s')
|
||||
def presenceUpdate(self, entity, show, priority, statuses, profile):
|
||||
|
|
@ -288,7 +293,7 @@ class DbusObject(dbus.service.Object):
|
|||
|
||||
if in_sign[i] == 'a':
|
||||
i+=1
|
||||
if in_sign[i]!='{' and in_sign[i]!='(': #FIXME: gof: must manage tuples out of arrays
|
||||
if in_sign[i]!='{' and in_sign[i]!='(': #FIXME: must manage tuples out of arrays
|
||||
i+=1
|
||||
continue #we have a simple type for the array
|
||||
while (True): #we have a dict or a list of tuples
|
||||
|
|
@ -346,6 +351,9 @@ class DBusBridge(Bridge):
|
|||
debug("sending message...")
|
||||
self.dbus_bridge.newMessage(from_jid, msg, type, to, profile)
|
||||
|
||||
def newAlert(self, msg, title="", type="INFO", profile='@NONE@'):
|
||||
self.dbus_bridge.newAlert(type, title, msg, profile)
|
||||
|
||||
def presenceUpdate(self, entity, show, priority, statuses, profile):
|
||||
debug("updating presence for %s",entity)
|
||||
self.dbus_bridge.presenceUpdate(entity, show, priority, statuses, profile)
|
||||
|
|
|
|||
|
|
@ -109,7 +109,7 @@ class Param():
|
|||
debug("Parameters init")
|
||||
self.host = host
|
||||
self.default_profile = None
|
||||
self.params = {'goffi':{}} #gof:
|
||||
self.params = {}
|
||||
self.params_gen = {}
|
||||
host.set_const('savefile_param_xml', SAVEFILE_PARAM_XML)
|
||||
host.set_const('savefile_param_data', SAVEFILE_PARAM_DATA)
|
||||
|
|
@ -150,7 +150,7 @@ class Param():
|
|||
info(_('No default profile, returning first one')) #TODO: manage real default profile
|
||||
default = self.params.keys()[0]
|
||||
self.host.memory.setPrivate('Profile_default', default)
|
||||
return default #FIXME: gof: temporary, must use real default value, and fallback to first one if it doesn't exists
|
||||
return default #FIXME: temporary, must use real default value, and fallback to first one if it doesn't exists
|
||||
if not self.params.has_key(profile_key):
|
||||
info (_('Trying to access an unknown profile'))
|
||||
return ""
|
||||
|
|
|
|||
Loading…
Reference in a new issue