[gnome-control-center] online-accounts: Don't show spurious "No online accounts configured"



commit 06ede122abd90194eff4275ed1b97cd9bfa1902e
Author: Debarshi Ray <debarshir gnome org>
Date:   Tue Aug 21 17:23:50 2012 +0200

    online-accounts: Don't show spurious "No online accounts configured"
    
    Programmatically deleting or inserting a row into a GtkTreeModel
    implementation does not change the selection on the GtkTreeView even
    if it is in browse mode (see GTK+ documentation). So, we need to
    connect to the model's row-deleted and row-inserted signals and adjust
    the selection ourselves.
    
    Fixes: https://bugzilla.gnome.org/682175

 panels/online-accounts/cc-online-accounts-panel.c |   69 ++++++++++++++++++++-
 1 files changed, 68 insertions(+), 1 deletions(-)
---
diff --git a/panels/online-accounts/cc-online-accounts-panel.c b/panels/online-accounts/cc-online-accounts-panel.c
index 05477d6..f766ecb 100644
--- a/panels/online-accounts/cc-online-accounts-panel.c
+++ b/panels/online-accounts/cc-online-accounts-panel.c
@@ -59,6 +59,14 @@ struct _GoaPanelClass
   CcPanelClass parent_class;
 };
 
+static void on_model_row_deleted (GtkTreeModel *tree_model,
+                                  GtkTreePath  *path,
+                                  gpointer      user_data);
+static void on_model_row_inserted (GtkTreeModel *tree_model,
+                                   GtkTreePath  *path,
+                                   GtkTreeIter  *iter,
+                                   gpointer      user_data);
+
 static void on_tree_view_selection_changed (GtkTreeSelection *selection,
                                             gpointer          user_data);
 
@@ -116,7 +124,12 @@ goa_panel_finalize (GObject *object)
                                         G_CALLBACK (on_tree_view_selection_changed),
                                         panel);
   if (panel->accounts_model != NULL)
-    g_object_unref (panel->accounts_model);
+    {
+      g_signal_handlers_disconnect_by_func (panel->accounts_model, G_CALLBACK (on_model_row_deleted), panel);
+      g_signal_handlers_disconnect_by_func (panel->accounts_model, G_CALLBACK (on_model_row_inserted), panel);
+      g_clear_object (&panel->accounts_model);
+    }
+
   if (panel->client != NULL)
     {
       g_signal_handlers_disconnect_by_func (panel->client,
@@ -202,6 +215,8 @@ goa_panel_init (GoaPanel *panel)
 
   panel->accounts_model = goa_panel_accounts_model_new (panel->client);
   gtk_tree_view_set_model (GTK_TREE_VIEW (panel->accounts_treeview), GTK_TREE_MODEL (panel->accounts_model));
+  g_signal_connect (panel->accounts_model, "row-deleted", G_CALLBACK (on_model_row_deleted), panel);
+  g_signal_connect (panel->accounts_model, "row-inserted", G_CALLBACK (on_model_row_inserted), panel);
 
   column = gtk_tree_view_column_new ();
   gtk_tree_view_append_column (GTK_TREE_VIEW (panel->accounts_treeview), column);
@@ -550,6 +565,58 @@ on_account_changed (GoaClient  *client,
 /* ---------------------------------------------------------------------------------------------------- */
 
 static void
+on_model_row_changed (GtkTreeModel *tree_model,
+                      GtkTreePath  *path,
+                      GtkTreeIter  *iter,
+                      gpointer      user_data)
+{
+  GtkTreeSelection *selection = GTK_TREE_SELECTION (user_data);
+
+  gtk_tree_selection_select_iter (selection, iter);
+  g_signal_handlers_disconnect_by_func (tree_model, G_CALLBACK (on_model_row_changed), user_data);
+}
+
+static void
+on_model_row_deleted (GtkTreeModel *tree_model,
+                      GtkTreePath  *path,
+                      gpointer      user_data)
+{
+  GoaPanel *panel = GOA_PANEL (user_data);
+  GtkTreeIter iter;
+  GtkTreeSelection *selection;
+
+  if (!gtk_tree_model_get_iter (tree_model, &iter, path))
+    {
+      if (!gtk_tree_path_prev (path))
+        return;
+    }
+
+  selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (panel->accounts_treeview));
+  gtk_tree_selection_select_path (selection, path);
+}
+
+static void
+on_model_row_inserted (GtkTreeModel *tree_model,
+                       GtkTreePath  *path,
+                       GtkTreeIter  *iter,
+                       gpointer      user_data)
+{
+  GoaPanel *panel = GOA_PANEL (user_data);
+  GtkTreeSelection *selection;
+
+  selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (panel->accounts_treeview));
+  if (gtk_tree_selection_get_selected (selection, NULL, NULL))
+    return;
+
+  /* An empty row has been inserted and is going to be filled in, so
+   * we expect selection to stay valid.
+   */
+  g_signal_connect (tree_model, "row-changed", G_CALLBACK (on_model_row_changed), selection);
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+static void
 add_account (GoaPanel *panel)
 {
   GtkWindow *parent;



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