Welcome to mirror list, hosted at ThFree Co, Russian Federation.

dev.gajim.org/gajim/gajim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlovetox <philipp@hoerist.com>2022-08-09 00:29:31 +0300
committerlovetox <philipp@hoerist.com>2022-08-09 17:48:39 +0300
commit688ff8cb2da0552c8ac754c07a945b7a23caacf6 (patch)
tree5595096a146951448268b7da49fc37f59c0874d1
parent79ae5813836c3ee511fcb550880c8d404ec6b594 (diff)
refactor: GroupchatRoster: Make it work
-rw-r--r--gajim/gtk/groupchat_roster.py95
1 files changed, 69 insertions, 26 deletions
diff --git a/gajim/gtk/groupchat_roster.py b/gajim/gtk/groupchat_roster.py
index e4806c449..3d7222f20 100644
--- a/gajim/gtk/groupchat_roster.py
+++ b/gajim/gtk/groupchat_roster.py
@@ -18,6 +18,7 @@ from typing import Any
from typing import Optional
import locale
+import logging
from enum import IntEnum
from gi.repository import Gdk
@@ -44,6 +45,9 @@ from .builder import get_builder
from .util import EventHelper
+log = logging.getLogger('gajim.gui.groupchat_roster')
+
+
AffiliationRoleSortOrder = {
'owner': 0,
'admin': 1,
@@ -61,6 +65,17 @@ class Column(IntEnum):
NICK_OR_GROUP = 4
+CONTACT_SIGNALS = {
+ 'user-affiliation-changed',
+ 'user-avatar-update',
+ 'user-joined',
+ 'user-left',
+ 'user-nickname-changed',
+ 'user-role-changed',
+ 'user-status-show-changed',
+}
+
+
class GroupchatRoster(Gtk.ScrolledWindow, EventHelper):
__gsignals__ = {
@@ -107,36 +122,33 @@ class GroupchatRoster(Gtk.ScrolledWindow, EventHelper):
])
def clear(self) -> None:
- if self._contact is not None:
- self._contact.disconnect_all_from_obj(self)
-
+ log.info('Clear')
+ if self._contact is None:
+ return
+ self._unload_roster()
+ self._contact.disconnect_signal(self, 'state-changed')
self._contact = None
- self.reset()
def switch_contact(self, contact: types.ChatContactT) -> None:
- self.clear()
+ if self._contact is not None:
+ self.clear()
if not isinstance(contact, GroupchatContact):
return
- contact.connect('user-avatar-update', self._on_user_avatar_update)
- contact.connect('user-joined', self._on_user_joined)
- contact.connect('user-left', self._on_user_left)
- contact.connect('user-affiliation-changed', self._update_contact)
- contact.connect('user-role-changed', self._update_contact)
- contact.connect('user-nickname-changed', self._on_user_nickname_changed)
- contact.connect('user-status-show-changed',
- self._on_user_status_show_changed)
+ log.info('Switch to %s (%s)', contact.jid, contact.account)
+
+ contact.connect('state-changed', self._on_muc_state_changed)
self._contact = contact
+ if self._contact.is_joined:
+ self._load_roster()
+
@staticmethod
def _on_focus_out(treeview: Gtk.TreeView, _param: Gdk.EventFocus) -> None:
treeview.get_selection().unselect_all()
- def _set_model(self) -> None:
- self._roster.set_model(self._store)
-
def _query_tooltip(self,
widget: Gtk.Widget,
x_pos: int,
@@ -393,6 +405,17 @@ class GroupchatRoster(Gtk.ScrolledWindow, EventHelper):
popover.connect('closed', destroy)
popover.popup()
+ def _on_muc_state_changed(self,
+ contact: GroupchatContact,
+ _signal_name: str
+ ) -> None:
+
+ if contact.is_joined:
+ self._load_roster()
+
+ elif contact.is_not_joined:
+ self._unload_roster()
+
def _tree_compare_iters(self,
model: Gtk.TreeModel,
iter1: Gtk.TreeIter,
@@ -436,15 +459,40 @@ class GroupchatRoster(Gtk.ScrolledWindow, EventHelper):
self._store.set_sort_column_id(column, Gtk.SortType.ASCENDING)
- def invalidate_sort(self) -> None:
- self.enable_sort(False)
- self.enable_sort(True)
+ def _load_roster(self) -> None:
+ log.info('Load Roster')
+ self._contact.multi_connect({
+ 'user-affiliation-changed': self._update_contact,
+ 'user-avatar-update': self._on_user_avatar_update,
+ 'user-joined': self._on_user_joined,
+ 'user-left': self._on_user_left,
+ 'user-nickname-changed': self._on_user_nickname_changed,
+ 'user-role-changed': self._update_contact,
+ 'user-status-show-changed': self._on_user_status_show_changed,
+ })
+
+ for participant in self._contact.get_participants():
+ self._add_contact(participant)
- def initial_draw(self) -> None:
self.enable_sort(True)
- self._set_model()
+ self._roster.set_model(self._store)
self._roster.expand_all()
+ def _unload_roster(self) -> None:
+ log.info('Unload Roster')
+ self._contact.multi_disconnect(self, CONTACT_SIGNALS)
+
+ self._roster.set_model(None)
+ self._store.clear()
+ self.enable_sort(False)
+
+ self._contact_refs = {}
+ self._group_refs = {}
+
+ def invalidate_sort(self) -> None:
+ self.enable_sort(False)
+ self.enable_sort(True)
+
def _redraw(self) -> None:
self._roster.set_model(None)
self._roster.set_model(self._store)
@@ -530,8 +578,3 @@ class GroupchatRoster(Gtk.ScrolledWindow, EventHelper):
def _on_theme_update(self, _event: ApplicationEvent) -> None:
self._redraw()
-
- def reset(self) -> None:
- self._contact_refs = {}
- self._group_refs = {}
- self._store.clear()