# HG changeset patch # User Goffi # Date 1581288449 -3600 # Node ID 54f6a47cc60a9c94b0dceeb8a2b9ccd399b41246 # Parent ae6f7fd1cb0ed18969a658c150b76f4fe4cd721e core (common): added a notifications counter on ContactButton and use it in JidSelector: A notifications counter is drawned above avatar if `nofifs` key is present and not empty in `data`. This is used in JidSelector to show counter when necessary with opened chats. diff -r ae6f7fd1cb0e -r 54f6a47cc60a cagou/core/common.py --- a/cagou/core/common.py Sun Feb 09 23:47:29 2020 +0100 +++ b/cagou/core/common.py Sun Feb 09 23:47:29 2020 +0100 @@ -49,16 +49,32 @@ pass +class NotifLabel(Label): + pass + + class ContactItem(BoxLayout): """An item from ContactList - The item will drawn as an icon (JID avatar) with its jid below + The item will drawn as an icon (JID avatar) with its jid below. + If "notifs" are present in data, a notification counter will be drawn above the + avatar. """ base_width = dp(150) + avatar_layout = properties.ObjectProperty() + avatar = properties.ObjectProperty() profile = properties.StringProperty() data = properties.DictProperty() jid = properties.StringProperty('') + def on_kv_post(self, __): + if self.data and self.data.get('notifs'): + notif = NotifLabel( + pos_hint={"right": 0.8, "y": 0}, + text=str(len(self.data['notifs'])) + ) + self.avatar_layout.add_widget(notif) + class ContactButton(ButtonBehavior, ContactItem): pass @@ -225,10 +241,18 @@ for wid in opened_chats: contact_list = G.host.contact_lists[wid.profile] + data=contact_list.getItem(wid.target) + notifs = list(G.host.getNotifs(wid.target, profile=wid.profile)) + if notifs: + # we shallow copy the dict to have the notification displayed only with + # opened chats (otherwise, the counter would appear on each other + # instance of ContactButton for this entity, i.e. in roster too). + data = data.copy() + data['notifs'] = notifs try: item = ContactButton( jid=wid.target, - data=contact_list.getItem(wid.target), + data=data, profile=wid.profile, ) except Exception as e: diff -r ae6f7fd1cb0e -r 54f6a47cc60a cagou/kv/common.kv --- a/cagou/kv/common.kv Sun Feb 09 23:47:29 2020 +0100 +++ b/cagou/kv/common.kv Sun Feb 09 23:47:29 2020 +0100 @@ -15,26 +15,51 @@ # along with this program. If not, see . +: + background_color: 1, 0, 0, 1 + size_hint: None, None + text_size: None, root.height + padding_x: sp(5) + size: self.texture_size + bold: True + canvas.before: + Color: + rgba: root.background_color + Ellipse: + size: self.size + pos: self.pos + + : size_hint: None, None width: self.base_width height: self.minimum_height orientation: 'vertical' - Avatar: - id: avatar + avatar: avatar + avatar_layout: avatar_layout + FloatLayout: + id: avatar_layout size_hint: 1, None height: dp(60) - source: root.data.get('avatar') or app.default_avatar - allow_stretch: True - Label: - id: jid_label - size_hint: None, None - text_size: root.base_width, None - size: self.texture_size - text: root.data.get('nick', root.jid.node or root.jid) - bold: True - valign: 'middle' - halign: 'center' + Avatar: + id: avatar + pos_hint: {'x': 0, 'y': 0} + source: root.data.get('avatar') or app.default_avatar + allow_stretch: True + BoxLayout: + id: label_box + size_hint: 1, None + height: self.minimum_height + Label: + size_hint: 1, None + height: self.font_size + sp(5) + text_size: self.size + shorten: True + shorten_from: "right" + text: root.data.get('nick', root.jid.node or root.jid) + bold: True + valign: 'middle' + halign: 'center' :