diff src/browser/sat_browser/contact_list.py @ 647:e0021d571eef frontends_multi_profiles

browser side: moved ContactBox, ContactsPanel, ContactLabeland ContactMenuBar to base_widget/base_panels so they can be reused outside of contact_list module
author Goffi <goffi@goffi.org>
date Thu, 26 Feb 2015 13:10:46 +0100
parents f5145881723a
children 6d3142b782c3
line wrap: on
line diff
--- a/src/browser/sat_browser/contact_list.py	Wed Feb 25 19:44:10 2015 +0100
+++ b/src/browser/sat_browser/contact_list.py	Thu Feb 26 13:10:46 2015 +0100
@@ -26,19 +26,15 @@
 from pyjamas.ui.VerticalPanel import VerticalPanel
 from pyjamas.ui.ClickListener import ClickHandler
 from pyjamas.ui.Label import Label
-from pyjamas.ui.HTML import HTML
-from pyjamas.ui.Image import Image
 from pyjamas import Window
 from pyjamas import DOM
 from __pyjamas__ import doc
 
-from sat_frontends.tools import jid
 from constants import Const as C
 import base_widget
-import html_tools
+import base_panels
+import blog
 import chat
-import blog
-
 
 unicode = str # XXX: pyjama doesn't manage unicode
 
@@ -92,109 +88,6 @@
         self.host.displayWidget(blog.MicroblogPanel, self.group)
 
 
-class ContactLabel(HTML):
-    """Display a contact in HTML, selecting best display (jid/nick/etc)"""
-
-    def __init__(self, host, jid_):
-        # TODO: add a listener for nick changes
-        HTML.__init__(self)
-        self.host = host
-        self.jid = jid_.bare
-        self.nick = self.host.contact_lists[C.PROF_KEY_NONE].getCache(self.jid, "nick")
-        self.alert = False
-        self.refresh()
-        self.setStyleName('contactLabel')
-
-    def refresh(self):
-        alert_html = "<strong>(*)</strong>&nbsp;" if self.alert else ""
-        contact_html = html_tools.html_sanitize(self.nick or unicode(self.jid))
-        html = "%(alert)s%(contact)s" % {'alert': alert_html,
-                                         'contact': contact_html}
-        self.setHTML(html)
-
-    def updateNick(self, new_nick):
-        """Change the current nick
-
-        @param new_nick(unicode): new nick to use
-        """
-        self.nick = new_nick
-        self.refresh()
-
-    def setAlert(self, alert):
-        """Show a visual indicator
-
-        @param alert: True if alert must be shown
-        """
-        self.alert = alert
-        self.refresh()
-
-
-class ContactMenuBar(base_widget.WidgetMenuBar):
-
-    def onBrowserEvent(self, event):
-        base_widget.WidgetMenuBar.onBrowserEvent(self, event)
-        event.stopPropagation()  # prevent opening the chat dialog
-
-    @classmethod
-    def getCategoryHTML(cls, menu_name_i18n, type_):
-        return '<img src="%s"/>' % C.DEFAULT_AVATAR_URL
-
-    def setUrl(self, url):
-        """Set the URL of the contact avatar."""
-        self.items[0].setHTML('<img src="%s" />' % url)
-
-
-class ContactBox(VerticalPanel, ClickHandler, base_widget.DragLabel):
-
-    def __init__(self, parent, jid_):
-        """
-        @param parent (ContactPanel): ContactPanel hosting this box
-        @param jid_ (jid.JID): contact JID
-        """
-        VerticalPanel.__init__(self, StyleName='contactBox', VerticalAlignment='middle')
-        ClickHandler.__init__(self)
-        base_widget.DragLabel.__init__(self, jid_, "CONTACT", parent.host)
-        self.jid = jid_.bare
-        self.label = ContactLabel(parent.host, self.jid)
-        self.avatar = ContactMenuBar(self, parent.host) if parent.handle_menu else Image()
-        self.updateAvatar(parent.host.getAvatarURL(self.jid))
-        self.add(self.avatar)
-        self.add(self.label)
-        self.addClickListener(self)
-
-    def addMenus(self, menu_bar):
-        menu_bar.addCachedMenus(C.MENU_ROSTER_JID_CONTEXT, {'jid': unicode(self.jid)})
-        menu_bar.addCachedMenus(C.MENU_JID_CONTEXT, {'jid': unicode(self.jid)})
-
-    def setAlert(self, alert):
-        """Show a visual indicator
-
-        @param alert: True if alert indicator show be shown"""
-        self.label.setAlert(alert)
-
-    def updateAvatar(self, url):
-        """Update the avatar.
-
-        @param url (unicode): image url
-        """
-        self.avatar.setUrl(url)
-
-    def updateNick(self, new_nick):
-        """Update the nickname.
-
-        @param new_nick (unicode): new nickname to use
-        """
-        self.label.updateNick(new_nick)
-
-    def onClick(self, sender):
-        try:
-            self.parent.onClick(self.jid)
-        except AttributeError:
-            pass
-        else:
-            self.setAlert(False)
-
-
 class GroupPanel(VerticalPanel):
 
     def __init__(self, parent):
@@ -240,94 +133,13 @@
         return self._groups
 
 
-class BaseContactsPanel(VerticalPanel):
-    """ContactList graphic representation
-
-    Special features like popup menu panel or changing the contact states must be done in a sub-class.
-    """
-
-    def __init__(self, parent, handle_click=True, handle_menu=True):
-        """@param on_click (callable): click callback (used if ContactBox is created)
-        @param handle_menu (bool): if True, bind a popup menu to the avatar (used if ContactBox is created)
-        """ # FIXME
-        VerticalPanel.__init__(self)
-        self._parent = parent
-        self.host = parent.host
-        self._contacts = {} # entity jid to ContactBox map
-        self.click_listener = None
-        self.handle_menu = handle_menu
-
-        if handle_click:
-            def cb(contact_jid):
-                self.host.displayWidget(chat.Chat, contact_jid, type_=C.CHAT_ONE2ONE)
-            self.onClick = cb
-
-    def display(self, jids):
-        """Display a contact in the list.
-
-        @param jids (list[jid.JID]): jids to display (the order is kept)
-        @param name (unicode): optional name of the contact
-        """
-        # FIXME: we do a full clear and add boxes after, we should only remove recently hidden boxes and add new ones, and re-order
-        current = [box.jid for box in self.children if isinstance(box, ContactBox)]
-        if current == jids:
-            # the display doesn't change
-            return
-        self.clear()
-        for jid_ in jids:
-            assert isinstance(jid_, jid.JID)
-            box = self.getContactBox(jid_)
-            VerticalPanel.append(self, box)
-
-    def isContactPresent(self, contact_jid):
-        """Return True if a contact is present in the panel"""
-        return contact_jid in self._contacts
-
-    def getContacts(self):
-        return self._contacts
-
-    def getContactBox(self, contact_jid):
-        """get the Contactbox of a contact
-
-        if the Contactbox doesn't exists, it will be created
-        @param contact_jid (jid.JID): the contact
-        @return: ContactBox instance
-        """
-        try:
-            return self._contacts[contact_jid.bare]
-        except KeyError:
-            box = ContactBox(self, contact_jid)
-            self._contacts[contact_jid.bare] = box
-            return box
-
-    def updateAvatar(self, jid_, url):
-        """Update the avatar of the given contact
-
-        @param jid_ (jid.JID): contact jid
-        @param url (unicode): image url
-        """
-        try:
-            self.getContactBox(jid_).updateAvatar(url)
-        except TypeError:
-            pass
-
-    def updateNick(self, jid_, new_nick):
-        """Update the avatar of the given contact
-
-        @param jid_ (jid.JID): contact jid
-        @param new_nick (unicode): new nick of the contact
-        """
-        try:
-            self.getContactBox(jid_).updateNick(new_nick)
-        except TypeError:
-            pass
-
-
-class ContactsPanel(BaseContactsPanel):
+class ContactsPanel(base_panels.ContactsPanel):
     """The contact list that is displayed on the left side."""
 
     def __init__(self, parent):
-        BaseContactsPanel.__init__(self, parent, handle_click=True, handle_menu=True)
+        def on_click(contact_jid):
+            self.host.displayWidget(chat.Chat, contact_jid, type_=C.CHAT_ONE2ONE)
+        base_panels.ContactsPanel.__init__(self, parent, on_click=on_click, handle_menu=True)
 
     def setState(self, jid_, type_, state):
         """Change the appearance of the contact, according to the state