diff --git a/panels/online-accounts/cc-online-accounts-panel.c b/panels/online-accounts/cc-online-accounts-panel.c index 3a103479a..249bc513c 100644 --- a/panels/online-accounts/cc-online-accounts-panel.c +++ b/panels/online-accounts/cc-online-accounts-panel.c @@ -44,6 +44,7 @@ struct _CcGoaPanel GtkWidget *accounts_listbox; GtkWidget *edit_account_dialog; GtkWidget *edit_account_headerbar; + GtkWidget *new_account_vbox; GtkWidget *providers_listbox; GtkWidget *stack; GtkWidget *accounts_vbox; @@ -75,6 +76,9 @@ static void get_all_providers_cb (GObject *source, GAsyncResult *res, gpointer user_data); +static void show_page_account (CcGoaPanel *panel, + GoaObject *object); + CC_PANEL_REGISTER (CcGoaPanel, cc_goa_panel); enum { @@ -84,6 +88,22 @@ enum { /* ---------------------------------------------------------------------------------------------------- */ +static void +reset_headerbar (CcGoaPanel *self) +{ + gtk_header_bar_set_title (GTK_HEADER_BAR (self->edit_account_headerbar), NULL); + gtk_header_bar_set_subtitle (GTK_HEADER_BAR (self->edit_account_headerbar), NULL); + gtk_header_bar_set_show_close_button (GTK_HEADER_BAR (self->edit_account_headerbar), TRUE); + + /* Remove any leftover widgets */ + gtk_container_foreach (GTK_CONTAINER (self->edit_account_headerbar), + (GtkCallback) gtk_widget_destroy, + NULL); + +} + +/* ---------------------------------------------------------------------------------------------------- */ + static void add_provider_row (CcGoaPanel *self, GoaProvider *provider) @@ -132,6 +152,39 @@ add_provider_row (CcGoaPanel *self, g_object_unref (icon); } +static void +on_provider_row_activated (CcGoaPanel *self, + GtkListBoxRow *activated_row) +{ + GoaProvider *provider; + GoaObject *object; + GError *error; + + error = NULL; + provider = g_object_get_data (G_OBJECT (activated_row), "goa-provider"); + + gtk_container_foreach (GTK_CONTAINER (self->new_account_vbox), + (GtkCallback) gtk_widget_destroy, + NULL); + + reset_headerbar (self); + + /* Move to the new account page */ + gtk_stack_set_visible_child_name (GTK_STACK (self->stack), "new-account"); + + /* This spins gtk_dialog_run() */ + object = goa_provider_add_account (provider, + self->client, + GTK_DIALOG (self->edit_account_dialog), + GTK_BOX (self->new_account_vbox), + &error); + + if (object == NULL) + gtk_widget_hide (self->edit_account_dialog); + else + show_page_account (self, object); +} + /* ---------------------------------------------------------------------------------------------------- */ static gint @@ -344,11 +397,13 @@ cc_goa_panel_class_init (CcGoaPanelClass *klass) gtk_widget_class_bind_template_child (widget_class, CcGoaPanel, accounts_vbox); gtk_widget_class_bind_template_child (widget_class, CcGoaPanel, edit_account_dialog); gtk_widget_class_bind_template_child (widget_class, CcGoaPanel, edit_account_headerbar); + gtk_widget_class_bind_template_child (widget_class, CcGoaPanel, new_account_vbox); gtk_widget_class_bind_template_child (widget_class, CcGoaPanel, providers_listbox); gtk_widget_class_bind_template_child (widget_class, CcGoaPanel, stack); gtk_widget_class_bind_template_callback (widget_class, on_edit_account_dialog_delete_event); gtk_widget_class_bind_template_callback (widget_class, on_listbox_row_activated); + gtk_widget_class_bind_template_callback (widget_class, on_provider_row_activated); } /* ---------------------------------------------------------------------------------------------------- */ @@ -373,6 +428,7 @@ show_page_account (CcGoaPanel *panel, provider = NULL; panel->active_object = object; + reset_headerbar (panel); /* Move to the account editor page */ gtk_stack_set_visible_child_name (GTK_STACK (panel->stack), "editor"); diff --git a/panels/online-accounts/online-accounts.ui b/panels/online-accounts/online-accounts.ui index 13f03ee70..f5869cac4 100644 --- a/panels/online-accounts/online-accounts.ui +++ b/panels/online-accounts/online-accounts.ui @@ -63,6 +63,7 @@ True True none +