aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2012-07-13 21:18:39 +0800
committerGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2012-07-24 22:20:03 +0800
commitef6264b648b0ef50f25753cffc64c515494721e7 (patch)
tree794517bd90de55fc436adc905ab1db87fa450856
parent70ea840bfec883f883b748e937e28f68d9f0870f (diff)
downloadgsoc2013-empathy-ef6264b648b0ef50f25753cffc64c515494721e7.tar
gsoc2013-empathy-ef6264b648b0ef50f25753cffc64c515494721e7.tar.gz
gsoc2013-empathy-ef6264b648b0ef50f25753cffc64c515494721e7.tar.bz2
gsoc2013-empathy-ef6264b648b0ef50f25753cffc64c515494721e7.tar.lz
gsoc2013-empathy-ef6264b648b0ef50f25753cffc64c515494721e7.tar.xz
gsoc2013-empathy-ef6264b648b0ef50f25753cffc64c515494721e7.tar.zst
gsoc2013-empathy-ef6264b648b0ef50f25753cffc64c515494721e7.zip
account-plugin-widget: display the top bar and account widget
https://bugzilla.gnome.org/show_bug.cgi?id=680448
-rw-r--r--ubuntu-online-accounts/cc-plugins/empathy-accounts-plugin-widget.c197
-rw-r--r--ubuntu-online-accounts/cc-plugins/empathy-accounts-plugin.c17
2 files changed, 209 insertions, 5 deletions
diff --git a/ubuntu-online-accounts/cc-plugins/empathy-accounts-plugin-widget.c b/ubuntu-online-accounts/cc-plugins/empathy-accounts-plugin-widget.c
index c19207a2e..183d47527 100644
--- a/ubuntu-online-accounts/cc-plugins/empathy-accounts-plugin-widget.c
+++ b/ubuntu-online-accounts/cc-plugins/empathy-accounts-plugin-widget.c
@@ -23,6 +23,13 @@
#include "empathy-accounts-plugin-widget.h"
+#include <glib/gi18n-lib.h>
+
+#include <libaccounts-glib/ag-service.h>
+#include <libaccounts-glib/ag-account-service.h>
+
+#include <libempathy-gtk/empathy-account-widget.h>
+
G_DEFINE_TYPE (EmpathyAccountsPluginWidget, empathy_accounts_plugin_widget, GTK_TYPE_BOX)
enum
@@ -31,18 +38,22 @@ enum
N_PROPS
};
-/*
enum
{
+ SIG_DONE,
LAST_SIGNAL
};
static guint signals[LAST_SIGNAL];
-*/
struct _EmpathyAccountsPluginWidgetPriv
{
AgAccount *account;
+
+ EmpathyAccountSettings *settings;
+
+ EmpathyAccountWidget *account_widget;
+ GtkWidget *done_button;
};
static void
@@ -83,15 +94,186 @@ empathy_accounts_plugin_widget_set_property (GObject *object,
}
}
+static EmpathyAccountSettings *
+create_account_settings (AgAccount *account)
+{
+ AgService *service;
+ GList *services;
+ AgAccountService *account_service;
+ GValue v = G_VALUE_INIT;
+ gchar *manager = NULL, *protocol = NULL;
+ EmpathyAccountSettings *settings;
+
+ services = ag_account_list_services_by_type (account, "IM");
+ g_return_val_if_fail (services != NULL, NULL);
+ service = (AgService *) services->data;
+
+ account_service = ag_account_service_new (account, service);
+
+ g_value_init (&v, G_TYPE_STRING);
+ if (ag_account_service_get_value (account_service,
+ "telepathy/manager", &v) != AG_SETTING_SOURCE_NONE)
+ manager = g_value_dup_string (&v);
+ g_value_unset (&v);
+
+ g_value_init (&v, G_TYPE_STRING);
+ if (ag_account_service_get_value (account_service,
+ "telepathy/protocol", &v) != AG_SETTING_SOURCE_NONE)
+ protocol = g_value_dup_string (&v);
+ g_value_unset (&v);
+
+ g_return_val_if_fail (manager != NULL, NULL);
+ g_return_val_if_fail (protocol != NULL, NULL);
+
+ settings = empathy_account_settings_new (manager, protocol, NULL,
+ ag_service_get_display_name (service));
+
+ empathy_account_settings_set_storage_provider (settings,
+ EMPATHY_UOA_PROVIDER);
+
+ g_free (manager);
+ g_free (protocol);
+
+ return settings;
+}
+
+static void
+response_cb (GtkWidget *widget,
+ gint response,
+ EmpathyAccountsPluginWidget *self)
+{
+ if (response == GTK_RESPONSE_OK)
+ {
+ empathy_account_widget_apply_and_log_in (self->priv->account_widget);
+
+ /* Rely on account_widget_close_cb to fire the 'done' signal */
+ }
+ else
+ {
+ empathy_account_widget_discard_pending_changes (
+ self->priv->account_widget);
+
+ g_signal_emit (self, signals[SIG_DONE], 0);
+ }
+}
+
+static GtkWidget *
+create_top_bar (EmpathyAccountsPluginWidget *self)
+{
+ GtkWidget *bar, *content, *label;
+
+ bar = gtk_info_bar_new_with_buttons (
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+ NULL);
+
+ self->priv->done_button = gtk_info_bar_add_button (GTK_INFO_BAR (bar),
+ _("Done"), GTK_RESPONSE_OK);
+
+ gtk_widget_set_hexpand (bar, TRUE);
+
+ gtk_info_bar_set_message_type (GTK_INFO_BAR (bar), GTK_MESSAGE_QUESTION);
+
+ content = gtk_info_bar_get_content_area (GTK_INFO_BAR (bar));
+
+ label = gtk_label_new (_("Please enter your account details"));
+ gtk_container_add (GTK_CONTAINER (content), label);
+
+ g_signal_connect (bar, "response",
+ G_CALLBACK (response_cb), self);
+
+ gtk_widget_show_all (bar);
+ return bar;
+}
+
+static void
+account_widget_handle_apply_cb (EmpathyAccountWidget *widget,
+ gboolean valid,
+ EmpathyAccountsPluginWidget *self)
+{
+ gtk_widget_set_sensitive (self->priv->done_button, valid);
+}
+
+static void
+account_widget_close_cb (EmpathyAccountWidget *widget,
+ GtkResponseType response,
+ EmpathyAccountsPluginWidget *self)
+{
+ g_signal_emit (self, signals[SIG_DONE], 0);
+}
+
+static void
+add_account_widget (EmpathyAccountsPluginWidget *self)
+{
+ GtkWidget *alig;
+
+ alig = gtk_alignment_new (0.5, 0.1, 0, 0.1);
+
+ gtk_box_pack_start (GTK_BOX (self), alig, TRUE, TRUE, 0);
+ gtk_widget_show (GTK_WIDGET (alig));
+
+ self->priv->account_widget = empathy_account_widget_new_for_protocol (
+ self->priv->settings, TRUE);
+
+ empathy_account_widget_hide_buttons (self->priv->account_widget);
+
+ gtk_widget_set_valign (GTK_WIDGET (self->priv->account_widget),
+ GTK_ALIGN_CENTER);
+
+ gtk_container_add (GTK_CONTAINER (alig),
+ GTK_WIDGET (self->priv->account_widget));
+ gtk_widget_show (GTK_WIDGET (self->priv->account_widget));
+
+ if (!empathy_account_settings_is_valid (self->priv->settings))
+ {
+ gtk_widget_set_sensitive (self->priv->done_button, FALSE);
+ }
+
+ g_signal_connect (self->priv->account_widget, "handle-apply",
+ G_CALLBACK (account_widget_handle_apply_cb), self);
+ g_signal_connect (self->priv->account_widget, "close",
+ G_CALLBACK (account_widget_close_cb), self);
+}
+
+static void
+settings_ready_cb (EmpathyAccountSettings *settings,
+ GParamSpec *spec,
+ EmpathyAccountsPluginWidget *self)
+{
+ add_account_widget (self);
+}
+
static void
empathy_accounts_plugin_widget_constructed (GObject *object)
{
- //EmpathyAccountsPluginWidget *self = EMPATHY_ACCOUNTS_PLUGIN_WIDGET (object);
+ EmpathyAccountsPluginWidget *self = EMPATHY_ACCOUNTS_PLUGIN_WIDGET (object);
void (*chain_up) (GObject *) =
((GObjectClass *) empathy_accounts_plugin_widget_parent_class)->constructed;
+ GtkWidget *top;
if (chain_up != NULL)
chain_up (object);
+
+ g_return_if_fail (AG_IS_ACCOUNT (self->priv->account));
+
+ /* Top bar */
+ top = create_top_bar (self);
+ gtk_widget_show (top);
+ gtk_box_pack_start (GTK_BOX (self), top, FALSE, TRUE, 0);
+
+ self->priv->settings = create_account_settings (self->priv->account);
+ g_return_if_fail (self->priv->settings != NULL);
+
+ if (empathy_account_settings_is_ready (self->priv->settings))
+ {
+ add_account_widget (self);
+ }
+ else
+ {
+ g_signal_connect (self->priv->settings, "notify::ready",
+ G_CALLBACK (settings_ready_cb), self);
+ }
+
+ gtk_widget_set_hexpand (GTK_WIDGET (self), TRUE);
}
static void
@@ -102,6 +284,7 @@ empathy_accounts_plugin_widget_dispose (GObject *object)
((GObjectClass *) empathy_accounts_plugin_widget_parent_class)->dispose;
g_clear_object (&self->priv->account);
+ g_clear_object (&self->priv->settings);
if (chain_up != NULL)
chain_up (object);
@@ -125,6 +308,13 @@ empathy_accounts_plugin_widget_class_init (
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
g_object_class_install_property (oclass, PROP_ACCOUNT, spec);
+ signals[SIG_DONE] = g_signal_new ("done",
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST,
+ 0, NULL, NULL, NULL,
+ G_TYPE_NONE,
+ 0);
+
g_type_class_add_private (klass, sizeof (EmpathyAccountsPluginWidgetPriv));
}
@@ -141,5 +331,6 @@ empathy_accounts_plugin_widget_new (AgAccount *account)
return g_object_new (EMPATHY_TYPE_ACCOUNTS_PLUGIN_WIDGET,
"account", account,
"orientation", GTK_ORIENTATION_VERTICAL,
+ "spacing", 10,
NULL);
}
diff --git a/ubuntu-online-accounts/cc-plugins/empathy-accounts-plugin.c b/ubuntu-online-accounts/cc-plugins/empathy-accounts-plugin.c
index 517ba5272..cbbe90b3e 100644
--- a/ubuntu-online-accounts/cc-plugins/empathy-accounts-plugin.c
+++ b/ubuntu-online-accounts/cc-plugins/empathy-accounts-plugin.c
@@ -26,10 +26,24 @@
G_DEFINE_TYPE (EmpathyAccountsPlugin, empathy_accounts_plugin, AP_TYPE_PLUGIN)
+static void
+widget_done_cb (EmpathyAccountsPluginWidget *widget,
+ ApPlugin *plugin)
+{
+ ap_plugin_emit_finished (plugin);
+}
+
static GtkWidget *
empathy_accounts_plugin_build_widget (ApPlugin *plugin)
{
- return empathy_accounts_plugin_widget_new (ap_plugin_get_account (plugin));
+ GtkWidget *widget;
+
+ widget = empathy_accounts_plugin_widget_new (ap_plugin_get_account (plugin));
+
+ g_signal_connect (widget, "done",
+ G_CALLBACK (widget_done_cb), plugin);
+
+ return widget;
}
static void
@@ -43,7 +57,6 @@ empathy_accounts_plugin_delete_account (ApPlugin *plugin,
static void
empathy_accounts_plugin_act_headless (ApPlugin *plugin)
{
- /* TODO */
}
static void