pidgin/pidgincontactlist.c

changeset 42593
c821b5ab8895
parent 42577
f8b477a1b0b6
child 42677
66b49e545c53
--- a/pidgin/pidgincontactlist.c	Tue Feb 20 00:55:28 2024 -0600
+++ b/pidgin/pidgincontactlist.c	Tue Feb 20 01:19:41 2024 -0600
@@ -30,8 +30,11 @@
 struct _PidginContactList {
 	GtkBox parent;
 
+	GtkWidget *show_offline;
+
 	GtkFilterListModel *filter_model;
 	GtkCustomFilter *account_connected_filter;
+	GtkCustomFilter *offline_filter;
 	GtkCustomFilter *search_filter;
 
 	GtkWidget *search_entry;
@@ -101,6 +104,36 @@
 }
 
 static gboolean
+pidgin_contact_list_offline_filter(GObject *item, gpointer data) {
+	PidginContactList *list = data;
+	PurplePerson *person = PURPLE_PERSON(item);
+	PurpleContactInfo *info = NULL;
+	PurplePresence *presence = NULL;
+
+	/* If we're showing offline, there's nothing to do here. */
+	if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(list->show_offline))) {
+		return TRUE;
+	}
+
+	info = purple_person_get_priority_contact_info(person);
+	if(!PURPLE_IS_CONTACT_INFO(info)) {
+		return FALSE;
+	}
+
+	presence = purple_contact_info_get_presence(info);
+	if(PURPLE_IS_PRESENCE(presence)) {
+		PurplePresencePrimitive primitive = PURPLE_PRESENCE_PRIMITIVE_OFFLINE;
+
+		primitive = purple_presence_get_primitive(presence);
+		if(primitive == PURPLE_PRESENCE_PRIMITIVE_OFFLINE) {
+			return FALSE;
+		}
+	}
+
+	return TRUE;
+}
+
+static gboolean
 pidgin_contact_list_search_filter(GObject *item, gpointer data) {
 	PidginContactList *list = data;
 	PurplePerson *person = PURPLE_PERSON(item);
@@ -115,6 +148,16 @@
  * Callbacks
  *****************************************************************************/
 static void
+pidgin_contact_list_show_offline_toggled_cb(G_GNUC_UNUSED GtkToggleButton *self,
+                                            gpointer data)
+{
+	PidginContactList *list = data;
+
+	gtk_filter_changed(GTK_FILTER(list->offline_filter),
+	                   GTK_FILTER_CHANGE_DIFFERENT);
+}
+
+static void
 pidgin_contact_list_search_changed_cb(GtkSearchEntry *self, gpointer data) {
 	PidginContactList *list = data;
 
@@ -333,6 +376,11 @@
 	                        G_CALLBACK(pidgin_contact_list_account_disconnected_cb),
 	                        list, 0);
 
+	/* Set the filter function for the offline filter. */
+	gtk_custom_filter_set_filter_func(list->offline_filter,
+	                                  (GtkCustomFilterFunc)pidgin_contact_list_offline_filter,
+	                                  list, NULL);
+
 	/* Setup the search filter and forwarding widget. */
 	gtk_custom_filter_set_filter_func(list->search_filter,
 	                                  (GtkCustomFilterFunc)pidgin_contact_list_search_filter,
@@ -356,12 +404,18 @@
 	gtk_widget_class_bind_template_child(widget_class, PidginContactList,
 	                                     account_connected_filter);
 	gtk_widget_class_bind_template_child(widget_class, PidginContactList,
+	                                     show_offline);
+	gtk_widget_class_bind_template_child(widget_class, PidginContactList,
+	                                     offline_filter);
+	gtk_widget_class_bind_template_child(widget_class, PidginContactList,
 	                                     search_filter);
 
 	gtk_widget_class_bind_template_child(widget_class, PidginContactList,
 	                                     search_entry);
 
 	gtk_widget_class_bind_template_callback(widget_class,
+	                                        pidgin_contact_list_show_offline_toggled_cb);
+	gtk_widget_class_bind_template_callback(widget_class,
 	                                        pidgin_contact_list_search_changed_cb);
 	gtk_widget_class_bind_template_callback(widget_class,
 	                                        pidgin_contact_list_avatar_cb);

mercurial