Mercurial > libervia-web
diff browser_side/menu.py @ 78:12680e220b35
browser side: refactoring: menu is now in its own module
author | Goffi <goffi@goffi.org> |
---|---|
date | Sun, 19 Jun 2011 01:33:29 +0200 |
parents | |
children | d57e0d6b1ced |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/browser_side/menu.py Sun Jun 19 01:33:29 2011 +0200 @@ -0,0 +1,229 @@ +#!/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') + + 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")) + + menubar = LiberviaMenuBar() + menubar.addItem(MenuItem("General", menu_general)) + menubar.addItem(MenuItem("Contacts", menu_contacts)) + menubar.addItem(MenuItem("Groups", menu_group)) + _separator = MenuItem('', None) + _separator.setStyleName('menuSeparator') + menubar.addItem(_separator, None) + menubar.addItem(MenuItem("Games", True, menu_games)) + 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")