Mercurial > libervia-web
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()