# HG changeset patch # User souliane # Date 1384707217 -3600 # Node ID a76243c0207446122fc9c63f293d8eeab0a46009 # Parent cc778206b7ae23d1becfe97ba26f0f98acd5a2e7 browser_side: changes regarding widgets and tabs: - getOrCreateLiberviaWidget gets a tab_label argument to add widgets in a specific tab - ChatPanel can be matched not only regarding the target jid but also the dialog type ("one2one", "group"...) diff -r cc778206b7ae -r a76243c02074 browser_side/contact.py --- a/browser_side/contact.py Sun Nov 17 17:47:39 2013 +0100 +++ b/browser_side/contact.py Sun Nov 17 17:53:37 2013 +0100 @@ -173,7 +173,7 @@ # TODO: use the bare when all blogs can be retrieved node = JID(sender.jid).node web_panel = WebPanel(self.host, "/blog/%s" % node) - self.host.addTab(web_panel, "%s's blog" % node) + self.host.addTab("%s's blog" % node, web_panel) else: sender.onClick(sender) diff -r cc778206b7ae -r a76243c02074 browser_side/panels.py --- a/browser_side/panels.py Sun Nov 17 17:47:39 2013 +0100 +++ b/browser_side/panels.py Sun Nov 17 17:53:37 2013 +0100 @@ -728,12 +728,17 @@ def matchEntity(self, entity): """ - @param entity: target jid as a string or JID instance + @param entity: target jid as a string or JID instance. + Could also be a couple with a type in the second element. @return: True if self matches the given entity """ + if isinstance(entity, tuple): + entity, type_ = entity if len(entity) > 1 else (entity[0], self.type) + else: + type_ = self.type entity = entity if isinstance(entity, JID) else JID(entity) try: - return self.target.bare == entity.bare + return self.target.bare == entity.bare and self.type == type_ except AttributeError as e: e.include_traceback() return False diff -r cc778206b7ae -r a76243c02074 libervia.py --- a/libervia.py Sun Nov 17 17:47:39 2013 +0100 +++ b/libervia.py Sun Nov 17 17:53:37 2013 +0100 @@ -169,7 +169,7 @@ self.tab_panel = self.panel.tab_panel self.tab_panel.addTabListener(self) self.libervia_widgets = set() #keep track of all actives LiberviaWidgets - self.room_list = set() #set of rooms + self.room_list = set() #set of rooms self.mblog_cache = [] #used to keep our own blog entries in memory, to show them in new mblog panel self.avatars_cache = {} #keep track of jid's avatar hash (key=jid, value=file) self.current_action_ids = set() @@ -267,19 +267,27 @@ self.uni_box = unibox self.uni_box.addKey("@@: ") - def addTab(self, wid, label): - """Create a new tab and add a widget in + def addTab(self, label, wid, select=True): + """Create a new tab and eventually add a widget in + @param label: label of the tab @param wid: LiberviaWidget to add - @param label: label of the tab""" - _widgets_panel = WidgetsPanel(self) - _widgets_panel.addWidget(wid) - self.tab_panel.add(_widgets_panel, label) - self.tab_panel.selectTab(self.tab_panel.getWidgetCount() - 1) + @param select: True to select the added tab + """ + widgets_panel = WidgetsPanel(self) + self.tab_panel.add(widgets_panel, label) + widgets_panel.addWidget(wid) + if select: + self.tab_panel.selectTab(self.tab_panel.getWidgetCount() - 1) + return widgets_panel - def addWidget(self, wid): - """ Add a widget at the bottom of the current tab - @param wid: LiberviaWidget to add """ - panel = self.tab_panel.getCurrentPanel() + def addWidget(self, wid, tab_index=None): + """ Add a widget at the bottom of the current or specified tab + @param wid: LiberviaWidget to add + @param tab_index: index of the tab to add the widget to""" + if tab_index is None or tab_index < 0 or tab_index >= self.tab_panel.getWidgetCount(): + panel = self.tab_panel.getCurrentPanel() + else: + panel = self.tab_panel.tabBar.getTabWidget(tab_index) panel.addWidget(wid) def _isRegisteredCB(self, registered): @@ -513,26 +521,36 @@ return None return None - def getOrCreateLiberviaWidget(self, class_, entity, select=True): + def getOrCreateLiberviaWidget(self, class_, entity, select=True, new_tab=None): """Get the matching LiberviaWidget if it exists, or create a new one. @param class_: class of the panel (ChatPanel, MicroblogPanel...) @param entity: polymorphic parameter, see class_.matchEntity. @param select: if True, select the widget that has been found or created + @param new_tab: if not None, a widget which is created is created in + a new tab. In that case new_tab is a unicode to label that new tab. + If new_tab is not None and a widget is found, no tab is created. @return: the newly created wigdet if REUSE_EXISTING_LIBERVIA_WIDGETS is set to False or if the widget has not been found, the existing widget that has been found otherwise.""" lib_wid = None + tab = None if REUSE_EXISTING_LIBERVIA_WIDGETS: - lib_wid = self.getLiberviaWidget(class_, entity) - if lib_wid is None: - lib_wid = class_.createPanel(self, entity) - else: - # remove the widget from its previous panel - panel = lib_wid.getWidgetsPanel(verbose=False) - if panel is not None: - panel.removeWidget(lib_wid) - self.addWidget(lib_wid) + lib_wid = self.getLiberviaWidget(class_, entity, new_tab is None) + if lib_wid is None: # create a new widget + lib_wid = class_.createPanel(self, entity[0] if isinstance(entity, tuple) else entity) + if new_tab is None: + self.addWidget(lib_wid) + else: + tab = self.addTab(new_tab, lib_wid, False) + else: # reuse existing widget + tab = lib_wid.getWidgetsPanel(verbose=False) + if new_tab is None: + if tab is not None: + tab.removeWidget(lib_wid) + self.addWidget(lib_wid) if select: + if new_tab is not None: + self.tab_panel.selectTab(tab) # must be done after the widget is added, # for example to scroll to the bottom self.setSelected(lib_wid) @@ -564,11 +582,11 @@ chat_panel = panels.ChatPanel(self, _target, type_='group') chat_panel.setUserNick(user_nick) if _target.node.startswith('sat_tarot_'): #XXX: it's not really beautiful, but it works :) - self.addTab(chat_panel, "Tarot") + self.addTab("Tarot", chat_panel) elif _target.node.startswith('sat_radiocol_'): - self.addTab(chat_panel, "Radio collective") + self.addTab("Radio collective", chat_panel) else: - self.addTab(chat_panel, _target.node) + self.addTab(_target.node, chat_panel) chat_panel.setPresents(room_nicks) chat_panel.historyPrint()