[gnome-control-center/wip/gbsneto/new-goa-panel: 8/23] online-accounts: add a providers listbox to the panel



commit 7b246250e610bd020f790b5dc6be5c2e8d5d77b0
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date:   Wed Nov 9 17:06:18 2016 -0200

    online-accounts: add a providers listbox to the panel
    
    This commit starts moving the contents of the add account dialog
    class to the panel itself, by adding a providers listbox below
    the list of available account as per the new mockups.
    
    The next commits are focused on finishing this move and removing
    the add account dialog.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=774222

 panels/online-accounts/cc-online-accounts-panel.c |  179 +++++++++++----------
 panels/online-accounts/online-accounts.ui         |   25 +++
 2 files changed, 117 insertions(+), 87 deletions(-)
---
diff --git a/panels/online-accounts/cc-online-accounts-panel.c 
b/panels/online-accounts/cc-online-accounts-panel.c
index e745a7f..f999c8c 100644
--- a/panels/online-accounts/cc-online-accounts-panel.c
+++ b/panels/online-accounts/cc-online-accounts-panel.c
@@ -47,6 +47,7 @@ struct _CcGoaPanel
   GtkWidget *add_account_button;
   GtkWidget *edit_account_dialog;
   GtkWidget *edit_account_headerbar;
+  GtkWidget *providers_listbox;
   GtkWidget *toolbar;
   GtkWidget *toolbar_add_button;
   GtkWidget *toolbar_remove_button;
@@ -77,9 +78,13 @@ static void on_account_removed (GoaClient  *client,
 
 static void select_account_by_id (CcGoaPanel    *panel,
                                   const gchar   *account_id);
-static void     add_account          (CcGoaPanel *panel,
-                                      GoaProvider *provider,
-                                      GVariant *preseed);
+
+static void get_all_providers_cb (GObject      *source,
+                                  GAsyncResult *res,
+                                  gpointer      user_data);
+
+static void add_provider_row (CcGoaPanel  *self,
+                              GoaProvider *provider);
 
 CC_PANEL_REGISTER (CcGoaPanel, cc_goa_panel);
 
@@ -88,6 +93,75 @@ enum {
   PROP_PARAMETERS
 };
 
+/* ---------------------------------------------------------------------------------------------------- */
+
+static void
+add_provider_row (CcGoaPanel  *self,
+                  GoaProvider *provider)
+{
+  GtkWidget *row;
+  GtkWidget *row_grid;
+  GtkWidget *image;
+  GtkWidget *label;
+  GIcon *icon;
+  gchar *markup;
+  gchar *name;
+
+  row = gtk_list_box_row_new ();
+  row_grid = gtk_grid_new ();
+  gtk_orientable_set_orientation (GTK_ORIENTABLE (row_grid), GTK_ORIENTATION_HORIZONTAL);
+  gtk_grid_set_column_spacing (GTK_GRID (row_grid), 6);
+  gtk_container_set_border_width (GTK_CONTAINER (row_grid), 6);
+  gtk_container_add (GTK_CONTAINER (row), row_grid);
+
+  if (provider == NULL)
+    {
+      g_object_set_data (G_OBJECT (row), "provider", NULL);
+      icon = g_themed_icon_new_with_default_fallbacks ("goa-account");
+      name = g_strdup (C_("Online Account", "Other"));
+    }
+  else
+    {
+      g_object_set_data_full (G_OBJECT (row), "provider", g_object_ref (provider), g_object_unref);
+      icon = goa_provider_get_provider_icon (provider, NULL);
+      name = goa_provider_get_provider_name (provider, NULL);
+    }
+
+  gtk_container_add (GTK_CONTAINER (self->providers_listbox), row);
+
+  image = gtk_image_new_from_gicon (icon, GTK_ICON_SIZE_DND);
+  gtk_container_add (GTK_CONTAINER (row_grid), image);
+
+  markup = g_strdup_printf ("<b>%s</b>", name);
+  label = gtk_label_new (NULL);
+  gtk_label_set_markup (GTK_LABEL (label), markup);
+  gtk_container_add (GTK_CONTAINER (row_grid), label);
+  g_free (markup);
+
+  gtk_widget_show_all (row);
+
+  g_free (name);
+  g_object_unref (icon);
+}
+
+
+static gint
+sort_providers_func (GtkListBoxRow *a,
+                     GtkListBoxRow *b,
+                     gpointer       user_data)
+{
+  GoaProvider *a_provider, *b_provider;
+
+  a_provider = g_object_get_data (G_OBJECT (a), "provider");
+  b_provider = g_object_get_data (G_OBJECT (b), "provider");
+
+  return g_strcmp0 (goa_provider_get_provider_name (a_provider, NULL),
+                    goa_provider_get_provider_name (b_provider, NULL));
+}
+
+
+/* ---------------------------------------------------------------------------------------------------- */
+
 static gint
 sort_func (GtkListBoxRow *a,
            GtkListBoxRow *b,
@@ -148,8 +222,6 @@ command_add (CcGoaPanel *panel,
         }
     }
 
-  add_account (panel, provider, preseed);
-
 out:
   g_clear_object (&provider);
   g_clear_pointer (&preseed, g_variant_unref);
@@ -220,9 +292,18 @@ cc_goa_panel_init (CcGoaPanel *panel)
                               panel,
                               NULL);
 
+  gtk_list_box_set_sort_func (GTK_LIST_BOX (panel->providers_listbox),
+                              sort_providers_func,
+                              panel,
+                              NULL);
+
   monitor = g_network_monitor_get_default();
 
   g_object_bind_property (monitor, "network-available",
+                          panel->providers_listbox, "sensitive",
+                          G_BINDING_SYNC_CREATE);
+
+  g_object_bind_property (monitor, "network-available",
                           panel->toolbar_add_button, "sensitive",
                           G_BINDING_SYNC_CREATE);
   g_object_bind_property (monitor, "network-available",
@@ -252,6 +333,8 @@ cc_goa_panel_init (CcGoaPanel *panel)
                     panel);
 
   fill_accounts_listbox (panel);
+
+  goa_provider_get_all (get_all_providers_cb, panel);
 }
 
 static const char *
@@ -299,6 +382,7 @@ cc_goa_panel_class_init (CcGoaPanelClass *klass)
   gtk_widget_class_bind_template_child (widget_class, CcGoaPanel, add_account_button);
   gtk_widget_class_bind_template_child (widget_class, CcGoaPanel, edit_account_dialog);
   gtk_widget_class_bind_template_child (widget_class, CcGoaPanel, edit_account_headerbar);
+  gtk_widget_class_bind_template_child (widget_class, CcGoaPanel, providers_listbox);
   gtk_widget_class_bind_template_child (widget_class, CcGoaPanel, toolbar);
   gtk_widget_class_bind_template_child (widget_class, CcGoaPanel, toolbar_add_button);
   gtk_widget_class_bind_template_child (widget_class, CcGoaPanel, toolbar_remove_button);
@@ -536,103 +620,28 @@ on_account_removed (GoaClient *client,
 
 /* ---------------------------------------------------------------------------------------------------- */
 
-typedef struct
-{
-  CcGoaPanel *panel;
-  GoaProvider *provider;
-  GVariant *preseed;
-} AddAccountData;
-
 static void
 get_all_providers_cb (GObject      *source,
                       GAsyncResult *res,
                       gpointer      user_data)
 {
-  AddAccountData *data = user_data;
-  GtkWindow *parent;
-  GtkWidget *dialog;
+  CcGoaPanel *self = user_data;
   GList *providers;
   GList *l;
-  GoaObject *object;
-  GError *error;
 
   providers = NULL;
   if (!goa_provider_get_all_finish (&providers, res, NULL))
-    goto out;
-
-  parent = GTK_WINDOW (cc_shell_get_toplevel (cc_panel_get_shell (CC_PANEL (data->panel))));
-
-  dialog = goa_panel_add_account_dialog_new (data->panel->client);
-  gtk_window_set_transient_for (GTK_WINDOW (dialog), parent);
+    return;
 
   for (l = providers; l != NULL; l = l->next)
     {
       GoaProvider *provider;
       provider = GOA_PROVIDER (l->data);
 
-      goa_panel_add_account_dialog_add_provider (GOA_PANEL_ADD_ACCOUNT_DIALOG (dialog), provider);
-    }
-
-  goa_panel_add_account_dialog_set_preseed_data (GOA_PANEL_ADD_ACCOUNT_DIALOG (dialog),
-                                                 data->provider, data->preseed);
-
-  gtk_widget_show_all (dialog);
-  goa_panel_add_account_dialog_run (GOA_PANEL_ADD_ACCOUNT_DIALOG (dialog));
-
-  error = NULL;
-  object = goa_panel_add_account_dialog_get_account (GOA_PANEL_ADD_ACCOUNT_DIALOG (dialog), &error);
-  gtk_widget_destroy (dialog);
-
-  /* We might have an object even when error is set.
-   * eg., if we failed to store the credentials in the keyring.
-   */
-
-  if (object != NULL)
-    {
-      GoaAccount *account = goa_object_peek_account (object);
-      select_account_by_id (data->panel, goa_account_get_id (account));
-    }
-
-  if (error != NULL)
-    {
-      if (!(error->domain == GOA_ERROR && error->code == GOA_ERROR_DIALOG_DISMISSED))
-        {
-          dialog = gtk_message_dialog_new (parent,
-                                           GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
-                                           GTK_MESSAGE_ERROR,
-                                           GTK_BUTTONS_CLOSE,
-                                           _("Error creating account"));
-          gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
-                                                    "%s",
-                                                    error->message);
-          gtk_widget_show_all (dialog);
-          gtk_dialog_run (GTK_DIALOG (dialog));
-          gtk_widget_destroy (dialog);
-        }
-      g_error_free (error);
+      add_provider_row (self, provider);
     }
 
   g_list_free_full (providers, g_object_unref);
-
-out:
-  g_clear_object (&data->panel);
-  g_clear_object (&data->provider);
-  g_clear_pointer (&data->preseed, g_variant_unref);
-  g_slice_free (AddAccountData, data);
-}
-
-static void
-add_account (CcGoaPanel *panel,
-             GoaProvider *provider,
-             GVariant *preseed)
-{
-  AddAccountData *data;
-
-  data = g_slice_new0 (AddAccountData);
-  data->panel = g_object_ref_sink (panel);
-  data->provider = (provider != NULL ? g_object_ref (provider) : NULL);
-  data->preseed = (preseed != NULL ? g_variant_ref (preseed) : NULL);
-  goa_provider_get_all (get_all_providers_cb, data);
 }
 
 /* ---------------------------------------------------------------------------------------------------- */
@@ -641,8 +650,6 @@ static void
 on_toolbar_add_button_clicked (GtkToolButton *button,
                                gpointer       user_data)
 {
-  CcGoaPanel *panel = CC_GOA_PANEL (user_data);
-  add_account (panel, NULL, NULL);
 }
 
 static void
@@ -713,6 +720,4 @@ static void
 on_add_button_clicked (GtkButton *button,
                        gpointer   user_data)
 {
-  CcGoaPanel *panel = CC_GOA_PANEL (user_data);
-  add_account (panel, NULL, NULL);
 }
diff --git a/panels/online-accounts/online-accounts.ui b/panels/online-accounts/online-accounts.ui
index f8ad126..6932d3c 100644
--- a/panels/online-accounts/online-accounts.ui
+++ b/panels/online-accounts/online-accounts.ui
@@ -112,6 +112,31 @@
                 </child>
               </object>
             </child>
+            <child>
+              <object class="GtkLabel">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="margin-top">24</property>
+                <property name="xalign">0</property>
+                <property name="label" translatable="yes">Add an account</property>
+                <attributes>
+                  <attribute name="weight" value="bold" />
+                </attributes>
+              </object>
+            </child>
+            <child>
+              <object class="GtkFrame">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <child>
+                  <object class="GtkListBox" id="providers_listbox">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="selection_mode">none</property>
+                  </object>
+                </child>
+              </object>
+            </child>
           </object>
         </child>
     </object>


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]