Mercurial > libervia-web
view browser_side/menu.py @ 88:50b480fd0605
browser side: widgetsPanel is now scrollable when there are too many widgets, and widgets have a minimum size
author | Goffi <goffi@goffi.org> |
---|---|
date | Mon, 27 Jun 2011 16:46:31 +0200 |
parents | d57e0d6b1ced |
children | 500a1529c191 |
line wrap: on
line source
#!/usr/bin/python # -*- coding: utf-8 -*- """ Libervia: a Salut à Toi frontend Copyright (C) 2011 Jérôme Poisson <goffi@goffi.org> This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. """ import pyjd # this is dummy in pyjs from pyjamas.ui.SimplePanel import SimplePanel from pyjamas.ui.VerticalPanel import VerticalPanel from pyjamas.ui.HorizontalPanel import HorizontalPanel from pyjamas.ui.DialogBox import DialogBox from pyjamas.ui.MenuBar import MenuBar from pyjamas.ui.MenuItem import MenuItem from pyjamas.ui.ListBox import ListBox from pyjamas.ui.Label import Label from pyjamas.ui.TextBox import TextBox from pyjamas.ui.Button import Button from pyjamas.ui.HTML import HTML from pyjamas.ui.Frame import Frame from pyjamas import Window from jid import JID from tools import html_sanitize import dialog import re class MenuCmd: def __init__(self, object, handler): self._object = object self._handler = handler def execute(self): handler = getattr(self._object, self._handler) handler() class LiberviaMenuBar(MenuBar): def __init__(self): MenuBar.__init__(self, vertical=False) def doItemAction(self, item, fireCommand): MenuBar.doItemAction(self, item, fireCommand) if item == self.items[-1] and self.popup: self.popup.setPopupPosition(Window.getClientWidth() - self.popup.getOffsetWidth() - 22, self.getAbsoluteTop() + self.getOffsetHeight() - 1) self.popup.addStyleName('menuLastPopup') class Menu(SimplePanel): def __init__(self, host): self.host = host SimplePanel.__init__(self) self.setStyleName('menuContainer') _item_tpl = "<img src='media/icons/menu/%s_menu_red.png' />%s" menu_general = MenuBar(vertical=True) menu_general.addItem("Social contract", MenuCmd(self, "onSocialContract")) menu_general.addItem("About", MenuCmd(self, "onAbout")) menu_contacts = MenuBar(vertical=True) menu_contacts.addItem("add contact", MenuCmd(self, "onAddContact")) menu_contacts.addItem("update contact", MenuCmd(self, "onUpdateContact")) menu_contacts.addItem("remove contact", MenuCmd(self, "onRemoveContact")) menu_group = MenuBar(vertical=True) menu_group.addItem("join room", MenuCmd(self, "onJoinRoom")) menu_games = MenuBar(vertical=True) menu_games.addItem("Tarot", MenuCmd(self, "onTarotGame")) menu_games.addItem("Xiangqi", MenuCmd(self, "onXiangqiGame")) menu_help = MenuBar(vertical=True) menu_settings = MenuBar(vertical=True) menubar = LiberviaMenuBar() for _name, _icon, _menu in [('General', 'home', menu_general), ('Contacts', 'social', menu_contacts), ('Groups', 'social', menu_group), ('Games', 'games', menu_games)]: menubar.addItem(MenuItem(_item_tpl % (_icon, _name), True, _menu)) _separator = MenuItem('', None) _separator.setStyleName('menuSeparator') menubar.addItem(_separator, None) for _name, _icon, _menu in [('Help', 'help', menu_help), ('Settings', 'settings', menu_settings)]: menubar.addItem(MenuItem(_item_tpl % (_icon, _name), True, _menu)) self.add(menubar) #General menu def onSocialContract(self): _frame = Frame('contrat_social.html') _frame.setStyleName('infoFrame') _dialog = dialog.GenericDialog("Contrat Social", _frame) _dialog.setSize('80%', '80%') _dialog.show() def onAbout(self): _about = HTML("""<b>Libervia</b>, a Salut à Toi project<br /> <br /> You can contact the author at <a href="mailto:goffi@goffi.org">goffi@goffi.org</a><br /> Blog available (mainly in french) at <a href="http://www.goffi.org" target="_blank">http://www.goffi.org</a><br /> Project page: <a href="http://wiki.goffi.org/wiki/Salut_à_Toi"target="_blank">http://wiki.goffi.org/wiki/Salut_à_Toi</a><br /> <br /> Any help welcome :) <p style='font-size:small;text-align:center'>This project is dedicated to Roger Poisson</p> """) _dialog = dialog.GenericDialog("About", _about) _dialog.show() #Contact menu def onAddContact(self): """Q&D contact addition""" _dialog = None edit = TextBox() def addContactCb(sender): if not re.match(r'^.+@.+\..+',edit.getText(), re.IGNORECASE): Window.alert('You must enter a valid contact JID (like "contact@libervia.org")') _dialog.show() else: self.host.bridge.call('addContact', None, edit.getText(), '', _dialog.getSelectedGroups() ) label = Label("new contact identifier (JID):") edit.setText('@libervia.org') edit.setWidth('100%') _dialog = dialog.GroupSelector([label, edit], self.host.contact_panel.getGroups(), [], addContactCb) _dialog.setHTML('Adding contact') _dialog.show() def onUpdateContact(self): _dialog = None _contacts_list = ListBox() def updateContactCb(sender): _jid = _contacts_list.getValue(_contacts_list.getSelectedIndex()) self.host.bridge.call('updateContact', None, _jid, '', _dialog.getSelectedGroups()) def onContactChange(_list): _jid = _contacts_list.getValue(_contacts_list.getSelectedIndex()) groups = self.host.contact_panel.getContactGroups(_jid) _dialog.setGroupsSelected(groups) for contact in self.host.contact_panel.getContacts(): _contacts_list.addItem(contact) _contacts_list.addChangeListener(onContactChange) _jid = _contacts_list.getValue(_contacts_list.getSelectedIndex()) _selected_groups = self.host.contact_panel.getContactGroups(_jid) _dialog = dialog.GroupSelector([Label('Which contact do you want to update ?'), _contacts_list], self.host.contact_panel.getGroups(), _selected_groups, updateContactCb) _dialog.setHTML('Updating contact') _dialog.show() def onRemoveContact(self): _dialog = None _contacts_list = ListBox() def secondConfirmCb(confirm): if confirm: for contact in _contacts_list.getSelectedValues(): self.host.bridge.call('delContact', None, contact) else: _dialog.show() def dialogCb(confirm): if confirm: html_list = ''.join(['<li>%s</li>' % html_sanitize(contact) for contact in _contacts_list.getSelectedValues()]) html_body = "Are you sure to remove the following contacts from your contact list ?<ul>%s</ul>" % html_list dialog.ConfirmDialog(secondConfirmCb, html_body).show() for contact in self.host.contact_panel.getContacts(): _contacts_list.addItem(contact) _dialog = dialog.GenericConfirmDialog([_contacts_list], dialogCb, "Who do you want to remove from your contacts ?") _dialog.show() #Group menu def onJoinRoom(self): _dialog = None _edit = None def onOK(sender): if not _edit.getText(): Window.alert('You must enter a room jid in the form libervia@conference.libervia.org') if self.host.whoami: nick = self.host.whoami.node self.host.bridge.call('joinMUC', None, _edit.getText(), nick) _dialog.hide() def onCancel(sender): _dialog.hide() _main_panel = VerticalPanel() _label = Label("Discussion room:") _edit = TextBox() _edit.setText('libervia@conference.libervia.org') hpanel = HorizontalPanel() hpanel.add(_label) hpanel.add(_edit) _main_panel.add(hpanel) button_panel = HorizontalPanel() button_panel.add(Button("Join", onOK)) button_panel.add(Button("Cancel", onCancel)) _main_panel.add(button_panel) _dialog = DialogBox(centered=True) _dialog.setHTML('Group discussions') _dialog.setWidget(_main_panel) _dialog.show() #Game menu def onTarotGame(self): #Window.alert("Tarot selected") #self.host.tab_panel.add(EmptyPanel(self.host), "Tarot") def onPlayersSelected(other_players): self.host.bridge.call('launchTarotGame', None, other_players) dialog.ContactsChooser(self.host, onPlayersSelected, 3, text="Please select 3 other players").getContacts() def onXiangqiGame(self): Window.alert("A Xiangqi game is planed, but not available yet")