# HG changeset patch # User Goffi # Date 1529991371 -7200 # Node ID e1a385a791cc8d29205f89113028d5ee1c54c0ad # Parent 24f8ab7c08be3f4122ea0989c76a0108688cf482 plugin contact list: implemented contact addition diff -r 24f8ab7c08be -r e1a385a791cc cagou/plugins/plugin_wid_contact_list.kv --- 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._ +: + 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: + + : size_hint: None, None width: self.base_width @@ -37,6 +61,7 @@ valign: 'middle' halign: 'center' + : 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 diff -r 24f8ab7c08be -r e1a385a791cc cagou/plugins/plugin_wid_contact_list.py --- 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: