Mercurial > libervia-web
diff browser/sat_browser/menu.py @ 1124:28e3eb3bb217
files reorganisation and installation rework:
- files have been reorganised to follow other SàT projects and usual Python organisation (no more "/src" directory)
- VERSION file is now used, as for other SàT projects
- replace the overcomplicated setup.py be a more sane one. Pyjamas part is not compiled anymore by setup.py, it must be done separatly
- removed check for data_dir if it's empty
- installation tested working in virtual env
- libervia launching script is now in bin/libervia
author | Goffi <goffi@goffi.org> |
---|---|
date | Sat, 25 Aug 2018 17:59:48 +0200 |
parents | src/browser/sat_browser/menu.py@f2170536ba23 |
children | 2af117bfe6cc |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/browser/sat_browser/menu.py Sat Aug 25 17:59:48 2018 +0200 @@ -0,0 +1,177 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# Libervia: a Salut à Toi frontend +# Copyright (C) 2011-2018 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 sat.core.log import getLogger +log = getLogger(__name__) + +from pyjamas.ui.HTML import HTML +from pyjamas.ui.Frame import Frame + +from constants import Const as C +import file_tools +import xmlui +import chat +import dialog +import contact_group +import base_menu +from sat_browser import html_tools +from sat_browser import web_widget + + +unicode = str # FIXME: pyjamas workaround + + +class MainMenuBar(base_menu.GenericMenuBar): + """The main menu bar which is displayed on top of the document""" + + ITEM_TPL = "<img src='media/icons/menu/%s_menu_red.png' />%s" + + def __init__(self, host): + styles = {'moved_popup': 'menuLastPopup', 'menu_bar': 'mainMenuBar'} + base_menu.GenericMenuBar.__init__(self, host, vertical=False, styles=styles) + + @classmethod + def getCategoryHTML(cls, category): + """Build the html to be used for displaying a category item. + + @param category (quick_menus.MenuCategory): category to add + @return unicode: HTML to display + """ + name = html_tools.html_sanitize(category.name) + return cls.ITEM_TPL % (category.icon, name) if category.icon is not None else name + + ## callbacks + + # General menu + + def onDisconnect(self): + def confirm_cb(answer): + if answer: + self.host.disconnect(C.PROF_KEY_NONE) + _dialog = dialog.ConfirmDialog(confirm_cb, text="Do you really want to disconnect ?") + _dialog.show() + + #Contact menu + + def onManageContactGroups(self): + """Open the contact groups manager.""" + + def onCloseCallback(): + pass + + contact_group.ContactGroupEditor(self.host, None, onCloseCallback) + + #Group menu + def onJoinRoom(self): + + def invite(room_jid, contacts): + for contact in contacts: + self.host.bridge.call('inviteMUC', None, unicode(contact), unicode(room_jid)) + + def join(room_jid, contacts): + if self.host.whoami: + nick = self.host.whoami.node + contact_list = self.host.contact_list + if room_jid is None or room_jid not in contact_list.getSpecials(C.CONTACT_SPECIAL_GROUP): + room_jid_s = unicode(room_jid) if room_jid else '' + self.host.bridge.joinMUC(room_jid_s, nick, profile=C.PROF_KEY_NONE, callback=lambda room_jid: invite(room_jid, contacts), errback=self.host.onJoinMUCFailure) + else: + self.host.displayWidget(chat.Chat, room_jid, type_="group") + invite(room_jid, contacts) + + dialog.RoomAndContactsChooser(self.host, join, ok_button="Join", visible=(True, False)) + + + # Help menu + + def onOfficialChatRoom(self): + nick = self.host.whoami.node + self.host.bridge.joinMUC(self.host.default_muc, nick, profile=C.PROF_KEY_NONE, callback=lambda dummy: None, errback=self.host.onJoinMUCFailure) + + 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): + def gotVersions(): + _about = HTML("""<b>Libervia</b>, a Salut à Toi project<br /> + <br /> + Libervia is a web frontend for Salut à Toi<br /> + <span style='font-style: italic;'>SàT version:</span> {sat_version}<br/> + <span style='font-style: italic;'>Libervia version:</span> {libervia_version}<br/> + <br /> + You can contact the authors at <a href="mailto:contact@salut-a-toi.org">contact@salut-a-toi.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://salut-a-toi.org"target="_blank">http://salut-a-toi.org</a><br /> + <br /> + Any help welcome :) + <p style='font-size:small;text-align:center'>This project is dedicated to Roger Poisson</p> + """.format(sat_version=self.host.sat_version, libervia_version=self.host.libervia_version)) + _dialog = dialog.GenericDialog("About", _about) + _dialog.show() + self.host.getVersions(gotVersions) + + #Settings menu + + def onAccount(self): + def gotUI(xml_ui): + if not xml_ui: + return + body = xmlui.create(self.host, xml_ui) + _dialog = dialog.GenericDialog("Manage your account", body, options=['NO_CLOSE']) + body.setCloseCb(_dialog.close) + _dialog.show() + self.host.bridge.call('getAccountDialogUI', gotUI) + + def onParameters(self): + def gotParams(xml_ui): + if not xml_ui: + return + body = xmlui.create(self.host, xml_ui) + _dialog = dialog.GenericDialog("Parameters", body, options=['NO_CLOSE']) + _dialog.addStyleName("parameters") + body.setCloseCb(_dialog.close) + _dialog.setSize('80%', '80%') + _dialog.show() + self.host.bridge.getParamsUI(profile=C.PROF_KEY_NONE, callback=gotParams) + + def removeItemParams(self): + """Remove the Parameters item from the Settings menu bar.""" + self.menu_settings.removeItem(self.item_params) + + def onAvatarUpload(self): + body = file_tools.AvatarUpload() + _dialog = dialog.GenericDialog("Avatar upload", body, options=['NO_CLOSE']) + body.setCloseCb(_dialog.close) + _dialog.setWidth('40%') + _dialog.show() + + def onPublicBlog(self, contact_box, data, profile): + # FIXME: Q&D way to check domain, need to be done in a cleaner way + if contact_box.jid.domain != self.host._defaultDomain: + self.host.showDialog(u"Public blogs from other domains are not managed yet", "Can't show public blog", "error") + return + + url = '{}/blog/{}'.format(self.host.base_location, contact_box.jid.node) + widget = self.host.displayWidget(web_widget.WebWidget, url, show_url=False) + self.host.setSelected(widget)