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