# HG changeset patch # User souliane # Date 1405442733 -7200 # Node ID 587fe75d1b16baf77f53a2f966f1a1675c81c149 # Parent 5d8632a7bfde7723e97ead46263d5afc65bb7e0c browser_side: handle menus of type ROOM, SINGLE and ROSTER_JID diff -r 5d8632a7bfde -r 587fe75d1b16 src/browser/libervia_main.py --- a/src/browser/libervia_main.py Tue Jul 15 18:43:55 2014 +0200 +++ b/src/browser/libervia_main.py Tue Jul 15 18:45:33 2014 +0200 @@ -412,6 +412,10 @@ _dialog = dialog.GenericDialog(ui.title, ui, options=options) ui.setCloseCb(_dialog.close) _dialog.show() + elif "public_blog" in data: + # TODO: use the bare instead of node when all blogs can be retrieved + node = jid.JID(data['public_blog']).node + self.addTab("%s's blog" % node, panels.WebPanel(self, "/blog/%s" % node)) else: dialog.InfoDialog("Error", "Unmanaged action result", Width="400px").center() diff -r 5d8632a7bfde -r 587fe75d1b16 src/browser/public/libervia.css --- a/src/browser/public/libervia.css Tue Jul 15 18:43:55 2014 +0200 +++ b/src/browser/public/libervia.css Tue Jul 15 18:45:33 2014 +0200 @@ -469,8 +469,20 @@ width: 32px; height: 32px; border-radius: 5px; - margin: 5px 0px 0px 10px; + margin: 5px 5px 0px 10px; +} + +.contactBox .widgetHeader_buttonGroup img { border-radius: 5px; + border-left: 0px; + padding: 0px 0px 0px 0px; + background: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#aaa)); + background: -webkit-linear-gradient(top, #eee, #aaa); + background: linear-gradient(to bottom, #eee, #aaa); +} + +.contactBox table { + width: 100%; } .contactLabel { @@ -718,9 +730,7 @@ background-color: transparent; width: 25px; height: 20px; - padding-top: 2px; - padding-bottom: 3px; - padding-right: 0px; + padding: 2px 0px 3px 0px; border-left: 1px solid #666; border-top: 0; border-radius: 0 0 0 0; diff -r 5d8632a7bfde -r 587fe75d1b16 src/browser/sat_browser/contact.py --- a/src/browser/sat_browser/contact.py Tue Jul 15 18:43:55 2014 +0200 +++ b/src/browser/sat_browser/contact.py Tue Jul 15 18:45:33 2014 +0200 @@ -34,7 +34,6 @@ from constants import Const as C from jid import JID -import base_panels import base_widget import panels import html_tools @@ -95,8 +94,23 @@ self.refresh() -class ContactBox(base_widget.DragLabel, VerticalPanel, ClickHandler): - def __init__(self, host, jid, name=None, handleClick=True): +class ContactMenuBar(base_widget.WidgetMenuBar): + + ITEM_TPL = "" + + def __init__(self, host, menu_data): + base_widget.WidgetMenuBar.__init__(self, host) + self.addCachedMenus(C.MENU_ROSTER_JID_CONTEXT, menu_data) + self.addCachedMenus(C.MENU_JID_CONTEXT, menu_data) + + def onBrowserEvent(self, event): + base_widget.WidgetMenuBar.onBrowserEvent(self, event) + event.stopPropagation() # prevent opening the chat dialog + + +class ContactBox(VerticalPanel, ClickHandler, base_widget.DragLabel): + + def __init__(self, host, jid, name=None, click_listener=None, handle_menu=None): VerticalPanel.__init__(self, StyleName='contactBox', VerticalAlignment='middle') base_widget.DragLabel.__init__(self, jid, "CONTACT") self.host = host @@ -104,11 +118,17 @@ self.label = ContactLabel(jid, name) self.avatar = Image() self.updateAvatar(host.getAvatar(jid)) - self.add(self.avatar) + extra = HorizontalPanel() + extra.add(self.avatar) + self.add(extra) self.add(self.label) - if handleClick: + if click_listener: ClickHandler.__init__(self) self.addClickListener(self) + self.click_listener = click_listener + + if handle_menu: + extra.add(ContactMenuBar(host, {'jid': jid})) def setMessageWaiting(self, waiting): """Show a visual indicator if message are waiting @@ -125,7 +145,7 @@ self.avatar.setUrl(url) def onClick(self, sender): - self.host.getOrCreateLiberviaWidget(panels.ChatPanel, self.jid) + self.click_listener(self.jid) class GroupList(VerticalPanel): @@ -157,18 +177,23 @@ the one that is displayed on the left side. Special features like popup menu panel or changing the contact states must be done in a sub-class.""" - def __init__(self, host, handleClick=False): + def __init__(self, host, handle_click=False, handle_menu=False): VerticalPanel.__init__(self) self.host = host self.contacts = [] - self.handleClick = handleClick + self.click_listener = None + self.handle_menu = handle_menu - def add(self, jid, name=None, add_item_cb=None): + if handle_click: + def cb(contact_jid): + self.host.getOrCreateLiberviaWidget(panels.ChatPanel, contact_jid) + self.click_listener = cb + + def add(self, jid, name=None): """Add a contact to the list. @param jid (str): JID of the contact @param name (str): optional name of the contact - @param add_item_cb (method): to be called on the contact's widget after it's been added to the list """ if jid in self.contacts: return @@ -178,10 +203,8 @@ break index += 1 self.contacts.insert(index, jid) - box = ContactBox(self.host, jid, name, handleClick=self.handleClick) + box = ContactBox(self.host, jid, name, self.click_listener, self.handle_menu) VerticalPanel.insert(self, box, index) - if add_item_cb: - add_item_cb(box) def remove(self, jid): box = self.getContactBox(jid) @@ -221,34 +244,20 @@ """The contact list that is displayed on the left side.""" def __init__(self, host): - GenericContactList.__init__(self, host, handleClick=True) - self.menu_entries = {"blog": {"title": "Public blog..."}} - self.context_menu = base_panels.PopupMenuPanel(entries=self.menu_entries, - hide=self.contextMenuHide, - callback=self.contextMenuCallback, - vertical=False, style={"selected": "menu-selected"}) + GenericContactList.__init__(self, host, handle_click=True, handle_menu=True) def contextMenuHide(self, sender, key): """Return True if the item for that sender should be hidden.""" # TODO: enable the blogs of users that are on another server return JID(sender.jid).domain != self.host._defaultDomain - def contextMenuCallback(self, sender, key): - if key == "blog": - # TODO: use the bare when all blogs can be retrieved - node = JID(sender.jid).node - web_panel = panels.WebPanel(self.host, "/blog/%s" % node) - self.host.addTab("%s's blog" % node, web_panel) - else: - sender.onClick(sender) - def add(self, jid_s, name=None): """Add a contact @param jid_s (str): JID as unicode @param name (str): nickname """ - GenericContactList.add(self, jid_s, name, add_item_cb=lambda item: self.context_menu.registerRightClickSender(item)) + GenericContactList.add(self, jid_s, name) def setState(self, jid, type_, state): """Change the appearance of the contact, according to the state diff -r 5d8632a7bfde -r 587fe75d1b16 src/browser/sat_browser/panels.py --- a/src/browser/sat_browser/panels.py Tue Jul 15 18:43:55 2014 +0200 +++ b/src/browser/sat_browser/panels.py Tue Jul 15 18:45:33 2014 +0200 @@ -1093,15 +1093,15 @@ @param host: SatWebFrontend instance @param target: entity (jid.JID) with who we have a conversation (contact's jid for one 2 one chat, or MUC room) @param type: one2one for simple conversation, group for MUC""" - base_widget.LiberviaWidget.__init__(self, host, title=target.bare, selectable=True) self.vpanel = VerticalPanel() self.vpanel.setSize('100%', '100%') - self.type = type_ self.nick = None if not target: log.error("Empty target !") return self.target = target + self.type = type_ + base_widget.LiberviaWidget.__init__(self, host, title=target.bare, selectable=True) self.__body = AbsolutePanel() self.__body.setStyleName('chatPanel_body') chat_area = HorizontalPanel() @@ -1168,6 +1168,16 @@ e.include_traceback() return False + def addCachedMenus(self, menu_bar): + """Add cached menus to the header. + + @param menu_bar (GenericMenuBar): menu bar of the widget's header + """ + if self.type == 'group': + menu_bar.addCachedMenus(C.MENU_ROOM, {'room_jid': self.target.bare}) + elif self.type == 'one2one': + menu_bar.addCachedMenus(C.MENU_SINGLE, {'jid': self.target}) + def getWarningData(self): if self.type not in ["one2one", "group"]: raise Exception("Unmanaged type !") @@ -1350,7 +1360,7 @@ AbsolutePanel.__init__(self) # menu - self.menu = menu.Menu(host) + self.menu = menu.MainMenuPanel(host) # unibox self.unibox_panel = UniBoxPanel(host)