From 06e6f39721fe5ccea2d7ad74d6903b1e50442650 Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Fri, 1 May 2015 11:52:32 -0300 Subject: [PATCH] source-dialog: remove accounts with GoaClient::account-removed --- src/gcal-source-dialog.c | 63 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/src/gcal-source-dialog.c b/src/gcal-source-dialog.c index b95e8886..52c9ffde 100644 --- a/src/gcal-source-dialog.c +++ b/src/gcal-source-dialog.c @@ -2025,6 +2025,68 @@ goa_account_added_cb (GoaClient *client, add_goa_account (GCAL_SOURCE_DIALOG (user_data), goa_object_get_account (object)); } +static void +goa_account_removed_cb (GoaClient *client, + GoaObject *object, + gpointer user_data) +{ + GcalSourceDialogPrivate *priv = GCAL_SOURCE_DIALOG (user_data)->priv; + GoaAccount *account = goa_object_get_account (object); + GcalAccountType type = get_account_type (account); + GList *children, *l; + gint counter = 1; + + if (type == GCAL_ACCOUNT_TYPE_NOT_SUPPORTED) + return; + + children = gtk_container_get_children (GTK_CONTAINER (priv->online_accounts_listbox)); + + for (l = children; l != NULL; l = l->next) + { + GoaAccount *row_account; + GcalAccountType row_type; + + row_account = g_object_get_data (l->data, "goa-account"); + row_type = row_account ? get_account_type (row_account) : GCAL_ACCOUNT_TYPE_NOT_SUPPORTED; + + if (row_account == account) + { + gtk_widget_destroy (l->data); + counter--; + } + else if (type == row_type) + { + counter++; + } + } + + /* + * If there's any other account with the same type, + * it should show back the stub row of the given type. + */ + if (counter == 0) + { + switch (type) + { + case GCAL_ACCOUNT_TYPE_EXCHANGE: + gtk_widget_show (priv->exchange_stub_row); + break; + + case GCAL_ACCOUNT_TYPE_GOOGLE: + gtk_widget_show (priv->google_stub_row); + break; + + case GCAL_ACCOUNT_TYPE_OWNCLOUD: + gtk_widget_show (priv->owncloud_stub_row); + break; + + default: + g_assert_not_reached (); + } + } + + g_list_free (children); +} static void goa_client_ready_cb (GcalSourceDialog *dialog, @@ -2044,6 +2106,7 @@ goa_client_ready_cb (GcalSourceDialog *dialog, /* Be ready to other accounts */ g_signal_connect (client, "account-added", G_CALLBACK (goa_account_added_cb), user_data); + g_signal_connect (client, "account-removed", G_CALLBACK (goa_account_removed_cb), user_data); g_list_free (accounts); }