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); + GCAL_TYPE_CALENDAR); - 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[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[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); + 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) { - /* Enable the source before adding it again */ - gcal_manager_enable_source (manager, self->removed_source); + ESource *removed_source; - add_source (manager, - self->removed_source, - is_source_enabled (self->removed_source), - user_data); + removed_source = gcal_calendar_get_source (self->removed_calendar); + + /* Enable the source before adding it again */ + gcal_manager_enable_source (manager, removed_source); + + 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 %s removed"), e_source_get_display_name (self->removed_source)); + str = g_markup_printf_escaped (_("Calendar %s 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) +calendar_changed (GcalWindow *window, + GcalCalendar *calendar) { - 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) -{ - 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)); + g_debug ("Changing source %s from search results", gcal_calendar_get_id (calendar)); - if (enabled) - { - ECalClient *client; - - 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",