Mercurial > libervia-web
changeset 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 | c725b702e927 |
children | e8e3704eb97f |
files | browser_side/panels.py libervia.py |
diffstat | 2 files changed, 260 insertions(+), 229 deletions(-) [+] |
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%")
--- a/libervia.py Fri Apr 15 15:18:38 2011 +0200 +++ b/libervia.py Fri Apr 15 15:30:31 2011 +0200 @@ -22,24 +22,13 @@ import pyjd # this is dummy in pyjs from pyjamas.ui.SimplePanel import SimplePanel from pyjamas.ui.RootPanel import RootPanel -from pyjamas.ui.VerticalPanel import VerticalPanel -from pyjamas.ui.HorizontalPanel import HorizontalPanel -from pyjamas.ui.HTMLPanel import HTMLPanel -from pyjamas.ui.ScrollPanel import ScrollPanel -from pyjamas.ui.Grid import Grid -from pyjamas.ui.Label import Label -from pyjamas.ui import HasAlignment -from pyjamas.ui.MenuBar import MenuBar -from pyjamas.ui.MenuItem import MenuItem from pyjamas.ui.AutoComplete import AutoCompleteTextBox -from pyjamas.ui.DropWidget import DropWidget from pyjamas import Window from pyjamas.JSONService import JSONProxy from pyjamas.ui.KeyboardListener import KEY_ENTER from browser_side.register import RegisterPanel, RegisterBox -from pyjamas import DOM from browser_side.contact import ContactPanel -from datetime import datetime +from browser_side.panels import MainPanel, EmptyPanel, MicroblogPanel class LiberviaJsonProxy(JSONProxy): @@ -84,41 +73,6 @@ LiberviaJsonProxy.__init__(self, "/json_signal_api", ["getSignals"]) -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 UniBox(AutoCompleteTextBox): @@ -139,188 +93,6 @@ #XXX: fixed directly on pyjamas, if the patch is accepted, no need to walk around this return AutoCompleteTextBox.complete(self) -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%") class SatWebFrontend: def onModuleLoad(self):