]> git.0d.be Git - empathy.git/commitdiff
account-plugin-widget: display the top bar and account widget
authorGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>
Fri, 13 Jul 2012 13:18:39 +0000 (15:18 +0200)
committerGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>
Tue, 24 Jul 2012 14:20:03 +0000 (16:20 +0200)
https://bugzilla.gnome.org/show_bug.cgi?id=680448

ubuntu-online-accounts/cc-plugins/empathy-accounts-plugin-widget.c
ubuntu-online-accounts/cc-plugins/empathy-accounts-plugin.c

index c19207a2ea013182620e4a7695177019615d2fd2..183d475278dd674584d635754cd574eba3c59ca6 100644 (file)
 
 #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);
 }
index 517ba5272c3e25e0c11ec22659d667098e22aba8..cbbe90b3e72a763cc1f999075c9d0b8dcd0aeb9d 100644 (file)
 
 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