From 648badb8261dc8ca1141dfd88986c7b1945a9672 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Diego=20Iv=C3=A1n=20M=2EE?= Date: Wed, 7 Aug 2024 15:42:54 -0600 Subject: [PATCH] new-calendar-page: Cancel validation/discovery when user types It allows the user to fix typos in URLs or delete them. Before this, it would still prompt the password dialog, for instance Closes #1272 --- .../gcal-new-calendar-page.c | 47 ++++++++++++++----- 1 file changed, 35 insertions(+), 12 deletions(-) diff --git a/src/gui/calendar-management/gcal-new-calendar-page.c b/src/gui/calendar-management/gcal-new-calendar-page.c index ff5b5f2a..c9573502 100644 --- a/src/gui/calendar-management/gcal-new-calendar-page.c +++ b/src/gui/calendar-management/gcal-new-calendar-page.c @@ -75,6 +75,8 @@ static void sources_discovered_cb (GObject GAsyncResult *result, gpointer user_data); +static void cancel_validation_discover (GcalNewCalendarPage *self); + static void gcal_calendar_management_page_iface_init (GcalCalendarManagementPageInterface *iface); G_DEFINE_TYPE_WITH_CODE (GcalNewCalendarPage, gcal_new_calendar_page, ADW_TYPE_NAVIGATION_PAGE, @@ -342,7 +344,13 @@ sources_discovered_cb (GObject *source_object, gtk_window_set_transient_for (GTK_WINDOW (self->credentials_dialog), GTK_WINDOW (root)); gtk_window_present (GTK_WINDOW (self->credentials_dialog)); } - else + /* + * If the operation was cancelled by the user, no error message + * or error style class will be applied + */ + else if (!g_error_matches (error, + G_IO_ERROR, + G_IO_ERROR_CANCELLED)) { g_warning ("Error finding sources: %s", error->message); update_url_entry_state (self, ENTRY_STATE_INVALID); @@ -417,6 +425,7 @@ static void on_calendar_address_activated_cb (GtkEntry *entry, GcalNewCalendarPage *self) { + cancel_validation_discover (self); validate_url_cb (self); } @@ -434,6 +443,30 @@ on_credentials_dialog_response_cb (AdwMessageDialog *dialog, gtk_editable_set_text (GTK_EDITABLE (self->credentials_password_entry), ""); } +static void +cancel_validation_discover (GcalNewCalendarPage *self) +{ + if (self->calendar_address_id != 0) + { + gtk_entry_set_progress_fraction (self->calendar_address_entry, 0); + g_clear_handle_id (&self->calendar_address_id, g_source_remove); + } + + /* Cleanup previous remote sources */ + g_clear_pointer (&self->remote_sources, g_ptr_array_unref); + + if (self->validate_url_resource_id != 0) + g_clear_handle_id (&self->validate_url_resource_id, g_source_remove); + + /* Cancel a validation in case it is on-going */ + if (self->calendar_address_entry_state == ENTRY_STATE_VALIDATING) + { + g_cancellable_cancel (self->cancellable); + g_clear_object (&self->cancellable); + self->cancellable = g_cancellable_new (); + } +} + static void on_url_entry_text_changed_cb (GtkEntry *entry, GParamSpec *pspec, @@ -445,17 +478,7 @@ on_url_entry_text_changed_cb (GtkEntry *entry, text = gtk_editable_get_text (GTK_EDITABLE (entry)); - if (self->calendar_address_id != 0) - { - gtk_entry_set_progress_fraction (entry, 0); - g_clear_handle_id (&self->calendar_address_id, g_source_remove); - } - - /* Cleanup previous remote sources */ - g_clear_pointer (&self->remote_sources, g_ptr_array_unref); - - if (self->validate_url_resource_id != 0) - g_clear_handle_id (&self->validate_url_resource_id, g_source_remove); + cancel_validation_discover (self); if (text && g_utf8_strlen (text, -1) > 0) {