Skip to content
Snippets Groups Projects
Commit 627316c3 authored by Yann Leboulanger's avatar Yann Leboulanger
Browse files

improve loading of muc participand list speed by showing it only when we get...

improve loading of muc participand list speed by showing it only when we get our presence (this means we are connected). Fixes #6950
parent dcb5df4b
No related branches found
No related tags found
No related merge requests found
......@@ -418,10 +418,9 @@ class GroupchatControl(ChatControlBase):
#status_image, shown_nick, type, nickname, avatar
self.columns = [gtk.Image, str, str, str, gtk.gdk.Pixbuf]
store = gtk.TreeStore(*self.columns)
store.set_sort_func(C_NICK, self.tree_compare_iters)
store.set_sort_column_id(C_NICK, gtk.SORT_ASCENDING)
self.list_treeview.set_model(store)
self.model = gtk.TreeStore(*self.columns)
self.model.set_sort_func(C_NICK, self.tree_compare_iters)
self.model.set_sort_column_id(C_NICK, gtk.SORT_ASCENDING)
# columns
column = gtk.TreeViewColumn()
......@@ -609,14 +608,13 @@ class GroupchatControl(ChatControlBase):
"""
Iterate over all contact rows in the tree model
"""
model = self.list_treeview.get_model()
role_iter = model.get_iter_root()
role_iter = self.model.get_iter_root()
while role_iter:
contact_iter = model.iter_children(role_iter)
contact_iter = self.model.iter_children(role_iter)
while contact_iter:
yield model[contact_iter]
contact_iter = model.iter_next(contact_iter)
role_iter = model.iter_next(role_iter)
yield self.model[contact_iter]
contact_iter = self.model.iter_next(contact_iter)
role_iter = self.model.iter_next(role_iter)
def on_list_treeview_style_set(self, treeview, style):
"""
......@@ -704,8 +702,7 @@ class GroupchatControl(ChatControlBase):
model[iter_][C_NICK] = model[iter_][C_NICK]
def change_roster_style(self):
model = self.list_treeview.get_model()
model.foreach(self._change_style)
self.model.foreach(self._change_style)
def repaint_themed_widgets(self):
ChatControlBase.repaint_themed_widgets(self)
......@@ -1006,16 +1003,15 @@ class GroupchatControl(ChatControlBase):
autopopup = gajim.config.get('autopopup')
autopopupaway = gajim.config.get('autopopupaway')
iter_ = self.get_contact_iter(nick)
path = self.list_treeview.get_model().get_path(iter_)
path = self.model.get_path(iter_)
if not autopopup or (not autopopupaway and \
gajim.connections[self.account].connected > 2):
if no_queue: # We didn't have a queue: we change icons
model = self.list_treeview.get_model()
state_images = \
gajim.interface.roster.get_appropriate_state_images(
self.room_jid, icon_name='event')
image = state_images['event']
model[iter_][C_IMG] = image
self.model[iter_][C_IMG] = image
if self.parent_win:
self.parent_win.show_title()
self.parent_win.redraw_tab(self)
......@@ -1031,16 +1027,15 @@ class GroupchatControl(ChatControlBase):
gajim.interface.roster.draw_contact(self.room_jid, self.account)
def get_contact_iter(self, nick):
model = self.list_treeview.get_model()
role_iter = model.get_iter_root()
role_iter = self.model.get_iter_root()
while role_iter:
user_iter = model.iter_children(role_iter)
user_iter = self.model.iter_children(role_iter)
while user_iter:
if nick == model[user_iter][C_NICK].decode('utf-8'):
if nick == self.model[user_iter][C_NICK].decode('utf-8'):
return user_iter
else:
user_iter = model.iter_next(user_iter)
role_iter = model.iter_next(role_iter)
user_iter = self.model.iter_next(user_iter)
role_iter = self.model.iter_next(role_iter)
return None
def print_old_conversation(self, text, contact='', tim=None, xhtml = None,
......@@ -1303,6 +1298,8 @@ class GroupchatControl(ChatControlBase):
gajim.gc_connected[self.account][self.room_jid] = True
ChatControlBase.got_connected(self)
self.list_treeview.set_model(self.model)
self.list_treeview.expand_all()
# We don't redraw the whole banner here, because only icon change
self._update_banner_state_image()
if self.parent_win:
......@@ -1310,7 +1307,8 @@ class GroupchatControl(ChatControlBase):
gobject.idle_add(self.msg_textview.grab_focus)
def got_disconnected(self):
self.list_treeview.get_model().clear()
self.list_treeview.set_model(None)
self.model.clear()
nick_list = gajim.contacts.get_nick_list(self.account, self.room_jid)
for nick in nick_list:
# Update pm chat window
......@@ -1354,7 +1352,7 @@ class GroupchatControl(ChatControlBase):
return True
def draw_roster(self):
self.list_treeview.get_model().clear()
self.model.clear()
for nick in gajim.contacts.get_nick_list(self.account, self.room_jid):
gc_contact = gajim.contacts.get_gc_contact(self.account,
self.room_jid, nick)
......@@ -1387,7 +1385,6 @@ class GroupchatControl(ChatControlBase):
iter_ = self.get_contact_iter(nick)
if not iter_:
return
model = self.list_treeview.get_model()
gc_contact = gajim.contacts.get_gc_contact(self.account, self.room_jid,
nick)
state_images = gajim.interface.jabber_state_images['16']
......@@ -1434,13 +1431,12 @@ class GroupchatControl(ChatControlBase):
pixbuf2.get_property('height'), 0, 0, 1.0, 1.0,
gtk.gdk.INTERP_HYPER, 127)
image = gtk.image_new_from_pixbuf(pixbuf1)
model[iter_][C_IMG] = image
model[iter_][C_TEXT] = name
self.model[iter_][C_IMG] = image
self.model[iter_][C_TEXT] = name
def draw_avatar(self, nick):
if not gajim.config.get('show_avatars_in_roster'):
return
model = self.list_treeview.get_model()
iter_ = self.get_contact_iter(nick)
if not iter_:
return
......@@ -1450,19 +1446,18 @@ class GroupchatControl(ChatControlBase):
scaled_pixbuf = None
else:
scaled_pixbuf = gtkgui_helpers.get_scaled_pixbuf(pixbuf, 'roster')
model[iter_][C_AVATAR] = scaled_pixbuf
self.model[iter_][C_AVATAR] = scaled_pixbuf
def draw_role(self, role):
role_iter = self.get_role_iter(role)
if not role_iter:
return
model = self.list_treeview.get_model()
role_name = helpers.get_uf_role(role, plural=True)
if gajim.config.get('show_contacts_number'):
nbr_role, nbr_total = gajim.contacts.get_nb_role_total_gc_contacts(
self.account, self.room_jid, role)
role_name += ' (%s/%s)' % (repr(nbr_role), repr(nbr_total))
model[role_iter][C_TEXT] = role_name
self.model[role_iter][C_TEXT] = role_name
def draw_all_roles(self):
for role in ('visitor', 'participant', 'moderator'):
......@@ -1766,7 +1761,6 @@ class GroupchatControl(ChatControlBase):
def add_contact_to_roster(self, nick, show, role, affiliation, status,
jid=''):
model = self.list_treeview.get_model()
role_name = helpers.get_uf_role(role, plural=True)
resource = ''
......@@ -1782,11 +1776,11 @@ class GroupchatControl(ChatControlBase):
role_iter = self.get_role_iter(role)
if not role_iter:
role_iter = model.append(None,
role_iter = self.model.append(None,
[gajim.interface.jabber_state_images['16']['closed'], role,
'role', role_name, None] + [None] * self.nb_ext_renderers)
self.draw_all_roles()
iter_ = model.append(role_iter, [None, nick, 'contact', name, None] + \
iter_ = self.model.append(role_iter, [None, nick, 'contact', name, None] + \
[None] * self.nb_ext_renderers)
if not nick in gajim.contacts.get_nick_list(self.account,
self.room_jid):
......@@ -1811,26 +1805,24 @@ class GroupchatControl(ChatControlBase):
fake_jid)
if nick == self.nick: # we became online
self.got_connected()
self.list_treeview.expand_row((model.get_path(role_iter)), False)
self.list_treeview.expand_row((self.model.get_path(role_iter)), False)
if self.is_continued:
self.draw_banner_text()
return iter_
def get_role_iter(self, role):
model = self.list_treeview.get_model()
role_iter = model.get_iter_root()
role_iter = self.model.get_iter_root()
while role_iter:
role_name = model[role_iter][C_NICK].decode('utf-8')
role_name = self.model[role_iter][C_NICK].decode('utf-8')
if role == role_name:
return role_iter
role_iter = model.iter_next(role_iter)
role_iter = self.model.iter_next(role_iter)
return None
def remove_contact(self, nick):
"""
Remove a user from the contacts_list
"""
model = self.list_treeview.get_model()
iter_ = self.get_contact_iter(nick)
if not iter_:
return
......@@ -1838,10 +1830,10 @@ class GroupchatControl(ChatControlBase):
nick)
if gc_contact:
gajim.contacts.remove_gc_contact(self.account, gc_contact)
parent_iter = model.iter_parent(iter_)
model.remove(iter_)
if model.iter_n_children(parent_iter) == 0:
model.remove(parent_iter)
parent_iter = self.model.iter_parent(iter_)
self.model.remove(iter_)
if self.model.iter_n_children(parent_iter) == 0:
self.model.remove(parent_iter)
def send_message(self, message, xhtml=None, process_commands=True):
"""
......@@ -2296,8 +2288,7 @@ class GroupchatControl(ChatControlBase):
"""
Make contact's popup menu
"""
model = self.list_treeview.get_model()
nick = model[iter_][C_NICK].decode('utf-8')
nick = self.model[iter_][C_NICK].decode('utf-8')
c = gajim.contacts.get_gc_contact(self.account, self.room_jid, nick)
fjid = self.room_jid + '/' + nick
jid = c.jid
......@@ -2419,7 +2410,7 @@ class GroupchatControl(ChatControlBase):
item2.hide()
item = xml.get_object('send_private_message_menuitem')
id_ = item.connect('activate', self.on_send_pm, model, iter_)
id_ = item.connect('activate', self.on_send_pm, self.model, iter_)
self.handlers[id_] = item
item = xml.get_object('send_file_menuitem')
......@@ -2458,14 +2449,13 @@ class GroupchatControl(ChatControlBase):
When an iter is activated (dubblick or single click if gnome is set this
way
"""
model = widget.get_model()
if len(path) == 1: # It's a group
if (widget.row_expanded(path)):
widget.collapse_row(path)
else:
widget.expand_row(path, False)
else: # We want to send a private message
nick = model[path][C_NICK].decode('utf-8')
nick = self.model[path][C_NICK].decode('utf-8')
self._start_private_message(nick)
def on_list_treeview_row_activated(self, widget, path, col=0):
......@@ -2489,18 +2479,16 @@ class GroupchatControl(ChatControlBase):
return
if event.button == 3: # right click
widget.get_selection().select_path(path)
model = widget.get_model()
iter_ = model.get_iter(path)
iter_ = self.model.get_iter(path)
if len(path) == 2:
self.mk_menu(event, iter_)
return True
elif event.button == 2: # middle click
widget.get_selection().select_path(path)
model = widget.get_model()
iter_ = model.get_iter(path)
iter_ = self.model.get_iter(path)
if len(path) == 2:
nick = model[iter_][C_NICK].decode('utf-8')
nick = self.model[iter_][C_NICK].decode('utf-8')
self._start_private_message(nick)
return True
......@@ -2509,9 +2497,8 @@ class GroupchatControl(ChatControlBase):
self.on_row_activated(widget, path)
return True
else:
model = widget.get_model()
iter_ = model.get_iter(path)
nick = model[iter_][C_NICK].decode('utf-8')
iter_ = self.model.get_iter(path)
nick = self.model[iter_][C_NICK].decode('utf-8')
if not nick in gajim.contacts.get_nick_list(self.account,
self.room_jid):
# it's a group
......@@ -2542,7 +2529,6 @@ class GroupchatControl(ChatControlBase):
message_buffer.insert_at_cursor(start + nick + add)
def on_list_treeview_motion_notify_event(self, widget, event):
model = widget.get_model()
props = widget.get_path_at_pos(int(event.x), int(event.y))
if self.tooltip.timeout > 0:
if not props or self.tooltip.id != props[0]:
......@@ -2551,17 +2537,17 @@ class GroupchatControl(ChatControlBase):
[row, col, x, y] = props
iter_ = None
try:
iter_ = model.get_iter(row)
iter_ = self.model.get_iter(row)
except Exception:
self.tooltip.hide_tooltip()
return
typ = model[iter_][C_TYPE].decode('utf-8')
typ = self.model[iter_][C_TYPE].decode('utf-8')
if typ == 'contact':
account = self.account
if self.tooltip.timeout == 0 or self.tooltip.id != props[0]:
self.tooltip.id = row
nick = model[iter_][C_NICK].decode('utf-8')
nick = self.model[iter_][C_NICK].decode('utf-8')
self.tooltip.timeout = gobject.timeout_add(500,
self.show_tooltip, gajim.contacts.get_gc_contact(
account, self.room_jid, nick))
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment