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.
This commit is contained in:
Georges Basile Stavracas Neto
2023-06-22 00:20:21 +00:00
parent fd5aeac057
commit bdda09abb8
10 changed files with 341 additions and 398 deletions
@@ -55,10 +55,7 @@ struct _GcalCalendarManagementDialog
{ {
AdwWindow parent; AdwWindow parent;
GtkHeaderBar *headerbar; AdwNavigationView *navigation_view;
GtkWidget *notebook;
GtkWidget *stack;
AdwWindowTitle *window_title;
/* flags */ /* flags */
ESource *source; ESource *source;
@@ -97,29 +94,21 @@ set_page (GcalCalendarManagementDialog *self,
const gchar *page_name, const gchar *page_name,
GcalCalendar *calendar) GcalCalendar *calendar)
{ {
GcalCalendarManagementPage *current_page; GcalCalendarManagementPage *next_page;
guint i; AdwNavigationPage *page;
GCAL_TRACE_MSG ("Switching to page '%s'", page_name); 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++) gcal_calendar_management_page_activate (next_page, calendar);
{
GcalCalendarManagementPage *page = self->pages[i];
if (g_strcmp0 (page_name, gcal_calendar_management_page_get_name (page)) != 0) adw_navigation_view_pop (self->navigation_view);
continue;
gtk_stack_set_visible_child (GTK_STACK (self->stack), GTK_WIDGET (page)); if (page != adw_navigation_view_get_visible_page (self->navigation_view))
gcal_calendar_management_page_activate (page, calendar); adw_navigation_view_push (self->navigation_view, page);
adw_window_title_set_title (self->window_title,
gcal_calendar_management_page_get_title (page));
break;
}
gcal_calendar_management_page_deactivate (current_page);
} }
static void static void
@@ -140,16 +129,16 @@ setup_context (GcalCalendarManagementDialog *self)
for (i = 0; i < N_PAGES; i++) for (i = 0; i < N_PAGES; i++)
{ {
GcalCalendarManagementPage *page; GcalCalendarManagementPage *page;
AdwNavigationPage *navigation_page;
page = g_object_new (pages[i].gtype, page = g_object_new (pages[i].gtype,
"context", self->context, "context", self->context,
NULL); NULL);
gtk_widget_set_visible (GTK_WIDGET (page), TRUE);
gtk_stack_add_titled (GTK_STACK (self->stack), navigation_page = adw_navigation_page_new (GTK_WIDGET (page),
GTK_WIDGET (page),
gcal_calendar_management_page_get_name (page),
gcal_calendar_management_page_get_title (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, g_signal_connect_object (page,
"switch-page", "switch-page",
@@ -170,6 +159,19 @@ setup_context (GcalCalendarManagementDialog *self)
* Callbacks * 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 static void
on_page_switched_cb (GcalCalendarManagementPage *page, on_page_switched_cb (GcalCalendarManagementPage *page,
const gchar *next_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_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, navigation_view);
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_callback (widget_class, on_navigation_view_popped_cb);
} }
static void static void
@@ -276,11 +278,3 @@ gcal_calendar_management_dialog_init (GcalCalendarManagementDialog *self)
{ {
gtk_widget_init_template (GTK_WIDGET (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;
}
@@ -36,6 +36,4 @@ G_DECLARE_FINAL_TYPE (GcalCalendarManagementDialog,
GCAL, CALENDAR_MANAGEMENT_DIALOG, GCAL, CALENDAR_MANAGEMENT_DIALOG,
AdwWindow) AdwWindow)
GtkHeaderBar* gcal_calendar_management_dialog_get_titlebar (GcalCalendarManagementDialog *self);
G_END_DECLS G_END_DECLS
@@ -9,32 +9,8 @@
<property name="destroy_with_parent">True</property> <property name="destroy_with_parent">True</property>
<property name="hide-on-close">True</property> <property name="hide-on-close">True</property>
<child> <child>
<object class="AdwLeaflet"> <object class="AdwNavigationView" id="navigation_view">
<property name="can-unfold">False</property> <signal name="popped" handler="on_navigation_view_popped_cb" object="GcalCalendarManagementDialog" swapped="no" />
<child>
<object class="AdwToolbarView" id="vbox">
<child type="top">
<object class="GtkHeaderBar" id="headerbar">
<property name="show-title-buttons">True</property>
<property name="title-widget">
<object class="AdwWindowTitle" id="window_title" />
</property>
</object>
</child>
<property name="content">
<object class="GtkOverlay" id="overlay">
<child>
<object class="GtkStack" id="stack">
<property name="hexpand">True</property>
<property name="vhomogeneous">False</property>
<property name="transition_type">crossfade</property>
</object>
</child>
</object>
</property>
</object>
</child>
</object> </object>
</child> </child>
</template> </template>
@@ -107,14 +107,3 @@ gcal_calendar_management_page_switch_page (GcalCalendarManagementPage *self,
g_signal_emit (self, signals[SWITCH_PAGE], 0, page_name, calendar); 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));
}
@@ -61,6 +61,4 @@ void gcal_calendar_management_page_switch_page (GcalCalendarMa
const gchar *page_name, const gchar *page_name,
GcalCalendar *calendar); GcalCalendar *calendar);
GtkHeaderBar* gcal_calendar_management_page_get_titlebar (GcalCalendarManagementPage *self);
G_END_DECLS G_END_DECLS
@@ -46,6 +46,20 @@
</child> </child>
<child> <child>
<object class="AdwToolbarView">
<child type="top">
<object class="GtkHeaderBar">
<property name="show-title-buttons">True</property>
<property name="title-widget">
<object class="AdwWindowTitle">
<property name="title" translatable="yes">Calendars</property>
</object>
</property>
</object>
</child>
<property name="content">
<object class="GtkScrolledWindow"> <object class="GtkScrolledWindow">
<property name="hexpand">True</property> <property name="hexpand">True</property>
<property name="vexpand">True</property> <property name="vexpand">True</property>
@@ -84,8 +98,12 @@
</object> </object>
</child> </child>
</object>
</property>
</object> </object>
</child> </child>
</object> </object>
</child> </child>
</template> </template>
@@ -31,7 +31,6 @@ struct _GcalEditCalendarPage
GtkBox parent; GtkBox parent;
AdwActionRow *account_row; AdwActionRow *account_row;
GtkWidget *back_button;
GtkColorDialogButton *calendar_color_button; GtkColorDialogButton *calendar_color_button;
AdwSwitchRow *calendar_visible_row; AdwSwitchRow *calendar_visible_row;
AdwActionRow *calendar_url_row; AdwActionRow *calendar_url_row;
@@ -225,20 +224,6 @@ update_calendar (GcalEditCalendarPage *self)
* Callbacks * 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 static void
on_remove_button_clicked_cb (GtkButton *button, on_remove_button_clicked_cb (GtkButton *button,
GcalEditCalendarPage *self) GcalEditCalendarPage *self)
@@ -303,28 +288,22 @@ static void
gcal_edit_calendar_page_activate (GcalCalendarManagementPage *page, gcal_edit_calendar_page_activate (GcalCalendarManagementPage *page,
GcalCalendar *calendar) GcalCalendar *calendar)
{ {
GcalEditCalendarPage *self; GCAL_ENTRY;
GtkHeaderBar *headerbar;
self = GCAL_EDIT_CALENDAR_PAGE (page); setup_calendar (GCAL_EDIT_CALENDAR_PAGE (page), calendar);
headerbar = gcal_calendar_management_page_get_titlebar (page);
gtk_header_bar_pack_start (headerbar, self->back_button);
setup_calendar (self, calendar); GCAL_EXIT;
} }
static void static void
gcal_edit_calendar_page_deactivate (GcalCalendarManagementPage *page) gcal_edit_calendar_page_deactivate (GcalCalendarManagementPage *page)
{ {
GcalEditCalendarPage *self; GcalEditCalendarPage *self;
GtkHeaderBar *headerbar;
GcalManager *manager; GcalManager *manager;
GCAL_ENTRY; GCAL_ENTRY;
self = GCAL_EDIT_CALENDAR_PAGE (page); 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); 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_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, 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_color_button);
gtk_widget_class_bind_template_child (widget_class, GcalEditCalendarPage, calendar_url_row); gtk_widget_class_bind_template_child (widget_class, GcalEditCalendarPage, calendar_url_row);
gtk_widget_class_bind_template_child (widget_class, GcalEditCalendarPage, calendar_visible_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, name_entry);
gtk_widget_class_bind_template_child (widget_class, GcalEditCalendarPage, remove_button); 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_remove_button_clicked_cb);
gtk_widget_class_bind_template_callback (widget_class, on_settings_button_clicked_cb); gtk_widget_class_bind_template_callback (widget_class, on_settings_button_clicked_cb);
} }
@@ -4,6 +4,19 @@
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<child> <child>
<object class="AdwToolbarView">
<child type="top">
<object class="AdwHeaderBar">
<property name="show-end-title-buttons">False</property>
<property name="show-start-title-buttons">False</property>
<property name="title-widget">
<object class="AdwWindowTitle" />
</property>
</object>
</child>
<property name="content">
<object class="AdwPreferencesPage"> <object class="AdwPreferencesPage">
<child> <child>
<object class="AdwPreferencesGroup"> <object class="AdwPreferencesGroup">
@@ -114,14 +127,12 @@
</object> </object>
</child> </child>
</object>
</property>
</object> </object>
</child> </child>
</template> </template>
<!-- Headerbar buttons -->
<object class="GtkButton" id="back_button">
<property name="icon-name">go-previous-symbolic</property>
<property name="tooltip-text" translatable="yes">Back</property>
<signal name="clicked" handler="on_back_button_clicked_cb" object="GcalEditCalendarPage" swapped="no" />
</object>
</interface> </interface>
@@ -48,10 +48,9 @@ struct _GcalNewCalendarPage
GtkEntry *calendar_address_entry; GtkEntry *calendar_address_entry;
EntryState calendar_address_entry_state; EntryState calendar_address_entry_state;
GcalFileChooserButton *calendar_file_chooser_button; GcalFileChooserButton *calendar_file_chooser_button;
GtkWidget *cancel_button;
GtkWidget *credentials_cancel_button; GtkWidget *credentials_cancel_button;
GtkWidget *credentials_connect_button; GtkWidget *credentials_connect_button;
AdwWindow *credentials_dialog; GtkWindow *credentials_dialog;
GtkEntry *credentials_password_entry; GtkEntry *credentials_password_entry;
GtkEntry *credentials_user_entry; GtkEntry *credentials_user_entry;
GtkColorDialogButton *local_calendar_color_button; GtkColorDialogButton *local_calendar_color_button;
@@ -466,13 +465,6 @@ on_url_entry_text_changed_cb (GtkEntry *entry,
GCAL_EXIT; GCAL_EXIT;
} }
static void
on_cancel_button_clicked_cb (GtkWidget *button,
GcalCalendarManagementPage *page)
{
gcal_calendar_management_page_switch_page (page, "calendars", NULL);
}
static void static void
on_local_calendar_name_row_text_changed_cb (AdwEntryRow *entry_row, on_local_calendar_name_row_text_changed_cb (AdwEntryRow *entry_row,
GParamSpec *pspec, GParamSpec *pspec,
@@ -516,38 +508,14 @@ gcal_new_calendar_page_get_title (GcalCalendarManagementPage *page)
return _("New Calendar"); 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 static void
gcal_new_calendar_page_deactivate (GcalCalendarManagementPage *page) gcal_new_calendar_page_deactivate (GcalCalendarManagementPage *page)
{ {
GcalNewCalendarPage *self; GcalNewCalendarPage *self;
GtkHeaderBar *headerbar;
GCAL_ENTRY; GCAL_ENTRY;
self = GCAL_NEW_CALENDAR_PAGE (page); 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_object (&self->local_source);
g_clear_pointer (&self->remote_sources, g_ptr_array_unref); 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_name = gcal_new_calendar_page_get_name;
iface->get_title = gcal_new_calendar_page_get_title; iface->get_title = gcal_new_calendar_page_get_title;
iface->activate = gcal_new_calendar_page_activate;
iface->deactivate = gcal_new_calendar_page_deactivate; 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, add_button);
gtk_widget_class_bind_template_child (widget_class, GcalNewCalendarPage, calendar_address_entry); 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, 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_cancel_button);
gtk_widget_class_bind_template_child (widget_class, GcalNewCalendarPage, credentials_connect_button); gtk_widget_class_bind_template_child (widget_class, GcalNewCalendarPage, credentials_connect_button);
gtk_widget_class_bind_template_child (widget_class, GcalNewCalendarPage, credentials_dialog); 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_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_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_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_credential_entry_activate_cb);
gtk_widget_class_bind_template_callback (widget_class, on_file_chooser_button_file_changed_cb); gtk_widget_class_bind_template_callback (widget_class, on_file_chooser_button_file_changed_cb);
@@ -4,6 +4,34 @@
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<child> <child>
<object class="AdwToolbarView">
<child type="top">
<object class="AdwHeaderBar">
<property name="show-end-title-buttons">False</property>
<property name="show-start-title-buttons">False</property>
<property name="title-widget">
<object class="AdwWindowTitle">
<property name="title" translatable="yes">New Calendar</property>
</object>
</property>
<child type="end">
<object class="GtkButton" id="add_button">
<property name="label" translatable="yes">Add</property>
<property name="sensitive">False</property>
<signal name="clicked" handler="on_add_button_clicked_cb" object="GcalNewCalendarPage" swapped="no" />
<style>
<class name="suggested-action"/>
</style>
</object>
</child>
</object>
</child>
<property name="content">
<object class="AdwPreferencesPage"> <object class="AdwPreferencesPage">
<!-- Local calendar --> <!-- Local calendar -->
@@ -173,6 +201,8 @@
</object> </object>
</child> </child>
</object>
</property>
</object> </object>
</child> </child>
@@ -286,17 +316,4 @@
</property> </property>
</object> </object>
<!-- Headerbar buttons -->
<object class="GtkButton" id="cancel_button">
<property name="label" translatable="yes">Cancel</property>
<signal name="clicked" handler="on_cancel_button_clicked_cb" object="GcalNewCalendarPage" swapped="no" />
</object>
<object class="GtkButton" id="add_button">
<property name="label" translatable="yes">Add</property>
<property name="sensitive">False</property>
<signal name="clicked" handler="on_add_button_clicked_cb" object="GcalNewCalendarPage" swapped="no" />
<style>
<class name="suggested-action"/>
</style>
</object>
</interface> </interface>