diff options
-rw-r--r-- | libempathy-gtk/empathy-individual-store.c | 106 | ||||
-rw-r--r-- | libempathy-gtk/empathy-individual-store.h | 7 | ||||
-rw-r--r-- | libempathy-gtk/empathy-individual-view.c | 63 | ||||
-rw-r--r-- | libempathy-gtk/empathy-individual-view.h | 7 | ||||
-rw-r--r-- | src/empathy-main-window.c | 2 |
5 files changed, 70 insertions, 115 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__ */ diff --git a/src/empathy-main-window.c b/src/empathy-main-window.c index ae50eaa4e..6588dfd59 100644 --- a/src/empathy-main-window.c +++ b/src/empathy-main-window.c @@ -736,7 +736,7 @@ main_window_view_show_offline_cb (GtkToggleAction *action, /* Turn off sound just while we alter the contact list. */ // FIXME: empathy_sound_set_enabled (FALSE); - empathy_individual_store_set_show_offline (priv->individual_store, + empathy_individual_view_set_show_offline (priv->individual_view, current); //empathy_sound_set_enabled (TRUE); } |