diff frontends/src/primitivus/contact_list.py @ 2015:20fb71b656e3

quick_frontend, primitivus (contact_list): improved and simplified handling of "special" entities: - special_extras has been removed - specials handle all entities (bare + full) in a single set
author Goffi <goffi@goffi.org>
date Sun, 24 Jul 2016 17:47:09 +0200
parents 90134b2e3dc4
children f09562b0704d
line wrap: on
line diff
--- a/frontends/src/primitivus/contact_list.py	Tue Jul 19 21:25:22 2016 +0200
+++ b/frontends/src/primitivus/contact_list.py	Sun Jul 24 17:47:09 2016 +0200
@@ -122,17 +122,6 @@
 
         log.debug(u"Not element found for {} in setFocus".format(text))
 
-    def specialResourceVisible(self, entity):
-        """Assure a resource of a special entity is visible and clickable
-
-        Mainly used to display private conversation in MUC rooms
-        @param entity: full jid of the resource to show
-        """
-        assert isinstance(entity, jid.JID)
-        if entity not in self._special_extras:
-            self._special_extras.add(entity)
-            self.update()
-
     # events
 
     def _groupClicked(self, group_wid):
@@ -163,7 +152,7 @@
 
     # Methods to build the widget
 
-    def _buildEntityWidget(self, entity, keys=None, use_bare_jid=False, with_notifs=True, with_show_attr=True, markup_prepend=None, markup_append = None):
+    def _buildEntityWidget(self, entity, keys=None, use_bare_jid=False, with_notifs=True, with_show_attr=True, markup_prepend=None, markup_append=None, special=False):
         """Build one contact markup data
 
         @param entity (jid.JID): entity to build
@@ -177,6 +166,7 @@
         @param with_show_attr (bool): if True, show color corresponding to presence status
         @param markup_prepend (list): markup to prepend to the generated one before building the widget
         @param markup_append (list): markup to append to the generated one before building the widget
+        @param special (bool): True if entity is a special one
         @return (list): markup data are expected by Urwid text widgets
         """
         markup = []
@@ -269,25 +259,18 @@
 
     def _buildSpecials(self, content):
         """Build the special entities"""
-        specials = list(self.contact_list._specials)
-        specials.sort()
-        extra_shown = set()
+        specials = sorted(self.contact_list.getSpecials())
+        current = None
         for entity in specials:
-            # the special widgets
-            widget = self._buildEntityWidget(entity, ('cache_nick', 'cache_name', 'node'), with_show_attr=False)
-            content.append(widget)
-
-            # resources which must be displayed (e.g. MUC private conversations)
-            extras = [extra for extra in self.contact_list._special_extras if extra.bare == entity.bare]
-            extras.sort()
-            for extra in extras:
-                widget = self._buildEntityWidget(extra, ('resource',), markup_prepend = '  ')
-                content.append(widget)
-                extra_shown.add(extra)
-
-        # entities which must be visible but not resource of current special entities
-        for extra in self.contact_list._special_extras.difference(extra_shown):
-            widget = self._buildEntityWidget(extra, ('resource',))
+            if current is not None and current.bare == entity.bare:
+                # nested entity (e.g. MUC private conversations)
+                widget = self._buildEntityWidget(entity, ('resource',), markup_prepend='  ', special=True)
+            else:
+                # the special widgets
+                if entity.resource:
+                    widget = self._buildEntityWidget(entity, ('resource',), special=True)
+                else:
+                    widget = self._buildEntityWidget(entity, ('cache_nick', 'cache_name', 'node'), with_show_attr=False, special=True)
             content.append(widget)
 
     def _buildList(self):