[calls] account-overview: Hook up available providers
- From: Evangelos Ribeiro Tzaras <devrtz src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [calls] account-overview: Hook up available providers
- Date: Tue, 20 Jul 2021 10:33:28 +0000 (UTC)
commit 803e089cfc582a5bd55218559c3fc3deeeb89a0b
Author: Evangelos Ribeiro Tzaras <evangelos tzaras puri sm>
Date: Mon Jul 5 10:01:26 2021 +0200
account-overview: Hook up available providers
Fixes #264.
src/calls-account-overview.c | 99 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 99 insertions(+)
---
diff --git a/src/calls-account-overview.c b/src/calls-account-overview.c
index 5ebe7b2d..feb733d5 100644
--- a/src/calls-account-overview.c
+++ b/src/calls-account-overview.c
@@ -28,6 +28,7 @@
#include "calls-account-overview.h"
#include "calls-account-row.h"
#include "calls-account-provider.h"
+#include "calls-manager.h"
/**
@@ -149,6 +150,98 @@ on_add_account_clicked (CallsAccountOverview *self)
}
+static void
+on_edit_account_clicked (CallsAccountRow *row,
+ CallsAccountProvider *provider,
+ CallsAccount *account,
+ CallsAccountOverview *self)
+{
+ GtkWidget *widget;
+
+ widget = calls_account_provider_get_account_widget (provider);
+ attach_account_widget (self, widget);
+
+ calls_account_provider_edit_account (provider, account);
+
+ gtk_window_present (self->account_window);
+}
+
+
+static void
+update_account_list (CallsAccountOverview *self)
+{
+ gboolean removed_all = FALSE;
+
+ g_assert (CALLS_IS_ACCOUNT_OVERVIEW (self));
+
+ /* TODO rework with GTK4 FlattenListModel (to flatten a GListModel of GListModels)
+ * in particular we could then connect to the items-changed signal of the flattened list.
+ * Always rebuilding the account list is not particularly efficient, but since
+ * we're not constantly doing this it's fine for now.
+ */
+ while (!removed_all) {
+ GtkListBoxRow *row = gtk_list_box_get_row_at_index (GTK_LIST_BOX (self->overview), 0);
+
+ if (row == NULL || row == GTK_LIST_BOX_ROW (self->add_row))
+ removed_all = TRUE;
+ else
+ gtk_container_remove (GTK_CONTAINER (self->overview), GTK_WIDGET (row));
+ }
+
+ for (GList *node = self->providers; node != NULL; node = node->next) {
+ CallsAccountProvider *provider = CALLS_ACCOUNT_PROVIDER (node->data);
+ GListModel *model = calls_provider_get_origins (CALLS_PROVIDER (provider));
+ guint n_origins = g_list_model_get_n_items (model);
+
+ for (guint i = 0; i < n_origins; i++) {
+ g_autoptr (CallsAccount) account = CALLS_ACCOUNT (g_list_model_get_item (model, i));
+ CallsAccountRow *account_row = calls_account_row_new (provider, account);
+
+ g_signal_connect (account_row, "edit-clicked",
+ G_CALLBACK (on_edit_account_clicked),
+ self);
+
+ gtk_list_box_insert (GTK_LIST_BOX (self->overview),
+ GTK_WIDGET (account_row),
+ 0);
+ }
+ }
+ update_state (self);
+}
+
+
+
+static void
+on_providers_changed (CallsAccountOverview *self)
+{
+ GList *providers;
+
+ g_clear_pointer (&self->providers, g_list_free);
+ providers = calls_manager_get_providers (calls_manager_get_default ());
+
+ for (GList *node = providers; node != NULL; node = node->next) {
+ CallsProvider *provider = node->data;
+
+ if (CALLS_IS_ACCOUNT_PROVIDER (provider)) {
+ self->providers = g_list_append (self->providers, provider);
+ g_signal_connect_swapped (calls_provider_get_origins (provider),
+ "items-changed",
+ G_CALLBACK (update_account_list),
+ self);
+ g_signal_connect_swapped (provider, "widget-edit-done",
+ G_CALLBACK (gtk_widget_hide), self->account_window);
+ }
+ }
+
+ /* Clear any acccount widgets, because they might've gone stale */
+ attach_account_widget (self, NULL);
+ gtk_widget_hide (GTK_WIDGET (self->account_window));
+
+ update_account_list (self);
+
+ gtk_widget_set_sensitive (self->add_btn, !!self->providers);
+}
+
static void
calls_account_overview_class_init (CallsAccountOverviewClass *klass)
{
@@ -174,6 +267,12 @@ calls_account_overview_init (CallsAccountOverview *self)
{
gtk_widget_init_template (GTK_WIDGET (self));
+ g_signal_connect_swapped (calls_manager_get_default (),
+ "providers-changed",
+ G_CALLBACK (on_providers_changed),
+ self);
+ on_providers_changed (self);
+
gtk_list_box_insert (GTK_LIST_BOX (self->overview),
GTK_WIDGET (self->add_row),
-1);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]