summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/roster.py61
-rw-r--r--src/windows.py3
2 files changed, 45 insertions, 19 deletions
diff --git a/src/roster.py b/src/roster.py
index 56c65d8f..84771678 100644
--- a/src/roster.py
+++ b/src/roster.py
@@ -198,12 +198,37 @@ class Roster(object):
except IOError:
return
-PRESENCE_PRIORITY = {'unavailable': 0,
- 'xa': 1,
- 'away': 2,
- 'dnd': 3,
- '': 4,
- 'available': 4}
+PRESENCE_PRIORITY = {'unavailable': 5,
+ 'xa': 4,
+ 'away': 3,
+ 'dnd': 2,
+ '': 1,
+ 'available': 1}
+
+def sort_jid(contact):
+ return contact.bare_jid
+
+def sort_show(contact):
+ res = contact.get_highest_priority_resource()
+ if not res:
+ return 0
+ show = res.presence
+ if show not in PRESENCE_PRIORITY:
+ return 0
+ return PRESENCE_PRIORITY[show]
+
+def sort_resource_nb(contact):
+ return - len(contact)
+
+def sort_name(contact):
+ return contact.name.lower() or contact.bare_jid
+
+SORTING_METHODS = {
+ 'jid': sort_jid,
+ 'show': sort_show,
+ 'resource': sort_resource_nb,
+ 'name': sort_name,
+}
class RosterGroup(object):
"""
@@ -244,20 +269,19 @@ class RosterGroup(object):
if contact in self.contacts:
self.contacts.remove(contact)
- def get_contacts(self, contact_filter):
+ def get_contacts(self, contact_filter=None, sort=''):
"""Return the group contacts, filtered and sorted"""
- def compare_contact(a):
- res = a.get_highest_priority_resource()
- if not res:
- return 0
- show = res.presence
- if show not in PRESENCE_PRIORITY:
- return 5
- return PRESENCE_PRIORITY[show]
- contact_list = self.contacts if not contact_filter\
+ contact_list = self.contacts.copy() if not contact_filter\
else [contact for contact in self.contacts.copy() if contact_filter[0](contact, contact_filter[1])]
- contact_list = sorted(contact_list, key=lambda x: x.bare_jid)
- return sorted(contact_list, key=compare_contact, reverse=True)
+
+ for sorting in sort.split('_'):
+ method = SORTING_METHODS.get(sorting, lambda x: 0)
+ if sorting == 'reverse':
+ contact_list = list(reversed(contact_list))
+ else:
+ contact_list = sorted(contact_list, key=method)
+ return contact_list
+
def toggle_folded(self):
"""Fold/unfold the group in the roster"""
@@ -273,5 +297,6 @@ class RosterGroup(object):
"""Return the number of connected contacts"""
return len([1 for contact in self.contacts if contact.resources])
+
# Shared roster object
roster = Roster()
diff --git a/src/windows.py b/src/windows.py
index a46edb1e..da80c989 100644
--- a/src/windows.py
+++ b/src/windows.py
@@ -1609,6 +1609,7 @@ class RosterWin(Win):
self.draw_roster_information(roster)
y = 1
show_offline = config.get('roster_show_offline', 'false') == 'true'
+ sort = config.get('roster_sort', 'jid_show') or 'jid_show'
for group in roster.get_groups()[:]:
contacts_filtered = group.get_contacts(roster.contact_filter)
if (not show_offline and group.get_nb_connected_contacts() == 0) or not contacts_filtered:
@@ -1621,7 +1622,7 @@ class RosterWin(Win):
y += 1
if group.folded:
continue
- for contact in group.get_contacts(roster.contact_filter)[:]:
+ for contact in group.get_contacts(roster.contact_filter, sort):
if not show_offline and len(contact) == 0:
continue
if y-1 == self.pos: