Mercurial > libervia-backend
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