def resort(self, mock = False): assert on_thread('sorter').now rootgroups = [display_copy(g) for g in self.rootgroups if isinstance(g, GroupTypes)] self.personalities = self.track_personalities(rootgroups) metacontacts = self.safe_metacontacts(rootgroups) # Always collect metacontacts, but exit early here if sorting is paused. if self.sorting_paused:# or not profile.prefs_loaded: return metrics.event('Buddylist Sort') self._setup_blist_sorter() # invalidate all sorter knowledge of contacts. # results in more CPU usage, but until we put metacontact combining into the sorter # this might be necessary. self.new_sorter.removeAllContacts() newroots = rootgroups[:] + [metacontacts] for i, root in enumerate(newroots): root.name = "Root" + str(i) root._root = True root = DGroup('none', [], [], newroots) if mock: self.mock_root = make_mocklist(root) self.new_sorter.set_root(root) view = get_view_from_sorter(self.new_sorter) if getattr(self, '_search_by', ''): if len(view) > 0: contacts_group = view[0] # don't allow renaming, etc of the search "Contacts" group contacts_group._disallow_actions = True num_contacts = len(contacts_group) else: num_contacts = -1 self._search_results = self._search_results[1], num_contacts else: if pref('buddylist.hide_offline_dependant', False, bool): hide_offline_groups = not pref('buddylist.show_offline') and pref('buddylist.hide_offline_groups') else: hide_offline_groups = pref('buddylist.hide_offline_groups') if hide_offline_groups: view[:] = filter((lambda g: not offline_nonempty_group_re.match(g.display_string)), view) for g in view: remove_duplicate_contacts(g) self.add_search_entries(view) hooks.notify('buddylist.sorted', view) return view
def use_sorter(self, sorter): rootgroups = [display_copy(g) for g in self.rootgroups if isinstance(g, GroupTypes)] newroots = rootgroups[:] + [self.safe_metacontacts(rootgroups, use_cached=True)] for i, root in enumerate(newroots): root.name = "Root" + str(i) root._root = True root = DGroup('none', [], [], newroots) sorter.set_root(root) view = get_view_from_sorter(sorter) for g in view: remove_duplicate_contacts(g) return view