From bdda09abb8dd715775386b43449d466ff2ac5e29 Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Tue, 20 Jun 2023 18:07:28 -0300 Subject: [PATCH] calendar-management: Port to AdwNavigationView The interfacing that GcalCalendarManagementDialog had is somewhat similar to AdwNavigationView, with pages and signaling basically matching the same semantics. We can save some code by switching to AdwNavigationView then, as the heavy-lifting of page management is done there now. The headerbar of the dialog is no more; instead, each page has its own headerbar that automatically gets a back button. Page activation and deactivation works essentially the same, but uses AdwNavigationView signals to manage that. --- .../gcal-calendar-management-dialog.c | 68 ++-- .../gcal-calendar-management-dialog.h | 2 - .../gcal-calendar-management-dialog.ui | 28 +- .../gcal-calendar-management-page.c | 11 - .../gcal-calendar-management-page.h | 2 - .../gcal-calendars-page.ui | 72 +++-- .../gcal-edit-calendar-page.c | 29 +- .../gcal-edit-calendar-page.ui | 187 ++++++----- .../gcal-new-calendar-page.c | 37 +-- .../gcal-new-calendar-page.ui | 303 +++++++++--------- 10 files changed, 341 insertions(+), 398 deletions(-) diff --git a/src/gui/calendar-management/gcal-calendar-management-dialog.c b/src/gui/calendar-management/gcal-calendar-management-dialog.c index dadb1a2d..7e5ece84 100644 --- a/src/gui/calendar-management/gcal-calendar-management-dialog.c +++ b/src/gui/calendar-management/gcal-calendar-management-dialog.c @@ -55,10 +55,7 @@ struct _GcalCalendarManagementDialog { AdwWindow parent; - GtkHeaderBar *headerbar; - GtkWidget *notebook; - GtkWidget *stack; - AdwWindowTitle *window_title; + AdwNavigationView *navigation_view; /* flags */ ESource *source; @@ -97,29 +94,21 @@ set_page (GcalCalendarManagementDialog *self, const gchar *page_name, GcalCalendar *calendar) { - GcalCalendarManagementPage *current_page; - guint i; + GcalCalendarManagementPage *next_page; + AdwNavigationPage *page; GCAL_TRACE_MSG ("Switching to page '%s'", page_name); - current_page = (GcalCalendarManagementPage*) gtk_stack_get_visible_child (GTK_STACK (self->stack)); + page = adw_navigation_view_find_page (self->navigation_view, page_name); + g_assert (page != NULL); + next_page = GCAL_CALENDAR_MANAGEMENT_PAGE (adw_navigation_page_get_child (page)); - for (i = 0; i < N_PAGES; i++) - { - GcalCalendarManagementPage *page = self->pages[i]; + gcal_calendar_management_page_activate (next_page, calendar); - if (g_strcmp0 (page_name, gcal_calendar_management_page_get_name (page)) != 0) - continue; + adw_navigation_view_pop (self->navigation_view); - gtk_stack_set_visible_child (GTK_STACK (self->stack), GTK_WIDGET (page)); - gcal_calendar_management_page_activate (page, calendar); - - adw_window_title_set_title (self->window_title, - gcal_calendar_management_page_get_title (page)); - break; - } - - gcal_calendar_management_page_deactivate (current_page); + if (page != adw_navigation_view_get_visible_page (self->navigation_view)) + adw_navigation_view_push (self->navigation_view, page); } static void @@ -140,16 +129,16 @@ setup_context (GcalCalendarManagementDialog *self) for (i = 0; i < N_PAGES; i++) { GcalCalendarManagementPage *page; + AdwNavigationPage *navigation_page; page = g_object_new (pages[i].gtype, "context", self->context, NULL); - gtk_widget_set_visible (GTK_WIDGET (page), TRUE); - gtk_stack_add_titled (GTK_STACK (self->stack), - GTK_WIDGET (page), - gcal_calendar_management_page_get_name (page), - gcal_calendar_management_page_get_title (page)); + navigation_page = adw_navigation_page_new (GTK_WIDGET (page), + gcal_calendar_management_page_get_title (page)); + adw_navigation_page_set_tag (navigation_page, gcal_calendar_management_page_get_name (page)); + adw_navigation_view_add (self->navigation_view, navigation_page); g_signal_connect_object (page, "switch-page", @@ -170,6 +159,19 @@ setup_context (GcalCalendarManagementDialog *self) * Callbacks */ +static void +on_navigation_view_popped_cb (AdwNavigationView *navigation_view, + AdwNavigationPage *popped_page, + GcalCalendarManagementDialog *self) +{ + GcalCalendarManagementPage *page; + + page = GCAL_CALENDAR_MANAGEMENT_PAGE (adw_navigation_page_get_child (popped_page)); + g_assert (page != NULL); + + gcal_calendar_management_page_deactivate (page); +} + static void on_page_switched_cb (GcalCalendarManagementPage *page, const gchar *next_page, @@ -266,9 +268,9 @@ gcal_calendar_management_dialog_class_init (GcalCalendarManagementDialogClass *k gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/calendar/ui/gui/calendar-management/gcal-calendar-management-dialog.ui"); - gtk_widget_class_bind_template_child (widget_class, GcalCalendarManagementDialog, headerbar); - gtk_widget_class_bind_template_child (widget_class, GcalCalendarManagementDialog, stack); - gtk_widget_class_bind_template_child (widget_class, GcalCalendarManagementDialog, window_title); + gtk_widget_class_bind_template_child (widget_class, GcalCalendarManagementDialog, navigation_view); + + gtk_widget_class_bind_template_callback (widget_class, on_navigation_view_popped_cb); } static void @@ -276,11 +278,3 @@ gcal_calendar_management_dialog_init (GcalCalendarManagementDialog *self) { gtk_widget_init_template (GTK_WIDGET (self)); } - -GtkHeaderBar* -gcal_calendar_management_dialog_get_titlebar (GcalCalendarManagementDialog *self) -{ - g_return_val_if_fail (GCAL_IS_CALENDAR_MANAGEMENT_DIALOG (self), NULL); - - return self->headerbar; -} diff --git a/src/gui/calendar-management/gcal-calendar-management-dialog.h b/src/gui/calendar-management/gcal-calendar-management-dialog.h index bcbde11f..9e0bdeeb 100644 --- a/src/gui/calendar-management/gcal-calendar-management-dialog.h +++ b/src/gui/calendar-management/gcal-calendar-management-dialog.h @@ -36,6 +36,4 @@ G_DECLARE_FINAL_TYPE (GcalCalendarManagementDialog, GCAL, CALENDAR_MANAGEMENT_DIALOG, AdwWindow) -GtkHeaderBar* gcal_calendar_management_dialog_get_titlebar (GcalCalendarManagementDialog *self); - G_END_DECLS diff --git a/src/gui/calendar-management/gcal-calendar-management-dialog.ui b/src/gui/calendar-management/gcal-calendar-management-dialog.ui index aaa0755e..03b19ae6 100644 --- a/src/gui/calendar-management/gcal-calendar-management-dialog.ui +++ b/src/gui/calendar-management/gcal-calendar-management-dialog.ui @@ -9,32 +9,8 @@ True True - - False - - - - - True - - - - - - - - - - - True - False - crossfade - - - - - - + + diff --git a/src/gui/calendar-management/gcal-calendar-management-page.c b/src/gui/calendar-management/gcal-calendar-management-page.c index 4575ddb2..afa305f0 100644 --- a/src/gui/calendar-management/gcal-calendar-management-page.c +++ b/src/gui/calendar-management/gcal-calendar-management-page.c @@ -107,14 +107,3 @@ gcal_calendar_management_page_switch_page (GcalCalendarManagementPage *self, g_signal_emit (self, signals[SWITCH_PAGE], 0, page_name, calendar); } - -GtkHeaderBar* -gcal_calendar_management_page_get_titlebar (GcalCalendarManagementPage *self) -{ - GtkNative *native; - - native = gtk_widget_get_native (GTK_WIDGET (self)); - g_assert (native != NULL); - - return gcal_calendar_management_dialog_get_titlebar (GCAL_CALENDAR_MANAGEMENT_DIALOG (native)); -} diff --git a/src/gui/calendar-management/gcal-calendar-management-page.h b/src/gui/calendar-management/gcal-calendar-management-page.h index b6bd6658..e9130fe7 100644 --- a/src/gui/calendar-management/gcal-calendar-management-page.h +++ b/src/gui/calendar-management/gcal-calendar-management-page.h @@ -61,6 +61,4 @@ void gcal_calendar_management_page_switch_page (GcalCalendarMa const gchar *page_name, GcalCalendar *calendar); -GtkHeaderBar* gcal_calendar_management_page_get_titlebar (GcalCalendarManagementPage *self); - G_END_DECLS diff --git a/src/gui/calendar-management/gcal-calendars-page.ui b/src/gui/calendar-management/gcal-calendars-page.ui index a7844887..fbb68e74 100644 --- a/src/gui/calendar-management/gcal-calendars-page.ui +++ b/src/gui/calendar-management/gcal-calendars-page.ui @@ -46,46 +46,64 @@ - - True - True - never - 600 - True + - - - 24 - 24 - 24 - 24 - start - none - - + + + True + + + Calendars + + + + + + + + True + True + never + 600 + True - + + 24 + 24 + 24 + 24 + start + none + + - - True - True - 0.5 - 0.5 - Add Calendar… + + + + + True + True + 0.5 + 0.5 + Add Calendar… + + + - + + diff --git a/src/gui/calendar-management/gcal-edit-calendar-page.c b/src/gui/calendar-management/gcal-edit-calendar-page.c index cb8532ea..7d447c7e 100644 --- a/src/gui/calendar-management/gcal-edit-calendar-page.c +++ b/src/gui/calendar-management/gcal-edit-calendar-page.c @@ -31,7 +31,6 @@ struct _GcalEditCalendarPage GtkBox parent; AdwActionRow *account_row; - GtkWidget *back_button; GtkColorDialogButton *calendar_color_button; AdwSwitchRow *calendar_visible_row; AdwActionRow *calendar_url_row; @@ -225,20 +224,6 @@ update_calendar (GcalEditCalendarPage *self) * Callbacks */ -static void -on_back_button_clicked_cb (GtkButton *back_button, - GcalEditCalendarPage *self) -{ - GcalCalendarManagementPage *page; - - GCAL_ENTRY; - - page = GCAL_CALENDAR_MANAGEMENT_PAGE (self); - gcal_calendar_management_page_switch_page (page, "calendars", NULL); - - GCAL_EXIT; -} - static void on_remove_button_clicked_cb (GtkButton *button, GcalEditCalendarPage *self) @@ -303,28 +288,22 @@ static void gcal_edit_calendar_page_activate (GcalCalendarManagementPage *page, GcalCalendar *calendar) { - GcalEditCalendarPage *self; - GtkHeaderBar *headerbar; + GCAL_ENTRY; - self = GCAL_EDIT_CALENDAR_PAGE (page); - headerbar = gcal_calendar_management_page_get_titlebar (page); - gtk_header_bar_pack_start (headerbar, self->back_button); + setup_calendar (GCAL_EDIT_CALENDAR_PAGE (page), calendar); - setup_calendar (self, calendar); + GCAL_EXIT; } static void gcal_edit_calendar_page_deactivate (GcalCalendarManagementPage *page) { GcalEditCalendarPage *self; - GtkHeaderBar *headerbar; GcalManager *manager; GCAL_ENTRY; self = GCAL_EDIT_CALENDAR_PAGE (page); - headerbar = gcal_calendar_management_page_get_titlebar (page); - gtk_header_bar_remove (headerbar, self->back_button); update_calendar (self); @@ -415,7 +394,6 @@ gcal_edit_calendar_page_class_init (GcalEditCalendarPageClass *klass) gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/calendar/ui/gui/calendar-management/gcal-edit-calendar-page.ui"); gtk_widget_class_bind_template_child (widget_class, GcalEditCalendarPage, account_row); - gtk_widget_class_bind_template_child (widget_class, GcalEditCalendarPage, back_button); gtk_widget_class_bind_template_child (widget_class, GcalEditCalendarPage, calendar_color_button); gtk_widget_class_bind_template_child (widget_class, GcalEditCalendarPage, calendar_url_row); gtk_widget_class_bind_template_child (widget_class, GcalEditCalendarPage, calendar_visible_row); @@ -423,7 +401,6 @@ gcal_edit_calendar_page_class_init (GcalEditCalendarPageClass *klass) gtk_widget_class_bind_template_child (widget_class, GcalEditCalendarPage, name_entry); gtk_widget_class_bind_template_child (widget_class, GcalEditCalendarPage, remove_button); - gtk_widget_class_bind_template_callback (widget_class, on_back_button_clicked_cb); gtk_widget_class_bind_template_callback (widget_class, on_remove_button_clicked_cb); gtk_widget_class_bind_template_callback (widget_class, on_settings_button_clicked_cb); } diff --git a/src/gui/calendar-management/gcal-edit-calendar-page.ui b/src/gui/calendar-management/gcal-edit-calendar-page.ui index 93dda3b8..9dc6f5ae 100644 --- a/src/gui/calendar-management/gcal-edit-calendar-page.ui +++ b/src/gui/calendar-management/gcal-edit-calendar-page.ui @@ -4,124 +4,135 @@ vertical - - - + - + + + False + False + + + + + + + + - - Account - settings_button - + + - - Open in Settings - center - - + + Account + settings_button - - settings-symbolic + + Open in Settings + center + + + + + + + settings-symbolic + + + - - + + + + Location + 1 + + + + - - - - Location - 1 - - - - + + + + Calendar Name + + - - - - Calendar Name - - + + + + Color + calendar_color_button - - - - Color - calendar_color_button + + + center + + + True + False + + + + + + + + + + + + _Display Calendar + true + + - + + Default _Calendar + Add new events to this calendar by default. + true + + + + + + + _Remove Calendar + center center - - - True - False - - + 24 + true + + - - - - _Display Calendar - true - - - - - - Default _Calendar - Add new events to this calendar by default. - true - - - - - - - _Remove Calendar - center - center - 24 - true - - - - - - + + - - - go-previous-symbolic - Back - - diff --git a/src/gui/calendar-management/gcal-new-calendar-page.c b/src/gui/calendar-management/gcal-new-calendar-page.c index 3612195f..f90c4dde 100644 --- a/src/gui/calendar-management/gcal-new-calendar-page.c +++ b/src/gui/calendar-management/gcal-new-calendar-page.c @@ -48,10 +48,9 @@ struct _GcalNewCalendarPage GtkEntry *calendar_address_entry; EntryState calendar_address_entry_state; GcalFileChooserButton *calendar_file_chooser_button; - GtkWidget *cancel_button; GtkWidget *credentials_cancel_button; GtkWidget *credentials_connect_button; - AdwWindow *credentials_dialog; + GtkWindow *credentials_dialog; GtkEntry *credentials_password_entry; GtkEntry *credentials_user_entry; GtkColorDialogButton *local_calendar_color_button; @@ -466,13 +465,6 @@ on_url_entry_text_changed_cb (GtkEntry *entry, GCAL_EXIT; } -static void -on_cancel_button_clicked_cb (GtkWidget *button, - GcalCalendarManagementPage *page) -{ - gcal_calendar_management_page_switch_page (page, "calendars", NULL); -} - static void on_local_calendar_name_row_text_changed_cb (AdwEntryRow *entry_row, GParamSpec *pspec, @@ -516,38 +508,14 @@ gcal_new_calendar_page_get_title (GcalCalendarManagementPage *page) return _("New Calendar"); } -static void -gcal_new_calendar_page_activate (GcalCalendarManagementPage *page, - GcalCalendar *calendar) -{ - GcalNewCalendarPage *self; - GtkHeaderBar *headerbar; - - GCAL_ENTRY; - - self = GCAL_NEW_CALENDAR_PAGE (page); - headerbar = gcal_calendar_management_page_get_titlebar (page); - - gtk_header_bar_pack_start (headerbar, self->cancel_button); - gtk_header_bar_pack_end (headerbar, self->add_button); - gtk_header_bar_set_show_title_buttons (headerbar, FALSE); - - GCAL_EXIT; -} static void gcal_new_calendar_page_deactivate (GcalCalendarManagementPage *page) { GcalNewCalendarPage *self; - GtkHeaderBar *headerbar; GCAL_ENTRY; self = GCAL_NEW_CALENDAR_PAGE (page); - headerbar = gcal_calendar_management_page_get_titlebar (page); - - gtk_header_bar_remove (headerbar, self->cancel_button); - gtk_header_bar_remove (headerbar, self->add_button); - gtk_header_bar_set_show_title_buttons (headerbar, TRUE); g_clear_object (&self->local_source); g_clear_pointer (&self->remote_sources, g_ptr_array_unref); @@ -566,7 +534,6 @@ gcal_calendar_management_page_iface_init (GcalCalendarManagementPageInterface *i { iface->get_name = gcal_new_calendar_page_get_name; iface->get_title = gcal_new_calendar_page_get_title; - iface->activate = gcal_new_calendar_page_activate; iface->deactivate = gcal_new_calendar_page_deactivate; } @@ -658,7 +625,6 @@ gcal_new_calendar_page_class_init (GcalNewCalendarPageClass *klass) gtk_widget_class_bind_template_child (widget_class, GcalNewCalendarPage, add_button); gtk_widget_class_bind_template_child (widget_class, GcalNewCalendarPage, calendar_address_entry); gtk_widget_class_bind_template_child (widget_class, GcalNewCalendarPage, calendar_file_chooser_button); - gtk_widget_class_bind_template_child (widget_class, GcalNewCalendarPage, cancel_button); gtk_widget_class_bind_template_child (widget_class, GcalNewCalendarPage, credentials_cancel_button); gtk_widget_class_bind_template_child (widget_class, GcalNewCalendarPage, credentials_connect_button); gtk_widget_class_bind_template_child (widget_class, GcalNewCalendarPage, credentials_dialog); @@ -671,7 +637,6 @@ gcal_new_calendar_page_class_init (GcalNewCalendarPageClass *klass) gtk_widget_class_bind_template_callback (widget_class, on_add_button_clicked_cb); gtk_widget_class_bind_template_callback (widget_class, on_calendar_address_activated_cb); - gtk_widget_class_bind_template_callback (widget_class, on_cancel_button_clicked_cb); gtk_widget_class_bind_template_callback (widget_class, on_credential_button_clicked_cb); gtk_widget_class_bind_template_callback (widget_class, on_credential_entry_activate_cb); gtk_widget_class_bind_template_callback (widget_class, on_file_chooser_button_file_changed_cb); diff --git a/src/gui/calendar-management/gcal-new-calendar-page.ui b/src/gui/calendar-management/gcal-new-calendar-page.ui index fc7448d4..d13bd4ee 100644 --- a/src/gui/calendar-management/gcal-new-calendar-page.ui +++ b/src/gui/calendar-management/gcal-new-calendar-page.ui @@ -4,166 +4,197 @@ vertical - + - - - + + + False + False - - - - Calendar Name - + + + New Calendar - - - - - - Color - local_calendar_color_button - - - - center - - - True - False - - - - - + + + + Add + False + + - - + + + - - True - Import a Calendar - 0.0 - - - - + + + + + + Calendar Name + + + + + + + + Color + local_calendar_color_button + + + + center + + + True + False + + + + + + + + + - - 12 - 12 + - - Alternatively, enter the web address of an online calendar you want to import, or open a supported calendar file. - True - 0 - - 0 - 0 - 2 - - - - - - - True - https://example.com/calendar.ics - - - - 0 - 1 - - - - - - - - Open a File - - - Calendar files - - *.ical - *.icalendar - *.ics - *.ifb - *.vcs - - - - - - 1 - 1 - + Import a Calendar + 0.0 + + + + - - slide-down - 200 - - 0 - 2 - 2 - + + 12 + 12 + + - - vertical - 6 - - - Calendars - 0 - - - + + Alternatively, enter the web address of an online calendar you want to import, or open a supported calendar file. + True + 0 + + 0 + 0 + 2 + + + + + + + + True + https://example.com/calendar.ics + + + + 0 + 1 + + + + + + + + Open a File + + + Calendar files + + *.ical + *.icalendar + *.ics + *.ifb + *.vcs + - + + + + 1 + 1 + + + + + + + slide-down + 200 + + 0 + 2 + 2 + - - False - none - + + vertical + 6 + + + Calendars + 0 + + + + + + + + False + none + + + - - - - - - If the calendar belongs to one of your online accounts, you can add it through the <a href="GOA">online account settings</a>. - True - True - 0 - - - 0 - 3 - 2 - + + + + If the calendar belongs to one of your online accounts, you can add it through the <a href="GOA">online account settings</a>. + True + True + 0 + + + 0 + 3 + 2 + + + + @@ -171,8 +202,7 @@ - - + @@ -286,17 +316,4 @@ - - - Cancel - - - - Add - False - - -