From 565f601258c4aaa0b2ee4cedd433d79af0234526 Mon Sep 17 00:00:00 2001 From: lovetox <philipp@hoerist.com> Date: Fri, 19 Mar 2021 21:37:19 +0100 Subject: [PATCH] Refactor ContactInfo --- gajim/data/gui/contact_info.ui | 10 ++---- gajim/gtk/contact_info.py | 58 +++++++++++++++++++++++----------- 2 files changed, 43 insertions(+), 25 deletions(-) diff --git a/gajim/data/gui/contact_info.ui b/gajim/data/gui/contact_info.ui index f4906eabea..ce2156cab1 100644 --- a/gajim/data/gui/contact_info.ui +++ b/gajim/data/gui/contact_info.ui @@ -490,16 +490,13 @@ <property name="model">groups_model</property> <property name="headers-visible">False</property> <child internal-child="selection"> - <object class="GtkTreeSelection"> - <signal name="changed" handler="_on_group_selection_changed" swapped="no"/> - </object> + <object class="GtkTreeSelection" id="tree_selection"/> </child> <child> <object class="GtkTreeViewColumn"> <child> - <object class="GtkCellRendererToggle"> + <object class="GtkCellRendererToggle" id="toggle_renderer"> <property name="xpad">12</property> - <signal name="toggled" handler="_on_group_toggled" swapped="no"/> </object> <attributes> <attribute name="active">0</attribute> @@ -512,10 +509,9 @@ <property name="title" translatable="yes">column</property> <property name="sort-column-id">1</property> <child> - <object class="GtkCellRendererText"> + <object class="GtkCellRendererText" id="text_renderer"> <property name="height">42</property> <property name="editable">True</property> - <signal name="edited" handler="_on_group_name_edited" swapped="no"/> </object> <attributes> <attribute name="text">1</attribute> diff --git a/gajim/gtk/contact_info.py b/gajim/gtk/contact_info.py index 1715cce27f..618ae9ec42 100644 --- a/gajim/gtk/contact_info.py +++ b/gajim/gtk/contact_info.py @@ -38,6 +38,7 @@ from .dialogs import DialogButton from .sidebar_switcher import SideBarSwitcher from .util import get_builder +from .util import connect_destroy from .vcard_grid import VCardGrid log = logging.getLogger('gajim.gui.contact_info') @@ -92,14 +93,17 @@ def __init__(self, account, contact, page=None, anonymous=False): self._fill_settings_page() self._fill_groups_page() + self._tasks = [] + # pylint: disable=line-too-long self.register_events([ - ('time-result-received', ged.GUI1, self._set_entity_time), ('subscribed-presence-received', ged.GUI1, self._on_subscribed_presence_received), ('unsubscribed-presence-received', ged.GUI1, self._on_unsubscribed_presence_received), ]) # pylint: enable=line-too-long + self._load_avatar() + self._ui.contact_name_label.set_text(contact.name) if contact.is_pm_contact: self._ui.role_label.set_text(get_uf_role(contact.role)) @@ -131,6 +135,16 @@ def __init__(self, account, contact, page=None, anonymous=False): self.connect('key-press-event', self._on_key_press) self.connect('destroy', self._on_destroy) + connect_destroy(self._ui.tree_selection, + 'changed', + self._on_group_selection_changed) + connect_destroy(self._ui.toggle_renderer, + 'toggled', + self._on_group_toggled) + connect_destroy(self._ui.text_renderer, + 'edited', + self._on_group_name_edited) + self.add(self._ui.main_grid) self.show_all() @@ -145,6 +159,10 @@ def _on_stack_child_changed(self, *args): self._ui.header_revealer.set_reveal_child(True) def _on_destroy(self, _widget): + for task in self._tasks: + task.cancel() + self._tasks.clear() + if not self.contact.is_pm_contact: self._save_annotation() @@ -152,7 +170,7 @@ def _on_destroy(self, _widget): GLib.source_remove(self._update_timeout_id) self.unregister_events() - app.cancel_tasks(self) + app.check_finalize(self) def _save_annotation(self): buffer_ = self._ui.textview_annotation.get_buffer() @@ -183,7 +201,6 @@ def _on_vcard_received(self, task): vcard = VCard() self._vcard_grid.set_vcard(vcard) - self._load_avatar() def _load_avatar(self): scale = self.get_scale_factor() @@ -210,16 +227,21 @@ def _query_device(self, contact): } self._rebuild_devices_grid() - self._client.get_module('SoftwareVersion').request_software_version( + task = self._client.get_module('SoftwareVersion').request_software_version( contact.jid, callback=self._set_os_info, user_data=contact) - self._client.get_module('EntityTime').request_entity_time( - str(contact.jid.bare), contact.jid.resource) + self._tasks.append(task) + + task = self._client.get_module('EntityTime').request_entity_time( + contact.jid, callback=self._set_entity_time, user_data=contact) + self._tasks.append(task) def _set_os_info(self, task): + self._tasks.remove(task) + try: result = task.finish() - except StanzaError as err: - log.info('Could not retrieve software version: %s', err) + except Exception as err: + log.warning('Could not retrieve software version: %s', err) return contact = task.get_user_data() @@ -230,19 +252,19 @@ def _set_os_info(self, task): self._received_devices.add(contact.jid.resource) self._rebuild_devices_grid() - def _set_entity_time(self, event): - if event.conn.name != self.account: + def _set_entity_time(self, task): + self._tasks.remove(task) + + try: + entity_time = task.finish() + except Exception as err: + log.warning('Could not retrieve entity time: %s', err) return - if self.contact.is_pm_contact: - if event.jid != self.contact.jid: - return - else: - if event.jid.bare != self.contact.jid: - return + contact = task.get_user_data() - self._devices[event.jid.resource]['time'] = event.time_info - self._received_times.add(event.jid.resource) + self._devices[contact.jid.resource]['time'] = entity_time + self._received_times.add(contact.jid.resource) self._rebuild_devices_grid() def _rebuild_devices_grid(self): -- GitLab