summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Zeuthen <davidz@redhat.com>2011-05-20 17:52:30 -0400
committerDavid Zeuthen <davidz@redhat.com>2011-05-20 17:52:30 -0400
commit9851ed800ce5c7d3d60e06ac7f75543e5ea90b2b (patch)
tree8fa9c31bf768333be70bae2202992f613d26e134
parent80a15328c1feb92301cdfa71ddb7f237fb633f8d (diff)
Add goa_util_add_row_editable_label_from_keyfile() util and use it
Signed-off-by: David Zeuthen <davidz@redhat.com>
-rw-r--r--src/goabackend/goafacebookprovider.c7
-rw-r--r--src/goabackend/goagenericmailprovider.c9
-rw-r--r--src/goabackend/goagoogleprovider.c7
-rw-r--r--src/goabackend/goaprovider.c334
-rw-r--r--src/goabackend/goaprovider.h19
-rw-r--r--src/goabackend/goatwitterprovider.c9
-rw-r--r--src/goabackend/goayahooprovider.c9
-rw-r--r--src/panel/goapanel.c4
8 files changed, 266 insertions, 132 deletions
diff --git a/src/goabackend/goafacebookprovider.c b/src/goabackend/goafacebookprovider.c
index 7a9c972..051a4f8 100644
--- a/src/goabackend/goafacebookprovider.c
+++ b/src/goabackend/goafacebookprovider.c
@@ -286,15 +286,10 @@ show_account (GoaProvider *provider,
GtkBox *vbox,
GtkTable *table)
{
- GoaFacebookAccount *fbaccount;
-
/* Chain up */
GOA_PROVIDER_CLASS (goa_facebook_provider_parent_class)->show_account (provider, client, object, vbox, table);
- fbaccount = goa_object_get_facebook_account (object);
- goa_util_add_row (table,
- _("User Name"),
- goa_facebook_account_get_user_name (fbaccount));
+ goa_util_add_row_editable_label_from_keyfile (table, object, _("User Name"), "Identity", FALSE);
}
/* ---------------------------------------------------------------------------------------------------- */
diff --git a/src/goabackend/goagenericmailprovider.c b/src/goabackend/goagenericmailprovider.c
index a2ba39c..d7845c6 100644
--- a/src/goabackend/goagenericmailprovider.c
+++ b/src/goabackend/goagenericmailprovider.c
@@ -28,6 +28,7 @@
#include "goagenericmailprovider.h"
#include "goaimapclient.h"
#include "goaimapauthlogin.h"
+#include "goaeditablelabel.h"
#include "goaimapmail.h"
@@ -823,15 +824,11 @@ show_account (GoaProvider *provider,
GtkBox *vbox,
GtkTable *table)
{
- GoaMail *mail;
-
/* Chain up */
GOA_PROVIDER_CLASS (goa_generic_mail_provider_parent_class)->show_account (provider, client, object, vbox, table);
- mail = goa_object_get_mail (object);
- goa_util_add_row (table,
- _("Email Address"),
- goa_mail_get_email_address (mail));
+ goa_util_add_row_editable_label_from_keyfile (table, object, _("Email Address"), "EmailAddress", FALSE);
+ goa_util_add_row_editable_label_from_keyfile (table, object, _("IMAP Server"), "ImapHost", TRUE);
}
/* ---------------------------------------------------------------------------------------------------- */
diff --git a/src/goabackend/goagoogleprovider.c b/src/goabackend/goagoogleprovider.c
index faf85a0..d405227 100644
--- a/src/goabackend/goagoogleprovider.c
+++ b/src/goabackend/goagoogleprovider.c
@@ -332,15 +332,10 @@ show_account (GoaProvider *provider,
GtkBox *vbox,
GtkTable *table)
{
- GoaGoogleAccount *gaccount;
-
/* Chain up */
GOA_PROVIDER_CLASS (goa_google_provider_parent_class)->show_account (provider, client, object, vbox, table);
- gaccount = goa_object_get_google_account (object);
- goa_util_add_row (table,
- _("Email Address"),
- goa_google_account_get_email_address (gaccount));
+ goa_util_add_row_editable_label_from_keyfile (table, object, _("Email Address"), "Identity", FALSE);
}
/* ---------------------------------------------------------------------------------------------------- */
diff --git a/src/goabackend/goaprovider.c b/src/goabackend/goaprovider.c
index e8fc210..2180a6c 100644
--- a/src/goabackend/goaprovider.c
+++ b/src/goabackend/goaprovider.c
@@ -24,6 +24,7 @@
#include <glib/gi18n-lib.h>
#include <gnome-keyring.h>
+#include "goalogging.h"
#include "goaprovider.h"
#include "goagoogleprovider.h"
#include "goafacebookprovider.h"
@@ -251,81 +252,6 @@ goa_provider_show_account (GoaProvider *provider,
/* ---------------------------------------------------------------------------------------------------- */
-/**
- * goa_util_add_row_widget:
- * @table: A #GtkTable.
- * @label_text: The text to insert on the left side.
- * @widget: A widget to insert on the right side.
- *
- * Utility function to add @label_text and @widget to @table.
- */
-void
-goa_util_add_row_widget (GtkTable *table,
- const gchar *label_text,
- GtkWidget *widget)
-{
- GtkWidget *label;
- gchar *s;
- guint num_rows;
-
- g_return_if_fail (GTK_IS_TABLE (table));
- g_return_if_fail (label_text != NULL);
- g_return_if_fail (GTK_IS_WIDGET (widget));
-
- s = g_strdup_printf ("<span foreground=\"#555555\">%s</span>", label_text);
-
- gtk_table_get_size (table, &num_rows, NULL);
-
- label = gtk_label_new (NULL);
- gtk_label_set_markup (GTK_LABEL (label), s);
- gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
- gtk_table_attach (table, label,
- 0, 1,
- num_rows, num_rows + 1,
- GTK_FILL, GTK_FILL, 0, 0);
- gtk_table_attach (table, widget,
- 1, 2,
- num_rows, num_rows + 1,
- GTK_FILL, GTK_FILL, 0, 0);
-
- g_free (s);
-}
-
-/**
- * goa_util_add_row:
- * @table: A #GtkTable.
- * @label_text: The text to insert on the left side.
- * @value_markup: The markup to insert on the right side.
- *
- * Utility function to add @label_text and @value_text to @table.
- */
-void
-goa_util_add_row (GtkTable *table,
- const gchar *label_text,
- const gchar *value_markup)
-{
- GtkWidget *label;
- label = gtk_label_new (NULL);
- gtk_label_set_markup (GTK_LABEL (label), value_markup);
- gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
- gtk_label_set_selectable (GTK_LABEL (label), TRUE);
- goa_util_add_row_widget (table, label_text, label);
-}
-
-static void
-on_name_editing_done (GoaEditableLabel *editable_label,
- gpointer user_data)
-{
- GoaObject *object = GOA_OBJECT (user_data);
- GoaAccount *account;
-
- account = goa_object_peek_account (object);
- goa_account_call_set_name (account,
- goa_editable_label_get_text (editable_label),
- NULL, /* GCancellable */
- NULL, NULL); /* callback, user_data */
-}
-
static void
goa_provider_show_account_real (GoaProvider *provider,
GoaClient *client,
@@ -333,25 +259,10 @@ goa_provider_show_account_real (GoaProvider *provider,
GtkBox *vbox,
GtkTable *table)
{
- GoaAccount *account;
GtkWidget *elabel;
- guint num_rows;
-
- account = goa_object_peek_account (object);
-
- gtk_table_get_size (table, &num_rows, NULL);
-
- elabel = goa_editable_label_new ();
- goa_editable_label_set_text (GOA_EDITABLE_LABEL (elabel), goa_account_get_name (account));
- goa_editable_label_set_editable (GOA_EDITABLE_LABEL (elabel), TRUE);
+ elabel = goa_util_add_row_editable_label_from_keyfile (table, object, NULL, "Name", TRUE);
goa_editable_label_set_scale (GOA_EDITABLE_LABEL (elabel), 1.2);
goa_editable_label_set_weight (GOA_EDITABLE_LABEL (elabel), 700);
- g_signal_connect (elabel, "editing-done", G_CALLBACK (on_name_editing_done), object);
-
- gtk_table_attach (table, elabel,
- 1, 2,
- num_rows, num_rows + 1,
- GTK_FILL, GTK_FILL, 0, 0);
}
/* ---------------------------------------------------------------------------------------------------- */
@@ -845,3 +756,244 @@ goa_provider_lookup_credentials_sync (GoaProvider *provider,
return ret;
}
+/* ---------------------------------------------------------------------------------------------------- */
+
+/**
+ * goa_util_add_row_widget:
+ * @table: A #GtkTable.
+ * @label_text: (allow-none): The text to insert on the left side or %NULL for no label.
+ * @widget: A widget to insert on the right side.
+ *
+ * Utility function to add @label_text and @widget to @table.
+ *
+ * Returns: (transfer none): The #GtkWidget that was inserted (e.g. @widget itself).
+ */
+GtkWidget *
+goa_util_add_row_widget (GtkTable *table,
+ const gchar *label_text,
+ GtkWidget *widget)
+{
+ GtkWidget *label;
+ guint num_rows;
+
+ g_return_val_if_fail (GTK_IS_TABLE (table), NULL);
+ g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
+
+ gtk_table_get_size (table, &num_rows, NULL);
+
+ if (label_text != NULL)
+ {
+ gchar *s;
+ s = g_strdup_printf ("<span foreground=\"#555555\">%s</span>", label_text);
+ label = gtk_label_new (NULL);
+ gtk_label_set_markup (GTK_LABEL (label), s);
+ gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
+ gtk_table_attach (table, label,
+ 0, 1,
+ num_rows, num_rows + 1,
+ GTK_FILL, GTK_FILL, 0, 0);
+ g_free (s);
+ }
+ gtk_table_attach (table, widget,
+ 1, 2,
+ num_rows, num_rows + 1,
+ GTK_FILL, GTK_FILL, 0, 0);
+ return widget;
+}
+
+/**
+ * goa_util_add_row_label:
+ * @table: A #GtkTable.
+ * @label_text: (allow-none): The text to insert on the left side or %NULL for no label.
+ * @value_markup: The markup to insert on the right side.
+ *
+ * Utility function to add @label_text and @value_text to @table.
+ *
+ * Returns: (transfer none): The #GtkLabel that was inserted.
+ */
+GtkWidget *
+goa_util_add_row_label (GtkTable *table,
+ const gchar *label_text,
+ const gchar *value_markup)
+{
+ GtkWidget *label;
+ label = gtk_label_new (NULL);
+ gtk_label_set_markup (GTK_LABEL (label), value_markup);
+ gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+ gtk_label_set_selectable (GTK_LABEL (label), TRUE);
+ return goa_util_add_row_widget (table, label_text, label);
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+typedef struct {
+ GoaObject *object;
+ gchar *key;
+} KeyFileEditableData;
+
+static KeyFileEditableData *
+keyfile_editable_data_new (GoaObject *object,
+ const gchar *key)
+{
+ KeyFileEditableData *data;
+ data = g_slice_new (KeyFileEditableData);
+ data->object = g_object_ref (object);
+ data->key = g_strdup (key);
+ return data;
+}
+
+static void
+keyfile_editable_data_free (KeyFileEditableData *data)
+{
+ g_object_unref (data->object);
+ g_free (data->key);
+ g_slice_free (KeyFileEditableData, data);
+}
+
+static void
+keyfile_editable_on_editing_done (GtkEditable *editable,
+ gpointer user_data)
+{
+ KeyFileEditableData *data = user_data;
+ GoaAccount *account;
+ GError *error;
+ GKeyFile *key_file;
+ gchar *contents;
+ gsize length;
+
+ account = goa_object_peek_account (data->object);
+
+ key_file = g_key_file_new ();
+ error = NULL;
+ if (!g_key_file_load_from_file (key_file,
+ goa_account_get_keyfile_path (account),
+ G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS,
+ &error))
+ {
+ goa_warning ("Error loading keyfile %s: %s (%s, %d)",
+ goa_account_get_keyfile_path (account),
+ error->message, g_quark_to_string (error->domain), error->code);
+ g_error_free (error);
+ goto out;
+ }
+
+ g_key_file_set_string (key_file,
+ goa_account_get_keyfile_group (account),
+ data->key,
+ goa_editable_label_get_text (GOA_EDITABLE_LABEL (editable)));
+
+ error = NULL;
+ contents = g_key_file_to_data (key_file,
+ &length,
+ &error);
+ if (contents == NULL)
+ {
+ g_prefix_error (&error,
+ "Error generating key-value-file %s: ",
+ goa_account_get_keyfile_path (account));
+ goa_warning ("%s (%s, %d)",
+ error->message, g_quark_to_string (error->domain), error->code);
+ g_error_free (error);
+ goto out;
+ }
+
+ error = NULL;
+ if (!g_file_set_contents (goa_account_get_keyfile_path (account),
+ contents,
+ length,
+ &error))
+ {
+ g_prefix_error (&error,
+ "Error writing key-value-file %s: ",
+ goa_account_get_keyfile_path (account));
+ goa_warning ("%s (%s, %d)",
+ error->message, g_quark_to_string (error->domain), error->code);
+ g_error_free (error);
+ goto out;
+ }
+
+ out:
+ g_key_file_free (key_file);
+}
+
+/**
+ * goa_util_add_row_editable_label:
+ * @table: A #GtkTable.
+ * @object: A #GoaObject for an account.
+ * @label_text: (allow-none): The text to insert on the left side or %NULL for no label.
+ * @key: The key in the key-value file for @object to look up.
+ * @editable: Whether the widget should be editable
+ *
+ * Adds a #GoaEditableLabel to @table that reads its value from the
+ * key-value file for @object using @key. If it's edited, the new
+ * value is written back to the key-value file.
+ *
+ * Returns: (transfer none): The #GoaEditableLabel that was inserted.
+ */
+GtkWidget *
+goa_util_add_row_editable_label_from_keyfile (GtkTable *table,
+ GoaObject *object,
+ const gchar *label_text,
+ const gchar *key,
+ gboolean editable)
+{
+ GoaAccount *account;
+ GtkWidget *elabel;
+ GKeyFile *key_file;
+ GError *error;
+ gchar *value;
+
+ key_file = NULL;
+ value = NULL;
+
+ account = goa_object_peek_account (object);
+ elabel = goa_editable_label_new ();
+
+ key_file = g_key_file_new ();
+ error = NULL;
+ if (!g_key_file_load_from_file (key_file,
+ goa_account_get_keyfile_path (account),
+ G_KEY_FILE_NONE,
+ &error))
+ {
+ goa_warning ("Error loading keyfile %s: %s (%s, %d)",
+ goa_account_get_keyfile_path (account),
+ error->message, g_quark_to_string (error->domain), error->code);
+ g_error_free (error);
+ goto out;
+ }
+ value = g_key_file_get_string (key_file,
+ goa_account_get_keyfile_group (account),
+ key,
+ &error);
+ if (value == NULL)
+ {
+ goa_warning ("Error extracting key %s from keyfile %s: %s (%s, %d)",
+ key,
+ goa_account_get_keyfile_path (account),
+ error->message, g_quark_to_string (error->domain), error->code);
+ g_error_free (error);
+ goto out;
+ }
+
+ goa_editable_label_set_text (GOA_EDITABLE_LABEL (elabel), value);
+
+ if (editable)
+ {
+ goa_editable_label_set_editable (GOA_EDITABLE_LABEL (elabel), TRUE);
+ g_signal_connect_data (elabel,
+ "editing-done",
+ G_CALLBACK (keyfile_editable_on_editing_done),
+ keyfile_editable_data_new (object, key),
+ (GClosureNotify) keyfile_editable_data_free,
+ 0); /* GConnectFlags */
+ }
+
+ out:
+ g_free (value);
+ if (key_file != NULL)
+ g_key_file_free (key_file);
+ return goa_util_add_row_widget (table, label_text, elabel);
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
diff --git a/src/goabackend/goaprovider.h b/src/goabackend/goaprovider.h
index 454fbf5..5a57c19 100644
--- a/src/goabackend/goaprovider.h
+++ b/src/goabackend/goaprovider.h
@@ -153,13 +153,6 @@ gboolean goa_provider_ensure_credentials_sync (GoaProvider *provid
GCancellable *cancellable,
GError **error);
-void goa_util_add_row_widget (GtkTable *table,
- const gchar *label_text,
- GtkWidget *widget);
-void goa_util_add_row (GtkTable *table,
- const gchar *label_text,
- const gchar *value_markup);
-
/**
* GOA_PROVIDER_EXTENSION_POINT_NAME:
*
@@ -170,6 +163,18 @@ void goa_util_add_row (GtkTable *table,
GList *goa_provider_get_all (void);
GoaProvider *goa_provider_get_for_provider_type (const gchar *provider_type);
+GtkWidget *goa_util_add_row_widget (GtkTable *table,
+ const gchar *label_text,
+ GtkWidget *widget);
+GtkWidget *goa_util_add_row_label (GtkTable *table,
+ const gchar *label_text,
+ const gchar *value_markup);
+GtkWidget *goa_util_add_row_editable_label_from_keyfile (GtkTable *table,
+ GoaObject *object,
+ const gchar *label_text,
+ const gchar *key,
+ gboolean editable);
+
G_END_DECLS
#endif /* __GOA_PROVIDER_H__ */
diff --git a/src/goabackend/goatwitterprovider.c b/src/goabackend/goatwitterprovider.c
index 12c1fe4..6db0236 100644
--- a/src/goabackend/goatwitterprovider.c
+++ b/src/goabackend/goatwitterprovider.c
@@ -310,16 +310,11 @@ show_account (GoaProvider *provider,
GtkBox *vbox,
GtkTable *table)
{
- GoaTwitterAccount *taccount;
-
/* Chain up */
GOA_PROVIDER_CLASS (goa_twitter_provider_parent_class)->show_account (provider, client, object, vbox, table);
- /* TODO: look up screenname */
- taccount = goa_object_get_twitter_account (object);
- goa_util_add_row (table,
- _("Account Number"),
- goa_twitter_account_get_id (taccount));
+ /* TODO: look up screenname from account number */
+ goa_util_add_row_editable_label_from_keyfile (table, object, _("Account Number"), "Identity", FALSE);
}
/* ---------------------------------------------------------------------------------------------------- */
diff --git a/src/goabackend/goayahooprovider.c b/src/goabackend/goayahooprovider.c
index d001ee6..8c89dd8 100644
--- a/src/goabackend/goayahooprovider.c
+++ b/src/goabackend/goayahooprovider.c
@@ -348,16 +348,11 @@ show_account (GoaProvider *provider,
GtkBox *vbox,
GtkTable *table)
{
- GoaYahooAccount *taccount;
-
/* Chain up */
GOA_PROVIDER_CLASS (goa_yahoo_provider_parent_class)->show_account (provider, client, object, vbox, table);
- /* TODO: look up email address / screenname */
- taccount = goa_object_get_yahoo_account (object);
- goa_util_add_row (table,
- _("GUID"),
- goa_yahoo_account_get_guid (taccount));
+ /* TODO: look up email address / screenname from GUID */
+ goa_util_add_row_editable_label_from_keyfile (table, object, _("GUID"), "Identity", FALSE);
}
/* ---------------------------------------------------------------------------------------------------- */
diff --git a/src/panel/goapanel.c b/src/panel/goapanel.c
index 22265a4..8229f86 100644
--- a/src/panel/goapanel.c
+++ b/src/panel/goapanel.c
@@ -360,8 +360,8 @@ show_page_account (GoaPanel *panel,
}
table = gtk_table_new (3, 2, FALSE);
- gtk_table_set_row_spacings (GTK_TABLE (table), 10);
- gtk_table_set_col_spacings (GTK_TABLE (table), 10);
+ gtk_table_set_row_spacings (GTK_TABLE (table), 0);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 4);
gtk_box_pack_start (GTK_BOX (panel->accounts_vbox), table, FALSE, TRUE, 0);
if (provider != NULL)