diff frontends/src/quick_frontend/quick_contact_list.py @ 1972:02d21a589be2

quick_frontend, primitivus: notifications refactoring replaced old "alerts" system by a more generic one which use listeners and can activate callbacks on notification click.
author Goffi <goffi@goffi.org>
date Mon, 27 Jun 2016 22:36:22 +0200
parents 633b5c21aefd
children 8c4087fd034a
line wrap: on
line diff
--- a/frontends/src/quick_frontend/quick_contact_list.py	Mon Jun 27 21:45:13 2016 +0200
+++ b/frontends/src/quick_frontend/quick_contact_list.py	Mon Jun 27 22:36:22 2016 +0200
@@ -68,9 +68,6 @@
         # contacts in roster (bare jids)
         self._roster = set()
 
-        # alerts per entity (key: full jid, value: list of alerts)
-        self._alerts = {}
-
         # selected entities, full jid
         self._selected = set()
 
@@ -91,6 +88,10 @@
         self.host.addListener('presence', self.presenceListener, [self.profile])
         self.nickListener = self.onNickUpdate
         self.host.addListener('nick', self.nickListener, [self.profile])
+        self.notifListener = self.onNotification
+        self.host.addListener('notification', self.notifListener, [self.profile])
+        # notifListener only update the entity, so we can re-use it
+        self.host.addListener('notificationsClear', self.notifListener, [self.profile])
 
     def _showEmptyGroups(self, show_str):
         # Called only by __init__
@@ -321,8 +322,6 @@
         self._specials.clear()
         self._special_extras.clear()
         self._roster.clear()
-        self._alerts.clear()
-        self.host.updateAlertsCounter()
         self.update()
 
     def setContact(self, entity, groups=None, attributes=None, in_roster=False):
@@ -392,15 +391,14 @@
         show = self.getCache(entity, C.PRESENCE_SHOW)
 
         if check_resource:
-            alerts = self._alerts.keys()
             selected = self._selected
         else:
-            alerts = {alert.bare for alert in self._alerts}
             selected = {selected.bare for selected in self._selected}
         return ((show is not None and show != C.PRESENCE_UNAVAILABLE)
                 or self.show_disconnected
-                or entity in alerts
-                or entity in selected)
+                or entity in selected
+                or self.host.getNotifs(entity.bare, profile=self.profile)
+                )
 
     def anyEntityToShow(self, entities, check_resources=False):
         """Tell if in a list of entities, at least one should be shown
@@ -443,16 +441,12 @@
             self._groups[group]['jids'].remove(entity_bare)
             if not self._groups[group]['jids']:
                 self._groups.pop(group) # FIXME: we use pop because of pyjamas: http://wiki.goffi.org/wiki/Issues_with_Pyjamas/en
-        for iterable in (self._selected, self._alerts, self._specials, self._special_extras):
+        for iterable in (self._selected, self._specials, self._special_extras):
             to_remove = set()
             for set_entity in iterable:
                 if set_entity.bare == entity.bare:
                     to_remove.add(set_entity)
-            if isinstance(iterable, set):
-                iterable.difference_update(to_remove)
-            else:  # XXX: self._alerts is a dict
-                for item in to_remove:
-                    del iterable[item]
+            iterable.difference_update(to_remove)
         self.update([entity], C.UPDATE_DELETE, self.profile)
 
     def onPresenceUpdate(self, entity, show, priority, statuses, profile):
@@ -500,6 +494,17 @@
         self.setCache(entity, 'nick', new_nick)
         self.update([entity], C.UPDATE_MODIFY, profile)
 
+    def onNotification(self, entity, notif, profile):
+        """Update entity with notification
+
+        @param entity(jid.JID): entity updated
+        @param notif(dict): notification data
+        @param profile: %(doc_profile)s
+        """
+        assert profile == self.profile
+        if entity is not None:
+            self.update([entity], C.UPDATE_MODIFY, profile)
+
     def unselect(self, entity):
         """Unselect an entity
 
@@ -540,66 +545,6 @@
                 self._selected.add(entity)
                 self.update([entity], C.UPDATE_SELECTION, profile=self.profile)
 
-    def getAlerts(self, entity, use_bare_jid=False, filter_=None):
-        """Return alerts set to this entity.
-
-        @param entity (jid.JID): entity
-        @param use_bare_jid (bool): if True, cumulate the alerts of all the resources sharing the same bare JID
-        @param filter_(iterable, None): alert to take into account,
-            None to count all of them
-        @return (list[unicode,None]): list of C.ALERT_* or None for undefined ones
-        """
-        return [] # FIXME: temporarily disabled
-        if not use_bare_jid:
-            alerts = self._alerts.get(entity, [])
-        else:
-            alerts = []
-            for contact, contact_alerts in self._alerts:
-                if contact.bare == entity:
-                    alerts.extend(contact_alerts)
-        if filter_ is None:
-            return alerts
-        else:
-            return [alert for alert in alerts if alert in filter_]
-
-    def addAlert(self, entity, type_=None):
-        """Add an alert for this enity
-
-        @param entity(jid.JID): entity who received an alert (resource is significant)
-        @param type_(unicode, None): type of alert (C.ALERT_*)
-            None for generic alert
-        """
-        self._alerts.setdefault(entity, [])
-        self._alerts[entity].append(type_)
-        self.update([entity], C.UPDATE_MODIFY, self.profile)
-        self.host.updateAlertsCounter() # FIXME: ?
-
-    def removeAlerts(self, entity, use_bare_jid=True):
-        """Eventually remove an alert on the entity (usually for a waiting message).
-
-        @param entity(jid.JID): entity (resource is significant)
-        @param use_bare_jid (bool): if True, ignore the resource
-        """
-        if use_bare_jid:
-            to_remove = set()
-            for alert_entity in self._alerts:
-                if alert_entity.bare == entity.bare:
-                    to_remove.add(alert_entity)
-            if not to_remove:
-                return  # nothing changed
-            for entity in to_remove:
-                del self._alerts[entity]
-            self.update([to_remove], C.UPDATE_MODIFY, self.profile)
-            self.host.updateAlertsCounter() # FIXME: ?
-        else:
-            try:
-                del self._alerts[entity]
-            except KeyError:
-                return  # nothing changed
-            else:
-                self.update([entity], C.UPDATE_MODIFY, self.profile)
-            self.host.updateAlertsCounter() # FIXME: ?
-
     def showOfflineContacts(self, show):
         """Tell if offline contacts should shown