From ddb54c8c1cdc7220ef1640b856e4e6e9f1a69b9e Mon Sep 17 00:00:00 2001 From: Hari Rana Date: Thu, 30 Nov 2023 22:56:46 -0500 Subject: [PATCH] event-editor: Improve event name validation handling - Fix a bug where clicking the "Add Event" button created an empty title in the event editor dialog. - Add "error" class when the user writes an invalid event name. - Add new function to validate event name. Because the sections are split into files, the event editor will need a signal to check that each section is correct, and each section will have to emit the signal. This will need to be done in a future commit. --- .../event-editor/gcal-event-editor-dialog.c | 4 ++++ src/gui/event-editor/gcal-summary-section.c | 23 ++++++++++++------- src/gui/event-editor/gcal-summary-section.ui | 1 + src/gui/gcal-quick-add-popover.c | 21 ++++++++++++----- src/utils/gcal-utils.c | 15 ++++++++++++ src/utils/gcal-utils.h | 2 ++ 6 files changed, 52 insertions(+), 14 deletions(-) diff --git a/src/gui/event-editor/gcal-event-editor-dialog.c b/src/gui/event-editor/gcal-event-editor-dialog.c index 56c96f4f..8bc9243d 100644 --- a/src/gui/event-editor/gcal-event-editor-dialog.c +++ b/src/gui/event-editor/gcal-event-editor-dialog.c @@ -773,6 +773,10 @@ gcal_event_editor_dialog_set_event (GcalEventEditorDialog *self, g_object_add_weak_pointer (G_OBJECT (self->event_title_binding), (gpointer*) &self->event_title_binding); + /* change title when event name is empty */ + if (!gcal_is_valid_event_name (gtk_label_get_label (GTK_LABEL (self->title_label)))) + gtk_label_set_label (GTK_LABEL (self->title_label), _("New Event")); + gtk_label_set_label (GTK_LABEL (self->subtitle_label), gcal_calendar_get_name (calendar)); self->selected_calendar = calendar; diff --git a/src/gui/event-editor/gcal-summary-section.c b/src/gui/event-editor/gcal-summary-section.c index f9cd7b2a..661cd289 100644 --- a/src/gui/event-editor/gcal-summary-section.c +++ b/src/gui/event-editor/gcal-summary-section.c @@ -24,6 +24,7 @@ #include "gcal-debug.h" #include "gcal-event-editor-section.h" #include "gcal-summary-section.h" +#include "gcal-utils.h" #include @@ -61,7 +62,6 @@ gcal_reminders_section_set_event (GcalEventEditorSection *section, GcalEventEditorFlags flags) { GcalSummarySection *self; - const gchar *summary; GCAL_ENTRY; @@ -72,20 +72,25 @@ gcal_reminders_section_set_event (GcalEventEditorSection *section, if (!event) GCAL_RETURN (); - summary = gcal_event_get_summary (event); - - if (g_strcmp0 (summary, "") == 0) - gtk_editable_set_text (GTK_EDITABLE (self->summary_entry), _("Unnamed event")); - else - gtk_editable_set_text (GTK_EDITABLE (self->summary_entry), summary); - + gtk_editable_set_text (GTK_EDITABLE (self->summary_entry), gcal_event_get_summary (event)); gtk_editable_set_text (GTK_EDITABLE (self->location_entry), gcal_event_get_location (event)); adw_entry_row_grab_focus_without_selecting (self->summary_entry); + gtk_widget_remove_css_class (GTK_WIDGET (self->summary_entry), "error"); + GCAL_EXIT; } +static void +on_summary_entry_text_changed_cb (AdwEntryRow *entry_row) +{ + if (gcal_is_valid_event_name (gtk_editable_get_text (GTK_EDITABLE (entry_row)))) + gtk_widget_remove_css_class (GTK_WIDGET (entry_row), "error"); + else + gtk_widget_add_css_class (GTK_WIDGET (entry_row), "error"); +} + static void gcal_reminders_section_apply (GcalEventEditorSection *section) { @@ -197,6 +202,8 @@ gcal_summary_section_class_init (GcalSummarySectionClass *klass) gtk_widget_class_bind_template_child (widget_class, GcalSummarySection, location_entry); gtk_widget_class_bind_template_child (widget_class, GcalSummarySection, summary_entry); + + gtk_widget_class_bind_template_callback (widget_class, on_summary_entry_text_changed_cb); } static void diff --git a/src/gui/event-editor/gcal-summary-section.ui b/src/gui/event-editor/gcal-summary-section.ui index 1beccc64..c4914313 100644 --- a/src/gui/event-editor/gcal-summary-section.ui +++ b/src/gui/event-editor/gcal-summary-section.ui @@ -14,6 +14,7 @@ Title + diff --git a/src/gui/gcal-quick-add-popover.c b/src/gui/gcal-quick-add-popover.c index e08a08a8..86e01e85 100644 --- a/src/gui/gcal-quick-add-popover.c +++ b/src/gui/gcal-quick-add-popover.c @@ -687,10 +687,7 @@ edit_or_create_event (GcalQuickAddPopover *self, } /* Gather the summary */ - if (gtk_entry_get_text_length (GTK_ENTRY (self->summary_entry)) > 0) - summary = gtk_editable_get_text (GTK_EDITABLE (self->summary_entry)); - else - summary = _("Unnamed event"); + summary = gtk_editable_get_text (GTK_EDITABLE (self->summary_entry)); /* Create an ECalComponent from the data above */ component = build_component_from_details (summary, date_start, date_end); @@ -717,14 +714,23 @@ summary_entry_text_changed (GtkEntry *entry, GParamSpec *pspec, GcalQuickAddPopover *self) { - gtk_widget_set_sensitive (self->add_button, gtk_entry_get_text_length (entry) > 0); + gboolean is_valid_event_name; + + is_valid_event_name = gcal_is_valid_event_name (gtk_editable_get_text (GTK_EDITABLE (entry))); + + if (is_valid_event_name) + gtk_widget_remove_css_class (GTK_WIDGET (entry), "error"); + else + gtk_widget_add_css_class (GTK_WIDGET (entry), "error"); + + gtk_widget_set_sensitive (self->add_button, is_valid_event_name); } static void summary_entry_activated (GtkEntry *entry, GcalQuickAddPopover *self) { - if (gtk_entry_get_text_length (entry) > 0) + if (gcal_is_valid_event_name (gtk_editable_get_text (GTK_EDITABLE (entry)))) edit_or_create_event (self, self->add_button); } @@ -828,6 +834,9 @@ gcal_quick_add_popover_closed (GtkPopover *popover) /* Select the default row again */ update_default_calendar_row (self); + /* Remove "error" class */ + gtk_widget_remove_css_class (self->summary_entry, "error"); + g_clear_pointer (&self->range, gcal_range_unref); } diff --git a/src/utils/gcal-utils.c b/src/utils/gcal-utils.c index 5ed9c4b8..d157e672 100644 --- a/src/utils/gcal-utils.c +++ b/src/utils/gcal-utils.c @@ -1343,3 +1343,18 @@ gcal_util_get_app_timezone_or_local () context = gcal_application_get_context (application); return g_time_zone_ref (gcal_context_get_timezone (context)); } + +/** + * gcal_is_valid_event_name: + * @event_name: the name of the event to check + * + * Check if the event name is valid + * + * Returns: %TRUE if the name is valid, %FALSE otherwise. + */ +gboolean +gcal_is_valid_event_name (const gchar *event_name) +{ + g_autofree gchar *aux = g_strstrip (g_strdup (event_name)); + return g_utf8_strlen (aux, -1) > 0; +} diff --git a/src/utils/gcal-utils.h b/src/utils/gcal-utils.h index 538a4b1f..059299fc 100644 --- a/src/utils/gcal-utils.h +++ b/src/utils/gcal-utils.h @@ -138,4 +138,6 @@ const gchar * gcal_util_translate_time_string (const gchar GTimeZone * gcal_util_get_app_timezone_or_local (); +gboolean gcal_is_valid_event_name (const gchar *event_name); + #endif /* __GCAL_UTILS_H__ */