gnome-control-center/panels/online-accounts/cc-online-accounts-add-account-dialog.c
Debarshi Ray b68b6d84cd online-accounts: Get rid of extra "Add Account" label
Back in the day when titles were not shown for modal dialogs we added
the big "Add Account" label. Now that modal dialogs have titles, we
don't need it anymore.

Fixes: https://bugzilla.gnome.org/684013
2012-09-14 13:38:06 +02:00

365 lines
12 KiB
C

/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
*
* Copyright (C) 2012 Red Hat, Inc.
*
* 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, write to the
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA.
*
* Author: Debarshi Ray <debarshir@gnome.org>
*/
#include "config.h"
#include <glib/gi18n-lib.h>
#define GOA_API_IS_SUBJECT_TO_CHANGE
#define GOA_BACKEND_API_IS_SUBJECT_TO_CHANGE
#include <goabackend/goabackend.h>
#include "cc-online-accounts-add-account-dialog.h"
struct _GoaPanelAddAccountDialogPrivate
{
GError *error;
GoaClient *client;
GoaObject *object;
GtkListStore *list_store;
GtkTreePath *path;
GtkWidget *tree_view;
gboolean ignore_release;
};
#define GOA_ADD_ACCOUNT_DIALOG_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GOA_TYPE_PANEL_ADD_ACCOUNT_DIALOG, GoaPanelAddAccountDialogPrivate))
enum
{
PROP_0,
PROP_CLIENT,
};
enum
{
COLUMN_PROVIDER,
COLUMN_ICON,
COLUMN_MARKUP,
N_COLUMNS
};
G_DEFINE_TYPE (GoaPanelAddAccountDialog, goa_panel_add_account_dialog, GTK_TYPE_DIALOG)
static GoaProvider *
add_account_dialog_get_provider (GoaPanelAddAccountDialog *add_account)
{
GoaPanelAddAccountDialogPrivate *priv = add_account->priv;
GoaProvider *provider;
GtkTreeIter iter;
if (priv->path == NULL)
return NULL;
if (!gtk_tree_model_get_iter (GTK_TREE_MODEL (priv->list_store), &iter, priv->path))
return NULL;
gtk_tree_model_get (GTK_TREE_MODEL (priv->list_store), &iter, COLUMN_PROVIDER, &provider, -1);
return provider;
}
static void
add_account_dialog_add_account (GoaPanelAddAccountDialog *add_account)
{
GoaPanelAddAccountDialogPrivate *priv = add_account->priv;
GList *children;
GList *l;
GoaProvider *provider;
GtkWidget *action_area;
GtkWidget *vbox;
provider = add_account_dialog_get_provider (add_account);
g_assert (provider != NULL);
action_area = gtk_dialog_get_action_area (GTK_DIALOG (add_account));
vbox = gtk_dialog_get_content_area (GTK_DIALOG (add_account));
children = gtk_container_get_children (GTK_CONTAINER (vbox));
for (l = children; l != NULL; l = l->next)
{
GtkWidget *child = l->data;
if (child != action_area)
gtk_container_remove (GTK_CONTAINER (vbox), child);
}
g_list_free (children);
priv->object = goa_provider_add_account (provider,
priv->client,
GTK_DIALOG (add_account),
GTK_BOX (vbox),
&priv->error);
g_object_unref (provider);
}
static gboolean
tree_view_button_press_event_cb (GtkWidget *widget,
GdkEventButton *event,
gpointer *user_data)
{
GoaPanelAddAccountDialog *add_account = GOA_PANEL_ADD_ACCOUNT_DIALOG (user_data);
GoaPanelAddAccountDialogPrivate *priv = add_account->priv;
/* be sure to ignore double and triple clicks */
priv->ignore_release = (event->type != GDK_BUTTON_PRESS);
return FALSE;
}
static gboolean
tree_view_button_release_event_cb (GtkWidget *widget,
GdkEventButton *event,
gpointer *user_data)
{
GoaPanelAddAccountDialog *add_account = GOA_PANEL_ADD_ACCOUNT_DIALOG (user_data);
GoaPanelAddAccountDialogPrivate *priv = add_account->priv;
GtkTreePath *path;
GtkTreeViewColumn *column;
if (event->button != 1 || priv->ignore_release)
return TRUE;
gtk_tree_view_get_cursor (GTK_TREE_VIEW (widget), &path, &column);
if (path == NULL)
return TRUE;
gtk_tree_view_row_activated (GTK_TREE_VIEW (widget), path, column);
gtk_tree_path_free (path);
return TRUE;
}
static void
tree_view_row_activated_cb (GtkTreeView *tree_view,
GtkTreePath *path,
GtkTreeViewColumn *column,
gpointer user_data)
{
GoaPanelAddAccountDialog *add_account = GOA_PANEL_ADD_ACCOUNT_DIALOG (user_data);
GoaPanelAddAccountDialogPrivate *priv = add_account->priv;
priv->path = gtk_tree_path_copy (path);
add_account_dialog_add_account (add_account);
gtk_dialog_response (GTK_DIALOG (add_account), GTK_RESPONSE_OK);
}
static void
goa_panel_add_account_dialog_realize (GtkWidget *widget)
{
GoaPanelAddAccountDialog *add_account = GOA_PANEL_ADD_ACCOUNT_DIALOG (widget);
GoaPanelAddAccountDialogPrivate *priv = add_account->priv;
GtkWindow *parent;
parent = gtk_window_get_transient_for (GTK_WINDOW (add_account));
if (parent != NULL)
{
gint width;
gint height;
gtk_window_get_size (parent, &width, &height);
gtk_widget_set_size_request (GTK_WIDGET (add_account), (gint) (0.5 * width), (gint) (0.9 * height));
}
gtk_tree_view_set_model (GTK_TREE_VIEW (priv->tree_view), GTK_TREE_MODEL (priv->list_store));
GTK_WIDGET_CLASS (goa_panel_add_account_dialog_parent_class)->realize (widget);
}
static void
goa_panel_add_account_dialog_dispose (GObject *object)
{
GoaPanelAddAccountDialog *add_account = GOA_PANEL_ADD_ACCOUNT_DIALOG (object);
GoaPanelAddAccountDialogPrivate *priv = add_account->priv;
if (priv->tree_view != NULL)
priv->tree_view = NULL;
g_clear_object (&priv->list_store);
g_clear_object (&priv->object);
g_clear_object (&priv->client);
G_OBJECT_CLASS (goa_panel_add_account_dialog_parent_class)->dispose (object);
}
static void
goa_panel_add_account_dialog_finalize (GObject *object)
{
GoaPanelAddAccountDialog *add_account = GOA_PANEL_ADD_ACCOUNT_DIALOG (object);
GoaPanelAddAccountDialogPrivate *priv = add_account->priv;
gtk_tree_path_free (priv->path);
if (priv->error != NULL)
g_error_free (priv->error);
G_OBJECT_CLASS (goa_panel_add_account_dialog_parent_class)->finalize (object);
}
static void
goa_panel_add_account_dialog_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
{
GoaPanelAddAccountDialog *add_account = GOA_PANEL_ADD_ACCOUNT_DIALOG (object);
GoaPanelAddAccountDialogPrivate *priv = add_account->priv;
switch (prop_id)
{
case PROP_CLIENT:
priv->client = GOA_CLIENT (g_value_dup_object (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
goa_panel_add_account_dialog_init (GoaPanelAddAccountDialog *add_account)
{
GoaPanelAddAccountDialogPrivate *priv;
GtkCellRenderer *renderer;
GtkTreeSelection *selection;
GtkTreeViewColumn *column;
GtkWidget *sw;
GtkWidget *vbox;
GtkWidget *grid;
add_account->priv = GOA_ADD_ACCOUNT_DIALOG_GET_PRIVATE (add_account);
priv = add_account->priv;
gtk_container_set_border_width (GTK_CONTAINER (add_account), 6);
gtk_window_set_modal (GTK_WINDOW (add_account), TRUE);
gtk_window_set_resizable (GTK_WINDOW (add_account), FALSE);
/* translators: This is the title of the "Add Account" dialog. */
gtk_window_set_title (GTK_WINDOW (add_account), _("Add Account"));
vbox = gtk_dialog_get_content_area (GTK_DIALOG (add_account));
grid = gtk_grid_new ();
gtk_container_set_border_width (GTK_CONTAINER (grid), 5);
gtk_widget_set_margin_bottom (grid, 6);
gtk_orientable_set_orientation (GTK_ORIENTABLE (grid), GTK_ORIENTATION_VERTICAL);
gtk_grid_set_row_spacing (GTK_GRID (grid), 12);
gtk_container_add (GTK_CONTAINER (vbox), grid);
priv->list_store = gtk_list_store_new (N_COLUMNS, GOA_TYPE_PROVIDER, G_TYPE_ICON, G_TYPE_STRING);
sw = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_IN);
gtk_widget_set_hexpand (sw, TRUE);
gtk_widget_set_vexpand (sw, TRUE);
gtk_container_add (GTK_CONTAINER (grid), sw);
priv->tree_view = gtk_tree_view_new ();
gtk_widget_set_hexpand (priv->tree_view, TRUE);
gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (priv->tree_view), FALSE);
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->tree_view));
gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE);
gtk_container_add (GTK_CONTAINER (sw), priv->tree_view);
column = gtk_tree_view_column_new ();
gtk_tree_view_append_column (GTK_TREE_VIEW (priv->tree_view), column);
renderer = gtk_cell_renderer_pixbuf_new ();
gtk_tree_view_column_pack_start (column, renderer, FALSE);
g_object_set (G_OBJECT (renderer), "stock-size", GTK_ICON_SIZE_DIALOG, NULL);
gtk_tree_view_column_set_attributes (column, renderer, "gicon", COLUMN_ICON, NULL);
renderer = gtk_cell_renderer_text_new ();
gtk_tree_view_column_pack_start (column, renderer, TRUE);
gtk_tree_view_column_set_attributes (column, renderer, "markup", COLUMN_MARKUP, NULL);
gtk_dialog_add_button (GTK_DIALOG (add_account), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
gtk_dialog_set_default_response (GTK_DIALOG (add_account), GTK_RESPONSE_CANCEL);
g_signal_connect (priv->tree_view, "button-press-event",
G_CALLBACK (tree_view_button_press_event_cb), add_account);
g_signal_connect (priv->tree_view, "button-release-event",
G_CALLBACK (tree_view_button_release_event_cb), add_account);
g_signal_connect (priv->tree_view, "row-activated", G_CALLBACK (tree_view_row_activated_cb), add_account);
}
static void
goa_panel_add_account_dialog_class_init (GoaPanelAddAccountDialogClass *klass)
{
GObjectClass *object_class;
GtkWidgetClass *widget_class;
object_class = G_OBJECT_CLASS (klass);
object_class->dispose = goa_panel_add_account_dialog_dispose;
object_class->finalize = goa_panel_add_account_dialog_finalize;
object_class->set_property = goa_panel_add_account_dialog_set_property;
widget_class = GTK_WIDGET_CLASS (klass);
widget_class->realize = goa_panel_add_account_dialog_realize;
g_type_class_add_private (object_class, sizeof (GoaPanelAddAccountDialogPrivate));
g_object_class_install_property (object_class,
PROP_CLIENT,
g_param_spec_object ("client",
"Goa Client",
"A Goa client for talking to the Goa daemon.",
GOA_TYPE_CLIENT,
G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
}
GtkWidget *
goa_panel_add_account_dialog_new (GoaClient *client)
{
return g_object_new (GOA_TYPE_PANEL_ADD_ACCOUNT_DIALOG, "client", client, NULL);
}
void
goa_panel_add_account_dialog_add_provider (GoaPanelAddAccountDialog *add_account, GoaProvider *provider)
{
GoaPanelAddAccountDialogPrivate *priv = add_account->priv;
GIcon *icon;
GtkTreeIter iter;
gchar *markup;
gchar *name;
icon = goa_provider_get_provider_icon (provider, NULL);
name = goa_provider_get_provider_name (provider, NULL);
markup = g_strdup_printf ("<b>%s</b>", name);
g_free (name);
gtk_list_store_append (priv->list_store, &iter);
gtk_list_store_set (priv->list_store, &iter,
COLUMN_PROVIDER, provider,
COLUMN_ICON, icon,
COLUMN_MARKUP, markup,
-1);
g_free (markup);
g_object_unref (icon);
}
GoaObject *
goa_panel_add_account_dialog_get_account (GoaPanelAddAccountDialog *add_account, GError **error)
{
GoaPanelAddAccountDialogPrivate *priv = add_account->priv;
if (error != NULL && priv->error != NULL)
*error = g_error_copy (priv->error);
if (priv->object != NULL)
g_object_ref (priv->object);
return priv->object;
}