diff frontends/src/primitivus/chat.py @ 907:cd02f5ef30df

primitivus: display chat states (with symbols) for MUC participants
author souliane <souliane@mailoo.org>
date Mon, 17 Mar 2014 13:24:55 +0100
parents f3513c8cc2e6
children b12706d164d7
line wrap: on
line diff
--- a/frontends/src/primitivus/chat.py	Sun Mar 16 21:25:49 2014 +0100
+++ b/frontends/src/primitivus/chat.py	Mon Mar 17 13:24:55 2014 +0100
@@ -25,6 +25,7 @@
 from sat_frontends.primitivus.card_game import CardGame
 from sat_frontends.quick_frontend.quick_utils import escapePrivate, unescapePrivate
 from sat_frontends.primitivus.xmlui import XMLUI
+from sat_frontends.primitivus.constants import Const
 import time
 from sat.tools.jid  import JID
 
@@ -175,21 +176,32 @@
             main_widget = self.pile
         self._w = main_widget
 
-    def updateChatState(self, state):
-        """Update the chat state of the contact.
-        @param state: new state to set
+    def updateChatState(self, state, nick=None):
+        """Set the chat state (XEP-0085) of the contact. Leave nick to None
+        to set the state for a one2one conversation, or give a nickname or
+        Const.ALL_OCCUPANTS to set the state of a participant within a MUC.
+        @param state: the new chat state
+        @param nick: None for one2one, the MUC user nick or Const.ALL_OCCUPANTS
         """
-        if (self.type == 'one2one'):
+        if nick:
+            assert(self.type == 'group')
+            occupants = self.occupants if nick == Const.ALL_OCCUPANTS else [nick]
+            options = self.present_wid.getAllValues()
+            for index in xrange(0, len(options)):
+                nick = options[index].value
+                if nick in occupants:
+                    options[index] = (nick, '%s %s' % (Const.MUC_USER_STATES[state], nick))
+            self.present_wid.changeValues(options)
+            self.host.redraw()
+        else:
+            assert(self.type == 'one2one')
             self.__setSurrendedText(state)
             self.showDecoration()
             self.host.redraw()
-        elif (self.type == 'group'):
-            # TODO: chat state for groupchat
-            pass
 
     def _presentClicked(self, list_wid, clicked_wid):
         assert(self.type == 'group')
-        nick = clicked_wid.getValue()
+        nick = clicked_wid.getValue().value
         if nick == self.getUserNick():
             #We ignore click on our own nick
             return
@@ -250,9 +262,9 @@
         nick = unicode(param_nick) #FIXME: should be done in DBus bridge
         QuickChat.replaceUser(self, nick, show_info)
         presents = self.present_wid.getAllValues()
-        if nick not in presents:
+        if nick not in [present.value for present in presents]:
             presents.append(nick)
-            presents.sort()
+            presents.sort(cmp=lambda a, b: cmp(a.value if hasattr(a, 'value') else a, b.value if hasattr(b, 'value') else b))
             self.present_wid.changeValues(presents)
         self.host.redraw()