[empathy] refactored show_offline property to the view



commit a84e9e79c7f7a0dca20e1f5b5bc576400238e55c
Author: Felix Kaser <f kaser gmx net>
Date:   Tue Aug 3 13:01:29 2010 +0200

    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.

 libempathy-gtk/empathy-individual-store.c |  106 +----------------------------
 libempathy-gtk/empathy-individual-store.h |    7 --
 libempathy-gtk/empathy-individual-view.c  |   63 ++++++++++++++++-
 libempathy-gtk/empathy-individual-view.h  |    7 ++
 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 41d9f52..574ae2b 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 9c85582..4c99610 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 79e6562..4ffbed3 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 826e490..ce3c95c 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 ae50eaa..6588dfd 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);
 }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]