# HG changeset patch # User souliane # Date 1411473456 -7200 # Node ID 77372641e05debea94702e85dbb2ce106f4b8935 # Parent b38629924602e6f14e01560963bd0eff206a9819 browser_side (plugin OTR): display the correct icons on opening the window + auto-open on accepted invitation diff -r b38629924602 -r 77372641e05d src/browser/sat_browser/base_widget.py --- a/src/browser/sat_browser/base_widget.py Tue Sep 23 11:48:57 2014 +0200 +++ b/src/browser/sat_browser/base_widget.py Tue Sep 23 13:57:36 2014 +0200 @@ -229,11 +229,11 @@ class LiberviaWidget(DropCell, VerticalPanel, ClickHandler): """Libervia's widget which can replace itself with a dropped widget on DnD""" - def __init__(self, host, title='', info='', selectable=False): + def __init__(self, host, title='', info=None, selectable=False): """Init the widget @param host (SatWebFrontend): SatWebFrontend instance @param title (str): title shown in the header of the widget - @param info (str): info shown in the header of the widget + @param info (str, callable): info shown in the header of the widget @param selectable (bool): True is widget can be selected by user""" VerticalPanel.__init__(self) DropCell.__init__(self, host) @@ -244,8 +244,13 @@ self.__close_button_id = HTMLPanel.createUniqueId() self.__title = Label(title) self.__title.setStyleName('widgetHeader_title') - if info: - self.__info = HTML(info) + if info is not None: + if isinstance(info, str): + self.__info = HTML(info) + else: # the info will be set by a callback + assert(callable(info)) + self.__info = HTML() + info(self.__info.setHTML) self.__info.setStyleName('widgetHeader_info') else: self.__info = None @@ -394,7 +399,7 @@ @param text: text of the new title""" try: self.__info.setHTML(text) - except AttributeError: + except TypeError: log.error("LiberviaWidget.setInfo: info widget has not been initialized!") def isSelectable(self): diff -r b38629924602 -r 77372641e05d src/browser/sat_browser/panels.py --- a/src/browser/sat_browser/panels.py Tue Sep 23 11:48:57 2014 +0200 +++ b/src/browser/sat_browser/panels.py Tue Sep 23 13:57:36 2014 +0200 @@ -1121,7 +1121,9 @@ self.type = type_ # FIXME: temporary dirty initialization to display the OTR state - header_info = host.plugins['otr'].getInfoText() if (type_ == 'one2one' and 'otr' in host.plugins) else None + def header_info_cb(cb): + host.plugins['otr'].infoTextCallback(target, cb) + header_info = header_info_cb if (type_ == 'one2one' and 'otr' in host.plugins) else None base_widget.LiberviaWidget.__init__(self, host, title=target.bare, info=header_info, selectable=True) self.__body = AbsolutePanel() diff -r b38629924602 -r 77372641e05d src/browser/sat_browser/plugin_sec_otr.py --- a/src/browser/sat_browser/plugin_sec_otr.py Tue Sep 23 11:48:57 2014 +0200 +++ b/src/browser/sat_browser/plugin_sec_otr.py Tue Sep 23 13:57:36 2014 +0200 @@ -32,6 +32,8 @@ import jid import otrjs_wrapper as otr import dialog +import panels + NS_OTR = "otr_plugin" PRIVATE_KEY = "PRIVATE KEY" @@ -365,10 +367,31 @@ @classmethod def getInfoText(self, state=otr.context.STATE_PLAINTEXT, trust=''): + """Get the widget info text for a certain message state and trust. + + @param state (str): message state + @param trust (str): trust + @return: str + """ if not state: state = OTR_MSG_STATES.keys()[0] return OTR_MSG_STATES[state][1 if trust else 0] + def infoTextCallback(self, other_jid, cb): + """Get the current info text for a conversation and run a callback. + + @param other_jid (JID): JID of the correspondant + @paam cb (callable): method to be called with the computed info text + """ + def gotResource(other_jid): + otrctx = self.context_manager.getContextForUser(other_jid, start=False) + if otrctx is None: + cb(OTR.getInfoText()) + else: + cb(OTR.getInfoText(otrctx.state, otrctx.getCurrentTrust())) + + self.fixResource(other_jid, gotResource) + def inhibitMenus(self): """Tell the caller which dynamic menus should be inhibited""" return ["OTR"] # menu categories name to inhibit @@ -423,6 +446,7 @@ if otrctx is None: def confirm(confirm): if confirm: + self.host.getOrCreateLiberviaWidget(panels.ChatPanel, jid) decrypt(self.context_manager.startContext(jid)) else: # FIXME: plain text messages with whitespaces would be lost here when WHITESPACE_START_AKE is True