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='&nbsp;'
+            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("&nbsp;")
+        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='&nbsp;', 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('<','&lt;').replace('>','&gt;')
+        self.accepted_groups = []
+        _class = ['mb_panel_header']
+        if title == '&nbsp;':
+            _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='&nbsp;'
-            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("&nbsp;")
-        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='&nbsp;', 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('<','&lt;').replace('>','&gt;')
-        self.accepted_groups = []
-        _class = ['mb_panel_header']
-        if title == '&nbsp;':
-            _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):