From 5e2c8da5943dcc07bf4f0301fcfdeb0ada92e532 Mon Sep 17 00:00:00 2001
From: Yann Leboulanger <asterix@lagaule.org>
Date: Fri, 30 Jan 2009 07:53:26 +0000
Subject: [PATCH] new show_only_active_contact option. Fixes #3497

---
 data/glade/roster_window.glade |  9 ++++++++
 src/common/config.py           |  1 +
 src/roster_window.py           | 40 ++++++++++++++++++++++++++++++----
 3 files changed, 46 insertions(+), 4 deletions(-)

diff --git a/data/glade/roster_window.glade b/data/glade/roster_window.glade
index 97d1572c38..c1caef86a2 100644
--- a/data/glade/roster_window.glade
+++ b/data/glade/roster_window.glade
@@ -214,6 +214,15 @@
                         <accelerator key="O" modifiers="GDK_CONTROL_MASK" signal="activate"/>
                       </widget>
                     </child>
+                    <child>
+                      <widget class="GtkCheckMenuItem" id="show_only_active_contacts_menuitem">
+                        <property name="visible">True</property>
+                        <property name="label" translatable="yes">Show Only _Active Contacts</property>
+                        <property name="use_underline">True</property>
+                        <signal name="activate" handler="on_show_only_active_contacts_menuitem_activate"/>
+                        <accelerator key="Y" modifiers="GDK_CONTROL_MASK" signal="activate"/>
+                      </widget>
+                    </child>
                     <child>
                       <widget class="GtkCheckMenuItem" id="show_transports_menuitem">
                         <property name="visible">True</property>
diff --git a/src/common/config.py b/src/common/config.py
index bb631357dc..ed05f41677 100644
--- a/src/common/config.py
+++ b/src/common/config.py
@@ -81,6 +81,7 @@ class Config:
 		'autopopupaway': [ opt_bool, False ],
 		'use_notif_daemon': [ opt_bool, True , _('Use D-Bus and Notification-Daemon to show notifications') ],
 		'showoffline': [ opt_bool, False ],
+		'show_only_chat_and_online': [ opt_bool, False, _('Show only online and free for chat contacts in roster.')],
 		'show_transports_group': [ opt_bool, True ],
 		'autoaway': [ opt_bool, True ],
 		'autoawaytime': [ opt_int, 5, _('Time in minutes, after which your status changes to away.') ],
diff --git a/src/roster_window.py b/src/roster_window.py
index 53026fb2c5..fe09c5f6a1 100644
--- a/src/roster_window.py
+++ b/src/roster_window.py
@@ -1441,6 +1441,9 @@ class RosterWindow:
 			if contact.jid in gajim.to_be_removed[account]:
 				return True
 			return False
+		if gajim.config.get('show_only_chat_and_online') and contact.show in (
+		'away', 'xa', 'busy'):
+			return False
 		return True
 
 	def _visible_func(self, model, titer):
@@ -1500,12 +1503,14 @@ class RosterWindow:
 				for data in nearby_family:
 					jid = data['jid']
 					account = data['account']
-					contact = gajim.contacts.get_first_contact_from_jid(account, jid)
+					contact = gajim.contacts.get_contact_with_highest_priority(
+						account, jid)
 					if contact and self.contact_is_visible(contact, account):
 						return True
 				return False
 			else:
-				contact = gajim.contacts.get_first_contact_from_jid(account, jid)
+				contact = gajim.contacts.get_contact_with_highest_priority(account,
+					jid)
 				return self.contact_is_visible(contact, account)
 		if type_ == 'agent':
 			return gajim.config.get('show_transports_group') and \
@@ -3674,11 +3679,29 @@ class RosterWindow:
 		redraw the treeview'''
 		gajim.config.set('showoffline', not gajim.config.get('showoffline'))
 		self.refilter_shown_roster_items()
+		w = self.xml.get_widget('show_only_active_contacts_menuitem')
 		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()
+			w.set_sensitive(False)
+		else:
+			w.set_sensitive(True)
 
+	def on_show_only_active_contacts_menuitem_activate(self, widget):
+		'''when show only active contact option is changed:
+		redraw the treeview'''
+		gajim.config.set('show_only_chat_and_online', not gajim.config.get(
+			'show_only_chat_and_online'))
+		self.refilter_shown_roster_items()
+		w = self.xml.get_widget('show_offline_contacts_menuitem')
+		if gajim.config.get('show_only_chat_and_online'):
+			# We need to filter twice to show groups with no contacts inside
+			# in the correct expand state
+			self.refilter_shown_roster_items()
+			w.set_sensitive(False)
+		else:
+			w.set_sensitive(True)
 
 	def on_view_menu_activate(self, widget):
 		# Hide the show roster menu if we are not in the right windowing mode.
@@ -6240,8 +6263,17 @@ class RosterWindow:
 		self.previous_status_combobox_active = number_of_menuitem
 
 		showOffline = gajim.config.get('showoffline')
-		self.xml.get_widget('show_offline_contacts_menuitem').set_active(
-			showOffline)
+		showOnlyChatAndOnline = gajim.config.get('show_only_chat_and_online')
+
+		w = self.xml.get_widget('show_offline_contacts_menuitem')
+		w.set_active(showOffline)
+		if showOnlyChatAndOnline:
+			w.set_sensitive(False)
+
+		w = self.xml.get_widget('show_only_active_contacts_menuitem')
+		w.set_active(showOnlyChatAndOnline)
+		if showOffline:
+			w.set_sensitive(False)
 
 		show_transports_group = gajim.config.get('show_transports_group')
 		self.xml.get_widget('show_transports_menuitem').set_active(
-- 
GitLab