changeset 221:e1a385a791cc

plugin contact list: implemented contact addition
author Goffi <goffi@goffi.org>
date Tue, 26 Jun 2018 07:36:11 +0200
parents 24f8ab7c08be
children a676cb07c1cb
files cagou/plugins/plugin_wid_contact_list.kv cagou/plugins/plugin_wid_contact_list.py
diffstat 2 files changed, 74 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/cagou/plugins/plugin_wid_contact_list.kv	Tue Jun 26 07:11:16 2018 +0200
+++ b/cagou/plugins/plugin_wid_contact_list.kv	Tue Jun 26 07:36:11 2018 +0200
@@ -16,6 +16,30 @@
 
 #:import _ sat.core.i18n._
 
+<AddContactMenu>:
+    padding: dp(20)
+    spacing: dp(10)
+    Label:
+        size_hint: 1, None
+        color: 1, 1, 1, 1
+        text: root.instructions
+        text_size: root.width, None
+        size: self.texture_size
+        halign: "center"
+        bold: True
+    TextInput:
+        id: contact_jid
+        size_hint: 1, None
+        height: sp(30)
+        hint_text: _("enter here your new contact JID")
+    Button:
+        size_hint: 1, None
+        height: sp(50)
+        text: _("add this contact")
+        on_release: root.addContact(contact_jid.text)
+    Widget:
+
+
 <ContactItem>:
     size_hint: None, None
     width: self.base_width
@@ -37,6 +61,7 @@
         valign: 'middle'
         halign: 'center'
 
+
 <ContactList>:
     float_layout: float_layout
     layout: layout
@@ -48,6 +73,7 @@
         SymbolLabel:
             symbol: 'plus-circled'
             text: _("add a contact")
+            on_release: root.addContactMenu()
         Widget:
     FloatLayout:
         id: float_layout
--- a/cagou/plugins/plugin_wid_contact_list.py	Tue Jun 26 07:11:16 2018 +0200
+++ b/cagou/plugins/plugin_wid_contact_list.py	Tue Jun 26 07:36:11 2018 +0200
@@ -27,12 +27,15 @@
 from kivy.uix.boxlayout import BoxLayout
 from kivy.uix.behaviors import ButtonBehavior
 from cagou.core.utils import FilterBehavior
+from cagou.core.menu import SideMenu
 from kivy.metrics import dp
 from kivy import properties
 from cagou.core import cagou_widget
 from cagou.core import image
 from cagou import G
+from functools import partial
 import bisect
+import re
 
 
 PLUGIN_INFO = {
@@ -43,12 +46,47 @@
 }
 
 
+class AddContactMenu(SideMenu):
+    profile = properties.StringProperty()
+    instructions = properties.StringProperty(_(u"Please enter new contact JID"))
+    size_hint_close = (1, 0)
+    size_hint_open = (1, 0.5)
+
+    def __init__(self, **kwargs):
+        super(AddContactMenu, self).__init__(**kwargs)
+        if self.profile is None:
+            log.warning(_(u"profile not set in AddContactMenu"))
+            self.profile = next(iter(G.host.profiles))
+
+    def addContact(self, contact_jid):
+        """Actually add the contact
+
+        @param contact_jid(unicode): jid of the contact to add
+        """
+        contact_jid = contact_jid.strip()
+        # FIXME: trivial jid verification
+        if not contact_jid or not re.match(r"[^@ ]+@[^@ ]+", contact_jid):
+            return
+        contact_jid = jid.JID(contact_jid).bare
+        G.host.bridge.addContact(contact_jid,
+            self.profile,
+            callback=lambda: G.host.addNote(
+                _(u"contact request"),
+                _(u"a contact request has been sent to {contact_jid}").format(
+                    contact_jid=contact_jid)),
+            errback=partial(G.host.errback,
+                title=_(u"can't add contact"),
+                message=_(u"error while trying to add contact: {msg}")))
+        self.hide()
+
+
 class Avatar(image.Image):
     pass
 
 
 class ContactItem(ButtonBehavior, BoxLayout):
     base_width = dp(150)
+    profile = properties.StringProperty()
     data = properties.DictProperty()
     jid = properties.StringProperty('')
 
@@ -56,6 +94,7 @@
         super(ContactItem, self).__init__(**kwargs)
 
     def on_release(self):
+        assert self.profile
         # XXX: for now clicking on an item launch the corresponding Chat widget
         #      behaviour should change in the future
         try:
@@ -69,7 +108,7 @@
             factory = plg_infos['factory']
             G.host.switchWidget(self, factory(plg_infos,
                                               jid.JID(self.jid),
-                                              profiles=iter(G.host.profiles)))
+                                              profiles=[self.profile]))
 
 
 class ContactList(QuickContactList, cagou_widget.CagouWidget, FilterBehavior):
@@ -86,6 +125,12 @@
             raise NotImplementedError('multi profiles is not implemented yet')
         self.update(profile=next(iter(self.profiles)))
 
+    def addContactMenu(self):
+        """Show the "add a contact" menu"""
+        # FIXME: for now we add contact to the first profile we find
+        profile = next(iter(self.profiles))
+        AddContactMenu(profile=profile).show()
+
     def onHeaderInputComplete(self, wid, text):
         self.do_filter(self.layout.children,
                        text,
@@ -102,7 +147,7 @@
         @param profile(unicode): profile where the contact is
         """
         data = G.host.contact_lists[profile].getItem(bare_jid)
-        wid = ContactItem(data=data, jid=bare_jid)
+        wid = ContactItem(profile=profile, data=data, jid=bare_jid)
         child_jids = [c.jid for c in reversed(self.layout.children)]
         idx = bisect.bisect_right(child_jids, bare_jid)
         self.layout.add_widget(wid, -idx)
@@ -114,7 +159,7 @@
             log.debug("full contact list update")
             self.layout.clear_widgets()
             for bare_jid, data in self.items_sorted.iteritems():
-                wid = ContactItem(data=data, jid=bare_jid)
+                wid = ContactItem(profile=profile, data=data, jid=bare_jid)
                 self.layout.add_widget(wid)
                 self._wid_map[(profile, bare_jid)] = wid
         elif type_ == C.UPDATE_MODIFY: