diff libervia.py @ 33:e70521e6d803

browser side, misc stuffs - dropCell are now keep the dragover style if the mouse go on an other widget inside them - uniBox moved to panels.py - chatPanel now partially managed MUC Room - room joined open in a new tab (as Tarot games) - MainPanel & MainTabPanel are now dynamically sized in pixels - fixed stupid bug in json callbacks management
author Goffi <goffi@goffi.org>
date Sat, 14 May 2011 01:11:08 +0200
parents 258dfaa1035f
children d43d6e4b9dc8
line wrap: on
line diff
--- a/libervia.py	Sat May 14 00:58:11 2011 +0200
+++ b/libervia.py	Sat May 14 01:11:08 2011 +0200
@@ -20,15 +20,10 @@
 """
 
 import pyjd # this is dummy in pyjs
-from pyjamas.ui.SimplePanel import SimplePanel
 from pyjamas.ui.RootPanel import RootPanel
-from pyjamas.ui.AutoComplete import AutoCompleteTextBox
-from pyjamas.ui.PopupPanel import PopupPanel
 from pyjamas.ui.HTML import HTML
-from pyjamas.Timer import Timer
 from pyjamas import Window
 from pyjamas.JSONService import JSONProxy
-from pyjamas.ui.KeyboardListener import KEY_ENTER
 from browser_side.register import RegisterPanel, RegisterBox
 from browser_side.contact import ContactPanel
 from browser_side.panels import MainPanel, EmptyPanel, MicroblogPanel, ChatPanel, StatusPanel
@@ -42,14 +37,14 @@
         self.cb={}
 
     def call(self, method, cb, *args):
+        id = self.callMethod(method,args)
         if cb:
-            self.cb[method] = cb
-        self.callMethod(method,args)
+            self.cb[id] = cb
 
     def onRemoteResponse(self, response, request_info):
-        if self.cb.has_key(request_info.method):
-            self.cb[request_info.method](response)
-            del self.cb[request_info.method]
+        if self.cb.has_key(request_info.id):
+            self.cb[request_info.id](response)
+            del self.cb[request_info.id]
         
     def onRemoteError(self, code, errobj, request_info):
         if code != 0:
@@ -70,142 +65,47 @@
 class BridgeCall(LiberviaJsonProxy):
     def __init__(self):
         LiberviaJsonProxy.__init__(self, "/json_api",
-                        ["getContacts", "sendMessage", "sendMblog", "getMblogNodes", "getProfileJid", "getHistory", "getPresenceStatus", "launchTarotGame"])
+                        ["getContacts", "sendMessage", "sendMblog", "getMblogNodes", "getProfileJid", "getHistory",
+                         "getPresenceStatus", "getRoomJoined", "launchTarotGame"])
 
 class BridgeSignals(LiberviaJsonProxy):
     def __init__(self):
         LiberviaJsonProxy.__init__(self, "/json_signal_api",
                         ["getSignals"])
 
-
-class UniBox(AutoCompleteTextBox):
-    """This text box is used as a main typing point, for message, microblog, etc"""
-
-    def __init__(self, host):
-        AutoCompleteTextBox.__init__(self)
-        self._popup = None
-        self._timer = Timer(notify=self._timeCb)
-        self.host = host
-
-    def addKey(self, key):
-        self.getCompletionItems().completions.append(key)
-
-    def showWarning(self, target_data):
-        type, target = target_data
-        if type == "PUBLIC":
-            msg = "This message will be PUBLIC and everybody will be able to see it, even people you don't know"
-            style = "targetPublic"
-        elif type == "GROUP":
-            msg = "This message will be published for all the people of the group <span class='warningTarget'>%s</span>" % (target or '')
-            style = "targetGroup"
-        elif type == "STATUS":
-            msg = "This will be your new status message"
-            style = "targetStatus"
-        elif type == "ONE2ONE":
-            msg = "This message will be sent to your contact <span class='warningTarget'>%s</span>" % target
-            style = "targetOne2One"
-        else:
-            print "WARNING: undetermined target for this message"
-            return
-        contents = HTML(msg)
-
-        self._popup = PopupPanel(autoHide=False, modal=False)
-        self._popup.target_data = target_data
-        self._popup.add(contents)
-        self._popup.setStyleName("warningPopup")
-        if style:
-            self._popup.addStyleName(style)
-
-        left = 0
-        top  = 0 #max(0, self.getAbsoluteTop() - contents.getOffsetHeight() - 2)   
-        self._popup.setPopupPosition(left, top)
-        self._popup.setPopupPosition(left, top)
-        self._popup.show()
-
-    def _timeCb(self, timer):
-        if self._popup:
-            self._popup.hide()
-            del self._popup
-            self._popup = None
-
-    def _getTarget(self, txt):
-        """Say who will receive the messsage
-        Return a tuple (target_type, target info)"""
-        type = None
-        target = None
-        if txt.startswith('@@: '):
-            type = "PUBLIC"
-        elif txt.startswith('@'):
-            type = "GROUP"
-            _end = txt.find(': ')
-            if _end == -1:
-                type = "STATUS"
-            else:
-                target = txt[1:_end] #only one target group is managed for the moment
-                if not target in self.host.contact_panel.getGroups():
-                    target = None
-        elif self.host.selected == None:
-            type = "STATUS"
-        elif isinstance(self.host.selected, ChatPanel):
-            type = "ONE2ONE"
-            target = str(self.host.selected.target)
-        else:
-            print self.host.selected
-            type = "UNKNOWN"
-        return (type, target)
-
-    def onKeyPress(self, sender, keycode, modifiers):
-        _txt = self.getText()
-        if not self._popup:
-            self.showWarning(self._getTarget(_txt))
-        else:
-            _target = self._getTarget(_txt)
-            if _target != self._popup.target_data:
-                self._timeCb(None) #we remove the popup
-                self.showWarning(_target)
-
-        self._timer.schedule(2000)
-
-        if keycode == KEY_ENTER and not self.visible:
-            if _txt:
-                if _txt.startswith('@'):
-                    self.host.bridge.call('sendMblog', None, self.getText())
-                elif self.host.selected == None:
-                    self.host.bridge.call('setStatus', None, _txt)
-                elif isinstance(self.host.selected, ChatPanel):
-                    _chat = self.host.selected
-                    self.host.bridge.call('sendMessage', None, str(_chat.target), _txt, '', 'chat')
-            self.setText('')
-            self._timeCb(None) #we remove the popup
-
-    def complete(self):
-        #self.visible=False #XXX: self.visible is not unset in pyjamas when ENTER is pressed and a completion is done
-        #XXX: fixed directly on pyjamas, if the patch is accepted, no need to walk around this
-        return AutoCompleteTextBox.complete(self)
-
-
 class SatWebFrontend:
     def onModuleLoad(self):
         self.whoami = None
         self.bridge = BridgeCall()
         self.bridge_signals = BridgeSignals()
         self.selected = None
-        self.uni_box = UniBox(self)
-        self.uni_box.addKey("@@: ")
+        self.uni_box = None
         self.status_panel = StatusPanel(self)
         self.contact_panel = ContactPanel(self)
         self.panel = MainPanel(self)
         self.discuss_panel = self.panel.discuss_panel
         self.tab_panel = self.panel.tab_panel 
         self.mpanels = [EmptyPanel(self), MicroblogPanel(self, accept_all=True), EmptyPanel(self)]
+        self.other_panels = [] #panels not on the main tab #FIXME: temporary, need to be changed
+        self.room_list = set() #set of rooms 
         self.discuss_panel.changePanel(0,self.mpanels[0])
         self.discuss_panel.changePanel(1,self.mpanels[1])
         self.discuss_panel.changePanel(2,self.mpanels[2])
         self._dialog = None
         RootPanel().add(self.panel)
+        self.resize()
         self._register = RegisterCall()
         self._register.call('isRegistered',self._isRegisteredCB)
 
+    def resize(self):
+        """Resize elements"""
+        Window.onResize()
+
+    def setUniBox(self, unibox):
+        """register the unibox widget"""
+        self.uni_box = unibox
+        self.uni_box.addKey("@@: ")
+
     def select(self, widget):
         """Define the selected widget"""
         if self.selected:
@@ -214,6 +114,13 @@
         if widget:
             self.selected.addStyleName('selected_widget')
 
+    def addTab(self, panel, label):
+        """Add a panel in a tab
+        @param panel: panel to add
+        @param label: label of the tab"""
+        self.tab_panel.add(panel, label)
+        self.other_panels.append(panel)
+
     def _isRegisteredCB(self, registered):
         if not registered:
             self._dialog = RegisterBox(self.logged,centered=True)
@@ -256,11 +163,17 @@
             self._presenceUpdateCb(*args)
         elif name == 'roomJoined':
             self._roomJoinedCb(*args)
+        elif name == 'roomUserJoined':
+            self._roomUserJoinedCb(*args)
+        elif name == 'roomUserLeft':
+            self._roomUserLeftCb(*args)
 
     def _getProfileJidCB(self, jid):
         self.whoami = JID(jid)
         #we can now ask our status
         self.bridge.call('getPresenceStatus', self._getPresenceStatusCB)
+        #and the rooms where we are
+        self.bridge.call('getRoomJoined', self._getRoomJoinedCB)
 
 
 
@@ -285,7 +198,7 @@
     def _newMessageCb(self, from_jid, msg, msg_type, to_jid):
         _from = JID(from_jid)
         _to = JID(to_jid)
-        for panel in self.mpanels:
+        for panel in self.mpanels + self.other_panels:
             if isinstance(panel,ChatPanel) and (panel.target.bare == _from.bare or panel.target.bare == _to.bare):
                 panel.printMessage(_from, msg)
 
@@ -294,17 +207,26 @@
         #XXX: QnD way to get our status
         if self.whoami and self.whoami.bare == _entity.bare and statuses:
             self.status_panel.changeStatus(statuses.values()[0])
-        if not self.whoami or self.whoami.bare != _entity.bare: 
+        if (not self.whoami or self.whoami.bare != _entity.bare):
             self.contact_panel.setConnected(_entity.bare, _entity.resource, show, priority, statuses)
 
-    def _roomJoinedCb(self, room_id, room_service, room_nicks, user_nick, profile):
-        print "roomJoined"
-        print room_id
+    def _roomJoinedCb(self, room_id, room_service, room_nicks, user_nick):
         _target = JID("%s@%s" % (room_id,room_service))
+        self.room_list.add(_target)
+        chat_panel = ChatPanel(self, _target, type='group')
+        chat_panel.setUserNick(user_nick)
         if room_id.startswith('sat_tarot_'): #XXX: it's not really beautiful, but it works :)
-            self.tab_panel.add(ChatPanel(self, _target), "Tarot")
+            self.addTab(chat_panel, "Tarot")
         else:
-            self.tab_panel.add(ChatPanel(self, _target), str(_target)) 
+            self.addTab(chat_panel, str(_target))
+        chat_panel.setPresents(room_nicks)
+        chat_panel.historyPrint()
+
+    def _roomUserJoinedCb(room_id, room_service, room_nicks, user_nick):
+        pass
+
+    def _roomUserLeftCb(room_id, room_service, room_nicks, user_nick):
+        pass
 
             
     def _getPresenceStatusCB(self, presence_data):
@@ -313,6 +235,10 @@
                 args = presence_data[entity][resource]
                 self._presenceUpdateCb("%s/%s" % (entity, resource), *args)
 
+    def _getRoomJoinedCB(self, room_data):
+        for room in room_data:
+            self._roomJoinedCb(*room)
+
 if __name__ == '__main__':
     pyjd.setup("http://localhost:8080/libervia.html")
     app = SatWebFrontend()