Mercurial > libervia-web
diff browser_side/panels.py @ 18:795d144fc1d2
moved panels and menu in a separate file
author | Goffi <goffi@goffi.org> |
---|---|
date | Fri, 15 Apr 2011 15:30:31 +0200 |
parents | |
children | e8e3704eb97f |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/browser_side/panels.py Fri Apr 15 15:30:31 2011 +0200 @@ -0,0 +1,259 @@ +#!/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.ScrollPanel import ScrollPanel +from pyjamas.ui.HTMLPanel import HTMLPanel +from pyjamas.ui.Grid import Grid +from pyjamas.ui.MenuBar import MenuBar +from pyjamas.ui.MenuItem import MenuItem +from pyjamas.ui.Label import Label +from pyjamas.ui.DropWidget import DropWidget +from pyjamas.ui import HasAlignment +from pyjamas import Window +from pyjamas import DOM + +from pyjamas.dnd import makeDraggable +from pyjamas.ui.DragWidget import DragWidget, DragContainer +from tools.jid import JID +from datetime import datetime + +class MenuCmd: + + def __init__(self, object, handler): + self._object = object + self._handler = handler + + def execute(self): + handler = getattr(self._object, self._handler) + handler() + +class Menu(SimplePanel): + + def __init__(self): + SimplePanel.__init__(self) + + menu_general = MenuBar(vertical=True) + menu_general.addItem("Properties", MenuCmd(self, "onProperties")) + + menu_games = MenuBar(vertical=True) + menu_games.addItem("Tarot", MenuCmd(self, "onTarotGame")) + menu_games.addItem("Xiangqi", MenuCmd(self, "onXiangqiGame")) + + menubar = MenuBar(vertical=False) + menubar.addItem(MenuItem("General", menu_general)) + menubar.addItem(MenuItem("Games", True, menu_games)) + self.add(menubar) + + def onProperties(self): + Window.alert("Properties selected") + + def onTarotGame(self): + Window.alert("Tarot selected") + + def onXiangqiGame(self): + Window.alert("Xiangqi selected") + +class DropCell(DropWidget): + """Cell in the middle grid which replace itself with the dropped widget on DnD""" + + def __init__(self): + DropWidget.__init__(self) + + def onDragEnter(self, event): + print "drag enter" + self.addStyleName('dragover') + DOM.eventPreventDefault(event) + + def onDragLeave(self, event): + print "drag leave" + self.removeStyleName('dragover') + + def onDragOver(self, event): + DOM.eventPreventDefault(event) + + def _getCellAndRow(self, grid, event): + """Return cell and row index where the event is occuring""" + cell = grid.getEventTargetCell(event) + row = DOM.getParent(cell) + return (row.rowIndex, cell.cellIndex) + + + def onDrop(self, event): + print "Empty Panel: onDrop" + dt = event.dataTransfer + #'text', 'text/plain', and 'Text' are equivalent. + try: + item = dt.getData("text/plain") + item_type = dt.getData("type") + print "message: %s" % item + print "type: %s" % item_type + except: + print "no message found" + item=' ' + item_type = None + DOM.eventPreventDefault(event) + if item_type=="GROUP": + _mblog = MicroblogPanel(self.host, item) + _mblog.setAcceptedGroup(item) + elif item_type=="CONTACT": + _mblog = MicroblogPanel(self.host, accept_all=True) + self.host.mpanels.remove(self) + self.host.mpanels.append(_mblog) + print "DEBUG" + grid = self.getParent() + row_idx, cell_idx = self._getCellAndRow(grid, event) + self.removeFromParent() + grid.setWidget(row_idx, cell_idx, _mblog) + print "index:", row_idx, cell_idx + #FIXME: delete object ? Check the right way with pyjamas + #self.host.middle_panel.changePanel(self.data,self.host.mpanels[0]) + + +class EmptyPanel(DropCell, SimplePanel): + """Empty dropable panel""" + + def __init__(self, host): + SimplePanel.__init__(self) + self.host = host + _panel = HTMLPanel(" ") + self.add(_panel) + self.setHeight('100%') + DropCell.__init__(self) + +class MicroblogEntry(SimplePanel): + + def __init__(self, body, author, timestamp): + SimplePanel.__init__(self) + + _datetime = datetime.fromtimestamp(timestamp) + + panel = HTMLPanel("<div class='mb_entry_header'><span class='mb_entry_author'>%(author)s</span> on <span class='mb_entry_timestamp'>%(timestamp)s</span></div><div class='mb_entry_body'>%(body)s</div>" % + {"author": author, + "timestamp": _datetime, + "body": body} + ) + panel.setStyleName('microblogEntry') + self.add(panel) + + +class MicroblogPanel(DropCell, ScrollPanel): + + def __init__(self,host, title=' ', accept_all=False): + """Panel used to show microblog + @param title: title of the panel + @param accept_all: if true, show every message, without filtering jids""" + self.host = host + self.accept_all = accept_all + title=title.replace('<','<').replace('>','>') + self.accepted_groups = [] + _class = ['mb_panel_header'] + if title == ' ': + _class.append('empty_header') + ScrollPanel.__init__(self) + self.vpanel = VerticalPanel() + self.vpanel.add(HTMLPanel("<div class='%s'>%s</div>" % (','.join(_class),title))) + self.vpanel.setWidth('100%') + self.setHeight('100%') + self.setStyleName('microblogPanel') + self.add(self.vpanel) + DropCell.__init__(self) + + def addEntry(self, text, author=None, timestamp=None): + """Add an entry to the panel + @param text: main text of the entry + @param author: who wrote the entry + @param date: when the entry was written""" + _entry = MicroblogEntry(text, author, timestamp) + self.vpanel.insert(_entry,1) + + def setAcceptedGroup(self, group): + """Set the group which can be displayed in this panel + @param group: string of the group, or list of string + """ + if isinstance(group, list): + self.accepted_groups.extend(group) + else: + self.accepted_groups.append(group) + + def isJidAccepted(self, jid): + """Tell if a jid is actepted and show in this panel + @param jid: jid + @return: True if the jid is accepted""" + if self.accept_all: + return True + for group in self.accepted_groups: + if self.host.contactPanel.isContactInGroup(group, jid): + return True + return False + + + +class MiddlePannel(HorizontalPanel): + + def __init__(self, host): + self.host=host + HorizontalPanel.__init__(self) + self._left = self.host.contactPanel + self._right = Grid(1,3) + self._right.setWidth('100%') + self._right.setHeight('100%') + self.add(self._left) + self.setCellWidth(self._left, "15%") + self.add(self._right) + self.setCellWidth(self._right, "85%") + self.setHeight('100%') + + def changePanel(self, idx, panel): + print "panel:",panel + print "idx:",idx + self._right.setWidget(0,idx,panel) + +class MainPanel(VerticalPanel): + + def __init__(self, host): + self.host=host + VerticalPanel.__init__(self) + + self.setHorizontalAlignment(HasAlignment.ALIGN_LEFT) + self.setVerticalAlignment(HasAlignment.ALIGN_TOP) + + menu = Menu() + uni_box = host.uniBox + self.middle_panel = MiddlePannel(self.host) + self.middle_panel.setWidth('100%') + + self.add(menu) + self.add(uni_box) + self.add(self.middle_panel) + + self.setCellHeight(menu, "5%") + self.setCellHeight(uni_box, "5%") + self.setCellVerticalAlignment(uni_box, HasAlignment.ALIGN_CENTER) + self.setCellHorizontalAlignment(uni_box, HasAlignment.ALIGN_CENTER) + self.setCellHeight(self.middle_panel, "90%") + self.setCellWidth(self.middle_panel, "100%") + + self.setWidth("100%") + self.setHeight("100%")