changeset 685:0b9bd47dffcd

primitivus, wix: auto-display MUC dialog after it has been joined: - a patch will follow to add a parameter for the user to choose between "always open", "never open" and "ask each time".
author souliane <souliane@mailoo.org>
date Mon, 28 Oct 2013 18:29:34 +0100 (2013-10-28)
parents 969562c4761b
children ae95b0327412
files frontends/src/primitivus/contact_list.py frontends/src/quick_frontend/quick_app.py frontends/src/quick_frontend/quick_chat.py frontends/src/quick_frontend/quick_contact_list.py frontends/src/wix/contact_list.py
diffstat 5 files changed, 53 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- a/frontends/src/primitivus/contact_list.py	Thu Oct 24 08:47:45 2013 +0200
+++ b/frontends/src/primitivus/contact_list.py	Mon Oct 28 18:29:34 2013 +0100
@@ -74,21 +74,37 @@
                 return True
         return False
 
-    def setFocus(self, name, select=False):
-        """give focus to the first group or contact wich contain the given name
-        @param name: name to check
-        @param select: if True, the contact/group is also clicked"""
+    def setFocus(self, text, select=False):
+        """give focus to the first element that matches the given text. You can also
+        pass in text a sat.tools.jid.JID (it's a subclass of unicode).
+        @param text: contact group name, contact or muc userhost, muc private dialog jid
+        @param select: if True, the element is also clicked
+        """
         idx = 0
         for widget in self.frame.body.body:
             try:
-                if name in widget.getValue():
+                if isinstance(widget, sat_widgets.ClickableText):
+                    # contact group
+                    value = widget.getValue()
+                elif isinstance(widget, sat_widgets.SelectableText):
+                    if  widget.data.startswith(const_PRIVATE_PREFIX):
+                        # muc private dialog
+                        value = widget.getValue()
+                    else:
+                        # contact or muc
+                        value = widget.data
+                else:
+                    # Divider instance
+                    continue
+                # there's sometimes a leading space
+                if text.strip() == value.strip():
                     self.frame.body.set_focus(idx)
                     if select:
                         self.__contactClicked(widget, True)
                     return
             except AttributeError:
                 pass
-            idx+=1
+            idx += 1
 
     def putAlert(self, jid):
         """Put an alert on the jid to get attention from user (e.g. for new message)"""
@@ -202,7 +218,6 @@
             if widget.__class__ == sat_widgets.SelectableText:
                 widget.setState(False, invisible=True)
 
-
     def getContact(self):
         """Return contact currently selected"""
         return self.selected
@@ -232,14 +247,6 @@
             self.groups[group][1].add(jid.short)
         self.update()
 
-
-        """contacts = self.list_wid.getAllValues()
-        if jid.short not in contacts:
-            contacts.append(jid.short)
-            contacts.sort()
-            self.list_wid.changeValues(contacts)
-            self._emit('change')"""
-
     def remove(self, jid):
         """remove a contact from the list"""
         QuickContactList.remove(self, jid)
@@ -258,19 +265,24 @@
         """add a contact to the list"""
         self.replace(jid,param_groups)
 
-    def setSpecial(self, special_jid, special_type):
+    def setSpecial(self, special_jid, special_type, show=False):
         """Set entity as a special
         @param jid: jid of the entity
         @param _type: special type (e.g.: "MUC")
+        @param show: True to display the dialog to chat with this entity
         """
-        QuickContactList.setSpecial(self, special_jid, special_type)
+        QuickContactList.setSpecial(self, special_jid, special_type, show)
         if None in self.groups:
-            folded,group_jids = self.groups[None]
+            folded, group_jids = self.groups[None]
             for group_jid in group_jids:
                 if JID(group_jid).short == special_jid.short:
                     group_jids.remove(group_jid)
                     break
         self.update()
+        if show:
+            # also display the dialog for this room
+            self.setFocus(special_jid, True)
+            self.host.redraw()
 
     def updatePresence(self, jid, show, priority, statuses):
         #XXX: for the moment, we ignore presence updates for special entities
--- a/frontends/src/quick_frontend/quick_app.py	Thu Oct 24 08:47:45 2013 +0200
+++ b/frontends/src/quick_frontend/quick_app.py	Mon Oct 28 18:29:34 2013 +0100
@@ -336,7 +336,7 @@
         self.chat_wins[room_jid].setType("group")
         self.chat_wins[room_jid].id = room_jid
         self.chat_wins[room_jid].setPresents(list(set([user_nick]+room_nicks)))
-        self.contact_list.setSpecial(JID(room_jid), "MUC")
+        self.contact_list.setSpecial(JID(room_jid), "MUC", show=True)
 
     def roomLeft(self, room_jid_s, profile):
         """Called when a MUC room is left"""
@@ -573,3 +573,4 @@
                     self.bridge.disconnect(self.profile)
         except:
             pass
+
--- a/frontends/src/quick_frontend/quick_chat.py	Thu Oct 24 08:47:45 2013 +0200
+++ b/frontends/src/quick_frontend/quick_chat.py	Mon Oct 28 18:29:34 2013 +0100
@@ -141,7 +141,6 @@
         """
         raise NotImplementedError
 
-
     def startGame(self, game_type, referee, players):
         """Configure the chat window to start a game"""
         #No need to raise an error as game are not mandatory
@@ -151,3 +150,4 @@
         """Return class managing the game type"""
         #No need to raise an error as game are not mandatory
         warning(_('getGame is not implemented in this frontend'))
+
--- a/frontends/src/quick_frontend/quick_contact_list.py	Thu Oct 24 08:47:45 2013 +0200
+++ b/frontends/src/quick_frontend/quick_contact_list.py	Mon Oct 28 18:29:34 2013 +0100
@@ -72,10 +72,11 @@
         """Return special type of jid, or None if it's not special"""
         return self.specials.get(jid.short)
 
-    def setSpecial(self, jid, _type):
+    def setSpecial(self, jid, _type, show=False):
         """Set entity as a special
         @param jid: jid of the entity
         @param _type: special type (e.g.: "MUC")
+        @param show: True to display the dialog to chat with this entity
         """
         self.specials[jid.short] = _type
 
@@ -89,4 +90,3 @@
         self.setCache(jid, 'prority', priority)
         self.setCache(jid, 'statuses', statuses)
         self.update_jid(jid)
-
--- a/frontends/src/wix/contact_list.py	Thu Oct 24 08:47:45 2013 +0200
+++ b/frontends/src/wix/contact_list.py	Mon Oct 28 18:29:34 2013 +0100
@@ -166,8 +166,24 @@
                 if _present:
                     self.Insert(_present, gp_idx+1, contact)
 
-    def setSpecial(self, special_jid, special_type):
-        QuickContactList.setSpecial(self, special_jid, special_type)
+    def setSpecial(self, special_jid, special_type, show=False):
+        """Set entity as a special
+        @param jid: jid of the entity
+        @param _type: special type (e.g.: "MUC")
+        @param show: True to display the dialog to chat with this entity
+        """
+        QuickContactList.setSpecial(self, special_jid, special_type, show)
+        if show:
+            self._showDialog(special_jid)
+
+    def _showDialog(self, jid):
+        """Show the dialog associated to the given jid."""
+        indexes = self.__find_idx(jid)
+        if not indexes:
+            return
+        self.DeselectAll()
+        self.SetSelection(indexes[0])
+        self.onActivated(wx.MouseEvent())
 
     def remove(self, contact):
         """remove a contact from the list"""