[gnome-calendar] Handled sources_model::active changes.



commit a4276a126379e41af865f613f36e70d939cdc51d
Author: Erick PÃrez Castellanos <erick red gmail com>
Date:   Tue Jul 10 20:00:21 2012 -0400

    Handled sources_model::active changes.
    
    Handled sources_model::active changes by emitting fake ::events-added and
    ::events-removed signals.
    Updated methods hooked to ECalClientView signals to take into account
    GcalManagerUnit::enabled field.

 src/gcal-manager.c    |   71 +++++++++++++++++++++++++++++++++++++++++++++---
 src/gcal-month-view.c |    1 +
 src/gcal-week-view.c  |    1 +
 3 files changed, 68 insertions(+), 5 deletions(-)
---
diff --git a/src/gcal-manager.c b/src/gcal-manager.c
index 85128df..630ac49 100644
--- a/src/gcal-manager.c
+++ b/src/gcal-manager.c
@@ -158,6 +158,9 @@ static void     gcal_manager_on_event_removed             (GObject         *sour
 
 static void     gcal_manager_send_fake_events_added       (GcalManager     *manager);
 
+static void     gcal_manager_send_fave_events_removed     (GcalManager     *manager,
+                                                           GcalManagerUnit *unit);
+
 G_DEFINE_TYPE(GcalManager, gcal_manager, G_TYPE_OBJECT)
 
 static void
@@ -451,6 +454,7 @@ gcal_manager_load_source (GcalManager *manager,
                                         g_str_equal,
                                         g_free,
                                         g_object_unref);
+  unit->enabled = TRUE;
 
   if (g_hash_table_lookup (priv->clients, e_source_peek_uid (source)) == NULL)
     {
@@ -615,10 +619,13 @@ gcal_manager_on_view_objects_added (ECalClientView *view,
                                    g_strdup (icalcomponent_get_uid (l->data)),
                                    component);
             }
-          event_uuid = g_strdup_printf ("%s:%s",
-                                        source_uid,
-                                        icalcomponent_get_uid (l->data));
-          events_data = g_slist_append (events_data, event_uuid);
+          if (unit->enabled)
+            {
+              event_uuid = g_strdup_printf ("%s:%s",
+                                            source_uid,
+                                            icalcomponent_get_uid (l->data));
+              events_data = g_slist_append (events_data, event_uuid);
+            }
         }
     }
 
@@ -644,16 +651,24 @@ gcal_manager_on_view_objects_removed (ECalClientView *view,
                                       gpointer        objects,
                                       gpointer        user_data)
 {
+  GcalManagerPrivate *priv;
+  GcalManagerUnit *unit;
+
   GSList *l;
   GSList *events_data;
 
   ECalClient *client;
   const gchar *source_uid;
 
+  g_return_if_fail (GCAL_IS_MANAGER (user_data));
+  priv = GCAL_MANAGER (user_data)->priv;
+
   events_data = NULL;
   client = e_cal_client_view_get_client (view);
   source_uid = e_source_peek_uid (e_client_get_source (E_CLIENT (client)));
 
+  unit = g_hash_table_lookup (priv->clients, source_uid);
+
   for (l = objects; l != NULL; l = l->next)
     {
       gchar *removed_event_uuid =
@@ -661,6 +676,9 @@ gcal_manager_on_view_objects_removed (ECalClientView *view,
                          source_uid,
                          ((ECalComponentId*)(l->data))->uid);
       events_data = g_slist_append (events_data, removed_event_uuid);
+
+      /* Removing from internal hash */
+      g_hash_table_remove (unit->events, ((ECalComponentId*)(l->data))->uid);
     }
 
   if (events_data != NULL)
@@ -708,7 +726,17 @@ gcal_manager_on_sources_row_changed (GtkTreeModel *store,
                       &active,
                       -1);
   unit = g_hash_table_lookup (priv->clients, source_uid);
-  unit->enabled = active;
+
+  /* hack for detecting when the activation was triggered by a button click */
+  if (! active || unit->enabled == FALSE)
+    {
+      unit->enabled = active;
+      if (active)
+        gcal_manager_send_fake_events_added (GCAL_MANAGER (user_data));
+      else
+        gcal_manager_send_fave_events_removed (GCAL_MANAGER (user_data), unit);
+    }
+
 
   g_free (source_uid);
 }
@@ -768,6 +796,9 @@ gcal_manager_send_fake_events_added (GcalManager *manager)
     {
       GcalManagerUnit *unit = (GcalManagerUnit*) clients_value;
 
+      if (! unit->enabled)
+        continue;
+
       source_uid = e_source_peek_uid (unit->source);
       g_hash_table_iter_init (&e_iter, unit->events);
       while (g_hash_table_iter_next (&e_iter, &e_key, &e_value))
@@ -785,6 +816,36 @@ gcal_manager_send_fake_events_added (GcalManager *manager)
   g_slist_free_full (events_data, g_free);
 }
 
+static void
+gcal_manager_send_fave_events_removed (GcalManager     *manager,
+                                       GcalManagerUnit *unit)
+{
+  GHashTableIter e_iter;
+  gpointer e_key;
+  gpointer e_value;
+
+  GSList *events_data;
+  const gchar *source_uid;
+  const gchar *event_uid;
+  gchar *event_uuid;
+
+  events_data = NULL;
+  source_uid = e_source_peek_uid (unit->source);
+  g_hash_table_iter_init (&e_iter, unit->events);
+  while (g_hash_table_iter_next (&e_iter, &e_key, &e_value))
+    {
+      ECalComponent *event = (ECalComponent*) e_value;
+      e_cal_component_get_uid (event, &event_uid);
+
+      event_uuid = g_strdup_printf ("%s:%s", source_uid, event_uid);
+      events_data = g_slist_append (events_data, event_uuid);
+    }
+
+  g_signal_emit (manager, signals[EVENTS_REMOVED], 0, events_data);
+
+  g_slist_free_full (events_data, g_free);
+}
+
 /* Public API */
 /**
  * gcal_manager_new:
diff --git a/src/gcal-month-view.c b/src/gcal-month-view.c
index de488fc..a13c0d8 100644
--- a/src/gcal-month-view.c
+++ b/src/gcal-month-view.c
@@ -594,6 +594,7 @@ gcal_month_view_add (GtkContainer *container,
             gcal_event_widget_peek_uuid (GCAL_EVENT_WIDGET (widget)),
             gcal_event_widget_peek_uuid (GCAL_EVENT_WIDGET (child->widget))) == 0)
         {
+          //TODO: remove once the main-dev phase its over
           g_warning ("Trying to add an event with the same uuid to the view");
           return;
         }
diff --git a/src/gcal-week-view.c b/src/gcal-week-view.c
index a59cf39..c37a9b7 100644
--- a/src/gcal-week-view.c
+++ b/src/gcal-week-view.c
@@ -518,6 +518,7 @@ gcal_week_view_add (GtkContainer *container,
             gcal_event_widget_peek_uuid (GCAL_EVENT_WIDGET (widget)),
             gcal_event_widget_peek_uuid (GCAL_EVENT_WIDGET (child->widget))) == 0)
         {
+          //TODO: remove once the main-dev phase its over
           g_warning ("Trying to add an event with the same uuid to the view");
           return;
         }



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