diff --git a/src/gui/event-editor/gcal-event-editor-dialog.c b/src/gui/event-editor/gcal-event-editor-dialog.c index 283fe0356d8b622fac5ca9988b2d79ba42d871ee..8db3a9fd8e3295f01c9ee52c60b2fdd8b7366fe1 100644 --- a/src/gui/event-editor/gcal-event-editor-dialog.c +++ b/src/gui/event-editor/gcal-event-editor-dialog.c @@ -210,13 +210,13 @@ create_row_func (gpointer data, static void setup_context (GcalEventEditorDialog *self) { + g_autoptr (GListModel) calendars = NULL; GcalManager *manager; - GListModel *calendars; GCAL_ENTRY; manager = gcal_context_get_manager (self->context); - calendars = gcal_manager_get_calendars_model (manager); + calendars = gcal_create_writable_calendars_model (manager); gtk_list_box_bind_model (self->calendars_listbox, calendars, create_row_func, self, NULL); diff --git a/src/gui/importer/gcal-import-dialog.c b/src/gui/importer/gcal-import-dialog.c index bf608364dd5fc87dd289610733199f82bbc62760..dd41991293a14323a87226aabd29e6ab21659ea5 100644 --- a/src/gui/importer/gcal-import-dialog.c +++ b/src/gui/importer/gcal-import-dialog.c @@ -98,13 +98,13 @@ import_data_free (gpointer data) static void update_default_calendar (GcalImportDialog *self) { + g_autoptr (GListModel) calendars = NULL; GcalCalendar *default_calendar; GcalManager *manager; - GListModel *calendars; guint position; manager = gcal_context_get_manager (self->context); - calendars = gcal_manager_get_calendars_model (manager); + calendars = gcal_create_writable_calendars_model (manager); default_calendar = gcal_manager_get_default_calendar (manager); if (default_calendar && g_list_store_find (G_LIST_STORE (calendars), default_calendar, &position)) @@ -114,15 +114,17 @@ update_default_calendar (GcalImportDialog *self) static void setup_calendars (GcalImportDialog *self) { + g_autoptr (GListModel) calendars = NULL; GcalManager *manager; g_assert (self->context != NULL); manager = gcal_context_get_manager (self->context); + calendars = gcal_create_writable_calendars_model (manager); // TODO: sort model - adw_combo_row_set_model (self->calendar_combo_row, gcal_manager_get_calendars_model (manager)); + adw_combo_row_set_model (self->calendar_combo_row, calendars); update_default_calendar (self); g_signal_connect_object (manager, "notify::default-calendar", G_CALLBACK (update_default_calendar), self, G_CONNECT_SWAPPED); diff --git a/src/utils/gcal-utils.c b/src/utils/gcal-utils.c index d2721b510406f1673a34c5d560d43cd45d62ad60..c78549f8a848432890688b98d20134ef5ab57654 100644 --- a/src/utils/gcal-utils.c +++ b/src/utils/gcal-utils.c @@ -1356,3 +1356,29 @@ gcal_create_soup_session (void) return g_steal_pointer (&session); } + +/** + * gcal_create_writable_calendars_model: + * @manager: a #GcalManager + * + * Retrieves a model with all available read-write #GcalCalendar. + * This is useful for binding to combo rows. + * + * Returns: (transfer full): a #GListModel with all available read-write #GcalCalendar + */ +GListModel* +gcal_create_writable_calendars_model (GcalManager *manager) +{ + GtkBoolFilter *bool_filter; + GtkExpression *expression; + + g_return_val_if_fail (GCAL_IS_MANAGER (manager), NULL); + + expression = gtk_property_expression_new (GCAL_TYPE_CALENDAR, NULL, "read-only"); + + bool_filter = gtk_bool_filter_new (expression); + gtk_bool_filter_set_invert (bool_filter, TRUE); + + return G_LIST_MODEL (gtk_filter_list_model_new (G_LIST_MODEL (gcal_manager_get_calendars_model (manager)), + GTK_FILTER (bool_filter))); +} diff --git a/src/utils/gcal-utils.h b/src/utils/gcal-utils.h index 721847a29ab86510caca6d0aa5e75e87abee0903..c5dd8d24d0cb63b8a96e27350b93521445d2ffed 100644 --- a/src/utils/gcal-utils.h +++ b/src/utils/gcal-utils.h @@ -141,4 +141,6 @@ const gchar* gcal_get_service_name_from_url (const gchar SoupSession * gcal_create_soup_session (void); +GListModel * gcal_create_writable_calendars_model (GcalManager *manager); + #endif /* __GCAL_UTILS_H__ */