summaryrefslogtreecommitdiffstats
path: root/panels/online-accounts/cc-online-account-row.c
diff options
context:
space:
mode:
Diffstat (limited to 'panels/online-accounts/cc-online-account-row.c')
-rw-r--r--panels/online-accounts/cc-online-account-row.c140
1 files changed, 140 insertions, 0 deletions
diff --git a/panels/online-accounts/cc-online-account-row.c b/panels/online-accounts/cc-online-account-row.c
new file mode 100644
index 0000000..1406a3d
--- /dev/null
+++ b/panels/online-accounts/cc-online-account-row.c
@@ -0,0 +1,140 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
+/*
+ * Copyright 2020 Canonical Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+#include <glib/gi18n.h>
+
+#include "cc-online-account-row.h"
+#include "cc-online-accounts-resources.h"
+
+struct _CcOnlineAccountRow
+{
+ AdwActionRow parent;
+
+ GtkImage *icon_image;
+ GtkImage *warning_image;
+
+ GoaObject *object;
+};
+
+G_DEFINE_TYPE (CcOnlineAccountRow, cc_online_account_row, ADW_TYPE_ACTION_ROW)
+
+static gboolean
+is_gicon_symbolic (GtkWidget *widget,
+ GIcon *icon)
+{
+ g_autoptr(GtkIconPaintable) icon_paintable = NULL;
+ GtkIconTheme *icon_theme;
+
+ icon_theme = gtk_icon_theme_get_for_display (gdk_display_get_default ());
+ icon_paintable = gtk_icon_theme_lookup_by_gicon (icon_theme,
+ icon,
+ 32,
+ gtk_widget_get_scale_factor (widget),
+ gtk_widget_get_direction (widget),
+ 0);
+
+ return icon_paintable && gtk_icon_paintable_is_symbolic (icon_paintable);
+}
+
+static void
+cc_online_account_row_dispose (GObject *object)
+{
+ CcOnlineAccountRow *self = CC_ONLINE_ACCOUNT_ROW (object);
+
+ g_clear_object (&self->object);
+
+ G_OBJECT_CLASS (cc_online_account_row_parent_class)->dispose (object);
+}
+
+static void
+cc_online_account_row_class_init (CcOnlineAccountRowClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+ object_class->dispose = cc_online_account_row_dispose;
+
+ gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/online-accounts/cc-online-account-row.ui");
+
+ gtk_widget_class_bind_template_child (widget_class, CcOnlineAccountRow, icon_image);
+ gtk_widget_class_bind_template_child (widget_class, CcOnlineAccountRow, warning_image);
+}
+
+static void
+cc_online_account_row_init (CcOnlineAccountRow *self)
+{
+ gtk_widget_init_template (GTK_WIDGET (self));
+}
+
+CcOnlineAccountRow *
+cc_online_account_row_new (GoaObject *object)
+{
+ CcOnlineAccountRow *self;
+ GoaAccount *account;
+ g_autoptr(GIcon) gicon = NULL;
+ g_autoptr(GError) error = NULL;
+
+ self = g_object_new (cc_online_account_row_get_type (), NULL);
+
+ self->object = g_object_ref (object);
+
+ account = goa_object_peek_account (object);
+
+ adw_preferences_row_set_title (ADW_PREFERENCES_ROW (self),
+ goa_account_get_provider_name (account));
+ adw_action_row_set_subtitle (ADW_ACTION_ROW (self),
+ goa_account_get_presentation_identity (account));
+
+ gicon = g_icon_new_for_string (goa_account_get_provider_icon (account), &error);
+ if (error != NULL)
+ {
+ g_warning ("Error creating GIcon for account: %s (%s, %d)",
+ error->message,
+ g_quark_to_string (error->domain),
+ error->code);
+ }
+ else
+ {
+ gtk_image_set_from_gicon (self->icon_image, gicon);
+
+ if (is_gicon_symbolic (GTK_WIDGET (self), gicon))
+ {
+ gtk_image_set_icon_size (self->icon_image, GTK_ICON_SIZE_NORMAL);
+ gtk_widget_add_css_class (GTK_WIDGET (self->icon_image), "symbolic-circular");
+ }
+ else
+ {
+ gtk_image_set_icon_size (self->icon_image, GTK_ICON_SIZE_LARGE);
+ gtk_widget_add_css_class (GTK_WIDGET (self->icon_image), "lowres-icon");
+ }
+ }
+
+ g_object_bind_property (account, "attention-needed",
+ self->warning_image, "visible",
+ G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE);
+
+ return self;
+}
+
+GoaObject *
+cc_online_account_row_get_object (CcOnlineAccountRow *self)
+{
+ g_return_val_if_fail (CC_IS_ONLINE_ACCOUNT_ROW (self), NULL);
+ return self->object;
+}