Mercurial > libervia-web
diff src/browser/sat_browser/base_widget.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 | 7113d40533d6 |
children | 6d3142b782c3 |
line wrap: on
line diff
--- a/src/browser/sat_browser/base_widget.py Wed Feb 25 19:44:10 2015 +0100 +++ b/src/browser/sat_browser/base_widget.py Thu Feb 26 13:10:46 2015 +0100 @@ -34,6 +34,7 @@ from pyjamas.ui.HTMLPanel import HTMLPanel from pyjamas.ui.Label import Label from pyjamas.ui.HTML import HTML +from pyjamas.ui.Image import Image from pyjamas.ui.Button import Button from pyjamas.ui.Widget import Widget from pyjamas.ui.DragWidget import DragWidget @@ -42,11 +43,15 @@ from pyjamas.ui import HasAlignment from pyjamas import DOM from pyjamas import Window +from constants import Const as C from __pyjamas__ import doc import dialog import base_menu +import html_tools + +unicode = str # XXX: pyjama doesn't manage unicode class NoLiberviaWidgetException(Exception): @@ -892,3 +897,106 @@ self.remove(panel) widgets_count = self.getWidgetCount() self.selectTab(widget_index if widget_index < widgets_count else widgets_count - 1) + + +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> " 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(WidgetMenuBar): + + def onBrowserEvent(self, event): + 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, 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) + 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)