diff --git a/src/common/config.py b/src/common/config.py
index dbbac1e43..ace80e013 100644
--- a/src/common/config.py
+++ b/src/common/config.py
@@ -72,6 +72,7 @@ class Config:
'userfont': [ opt_str, 'Sans 10' ],
'saveposition': [ opt_bool, True ],
'mergeaccounts': [ opt_bool, False ],
+ 'sort_by_show': [ opt_bool, True ],
'usetabbedchat': [ opt_bool, True ],
'use_speller': [ opt_bool, False ],
'print_time': [ opt_str, 'always' ],
diff --git a/src/config.py b/src/config.py
index 427bd6a50..f2a417369 100644
--- a/src/config.py
+++ b/src/config.py
@@ -106,6 +106,10 @@ class Preferences_window:
st = gajim.config.get('mergeaccounts')
self.xml.get_widget('merge_checkbutton').set_active(st)
+ # Sort contacts by show
+ st = gajim.config.get('sort_by_show')
+ self.xml.get_widget('sort_by_show_checkbutton').set_active(st)
+
#Use emoticons
st = gajim.config.get('useemoticons')
self.xml.get_widget('use_emoticons_checkbutton').set_active(st)
@@ -422,6 +426,10 @@ class Preferences_window:
self.plugin.roster.regroup = gajim.config.get('mergeaccounts')
self.plugin.roster.draw_roster()
+ def on_sort_by_show_checkbutton_toggled(self, widget):
+ self.on_checkbutton_toggled(widget, 'sort_by_show')
+ self.plugin.roster.draw_roster()
+
def on_use_emoticons_checkbutton_toggled(self, widget):
self.on_checkbutton_toggled(widget, 'useemoticons',
[self.xml.get_widget('add_remove_emoticons_button')])
diff --git a/src/gtkgui.glade b/src/gtkgui.glade
index 200d1538b..1190241fe 100644
--- a/src/gtkgui.glade
+++ b/src/gtkgui.glade
@@ -2968,7 +2968,6 @@
- False
If checked, Gajim will also have a trayicon
True
_Icon in systray (aka. notification area)
@@ -3029,6 +3028,26 @@
+
+
+ True
+ True
+ Sort contacts by status
+ True
+ GTK_RELIEF_NORMAL
+ True
+ False
+ False
+ True
+
+
+
+ 0
+ False
+ False
+
+
+
True
@@ -4629,7 +4648,6 @@
- False
False
5
@@ -5372,7 +5390,6 @@
- False
0
0.5
GTK_SHADOW_ETCHED_IN
diff --git a/src/roster_window.py b/src/roster_window.py
index 5f8c7ef0a..8ecfa59b9 100644
--- a/src/roster_window.py
+++ b/src/roster_window.py
@@ -1310,18 +1310,44 @@ class Roster_window:
renderer.set_property('font', gajim.config.get('userfont'))
renderer.set_property('xpad', 8)
+ def get_show(self, luser):
+ prio = luser[0].priority
+ show = luser[0].show
+ for u in luser:
+ if u.priority > prio:
+ prio = u.priority
+ show = u.show
+ return show
+
def compareIters(self, model, iter1, iter2, data = None):
'''Compare two iters to sort them'''
name1 = model.get_value(iter1, 1)
name2 = model.get_value(iter2, 1)
if not name1 or not name2:
return 0
- type = model.get_value(iter1, 2)
- if type == 'group':
+ type1 = model.get_value(iter1, 2)
+ type2 = model.get_value(iter2, 2)
+ if type1 == 'group':
if name1 == 'Transports':
return 1
if name2 == 'Transports':
return -1
+ if type1 == 'user' and type2 == 'user' and \
+ gajim.config.get('sort_by_show'):
+ account = model.get_value(iter1, 4)
+ if account and model.get_value(iter2, 4) == account:
+ jid1 = model.get_value(iter1, 3)
+ jid2 = model.get_value(iter2, 3)
+ luser1 = self.contacts[account][jid1]
+ luser2 = self.contacts[account][jid2]
+ cshow = {'online':0, 'free': 1, 'away':2, 'xa':3, 'dnd':4,
+ 'invisible':5, 'offline':6, 'error':7}
+ show1 = cshow[self.get_show(luser1)]
+ show2 = cshow[self.get_show(luser2)]
+ if show1 < show2:
+ return -1
+ elif show1 > show2:
+ return 1
if name1.lower() < name2.lower():
return -1
if name2.lower < name1.lower():