aboutsummaryrefslogtreecommitdiffstats
path: root/libempathy-gtk
diff options
context:
space:
mode:
authorFelix Kaser <f.kaser@gmx.net>2010-08-03 19:01:29 +0800
committerFelix Kaser <f.kaser@gmx.net>2010-08-03 21:55:47 +0800
commita84e9e79c7f7a0dca20e1f5b5bc576400238e55c (patch)
treed05758258be0faec1a0abb6e215a3775a8be5275 /libempathy-gtk
parentf5f67749239b7b6b8898c31acc3df33f4d02cd32 (diff)
downloadgsoc2013-empathy-a84e9e79c7f7a0dca20e1f5b5bc576400238e55c.tar
gsoc2013-empathy-a84e9e79c7f7a0dca20e1f5b5bc576400238e55c.tar.gz
gsoc2013-empathy-a84e9e79c7f7a0dca20e1f5b5bc576400238e55c.tar.bz2
gsoc2013-empathy-a84e9e79c7f7a0dca20e1f5b5bc576400238e55c.tar.lz
gsoc2013-empathy-a84e9e79c7f7a0dca20e1f5b5bc576400238e55c.tar.xz
gsoc2013-empathy-a84e9e79c7f7a0dca20e1f5b5bc576400238e55c.tar.zst
gsoc2013-empathy-a84e9e79c7f7a0dca20e1f5b5bc576400238e55c.zip
refactored show_offline property to the view
the show offline property was moved from the individual store to the individual view. this allows to easily and automatically search through offline contacts as well.
Diffstat (limited to 'libempathy-gtk')
-rw-r--r--libempathy-gtk/empathy-individual-store.c106
-rw-r--r--libempathy-gtk/empathy-individual-store.h7
-rw-r--r--libempathy-gtk/empathy-individual-view.c63
-rw-r--r--libempathy-gtk/empathy-individual-view.h7
4 files changed, 69 insertions, 114 deletions
diff --git a/libempathy-gtk/empathy-individual-store.c b/libempathy-gtk/empathy-individual-store.c
index 41d9f5214..574ae2b58 100644
--- a/libempathy-gtk/empathy-individual-store.c
+++ b/libempathy-gtk/empathy-individual-store.c
@@ -61,7 +61,6 @@
typedef struct
{
EmpathyIndividualManager *manager;
- gboolean show_offline;
gboolean show_avatars;
gboolean show_groups;
gboolean is_compact;
@@ -99,7 +98,6 @@ enum
{
PROP_0,
PROP_INDIVIDUAL_MANAGER,
- PROP_SHOW_OFFLINE,
PROP_SHOW_AVATARS,
PROP_SHOW_PROTOCOLS,
PROP_SHOW_GROUPS,
@@ -352,8 +350,7 @@ individual_store_add_individual (EmpathyIndividualStore *self,
priv = GET_PRIV (self);
- if (EMP_STR_EMPTY (folks_individual_get_alias (individual)) ||
- (!priv->show_offline && !folks_individual_is_online (individual)))
+ if (EMP_STR_EMPTY (folks_individual_get_alias (individual)))
return;
if (priv->show_groups)
@@ -515,8 +512,7 @@ individual_store_contact_active_cb (ShowActiveData *data)
priv = GET_PRIV (data->self);
- if (data->remove &&
- !priv->show_offline && !folks_individual_is_online (data->individual))
+ if (data->remove)
{
DEBUG ("Individual'%s' active timeout, removing item",
folks_individual_get_alias (data->individual));
@@ -578,7 +574,6 @@ individual_store_contact_update (EmpathyIndividualStore *self,
EmpathyContact *contact;
GList *iters, *l;
gboolean in_list;
- gboolean should_be_in_list;
gboolean was_online = TRUE;
gboolean now_online = FALSE;
gboolean set_model = FALSE;
@@ -606,46 +601,7 @@ individual_store_contact_update (EmpathyIndividualStore *self,
/* Get online state now. */
now_online = folks_individual_is_online (individual);
- if (priv->show_offline || now_online)
- {
- should_be_in_list = TRUE;
- }
- else
- {
- should_be_in_list = FALSE;
- }
-
- if (!in_list && !should_be_in_list)
- {
- /* Nothing to do. */
- DEBUG ("Individual:'%s' in list:NO, should be:NO",
- folks_individual_get_alias (individual));
-
- g_list_foreach (iters, (GFunc) gtk_tree_iter_free, NULL);
- g_list_free (iters);
- return;
- }
- else if (in_list && !should_be_in_list)
- {
- DEBUG ("Individual:'%s' in list:YES, should be:NO",
- folks_individual_get_alias (individual));
-
- if (priv->show_active)
- {
- do_remove = TRUE;
- do_set_active = TRUE;
- do_set_refresh = TRUE;
-
- set_model = TRUE;
- DEBUG ("Remove item (after timeout)");
- }
- else
- {
- DEBUG ("Remove item (now)!");
- individual_store_remove_individual (self, individual);
- }
- }
- else if (!in_list && should_be_in_list)
+ if (!in_list)
{
DEBUG ("Individual'%s' in list:NO, should be:YES",
folks_individual_get_alias (individual));
@@ -999,9 +955,6 @@ individual_store_get_property (GObject *object,
case PROP_INDIVIDUAL_MANAGER:
g_value_set_object (value, priv->manager);
break;
- case PROP_SHOW_OFFLINE:
- g_value_set_boolean (value, priv->show_offline);
- break;
case PROP_SHOW_AVATARS:
g_value_set_boolean (value, priv->show_avatars);
break;
@@ -1039,10 +992,6 @@ individual_store_set_property (GObject *object,
individual_store_set_individual_manager (EMPATHY_INDIVIDUAL_STORE
(object), g_value_get_object (value));
break;
- case PROP_SHOW_OFFLINE:
- empathy_individual_store_set_show_offline (EMPATHY_INDIVIDUAL_STORE
- (object), g_value_get_boolean (value));
- break;
case PROP_SHOW_AVATARS:
empathy_individual_store_set_show_avatars (EMPATHY_INDIVIDUAL_STORE
(object), g_value_get_boolean (value));
@@ -1086,12 +1035,6 @@ empathy_individual_store_class_init (EmpathyIndividualStoreClass *klass)
EMPATHY_TYPE_INDIVIDUAL_MANAGER,
G_PARAM_CONSTRUCT_ONLY | 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_object_class_install_property (object_class,
PROP_SHOW_AVATARS,
g_param_spec_boolean ("show-avatars",
"Show Avatars",
@@ -1460,49 +1403,6 @@ empathy_individual_store_get_manager (EmpathyIndividualStore *self)
}
gboolean
-empathy_individual_store_get_show_offline (EmpathyIndividualStore *self)
-{
- EmpathyIndividualStorePriv *priv;
-
- g_return_val_if_fail (EMPATHY_IS_INDIVIDUAL_STORE (self), FALSE);
-
- priv = GET_PRIV (self);
-
- return priv->show_offline;
-}
-
-void
-empathy_individual_store_set_show_offline (EmpathyIndividualStore *self,
- gboolean show_offline)
-{
- EmpathyIndividualStorePriv *priv;
- GList *contacts, *l;
- gboolean show_active;
-
- g_return_if_fail (EMPATHY_IS_INDIVIDUAL_STORE (self));
-
- priv = GET_PRIV (self);
-
- priv->show_offline = show_offline;
- show_active = priv->show_active;
-
- /* Disable temporarily. */
- priv->show_active = FALSE;
-
- contacts = empathy_individual_manager_get_members (priv->manager);
- for (l = contacts; l; l = l->next)
- {
- individual_store_contact_update (self, l->data);
- }
- g_list_free (contacts);
-
- /* Restore to original setting. */
- priv->show_active = show_active;
-
- g_object_notify (G_OBJECT (self), "show-offline");
-}
-
-gboolean
empathy_individual_store_get_show_avatars (EmpathyIndividualStore *self)
{
EmpathyIndividualStorePriv *priv;
diff --git a/libempathy-gtk/empathy-individual-store.h b/libempathy-gtk/empathy-individual-store.h
index 9c855824e..4c99610d6 100644
--- a/libempathy-gtk/empathy-individual-store.h
+++ b/libempathy-gtk/empathy-individual-store.h
@@ -92,13 +92,6 @@ EmpathyIndividualStore *empathy_individual_store_new (
EmpathyIndividualManager *empathy_individual_store_get_manager (
EmpathyIndividualStore *store);
-gboolean empathy_individual_store_get_show_offline (
- EmpathyIndividualStore *store);
-
-void empathy_individual_store_set_show_offline (
- EmpathyIndividualStore *store,
- gboolean show_offline);
-
gboolean empathy_individual_store_get_show_avatars (
EmpathyIndividualStore *store);
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);
+}
diff --git a/libempathy-gtk/empathy-individual-view.h b/libempathy-gtk/empathy-individual-view.h
index 826e490bb..ce3c95ce3 100644
--- a/libempathy-gtk/empathy-individual-view.h
+++ b/libempathy-gtk/empathy-individual-view.h
@@ -95,5 +95,12 @@ GtkWidget *empathy_individual_view_get_group_menu (EmpathyIndividualView *view);
void empathy_individual_view_set_live_search (EmpathyIndividualView *view,
EmpathyLiveSearch *search);
+gboolean empathy_individual_view_get_show_offline (
+ EmpathyIndividualView *view);
+
+void empathy_individual_view_set_show_offline (
+ EmpathyIndividualView *view,
+ gboolean show_offline);
+
G_END_DECLS
#endif /* __EMPATHY_INDIVIDUAL_VIEW_H__ */