[gnome-calendar] manager: Rework signals to use GcalCalendar



commit ea60c95a449b3558eed4efc9814a65d257f3b4ac
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date:   Fri May 3 21:33:06 2019 -0300

    manager: Rework signals to use GcalCalendar

 src/gcal-application.c          |   4 +-
 src/gcal-manager.c              |  76 +++++-------
 src/gcal-quick-add-popover.c    | 135 ++++++++++-----------
 src/gcal-source-dialog.c        | 258 +++++++++++++++++-----------------------
 src/gcal-window.c               | 150 +++++------------------
 src/search/gcal-search-engine.c |  51 ++++----
 6 files changed, 260 insertions(+), 414 deletions(-)
---
diff --git a/src/gcal-application.c b/src/gcal-application.c
index 3d6f908b..cab028bd 100644
--- a/src/gcal-application.c
+++ b/src/gcal-application.c
@@ -616,8 +616,8 @@ gcal_application_init (GcalApplication *self)
   self->context = gcal_context_new ();
 
   manager = gcal_context_get_manager (self->context);
-  g_signal_connect_swapped (manager, "source-added", G_CALLBACK (process_sources), self);
-  g_signal_connect_swapped (manager, "source-changed", G_CALLBACK (process_sources), self);
+  g_signal_connect_swapped (manager, "calendar-added", G_CALLBACK (process_sources), self);
+  g_signal_connect_swapped (manager, "calendar-changed", G_CALLBACK (process_sources), self);
 
   self->search_provider = gcal_shell_search_provider_new (self->context);
 }
diff --git a/src/gcal-manager.c b/src/gcal-manager.c
index 7daefabe..3305e977 100644
--- a/src/gcal-manager.c
+++ b/src/gcal-manager.c
@@ -103,10 +103,9 @@ enum
 
 enum
 {
-  SOURCE_ADDED,
-  SOURCE_CHANGED,
-  SOURCE_REMOVED,
-  SOURCE_ENABLED,
+  CALENDAR_ADDED,
+  CALENDAR_CHANGED,
+  CALENDAR_REMOVED,
   QUERY_COMPLETED,
   NUM_SIGNALS
 };
@@ -155,16 +154,20 @@ static void
 remove_source (GcalManager  *self,
                ESource      *source)
 {
+  GcalCalendar *calendar;
+
   GCAL_ENTRY;
 
   g_return_if_fail (GCAL_IS_MANAGER (self));
   g_return_if_fail (E_IS_SOURCE (source));
 
+  calendar = g_hash_table_lookup (self->clients, source);
+
   e_cal_data_model_remove_client (self->e_data_model,
                                   e_source_get_uid (source));
 
   g_hash_table_remove (self->clients, source);
-  g_signal_emit (self, signals[SOURCE_REMOVED], 0, source);
+  g_signal_emit (self, signals[CALENDAR_REMOVED], 0, calendar);
 
   GCAL_EXIT;
 }
@@ -173,13 +176,14 @@ static void
 source_changed (GcalManager *self,
                 ESource     *source)
 {
+  GcalCalendar *calendar;
+
   GCAL_ENTRY;
 
-  if (g_hash_table_lookup (self->clients, source) != NULL &&
-      e_source_has_extension (source, E_SOURCE_EXTENSION_CALENDAR))
-    {
-      g_signal_emit (self, signals[SOURCE_CHANGED], 0, source);
-    }
+  calendar = g_hash_table_lookup (self->clients, source);
+
+  if (calendar)
+    g_signal_emit (self, signals[CALENDAR_CHANGED], 0, calendar);
 
   GCAL_EXIT;
 }
@@ -269,7 +273,7 @@ on_calendar_created_cb (GObject      *source_object,
                                    NULL,
                                    NULL);
 
-  g_signal_emit (self, signals[SOURCE_ADDED], 0, gcal_calendar_get_source (calendar), visible);
+  g_signal_emit (self, signals[CALENDAR_ADDED], 0, calendar);
 }
 
 static void
@@ -702,39 +706,29 @@ gcal_manager_class_init (GcalManagerClass *klass)
   g_object_class_install_properties (object_class, NUM_PROPS, properties);
 
   /* signals */
-  signals[SOURCE_ADDED] = g_signal_new ("source-added",
-                                        GCAL_TYPE_MANAGER,
-                                        G_SIGNAL_RUN_LAST,
-                                        0, NULL, NULL, NULL,
-                                        G_TYPE_NONE,
-                                        2,
-                                        G_TYPE_POINTER,
-                                        G_TYPE_BOOLEAN);
-
-  signals[SOURCE_CHANGED] = g_signal_new ("source-changed",
+  signals[CALENDAR_ADDED] = g_signal_new ("calendar-added",
                                           GCAL_TYPE_MANAGER,
                                           G_SIGNAL_RUN_LAST,
                                           0, NULL, NULL, NULL,
                                           G_TYPE_NONE,
                                           1,
-                                          E_TYPE_SOURCE);
-
-  signals[SOURCE_REMOVED] = g_signal_new ("source-removed",
-                                          GCAL_TYPE_MANAGER,
-                                          G_SIGNAL_RUN_LAST,
-                                          0, NULL, NULL, NULL,
-                                          G_TYPE_NONE,
-                                          1,
-                                          G_TYPE_POINTER);
-
-  signals[SOURCE_ENABLED] = g_signal_new ("source-enabled",
-                                          GCAL_TYPE_MANAGER,
-                                          G_SIGNAL_RUN_LAST,
-                                          0, NULL, NULL, NULL,
-                                          G_TYPE_NONE,
-                                          2,
-                                          E_TYPE_SOURCE,
-                                          G_TYPE_BOOLEAN);
+                                          GCAL_TYPE_CALENDAR);
+
+  signals[CALENDAR_CHANGED] = g_signal_new ("calendar-changed",
+                                            GCAL_TYPE_MANAGER,
+                                            G_SIGNAL_RUN_LAST,
+                                            0, NULL, NULL, NULL,
+                                            G_TYPE_NONE,
+                                            1,
+                                            GCAL_TYPE_CALENDAR);
+
+  signals[CALENDAR_REMOVED] = g_signal_new ("calendar-removed",
+                                            GCAL_TYPE_MANAGER,
+                                            G_SIGNAL_RUN_LAST,
+                                            0, NULL, NULL, NULL,
+                                            G_TYPE_NONE,
+                                            1,
+                                            GCAL_TYPE_CALENDAR);
 
   signals[QUERY_COMPLETED] = g_signal_new ("query-completed",
                                            GCAL_TYPE_MANAGER,
@@ -1110,8 +1104,6 @@ gcal_manager_enable_source (GcalManager *self,
   if (self->shell_search_data_model)
     e_cal_data_model_add_client (self->shell_search_data_model, client);
 
-  g_signal_emit (self, signals[SOURCE_ENABLED], 0, source, TRUE);
-
   /* Save the source */
   e_source_selectable_set_selected (selectable, TRUE);
   gcal_manager_save_source (self, source);
@@ -1154,8 +1146,6 @@ gcal_manager_disable_source (GcalManager *self,
   if (self->shell_search_data_model != NULL)
     e_cal_data_model_remove_client (self->shell_search_data_model, source_uid);
 
-  g_signal_emit (self, signals[SOURCE_ENABLED], 0, source, FALSE);
-
   /* Save the source */
   e_source_selectable_set_selected (selectable, FALSE);
   gcal_manager_save_source (self, source);
diff --git a/src/gcal-quick-add-popover.c b/src/gcal-quick-add-popover.c
index 9d66cd88..43ea74f4 100644
--- a/src/gcal-quick-add-popover.c
+++ b/src/gcal-quick-add-popover.c
@@ -67,13 +67,13 @@ static guint signals[NUM_SIGNALS] = { 0, };
  */
 
 static GtkWidget*
-create_row_for_source (GcalManager *manager,
-                       ESource     *source,
-                       gboolean     writable)
+create_calendar_row (GcalManager  *manager,
+                     GcalCalendar *calendar)
 {
   cairo_surface_t *surface;
+  const GdkRGBA *color;
   GtkWidget *row, *box, *icon, *label, *selected_icon;
-  GdkRGBA color;
+  gboolean read_only;
   gchar *tooltip, *parent_name;
 
   /* The main box */
@@ -84,8 +84,8 @@ create_row_for_source (GcalManager *manager,
   gtk_widget_set_margin_bottom (box, 3);
 
   /* The icon with the source color */
-  get_color_name_from_source (source, &color);
-  surface = get_circle_surface_from_color (&color, 16);
+  color = gcal_calendar_get_color (calendar);
+  surface = get_circle_surface_from_color (color, 16);
   icon = gtk_image_new_from_surface (surface);
 
   gtk_container_add (GTK_CONTAINER (box), icon);
@@ -93,7 +93,7 @@ create_row_for_source (GcalManager *manager,
   gtk_style_context_add_class (gtk_widget_get_style_context (icon), "calendar-color-image");
 
   /* Source name label */
-  label = gtk_label_new (e_source_get_display_name (source));
+  label = gtk_label_new (gcal_calendar_get_name (calendar));
   gtk_widget_set_margin_end (label, 12);
 
   gtk_container_add (GTK_CONTAINER (box), label);
@@ -104,17 +104,19 @@ create_row_for_source (GcalManager *manager,
 
   /* The row itself */
   row = gtk_list_box_row_new ();
-  gtk_widget_set_sensitive (row, writable);
+
+  read_only = gcal_calendar_is_read_only (calendar);
+  gtk_widget_set_sensitive (row, !read_only);
 
   gtk_container_add (GTK_CONTAINER (row), box);
 
   /* Setup also a cool tooltip */
-  get_source_parent_name_color (manager, source, &parent_name, NULL);
+  get_source_parent_name_color (manager, gcal_calendar_get_source (calendar), &parent_name, NULL);
 
-  if (writable)
-    tooltip = g_strdup (parent_name);
-  else
+  if (read_only)
     tooltip = g_strdup_printf (_("%s (this calendar is read-only)"), parent_name);
+  else
+    tooltip = g_strdup (parent_name);
 
   gtk_widget_set_tooltip_text (row, tooltip);
 
@@ -123,7 +125,7 @@ create_row_for_source (GcalManager *manager,
    * taken to make sure it is not destroyed before this
    * row.
    */
-  g_object_set_data_full (G_OBJECT (row), "source", g_object_ref (source), g_object_unref);
+  g_object_set_data_full (G_OBJECT (row), "calendar", g_object_ref (calendar), g_object_unref);
   g_object_set_data (G_OBJECT (row), "selected-icon", selected_icon);
   g_object_set_data (G_OBJECT (row), "color-icon", icon);
   g_object_set_data (G_OBJECT (row), "name-label", label);
@@ -145,8 +147,8 @@ create_row_for_source (GcalManager *manager,
  * ESource from the listbox.
  */
 static GtkWidget*
-get_row_for_source (GcalQuickAddPopover *self,
-                    ESource             *source)
+get_row_for_calendar (GcalQuickAddPopover *self,
+                      GcalCalendar        *calendar)
 {
   GList *children, *l;
   GtkWidget *row;
@@ -156,9 +158,9 @@ get_row_for_source (GcalQuickAddPopover *self,
 
   for (l = children; l != NULL; l = g_list_next (l))
     {
-      ESource *row_source = g_object_get_data (l->data, "source");
+      GcalCalendar *row_calendar = g_object_get_data (l->data, "calendar");
 
-      if (row_source == source)
+      if (row_calendar == calendar)
         {
           row = l->data;
           break;
@@ -175,9 +177,9 @@ select_row (GcalQuickAddPopover *self,
             GtkListBoxRow       *row)
 {
   cairo_surface_t *surface;
+  const GdkRGBA *color;
+  GcalCalendar *calendar;
   GtkWidget *icon;
-  ESource *source;
-  GdkRGBA color;
 
   /* First, unselect the previous row */
   if (self->selected_row)
@@ -193,12 +195,12 @@ select_row (GcalQuickAddPopover *self,
   self->selected_row = GTK_WIDGET (row);
 
   /* Setup the event page's source name and color */
-  source = g_object_get_data (G_OBJECT (row), "source");
+  calendar = g_object_get_data (G_OBJECT (row), "calendar");
 
-  gtk_label_set_label (GTK_LABEL (self->calendar_name_label), e_source_get_display_name (source));
+  gtk_label_set_label (GTK_LABEL (self->calendar_name_label), gcal_calendar_get_name (calendar));
 
-  get_color_name_from_source (source, &color);
-  surface = get_circle_surface_from_color (&color, 16);
+  color = gcal_calendar_get_color (calendar);
+  surface = get_circle_surface_from_color (color, 16);
   gtk_image_set_from_surface (GTK_IMAGE (self->color_image), surface);
 
   /* Return to the events page */
@@ -485,14 +487,16 @@ update_header (GcalQuickAddPopover *self)
 static void
 update_default_calendar_row (GcalQuickAddPopover *self)
 {
+  GcalCalendar *default_calendar;
   GcalManager *manager;
   GtkWidget *row;
   ESource *default_source;
 
   manager = gcal_context_get_manager (self->context);
   default_source = gcal_manager_get_default_source (manager);
+  default_calendar = gcal_manager_get_calendar_from_source (manager, default_source);
 
-  row = get_row_for_source (self, default_source);
+  row = get_row_for_calendar (self, default_calendar);
   select_row (self, GTK_LIST_BOX_ROW (row));
 
   g_clear_object (&default_source);
@@ -504,43 +508,47 @@ update_default_calendar_row (GcalQuickAddPopover *self)
  */
 
 static void
-on_source_added (GcalManager         *manager,
-                 ESource             *source,
-                 gboolean             enabled,
-                 GcalQuickAddPopover *self)
+on_calendar_added (GcalManager         *manager,
+                   GcalCalendar        *calendar,
+                   GcalQuickAddPopover *self)
 {
   ESource *default_source;
   GtkWidget *row;
 
   /* Since we can't add on read-only calendars, lets not show them at all */
-  if (!gcal_manager_is_client_writable (manager, source))
+  if (gcal_calendar_is_read_only (calendar))
     return;
 
   default_source = gcal_manager_get_default_source (manager);
-  row = create_row_for_source (manager, source, gcal_manager_is_client_writable (manager, source));
+  row = create_calendar_row (manager, calendar);
 
   gtk_container_add (GTK_CONTAINER (self->calendars_listbox), row);
 
   /* Select the default source whe first adding events */
-  if (source == default_source && !self->selected_row)
-    select_row (self, GTK_LIST_BOX_ROW (row));
+  if (gcal_calendar_get_source (calendar) == default_source &&
+      !self->selected_row)
+    {
+      select_row (self, GTK_LIST_BOX_ROW (row));
+    }
 
   g_clear_object (&default_source);
 }
 
 static void
-on_source_changed (GcalManager         *manager,
-                   ESource             *source,
-                   GcalQuickAddPopover *self)
+on_calendar_changed (GcalManager         *manager,
+                     GcalCalendar        *calendar,
+                     GcalQuickAddPopover *self)
 {
   cairo_surface_t *surface;
+  const GdkRGBA *color;
   GtkWidget *row, *color_icon, *name_label;
-  GdkRGBA color;
+  gboolean read_only;
 
-  row = get_row_for_source (self, source);
+  read_only = gcal_calendar_is_read_only (calendar);
+  row = get_row_for_calendar (self, calendar);
 
   /* If the calendar changed from/to read-only, we add or remove it here */
-  if (!gcal_manager_is_client_writable (manager, source))
+  if (read_only)
     {
       if (row)
         gtk_container_remove (GTK_CONTAINER (self->calendars_listbox), row);
@@ -549,29 +557,26 @@ on_source_changed (GcalManager         *manager,
     }
   else if (!row)
     {
-      on_source_added (manager,
-                       source,
-                       is_source_enabled (source),
-                       self);
+      on_calendar_added (manager, calendar, self);
 
-      row = get_row_for_source (self, source);
+      row = get_row_for_calendar (self, calendar);
     }
 
   color_icon = g_object_get_data (G_OBJECT (row), "color-icon");
   name_label = g_object_get_data (G_OBJECT (row), "name-label");
 
   /* If the source is writable now (or not), update sensitivity */
-  gtk_widget_set_sensitive (row, gcal_manager_is_client_writable (manager, source));
+  gtk_widget_set_sensitive (row, !read_only);
 
   /* Setup the source color, in case it changed */
-  get_color_name_from_source (source, &color);
-  surface = get_circle_surface_from_color (&color, 16);
+  color = gcal_calendar_get_color (calendar);
+  surface = get_circle_surface_from_color (color, 16);
   gtk_image_set_from_surface (GTK_IMAGE (color_icon), surface);
 
   g_clear_pointer (&surface, cairo_surface_destroy);
 
   /* Also setup the row name, in case we just changed the source name */
-  gtk_label_set_text (GTK_LABEL (name_label), e_source_get_display_name (source));
+  gtk_label_set_text (GTK_LABEL (name_label), gcal_calendar_get_name (calendar));
 
   gtk_list_box_invalidate_sort (GTK_LIST_BOX (self->calendars_listbox));
 
@@ -584,13 +589,13 @@ on_source_changed (GcalManager         *manager,
 }
 
 static void
-on_source_removed (GcalManager         *manager,
-                   ESource             *source,
-                   GcalQuickAddPopover *self)
+on_calendar_removed (GcalManager         *manager,
+                     GcalCalendar        *calendar,
+                     GcalQuickAddPopover *self)
 {
   GtkWidget *row;
 
-  row = get_row_for_source (self, source);
+  row = get_row_for_calendar (self, calendar);
 
   if (!row)
     return;
@@ -604,15 +609,15 @@ sort_func (GtkListBoxRow *row1,
            GtkListBoxRow *row2,
            gpointer       user_data)
 {
-  ESource *source1, *source2;
+  GcalCalendar *calendar1, *calendar2;
   gchar *name1, *name2;
   gint retval;
 
-  source1 = g_object_get_data (G_OBJECT (row1), "source");
-  source2 = g_object_get_data (G_OBJECT (row2), "source");
+  calendar1 = g_object_get_data (G_OBJECT (row1), "calendar");
+  calendar2 = g_object_get_data (G_OBJECT (row2), "calendar");
 
-  name1 = g_utf8_casefold (e_source_get_display_name (source1), -1);
-  name2 = g_utf8_casefold (e_source_get_display_name (source2), -1);
+  name1 = g_utf8_casefold (gcal_calendar_get_name (calendar1), -1);
+  name2 = g_utf8_casefold (gcal_calendar_get_name (calendar2), -1);
 
   retval = g_strcmp0 (name1, name2);
 
@@ -644,7 +649,6 @@ edit_or_create_event (GcalQuickAddPopover *self,
   GDateTime *date_start, *date_end;
   GTimeZone *tz;
   GcalEvent *event;
-  ESource *source;
   const gchar *summary;
   gboolean all_day, single_day;
 
@@ -652,8 +656,7 @@ edit_or_create_event (GcalQuickAddPopover *self,
     return;
 
   manager = gcal_context_get_manager (self->context);
-  source = g_object_get_data (G_OBJECT (self->selected_row), "source");
-  calendar = gcal_manager_get_calendar_from_source (manager, source);
+  calendar = g_object_get_data (G_OBJECT (self->selected_row), "calendar");
 
   single_day = gcal_date_time_compare_date (self->date_end, self->date_start) == 0;
   all_day = gcal_date_time_compare_date (self->date_end, self->date_start) > 1 ||
@@ -799,20 +802,14 @@ gcal_quick_add_popover_set_property (GObject      *object,
           calendars = gcal_manager_get_calendars (manager);
 
           for (l = calendars; l; l = l->next)
-            {
-              GcalCalendar *calendar = l->data;
-              on_source_added (manager,
-                               gcal_calendar_get_source (calendar),
-                               gcal_calendar_get_visible (calendar),
-                               self);
-            }
+            on_calendar_added (manager, l->data, self);
 
           g_list_free (calendars);
 
           /* Connect to the manager signals and keep the list updates */
-          g_signal_connect (manager, "source-added", G_CALLBACK (on_source_added), self);
-          g_signal_connect (manager, "source-changed", G_CALLBACK (on_source_changed), self);
-          g_signal_connect (manager, "source-removed", G_CALLBACK (on_source_removed), self);
+          g_signal_connect (manager, "calendar-added", G_CALLBACK (on_calendar_added), self);
+          g_signal_connect (manager, "calendar-changed", G_CALLBACK (on_calendar_changed), self);
+          g_signal_connect (manager, "calendar-removed", G_CALLBACK (on_calendar_removed), self);
           g_signal_connect_swapped (manager, "notify::default-calendar", G_CALLBACK 
(update_default_calendar_row), self);
 
           g_signal_connect_object (self->context,
diff --git a/src/gcal-source-dialog.c b/src/gcal-source-dialog.c
index dae63b63..b36553c9 100644
--- a/src/gcal-source-dialog.c
+++ b/src/gcal-source-dialog.c
@@ -102,7 +102,7 @@ struct _GcalSourceDialog
   GcalSourceDialogMode mode;
   ESource            *source;
   GList              *remote_sources;
-  ESource            *removed_source;
+  GcalCalendar       *removed_calendar;
   ESource            *old_default_source;
   GBinding           *title_bind;
   gboolean            prompt_password;
@@ -126,11 +126,6 @@ typedef enum
 static void       add_button_clicked                    (GtkWidget            *button,
                                                          gpointer              user_data);
 
-static void       add_source                             (GcalManager         *manager,
-                                                          ESource             *source,
-                                                          gboolean             enabled,
-                                                          gpointer             user_data);
-
 static void       action_widget_activated               (GtkWidget            *widget,
                                                          gpointer              user_data);
 
@@ -175,9 +170,6 @@ static void       display_header_func                   (GtkListBoxRow        *r
 static gboolean   is_goa_source                         (GcalSourceDialog     *dialog,
                                                          ESource              *source);
 
-static GtkWidget* make_row_from_source                  (GcalSourceDialog    *dialog,
-                                                         ESource             *source);
-
 static void       name_entry_text_changed               (GObject             *object,
                                                          GParamSpec          *pspec,
                                                          gpointer             user_data);
@@ -205,10 +197,6 @@ static void       on_web_activated                      (GSimpleAction       *ac
                                                          GVariant            *param,
                                                          gpointer             user_data);
 
-static void       remove_source                         (GcalManager         *manager,
-                                                         ESource             *source,
-                                                         gpointer             user_data);
-
 static void       response_signal                       (GtkDialog           *dialog,
                                                          gint                 response_id,
                                                          gpointer             user_data);
@@ -302,22 +290,87 @@ add_button_clicked (GtkWidget *button,
 }
 
 static void
-add_source (GcalManager *manager,
-            ESource     *source,
-            gboolean     enabled,
-            gpointer     user_data)
+source_color_changed (GcalCalendar *calendar,
+                      GParamSpec   *pspec,
+                      GtkImage     *icon)
+{
+  cairo_surface_t *surface;
+  const GdkRGBA *color;
+
+  color = gcal_calendar_get_color (calendar);
+  surface = get_circle_surface_from_color (color, 24);
+  gtk_image_set_from_surface (GTK_IMAGE (icon), surface);
+  g_clear_pointer (&surface, cairo_surface_destroy);
+}
+
+static GtkWidget*
+make_calendar_row (GcalSourceDialog *dialog,
+                   GcalCalendar     *calendar)
+{
+  cairo_surface_t *surface;
+  const GdkRGBA *color;
+  GcalManager *manager;
+  GtkBuilder *builder;
+  GtkWidget *bottom_label;
+  GtkWidget *top_label;
+  GtkWidget *icon;
+  GtkWidget *row;
+  gchar *parent_name;
+
+  manager = gcal_context_get_manager (dialog->context);
+  get_source_parent_name_color (manager, gcal_calendar_get_source (calendar), &parent_name, NULL);
+
+  builder = gtk_builder_new_from_resource ("/org/gnome/calendar/calendar-row.ui");
+
+  /*
+   * Since we're destroying the builder instance before adding
+   * the row to the listbox, it should be referenced here so
+   * it isn't destroyed with the GtkBuilder.
+   */
+  row = g_object_ref (GTK_WIDGET (gtk_builder_get_object (builder, "row")));
+
+  /* source color icon */
+  color = gcal_calendar_get_color (calendar);
+  surface = get_circle_surface_from_color (color, 24);
+  icon = GTK_WIDGET (gtk_builder_get_object (builder, "icon"));
+  gtk_image_set_from_surface (GTK_IMAGE (icon), surface);
+
+  /* source name label */
+  top_label = GTK_WIDGET (gtk_builder_get_object (builder, "title"));
+  gtk_label_set_label (GTK_LABEL (top_label), gcal_calendar_get_name (calendar));
+  g_object_bind_property (calendar, "name", top_label, "label", G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE);
+  g_signal_connect_swapped (calendar,
+                            "notify::name",
+                            G_CALLBACK (gtk_list_box_invalidate_sort),
+                            dialog->calendars_listbox);
+
+  g_signal_connect (calendar, "notify::color", G_CALLBACK (source_color_changed), icon);
+
+  /* parent source name label */
+  bottom_label = GTK_WIDGET (gtk_builder_get_object (builder, "subtitle"));
+  gtk_label_set_label (GTK_LABEL (bottom_label), parent_name);
+
+  g_clear_pointer (&surface, cairo_surface_destroy);
+  g_object_unref (builder);
+  g_free (parent_name);
+
+  return row;
+}
+
+static void
+add_calendar (GcalManager      *manager,
+              GcalCalendar     *calendar,
+              GcalSourceDialog *self)
 {
-  GcalSourceDialog *self;
   GList *children, *l;
   gboolean contains_source;
 
-  self = GCAL_SOURCE_DIALOG (user_data);
   children = gtk_container_get_children (GTK_CONTAINER (self->calendars_listbox));
   contains_source = FALSE;
 
   for (l = children; l != NULL; l = l->next)
     {
-      if (g_object_get_data (l->data, "source") == source)
+      if (g_object_get_data (l->data, "calendar") == calendar)
         {
           contains_source = TRUE;
           break;
@@ -327,11 +380,13 @@ add_source (GcalManager *manager,
   if (!contains_source)
     {
       GtkWidget *row;
+      ESource *source;
       ESource *parent;
 
+      source = gcal_calendar_get_source (calendar);
       parent = gcal_manager_get_source (manager, e_source_get_parent (source));
 
-      row = make_row_from_source (GCAL_SOURCE_DIALOG (user_data), source);
+      row = make_calendar_row (self, calendar);
       g_object_set_data (G_OBJECT (row), "source", source);
 
       if (e_source_has_extension (parent, E_SOURCE_EXTENSION_GOA))
@@ -566,95 +621,6 @@ is_goa_source (GcalSourceDialog *dialog,
   return is_goa;
 }
 
-static void
-source_color_changed (GObject    *source,
-                      GParamSpec *pspec,
-                      GtkImage *icon)
-{
-  ESourceSelectable *extension;
-  cairo_surface_t *surface;
-  GdkRGBA out_color;
-
-  extension = E_SOURCE_SELECTABLE (source);
-
-  if (!gdk_rgba_parse (&out_color, e_source_selectable_get_color (extension)))
-    {
-      g_warning ("Error parsing color");
-      return;
-    }
-
-  if (gdk_rgba_parse (&out_color, e_source_selectable_get_color (extension)))
-    {
-      surface = get_circle_surface_from_color (&out_color, 24);
-      gtk_image_set_from_surface (GTK_IMAGE (icon), surface);
-      g_clear_pointer (&surface, cairo_surface_destroy);
-    }
-}
-
-static void
-invalidate_calendar_listbox_sort (GObject    *source,
-                                  GParamSpec *pspec,
-                                  gpointer    user_data)
-{
-  g_return_if_fail (GTK_IS_LIST_BOX (user_data));
-
-  gtk_list_box_invalidate_sort (GTK_LIST_BOX (user_data));
-}
-
-static GtkWidget*
-make_row_from_source (GcalSourceDialog *dialog,
-                      ESource          *source)
-{
-  ESourceSelectable *extension;
-  cairo_surface_t *surface;
-  GcalManager *manager;
-  GtkBuilder *builder;
-  GtkWidget *bottom_label;
-  GtkWidget *top_label;
-  GtkWidget *icon;
-  GtkWidget *row;
-  GdkRGBA color;
-  gchar *parent_name;
-
-  manager = gcal_context_get_manager (dialog->context);
-  get_source_parent_name_color (manager, source, &parent_name, NULL);
-
-  builder = gtk_builder_new_from_resource ("/org/gnome/calendar/calendar-row.ui");
-
-  /*
-   * Since we're destroying the builder instance before adding
-   * the row to the listbox, it should be referenced here so
-   * it isn't destroyed with the GtkBuilder.
-   */
-  row = g_object_ref (GTK_WIDGET (gtk_builder_get_object (builder, "row")));
-
-  /* source color icon */
-  get_color_name_from_source (source, &color);
-  surface = get_circle_surface_from_color (&color, 24);
-  icon = GTK_WIDGET (gtk_builder_get_object (builder, "icon"));
-  gtk_image_set_from_surface (GTK_IMAGE (icon), surface);
-
-  /* source name label */
-  top_label = GTK_WIDGET (gtk_builder_get_object (builder, "title"));
-  gtk_label_set_label (GTK_LABEL (top_label), e_source_get_display_name (source));
-  g_object_bind_property (source, "display-name", top_label, "label", G_BINDING_DEFAULT | 
G_BINDING_SYNC_CREATE);
-  g_signal_connect (source, "notify::display-name", G_CALLBACK (invalidate_calendar_listbox_sort),
-                    dialog->calendars_listbox);
-
-  extension = E_SOURCE_SELECTABLE (e_source_get_extension (source, E_SOURCE_EXTENSION_CALENDAR));
-  g_signal_connect (extension, "notify::color", G_CALLBACK (source_color_changed), icon);
-
-  /* parent source name label */
-  bottom_label = GTK_WIDGET (gtk_builder_get_object (builder, "subtitle"));
-  gtk_label_set_label (GTK_LABEL (bottom_label), parent_name);
-
-  g_clear_pointer (&surface, cairo_surface_destroy);
-  g_object_unref (builder);
-  g_free (parent_name);
-
-  return row;
-}
-
 static void
 name_entry_text_changed (GObject    *object,
                          GParamSpec *pspec,
@@ -1643,30 +1609,20 @@ discover_sources_cb (GObject      *source,
   g_slist_free_full (user_addresses, g_free);
 }
 
-/**
- * remove_source:
- *
- * Removes the given source from the source
- * list.
- *
- * Returns:
- */
 static void
-remove_source (GcalManager *manager,
-               ESource     *source,
-               gpointer     user_data)
+remove_calendar (GcalManager      *manager,
+                 GcalCalendar     *calendar,
+                 GcalSourceDialog *self)
 {
-  GcalSourceDialog *self;
   GList *children, *aux;
 
-  self = GCAL_SOURCE_DIALOG (user_data);
   children = gtk_container_get_children (GTK_CONTAINER (self->calendars_listbox));
 
   for (aux = children; aux != NULL; aux = aux->next)
     {
-      ESource *child_source = g_object_get_data (G_OBJECT (aux->data), "source");
+      GcalCalendar *row_calendar = g_object_get_data (G_OBJECT (aux->data), "calendar");
 
-      if (child_source != NULL && child_source == source)
+      if (row_calendar && row_calendar == calendar)
         {
           gtk_widget_destroy (aux->data);
           break;
@@ -1698,18 +1654,21 @@ notification_child_revealed_changed (GtkWidget  *notification,
   manager = gcal_context_get_manager (self->context);
 
   /* If we have any removed source, delete it */
-  if (self->removed_source != NULL)
+  if (self->removed_calendar != NULL)
     {
-      GError *error = NULL;
+      g_autoptr (GError) error = NULL;
+      ESource *removed_source;
+
+      removed_source = gcal_calendar_get_source (self->removed_calendar);
 
       /* We don't really want to remove non-removable sources */
-      if (!e_source_get_removable (self->removed_source))
+      if (!e_source_get_removable (removed_source))
         return;
 
       /* Enable the source again to remove it's name from disabled list */
-      gcal_manager_enable_source (manager, self->removed_source);
+      gcal_manager_enable_source (manager, removed_source);
 
-      e_source_remove_sync (self->removed_source, NULL, &error);
+      e_source_remove_sync (removed_source, NULL, &error);
 
       /**
        * If something goes wrong, throw
@@ -1719,14 +1678,8 @@ notification_child_revealed_changed (GtkWidget  *notification,
         {
           g_warning ("[source-dialog] Error removing source: %s", error->message);
 
-          add_source (manager,
-                      self->removed_source,
-                      is_source_enabled (self->removed_source),
-                      user_data);
-
-          gcal_manager_enable_source (manager, self->removed_source);
-
-          g_error_free (error);
+          add_calendar (manager, self->removed_calendar, self);
+          gcal_manager_enable_source (manager, removed_source);
         }
     }
 }
@@ -1748,21 +1701,22 @@ undo_remove_action (GtkButton *button,
   manager = gcal_context_get_manager (self->context);
 
   /* if there's any set source, unremove it */
-  if (self->removed_source != NULL)
+  if (self->removed_calendar != NULL)
     {
+      ESource *removed_source;
+
+      removed_source = gcal_calendar_get_source (self->removed_calendar);
+
       /* Enable the source before adding it again */
-      gcal_manager_enable_source (manager, self->removed_source);
+      gcal_manager_enable_source (manager, removed_source);
 
-      add_source (manager,
-                  self->removed_source,
-                  is_source_enabled (self->removed_source),
-                  user_data);
+      add_calendar (manager, self->removed_calendar, self);
 
       /*
        * Don't clear the pointer, since we don't
        * want to erase the source at all.
        */
-      self->removed_source = NULL;
+      self->removed_calendar = NULL;
 
       /* Hide notification */
       gtk_revealer_set_reveal_child (GTK_REVEALER (self->notification), FALSE);
@@ -1820,10 +1774,12 @@ remove_button_clicked (GtkWidget *button,
 
   if (self->source != NULL)
     {
+      ESource *removed_source;
       GList *children, *l;
       gchar *str;
 
-      self->removed_source = self->source;
+      removed_source = self->source;
+      self->removed_calendar = gcal_manager_get_calendar_from_source (manager, removed_source);
       self->source = NULL;
       children = gtk_container_get_children (GTK_CONTAINER (self->calendars_listbox));
 
@@ -1832,7 +1788,7 @@ remove_button_clicked (GtkWidget *button,
       /* Remove the listbox entry (if any) */
       for (l = children; l != NULL; l = l->next)
         {
-          if (g_object_get_data (l->data, "source") == self->removed_source)
+          if (g_object_get_data (l->data, "calendar") == self->removed_calendar)
             {
               gtk_widget_destroy (l->data);
               break;
@@ -1840,7 +1796,7 @@ remove_button_clicked (GtkWidget *button,
         }
 
       /* Update notification label */
-      str = g_markup_printf_escaped (_("Calendar <b>%s</b> removed"), e_source_get_display_name 
(self->removed_source));
+      str = g_markup_printf_escaped (_("Calendar <b>%s</b> removed"), gcal_calendar_get_name 
(self->removed_calendar));
       gtk_label_set_markup (GTK_LABEL (self->notification_label), str);
 
       /* Remove old notifications */
@@ -1850,7 +1806,7 @@ remove_button_clicked (GtkWidget *button,
       self->notification_timeout_id = g_timeout_add_seconds (5, hide_notification_scheduled, user_data);
 
       /* Disable the source, so it gets hidden */
-      gcal_manager_disable_source (manager, self->removed_source);
+      gcal_manager_disable_source (manager, removed_source);
 
       g_list_free (children);
       g_free (str);
@@ -2056,8 +2012,8 @@ setup_context (GcalSourceDialog *self)
   g_signal_connect (client, "account-removed", G_CALLBACK (goa_account_removed_cb), self);
 
   manager = gcal_context_get_manager (self->context);
-  g_signal_connect (manager, "source-added", G_CALLBACK (add_source), self);
-  g_signal_connect (manager, "source-removed", G_CALLBACK (remove_source), self);
+  g_signal_connect (manager, "calendar-added", G_CALLBACK (add_calendar), self);
+  g_signal_connect (manager, "calendar-removed", G_CALLBACK (remove_calendar), self);
 
   g_list_free_full (accounts, g_object_unref);
 
diff --git a/src/gcal-window.c b/src/gcal-window.c
index 3e03bbe8..7bc8d78a 100644
--- a/src/gcal-window.c
+++ b/src/gcal-window.c
@@ -666,41 +666,14 @@ hide_notification_scheduled (gpointer window)
   return FALSE;
 }
 
-static void
-on_calendar_toggled (GObject    *object,
-                     GParamSpec *pspec,
-                     gpointer    user_data)
-{
-  GcalManager *manager;
-  GcalWindow *window;
-  gboolean active;
-  GtkWidget *row;
-  ESource *source;
-
-  window = GCAL_WINDOW (user_data);
-  manager = gcal_context_get_manager (window->context);
-  active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (object));
-  row = gtk_widget_get_parent (gtk_widget_get_parent (GTK_WIDGET (object)));
-  source = g_object_get_data (G_OBJECT (row), "source");
-
-  if (source == NULL)
-    return;
-
-  /* Enable/disable the toggled calendar */
-  if (active)
-    gcal_manager_enable_source (manager, source);
-  else
-    gcal_manager_disable_source (manager, source);
-}
-
 static GtkWidget*
-make_row_from_source (GcalWindow *window,
-                      ESource    *source)
+make_calendar_row (GcalWindow   *window,
+                   GcalCalendar *calendar)
 {
   GtkWidget *label, *icon, *checkbox, *box, *row;
   GtkStyleContext *context;
   cairo_surface_t *surface;
-  GdkRGBA color;
+  const GdkRGBA *color;
 
   row = gtk_list_box_row_new ();
 
@@ -715,21 +688,24 @@ make_row_from_source (GcalWindow *window,
   gtk_container_set_border_width (GTK_CONTAINER (box), 6);
 
   /* source color icon */
-  get_color_name_from_source (source, &color);
-  surface = get_circle_surface_from_color (&color, 16);
+  color = gcal_calendar_get_color (calendar);
+  surface = get_circle_surface_from_color (color, 16);
   icon = gtk_image_new_from_surface (surface);
 
   gtk_style_context_add_class (gtk_widget_get_style_context (icon), "calendar-color-image");
 
   /* source name label */
-  label = gtk_label_new (e_source_get_display_name (source));
+  label = gtk_label_new (gcal_calendar_get_name (calendar));
   gtk_label_set_xalign (GTK_LABEL (label), 0.0);
   gtk_widget_set_hexpand (label, TRUE);
 
   /* checkbox */
   checkbox = gtk_check_button_new ();
-  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbox), is_source_enabled (source));
-  g_signal_connect (checkbox, "notify::active", G_CALLBACK (on_calendar_toggled), window);
+  g_object_bind_property (calendar,
+                          "visible",
+                          checkbox,
+                          "active",
+                          G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
 
   gtk_container_add (GTK_CONTAINER (box), icon);
   gtk_container_add (GTK_CONTAINER (box), label);
@@ -737,7 +713,7 @@ make_row_from_source (GcalWindow *window,
   gtk_container_add (GTK_CONTAINER (row), box);
 
   g_object_set_data (G_OBJECT (row), "check", checkbox);
-  g_object_set_data (G_OBJECT (row), "source", source);
+  g_object_set_data (G_OBJECT (row), "calendar", calendar);
 
   gtk_widget_show_all (row);
 
@@ -747,36 +723,30 @@ make_row_from_source (GcalWindow *window,
 }
 
 static void
-add_source (GcalManager *manager,
-            ESource     *source,
-            gboolean     enabled,
-            gpointer     user_data)
+add_calendar (GcalManager  *manager,
+              GcalCalendar *calendar,
+              GcalWindow   *self)
 {
-  GcalWindow *window;
   GtkWidget *row;
 
-  window = GCAL_WINDOW (user_data);
-
-  row = make_row_from_source (GCAL_WINDOW (user_data), source);
-
-  gtk_container_add (GTK_CONTAINER (window->calendar_listbox), row);
+  row = make_calendar_row (self, calendar);
+  gtk_container_add (GTK_CONTAINER (self->calendar_listbox), row);
 }
 
 static void
-remove_source (GcalManager *manager,
-               ESource     *source,
-               gpointer     user_data)
+remove_calendar (GcalManager  *manager,
+                 GcalCalendar *calendar,
+                 GcalWindow   *self)
 {
-  GcalWindow *window = GCAL_WINDOW (user_data);
   GList *children, *aux;
 
-  children = gtk_container_get_children (GTK_CONTAINER (window->calendar_listbox));
+  children = gtk_container_get_children (GTK_CONTAINER (self->calendar_listbox));
 
   for (aux = children; aux != NULL; aux = aux->next)
     {
-      ESource *child_source = g_object_get_data (G_OBJECT (aux->data), "source");
+      GcalCalendar *row_calendar = g_object_get_data (G_OBJECT (aux->data), "calendar");
 
-      if (child_source != NULL && child_source == source)
+      if (row_calendar && row_calendar == calendar)
         {
           gtk_widget_destroy (aux->data);
           break;
@@ -800,62 +770,11 @@ source_row_activated (GtkListBox    *listbox,
 }
 
 static void
-source_enabled (GcalWindow *self,
-                ESource    *source,
-                gboolean    enabled)
-{
-  GList *children, *aux;
-
-  children = gtk_container_get_children (GTK_CONTAINER (self->calendar_listbox));
-
-  for (aux = children; aux != NULL; aux = aux->next)
-    {
-      ESource *child_source = g_object_get_data (G_OBJECT (aux->data), "source");
-
-      if (child_source != NULL && child_source == source)
-        {
-          GtkToggleButton *button = g_object_get_data (G_OBJECT (aux->data), "check");
-
-          g_signal_handlers_block_by_func (button, on_calendar_toggled, self);
-          gtk_toggle_button_set_active (button, enabled);
-          g_signal_handlers_unblock_by_func (button, on_calendar_toggled, self);
-
-          break;
-        }
-    }
-
-  g_list_free (children);
-}
-
-static void
-source_changed (GcalWindow *window,
-                ESource    *source)
+calendar_changed (GcalWindow   *window,
+                  GcalCalendar *calendar)
 {
-  GcalManager *manager;
-  GList *children, *aux;
-
-  manager = gcal_context_get_manager (window->context);
-  children = gtk_container_get_children (GTK_CONTAINER (window->calendar_listbox));
-
-  for (aux = children; aux != NULL; aux = aux->next)
-    {
-      ESource *child_source = g_object_get_data (G_OBJECT (aux->data), "source");
-
-      /*
-       * Here we destroy the row and re-add it because there is no
-       * way to actually bind the ::enabled state of source. It behaves
-       * like a construct-only property, and we need to re-create the
-       * row if there's any changes.
-       */
-      if (child_source != NULL && child_source == source)
-        {
-          gtk_widget_destroy (aux->data);
-          add_source (manager, source, is_source_enabled (source), window);
-          break;
-        }
-    }
-
-  g_list_free (children);
+  remove_calendar (NULL, calendar, window);
+  add_calendar (NULL, calendar, window);
 }
 
 static gboolean
@@ -1204,19 +1123,12 @@ gcal_window_set_property (GObject      *object,
               calendars = gcal_manager_get_calendars (manager);
 
               for (l = calendars; l; l = l->next)
-                {
-                  GcalCalendar *calendar = l->data;
-                  add_source (manager,
-                              gcal_calendar_get_source (calendar),
-                              gcal_calendar_get_visible (calendar),
-                              self);
-                }
+                add_calendar (manager, l->data, self);
             }
 
-          g_signal_connect (manager, "source-added", G_CALLBACK (add_source), object);
-          g_signal_connect (manager, "source-removed", G_CALLBACK (remove_source), object);
-          g_signal_connect_swapped (manager, "source-enabled", G_CALLBACK (source_enabled), object);
-          g_signal_connect_swapped (manager, "source-changed", G_CALLBACK (source_changed), object);
+          g_signal_connect (manager, "calendar-added", G_CALLBACK (add_calendar), object);
+          g_signal_connect (manager, "calendar-removed", G_CALLBACK (remove_calendar), object);
+          g_signal_connect_swapped (manager, "calendar-changed", G_CALLBACK (calendar_changed), object);
 
           g_object_notify_by_pspec (object, properties[PROP_CONTEXT]);
         }
diff --git a/src/search/gcal-search-engine.c b/src/search/gcal-search-engine.c
index cd9ad95c..9c974c46 100644
--- a/src/search/gcal-search-engine.c
+++ b/src/search/gcal-search-engine.c
@@ -111,50 +111,41 @@ search_func (GTask        *task,
 }
 
 static void
-on_manager_source_added_cb (GcalManager      *manager,
-                            ESource          *source,
-                            gboolean          enabled,
-                            GcalSearchEngine *self)
+on_manager_calendar_added_cb (GcalManager      *manager,
+                              GcalCalendar     *calendar,
+                              GcalSearchEngine *self)
 {
   ECalClient *client;
 
-  g_debug ("Removing source %s from search results", e_source_get_uid (source));
+  g_debug ("Removing source %s from search results", gcal_calendar_get_id (calendar));
 
-  client = gcal_manager_get_client (manager, source);
+  client = gcal_calendar_get_client (calendar);
 
-  if (enabled)
+  if (gcal_calendar_get_visible (calendar))
     e_cal_data_model_add_client (self->data_model, client);
 }
 
 static void
-on_manager_source_enabled_cb (GcalManager      *manager,
-                              ESource          *source,
-                              gboolean          enabled,
-                              GcalSearchEngine *self)
+on_manager_calendar_changed_cb (GcalManager      *manager,
+                                GcalCalendar     *calendar,
+                                GcalSearchEngine *self)
 {
-  g_debug ("Changing source %s from search results", e_source_get_uid (source));
-
-  if (enabled)
-    {
-      ECalClient *client;
+  g_debug ("Changing source %s from search results", gcal_calendar_get_id (calendar));
 
-      client = gcal_manager_get_client (manager, source);
-      e_cal_data_model_add_client (self->data_model, client);
-    }
+  if (gcal_calendar_get_visible (calendar))
+    e_cal_data_model_add_client (self->data_model, gcal_calendar_get_client (calendar));
   else
-    {
-      e_cal_data_model_remove_client (self->data_model, e_source_get_uid (source));
-    }
+    e_cal_data_model_remove_client (self->data_model, gcal_calendar_get_id (calendar));
 }
 
 static void
-on_manager_source_removed_cb (GcalManager      *manager,
-                              ESource          *source,
-                              GcalSearchEngine *self)
+on_manager_calendar_removed_cb (GcalManager      *manager,
+                                GcalCalendar     *calendar,
+                                GcalSearchEngine *self)
 {
-  g_debug ("Removing source %s from search results", e_source_get_uid (source));
+  g_debug ("Removing source %s from search results", gcal_calendar_get_id (calendar));
 
-  e_cal_data_model_remove_client (self->data_model, e_source_get_uid (source));
+  e_cal_data_model_remove_client (self->data_model, gcal_calendar_get_id (calendar));
 }
 
 static void
@@ -196,9 +187,9 @@ gcal_search_engine_constructed (GObject *object)
 
 
   manager = gcal_context_get_manager (self->context);
-  g_signal_connect_object (manager, "source-added", G_CALLBACK (on_manager_source_added_cb), self, 0);
-  g_signal_connect_object (manager, "source-removed", G_CALLBACK (on_manager_source_removed_cb), self, 0);
-  g_signal_connect_object (manager, "source-enabled", G_CALLBACK (on_manager_source_enabled_cb), self, 0);
+  g_signal_connect_object (manager, "calendar-added", G_CALLBACK (on_manager_calendar_added_cb), self, 0);
+  g_signal_connect_object (manager, "calendar-changed", G_CALLBACK (on_manager_calendar_changed_cb), self, 
0);
+  g_signal_connect_object (manager, "calendar-removed", G_CALLBACK (on_manager_calendar_removed_cb), self, 
0);
 
   g_signal_connect_object (self->context,
                            "notify::timezone",



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