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
+