aboutsummaryrefslogtreecommitdiffstats
path: root/libempathy-gtk/empathy-individual-view.c
diff options
context:
space:
mode:
Diffstat (limited to 'libempathy-gtk/empathy-individual-view.c')
-rw-r--r--libempathy-gtk/empathy-individual-view.c63
1 files changed, 59 insertions, 4 deletions
diff --git a/libempathy-gtk/empathy-individual-view.c b/libempathy-gtk/empathy-individual-view.c
index 79e6562e1..4ffbed3c5 100644
--- a/libempathy-gtk/empathy-individual-view.c
+++ b/libempathy-gtk/empathy-individual-view.c
@@ -70,6 +70,8 @@ typedef struct
GtkWidget *tooltip_widget;
GtkTargetList *file_targets;
+ gboolean show_offline;
+
GtkTreeModelFilter *filter;
GtkWidget *search_widget;
} EmpathyIndividualViewPriv;
@@ -94,6 +96,7 @@ enum
PROP_STORE,
PROP_VIEW_FEATURES,
PROP_INDIVIDUAL_FEATURES,
+ PROP_SHOW_OFFLINE,
};
/* TODO: re-add DRAG_TYPE_CONTACT_ID, for the case that we're dragging around
@@ -187,15 +190,20 @@ individual_view_filter_visible_func (GtkTreeModel *model,
FolksIndividual *individual = NULL;
gboolean is_group, is_separator, valid;
GtkTreeIter child_iter;
- gboolean visible;
+ gboolean visible, show_offline, is_online;
+ gboolean is_searching = TRUE;
+
+ show_offline = empathy_individual_view_get_show_offline (self);
if (priv->search_widget == NULL ||
!gtk_widget_get_visible (priv->search_widget))
- return TRUE;
+ is_searching = FALSE;
+
gtk_tree_model_get (model, iter,
EMPATHY_INDIVIDUAL_STORE_COL_IS_GROUP, &is_group,
EMPATHY_INDIVIDUAL_STORE_COL_IS_SEPARATOR, &is_separator,
+ EMPATHY_INDIVIDUAL_STORE_COL_IS_ONLINE, &is_online,
EMPATHY_INDIVIDUAL_STORE_COL_INDIVIDUAL, &individual,
-1);
@@ -203,7 +211,11 @@ individual_view_filter_visible_func (GtkTreeModel *model,
{
visible = individual_view_is_visible_individual (self, individual);
g_object_unref (individual);
- return visible;
+
+ if (is_searching)
+ return visible;
+ else
+ return (show_offline || is_online);
}
if (is_separator)
@@ -218,6 +230,7 @@ individual_view_filter_visible_func (GtkTreeModel *model,
{
gtk_tree_model_get (model, &child_iter,
EMPATHY_INDIVIDUAL_STORE_COL_INDIVIDUAL, &individual,
+ EMPATHY_INDIVIDUAL_STORE_COL_IS_ONLINE, &is_online,
-1);
if (individual == NULL)
@@ -227,7 +240,8 @@ individual_view_filter_visible_func (GtkTreeModel *model,
g_object_unref (individual);
/* show group if it has at least one visible contact in it */
- if (visible)
+ if ((is_searching && visible) ||
+ (!is_searching && (show_offline || is_online)))
return TRUE;
}
@@ -1734,6 +1748,9 @@ individual_view_get_property (GObject *object,
case PROP_INDIVIDUAL_FEATURES:
g_value_set_flags (value, priv->individual_features);
break;
+ case PROP_SHOW_OFFLINE:
+ g_value_set_boolean (value, priv->show_offline);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
break;
@@ -1760,6 +1777,10 @@ individual_view_set_property (GObject *object,
case PROP_INDIVIDUAL_FEATURES:
priv->individual_features = g_value_get_flags (value);
break;
+ case PROP_SHOW_OFFLINE:
+ empathy_individual_view_set_show_offline (view,
+ g_value_get_boolean (value));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
break;
@@ -1820,6 +1841,12 @@ empathy_individual_view_class_init (EmpathyIndividualViewClass *klass)
"Flags for all enabled features for the menu",
EMPATHY_TYPE_INDIVIDUAL_FEATURE_FLAGS,
EMPATHY_CONTACT_FEATURE_NONE, G_PARAM_READWRITE));
+ g_object_class_install_property (object_class,
+ PROP_SHOW_OFFLINE,
+ g_param_spec_boolean ("show-offline",
+ "Show Offline",
+ "Whether contact list should display "
+ "offline contacts", FALSE, G_PARAM_READWRITE));
g_type_class_add_private (object_class, sizeof (EmpathyIndividualViewPriv));
}
@@ -2192,3 +2219,31 @@ empathy_individual_view_set_live_search (EmpathyIndividualView *view,
G_CALLBACK (individual_view_search_show_cb), view);
}
}
+
+gboolean
+empathy_individual_view_get_show_offline (EmpathyIndividualView *self)
+{
+ EmpathyIndividualViewPriv *priv;
+
+ g_return_val_if_fail (EMPATHY_IS_INDIVIDUAL_VIEW (self), FALSE);
+
+ priv = GET_PRIV (self);
+
+ return priv->show_offline;
+}
+
+void
+empathy_individual_view_set_show_offline (EmpathyIndividualView *self,
+ gboolean show_offline)
+{
+ EmpathyIndividualViewPriv *priv;
+
+ g_return_if_fail (EMPATHY_IS_INDIVIDUAL_VIEW (self));
+
+ priv = GET_PRIV (self);
+
+ priv->show_offline = show_offline;
+
+ g_object_notify (G_OBJECT (self), "show-offline");
+ gtk_tree_model_filter_refilter (priv->filter);
+}