[modelfilter]

-Always use self.modelfilter instead of self.tree.get_model()
-filter twice to show groups with no contacts inside in the correct expand state when showingOfflines. ( We
can't expand the group before we filter, and we need to filter to effectively show tree expand state in model )
-UNSURE : call _adjust_group_expand_collapse_state() only if filtering in on_model_row_has_child_toggled(). That
seems sufficient and when not filtering, it works better with :
-when contact change status, don't refilter, only adjust group row state. Steve-e, do we need to filter in a
case I don't see ?
-in visible_func : Don't initialize 'accounts' var if not needed
-Don't draw anything in add_contact(), that seems to be done somewhere else anyway
This commit is contained in:
Jean-Marie Traissard 2008-04-29 22:07:59 +00:00
parent 24b396b4a8
commit cc97c3ce7b
1 changed files with 43 additions and 54 deletions

View File

@ -85,7 +85,7 @@ class RosterWindow:
''' '''
if not model: if not model:
model = self.tree.get_model() model = self.modelfilter
if model is None: if model is None:
return return
account_iter = model.get_iter_root() account_iter = model.get_iter_root()
@ -109,7 +109,7 @@ class RosterWindow:
''' '''
if not model: if not model:
model = self.tree.get_model() model = self.modelfilter
root = self._get_account_iter(account, model) root = self._get_account_iter(account, model)
group_iter = model.iter_children(root) group_iter = model.iter_children(root)
# C_NAME column contacts the pango escaped group name # C_NAME column contacts the pango escaped group name
@ -131,7 +131,7 @@ class RosterWindow:
''' '''
if not model: if not model:
model = self.tree.get_model() model = self.modelfilter
iterAcct = self._get_account_iter(account, model) iterAcct = self._get_account_iter(account, model)
iter = model.iter_children(iterAcct) iter = model.iter_children(iterAcct)
if iter and model[iter][C_TYPE] == 'self_contact': if iter and model[iter][C_TYPE] == 'self_contact':
@ -149,7 +149,7 @@ class RosterWindow:
''' '''
if not model: if not model:
model = self.tree.get_model() model = self.modelfilter
if jid == gajim.get_jid_from_account(account): if jid == gajim.get_jid_from_account(account):
iter = self._get_self_contact_iter(account, model) iter = self._get_self_contact_iter(account, model)
if iter: if iter:
@ -214,7 +214,7 @@ class RosterWindow:
model -- the data model (default TreeFilterModel) model -- the data model (default TreeFilterModel)
''' '''
if not model: if not model:
model = self.tree.get_model() model = self.modelfilter
account_iter = model.get_iter_root() account_iter = model.get_iter_root()
while account_iter: while account_iter:
group_iter = model.iter_children(account_iter) group_iter = model.iter_children(account_iter)
@ -556,10 +556,9 @@ class RosterWindow:
def add_contact(self, jid, account): def add_contact(self, jid, account):
'''Add contact to roster and draw him. '''Add contact to roster
Add contact to all its group and redraw the groups, the contact and the Add contact to all its group. If it's a Metacontact, add the whole family.
account. If it's a Metacontact, add and draw the whole family.
Do nothing if the contact is already in roster. Do nothing if the contact is already in roster.
Return the added contact instance. If it is a Metacontact return Return the added contact instance. If it is a Metacontact return
@ -603,22 +602,6 @@ class RosterWindow:
contacts = [(contact, account),] contacts = [(contact, account),]
self._add_entity(contact, account) self._add_entity(contact, account)
# Draw the contact and its groups contact
if contact.is_transport():
contact.groups = [_('Transports')]
if is_observer:
contact.groups = [_('Observers')]
groups = contact.groups
if not groups:
groups = [_('General')]
if not self.starting:
for c, acc in contacts:
self.draw_contact(c.jid, acc)
self.draw_avatar(c.jid, acc)
for group in groups:
self.draw_group(group, account)
self.draw_account(account)
return contacts[0][0] # it's contact/big brother with highest priority return contacts[0][0] # it's contact/big brother with highest priority
@ -1119,10 +1102,10 @@ class RosterWindow:
groups = [_('General')] groups = [_('General')]
for group in groups: for group in groups:
self.draw_group(group, account) self.draw_group(group, account)
self._adjust_group_expand_collapse_state(group, account)
self.draw_account(account) self.draw_account(account)
self.draw_contact(jid, account) self.draw_contact(jid, account)
self.refilter_shown_roster_items()
def _idle_draw_jids_of_account(self, jids, account): def _idle_draw_jids_of_account(self, jids, account):
'''Draw given contacts and their avatars in a lazy fashion. '''Draw given contacts and their avatars in a lazy fashion.
@ -1167,7 +1150,7 @@ class RosterWindow:
if not iters: if not iters:
# Not visible in roster # Not visible in roster
return return
path = self.tree.get_model().get_path(iters[0]) path = self.modelfilter.get_path(iters[0])
if self.dragging or not gajim.config.get('scroll_roster_to_last_message'): if self.dragging or not gajim.config.get('scroll_roster_to_last_message'):
# do not change selection while DND'ing # do not change selection while DND'ing
return return
@ -1254,23 +1237,24 @@ class RosterWindow:
return False return False
account = account.decode('utf-8') account = account.decode('utf-8')
if self.regroup:
# C_ACCOUNT for groups depends on the order
# accounts were connected
# Check all accounts for online group contacts
accounts = gajim.contacts.get_accounts()
else:
accounts = [account]
jid = model[iter][C_JID] jid = model[iter][C_JID]
if not jid: if not jid:
return False return False
jid = jid.decode('utf-8') jid = jid.decode('utf-8')
if type_ == 'group': if type_ == 'group':
group = jid group = jid
if group == _('Transports'): if group == _('Transports'):
return gajim.config.get('show_transports_group') return gajim.config.get('show_transports_group')
if gajim.config.get('showoffline'):
return True
if self.regroup:
# C_ACCOUNT for groups depends on the order
# accounts were connected
# Check all accounts for online group contacts
accounts = gajim.contacts.get_accounts()
else:
accounts = [account]
for _acc in accounts: for _acc in accounts:
for contact in gajim.contacts.iter_contacts(_acc): for contact in gajim.contacts.iter_contacts(_acc):
# Is this contact in this group ? # Is this contact in this group ?
@ -1692,7 +1676,7 @@ class RosterWindow:
_('Now "%s" will always see you as offline.') %jid) _('Now "%s" will always see you as offline.') %jid)
def set_connecting_state(self, account): def set_connecting_state(self, account):
model = self.tree.get_model() model = self.modelfilter
child_model = model.get_model() child_model = model.get_model()
IterA = self._get_account_iter(account) IterA = self._get_account_iter(account)
if IterA: if IterA:
@ -1703,7 +1687,7 @@ class RosterWindow:
gajim.interface.systray.change_status('connecting') gajim.interface.systray.change_status('connecting')
def send_status(self, account, status, txt, auto = False, to = None): def send_status(self, account, status, txt, auto = False, to = None):
model = self.tree.get_model() model = self.modelfilter
child_model = model.get_model() child_model = model.get_model()
iterA = self._get_account_iter(account) iterA = self._get_account_iter(account)
if status != 'offline': if status != 'offline':
@ -2412,7 +2396,7 @@ class RosterWindow:
def on_block(self, widget, iter, group_list): def on_block(self, widget, iter, group_list):
''' When clicked on the 'block' button in context menu. ''' ''' When clicked on the 'block' button in context menu. '''
model = self.tree.get_model() model = self.modelfilter
accounts = [] accounts = []
msg = self.get_status_message('offline') msg = self.get_status_message('offline')
if group_list is None: if group_list is None:
@ -2466,7 +2450,7 @@ class RosterWindow:
def on_unblock(self, widget, iter, group_list): def on_unblock(self, widget, iter, group_list):
''' When clicked on the 'unblock' button in context menu. ''' ''' When clicked on the 'unblock' button in context menu. '''
model = self.tree.get_model() model = self.modelfilter
accounts = [] accounts = []
if group_list is None: if group_list is None:
jid = model[iter][C_JID].decode('utf-8') jid = model[iter][C_JID].decode('utf-8')
@ -2561,7 +2545,7 @@ class RosterWindow:
if gajim.interface.instances.has_key('rename'): if gajim.interface.instances.has_key('rename'):
gajim.interface.instances['rename'].dialog.present() gajim.interface.instances['rename'].dialog.present()
return return
model = self.tree.get_model() model = self.modelfilter
row_type = model[iter][C_TYPE] row_type = model[iter][C_TYPE]
jid = model[iter][C_JID].decode('utf-8') jid = model[iter][C_JID].decode('utf-8')
@ -2982,7 +2966,7 @@ class RosterWindow:
return True return True
elif event.button == 1: # Left click elif event.button == 1: # Left click
model = self.tree.get_model() model = self.modelfilter
type_ = model[path][C_TYPE] type_ = model[path][C_TYPE]
# x_min is the x start position of status icon column # x_min is the x start position of status icon column
if gajim.config.get('avatar_position_in_roster') == 'left': if gajim.config.get('avatar_position_in_roster') == 'left':
@ -3325,7 +3309,7 @@ class RosterWindow:
def on_row_activated(self, widget, path): def on_row_activated(self, widget, path):
'''When an iter is activated (dubblick or single click if gnome is set '''When an iter is activated (dubblick or single click if gnome is set
this way''' this way'''
model = self.tree.get_model() model = self.modelfilter
account = model[path][C_ACCOUNT].decode('utf-8') account = model[path][C_ACCOUNT].decode('utf-8')
type_ = model[path][C_TYPE] type_ = model[path][C_TYPE]
jid = model[path][C_JID].decode('utf-8') jid = model[path][C_JID].decode('utf-8')
@ -3480,7 +3464,6 @@ class RosterWindow:
# We just added the account to roster and it got its first contacts # We just added the account to roster and it got its first contacts
# Restore expand collapse state # Restore expand collapse state
self._adjust_account_expand_collapse_state(account) self._adjust_account_expand_collapse_state(account)
elif type_ == 'contact' and self.model.iter_has_child(child_iter): elif type_ == 'contact' and self.model.iter_has_child(child_iter):
# we are a bigbrother metacontact # we are a bigbrother metacontact
# redraw us to show/hide expand icon # redraw us to show/hide expand icon
@ -3489,8 +3472,9 @@ class RosterWindow:
jid = model[iter][C_JID].decode('utf-8') jid = model[iter][C_JID].decode('utf-8')
gobject.idle_add(self.draw_contact, jid, account) gobject.idle_add(self.draw_contact, jid, account)
elif type_ == 'group': elif type_ == 'group':
group = model[iter][C_JID].decode('utf-8') if self.filtering:
self._adjust_group_expand_collapse_state(group, account) group = model[iter][C_JID].decode('utf-8')
self._adjust_group_expand_collapse_state(group, account)
def on_treeview_selection_changed(self, selection): def on_treeview_selection_changed(self, selection):
'''Called when selection in TreeView has changed. '''Called when selection in TreeView has changed.
@ -3538,6 +3522,11 @@ class RosterWindow:
redraw the treeview''' redraw the treeview'''
gajim.config.set('showoffline', not gajim.config.get('showoffline')) gajim.config.set('showoffline', not gajim.config.get('showoffline'))
self.refilter_shown_roster_items() self.refilter_shown_roster_items()
if gajim.config.get('showoffline'):
# We need to filter twice to show groups with no contacts inside
# in the correct expand state
self.refilter_shown_roster_items()
def on_view_menu_activate(self, widget): def on_view_menu_activate(self, widget):
# Hide the show roster menu if we are not in the right windowing mode. # Hide the show roster menu if we are not in the right windowing mode.
@ -3938,7 +3927,7 @@ class RosterWindow:
def set_account_status_icon(self, account): def set_account_status_icon(self, account):
status = gajim.connections[account].connected status = gajim.connections[account].connected
model = self.tree.get_model() model = self.modelfilter
child_model = model.get_model() child_model = model.get_model()
iterA = self._get_account_iter(account) iterA = self._get_account_iter(account)
if not iterA: if not iterA:
@ -3989,7 +3978,7 @@ class RosterWindow:
model[iter][C_NAME] = model[iter][C_NAME] model[iter][C_NAME] = model[iter][C_NAME]
def change_roster_style(self, option): def change_roster_style(self, option):
model = self.tree.get_model() model = self.modelfilter
child_model = model.get_model() child_model = model.get_model()
child_model.foreach(self._change_style, option) child_model.foreach(self._change_style, option)
for win in gajim.interface.msg_win_mgr.windows(): for win in gajim.interface.msg_win_mgr.windows():
@ -4650,7 +4639,7 @@ class RosterWindow:
def make_account_menu(self, event, iter): def make_account_menu(self, event, iter):
'''Make account's popup menu''' '''Make account's popup menu'''
model = self.tree.get_model() model = self.modelfilter
account = model[iter][C_ACCOUNT].decode('utf-8') account = model[iter][C_ACCOUNT].decode('utf-8')
if account != 'all': # not in merged mode if account != 'all': # not in merged mode
@ -4682,7 +4671,7 @@ class RosterWindow:
def make_group_menu(self, event, iter): def make_group_menu(self, event, iter):
'''Make group's popup menu''' '''Make group's popup menu'''
model = self.tree.get_model() model = self.modelfilter
path = model.get_path(iter) path = model.get_path(iter)
group = model[iter][C_JID].decode('utf-8') group = model[iter][C_JID].decode('utf-8')
account = model[iter][C_ACCOUNT].decode('utf-8') account = model[iter][C_ACCOUNT].decode('utf-8')
@ -4836,7 +4825,7 @@ class RosterWindow:
def make_contact_menu(self, event, iter): def make_contact_menu(self, event, iter):
'''Make contact\'s popup menu''' '''Make contact\'s popup menu'''
model = self.tree.get_model() model = self.modelfilter
jid = model[iter][C_JID].decode('utf-8') jid = model[iter][C_JID].decode('utf-8')
tree_path = model.get_path(iter) tree_path = model.get_path(iter)
account = model[iter][C_ACCOUNT].decode('utf-8') account = model[iter][C_ACCOUNT].decode('utf-8')
@ -5165,7 +5154,7 @@ class RosterWindow:
def make_multiple_contact_menu(self, event, iters): def make_multiple_contact_menu(self, event, iters):
'''Make group's popup menu''' '''Make group's popup menu'''
model = self.tree.get_model() model = self.modelfilter
list_ = [] # list of (jid, account) tuples list_ = [] # list of (jid, account) tuples
one_account_offline = False one_account_offline = False
is_blocked = True is_blocked = True
@ -5262,7 +5251,7 @@ class RosterWindow:
def make_transport_menu(self, event, iter): def make_transport_menu(self, event, iter):
'''Make transport\'s popup menu''' '''Make transport\'s popup menu'''
model = self.tree.get_model() model = self.modelfilter
jid = model[iter][C_JID].decode('utf-8') jid = model[iter][C_JID].decode('utf-8')
path = model.get_path(iter) path = model.get_path(iter)
account = model[iter][C_ACCOUNT].decode('utf-8') account = model[iter][C_ACCOUNT].decode('utf-8')
@ -5399,7 +5388,7 @@ class RosterWindow:
menu.popup(None, None, None, event_button, event.time) menu.popup(None, None, None, event_button, event.time)
def make_groupchat_menu(self, event, iter): def make_groupchat_menu(self, event, iter):
model = self.tree.get_model() model = self.modelfilter
path = model.get_path(iter) path = model.get_path(iter)
jid = model[iter][C_JID].decode('utf-8') jid = model[iter][C_JID].decode('utf-8')
@ -5628,7 +5617,7 @@ class RosterWindow:
def show_appropriate_context_menu(self, event, iters): def show_appropriate_context_menu(self, event, iters):
# iters must be all of the same type # iters must be all of the same type
model = self.tree.get_model() model = self.modelfilter
type_ = model[iters[0]][C_TYPE] type_ = model[iters[0]][C_TYPE]
for iter in iters[1:]: for iter in iters[1:]:
if model[iter][C_TYPE] != type_: if model[iter][C_TYPE] != type_: