[gtk+] treeview: Signal selection changes to the accessible



commit 3112679a5ea58d6ee8f816b592e7188b8b3cea07
Author: Benjamin Otte <otte redhat com>
Date:   Mon Dec 12 16:41:21 2011 +0100

    treeview: Signal selection changes to the accessible
    
    And another signal gone.

 gtk/a11y/gtktreeviewaccessible.c |   56 ++++---------------------------------
 gtk/gtktreeselection.c           |   12 +++++++-
 2 files changed, 17 insertions(+), 51 deletions(-)
---
diff --git a/gtk/a11y/gtktreeviewaccessible.c b/gtk/a11y/gtktreeviewaccessible.c
index 08901a5..065be9f 100644
--- a/gtk/a11y/gtktreeviewaccessible.c
+++ b/gtk/a11y/gtktreeviewaccessible.c
@@ -47,9 +47,6 @@ struct _GtkTreeViewAccessibleCellInfo
 
 /* signal handling */
 
-static void     selection_changed_cb (GtkTreeSelection *selection,
-                                      gpointer          data);
-
 static void     cursor_changed       (GtkTreeView      *tree_view,
                                       GtkTreeViewAccessible *accessible);
 static gboolean focus_in             (GtkWidget        *widget);
@@ -184,7 +181,6 @@ gtk_tree_view_accessible_initialize (AtkObject *obj,
   GtkTreeView *tree_view;
   GtkTreeModel *tree_model;
   GtkWidget *widget;
-  GtkTreeSelection *selection;
 
   ATK_OBJECT_CLASS (_gtk_tree_view_accessible_parent_class)->initialize (obj, data);
 
@@ -197,10 +193,6 @@ gtk_tree_view_accessible_initialize (AtkObject *obj,
   widget = GTK_WIDGET (data);
   tree_view = GTK_TREE_VIEW (widget);
   tree_model = gtk_tree_view_get_model (tree_view);
-  selection = gtk_tree_view_get_selection (tree_view);
-
-  g_signal_connect (selection, "changed",
-                    G_CALLBACK (selection_changed_cb), obj);
 
   g_signal_connect (tree_view, "cursor-changed",
                     G_CALLBACK (cursor_changed), accessible);
@@ -397,7 +389,6 @@ gtk_tree_view_accessible_ref_child (AtkObject *obj,
   GtkCellRenderer *renderer;
   GtkTreeIter iter;
   GtkTreeViewColumn *tv_col;
-  GtkTreeSelection *selection;
   GtkTreePath *path;
   GtkRBTree *tree;
   GtkRBNode *node;
@@ -523,12 +514,6 @@ gtk_tree_view_accessible_ref_child (AtkObject *obj,
 
       update_cell_value (renderer_cell, accessible, FALSE);
 
-      /* If the row is selected, all cells on the row are selected */
-      selection = gtk_tree_view_get_selection (tree_view);
-
-      if (gtk_tree_selection_path_is_selected (selection, path))
-        _gtk_cell_accessible_add_state (cell, ATK_STATE_SELECTED, FALSE);
-
       _gtk_cell_accessible_add_state (cell, ATK_STATE_FOCUSABLE, FALSE);
       if (focus_index == i)
         {
@@ -1549,41 +1534,6 @@ gtk_cell_accessible_parent_interface_init (GtkCellAccessibleParentIface *iface)
 /* signal handling */
 
 static void
-selection_changed_cb (GtkTreeSelection *selection,
-                      gpointer          data)
-{
-  GtkTreeViewAccessible *accessible;
-  GtkTreeView *tree_view;
-  GtkWidget *widget;
-  GtkTreeViewAccessibleCellInfo *info;
-  GtkTreeSelection *tree_selection;
-  GtkTreePath *path;
-  GHashTableIter iter;
-
-  accessible = GTK_TREE_VIEW_ACCESSIBLE (data);
-  widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible));
-  if (widget == NULL)
-    return;
-
-  tree_view = GTK_TREE_VIEW (widget);
-  tree_selection = gtk_tree_view_get_selection (tree_view);
-
-  /* FIXME: clean rows iterates through all cells too */
-  g_hash_table_iter_init (&iter, accessible->cell_infos);
-  while (g_hash_table_iter_next (&iter, NULL, (gpointer *)&info))
-    {
-      _gtk_cell_accessible_remove_state (info->cell, ATK_STATE_SELECTED, TRUE);
-
-      path = cell_info_get_path (info);
-      if (path && gtk_tree_selection_path_is_selected (tree_selection, path))
-        _gtk_cell_accessible_add_state (info->cell, ATK_STATE_SELECTED, TRUE);
-      gtk_tree_path_free (path);
-    }
-  if (gtk_widget_get_realized (widget))
-    g_signal_emit_by_name (accessible, "selection-changed");
-}
-
-static void
 cursor_changed (GtkTreeView           *tree_view,
                 GtkTreeViewAccessible *accessible)
 {
@@ -2625,6 +2575,9 @@ _gtk_tree_view_accessible_add_state (GtkTreeView          *treeview,
 
       _gtk_cell_accessible_state_changed (cell, state, 0);
     }
+
+  if (state == GTK_CELL_RENDERER_SELECTED)
+    g_signal_emit_by_name (accessible, "selection-changed");
 }
 
 void
@@ -2654,4 +2607,7 @@ _gtk_tree_view_accessible_remove_state (GtkTreeView          *treeview,
 
       _gtk_cell_accessible_state_changed (cell, 0, state);
     }
+
+  if (state == GTK_CELL_RENDERER_SELECTED)
+    g_signal_emit_by_name (accessible, "selection-changed");
 }
diff --git a/gtk/gtktreeselection.c b/gtk/gtktreeselection.c
index 071a87b..7b56563 100644
--- a/gtk/gtktreeselection.c
+++ b/gtk/gtktreeselection.c
@@ -25,6 +25,7 @@
 #include "gtkmarshalers.h"
 #include "gtkintl.h"
 #include "gtktypebuiltins.h"
+#include "a11y/gtktreeviewaccessible.h"
 
 
 /**
@@ -1636,7 +1637,16 @@ gtk_tree_selection_real_select_node (GtkTreeSelection *selection,
 
   if (toggle)
     {
-      node->flags ^= GTK_RBNODE_IS_SELECTED;
+      if (!GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_SELECTED))
+        {
+          GTK_RBNODE_SET_FLAG (node, GTK_RBNODE_IS_SELECTED);
+          _gtk_tree_view_accessible_add_state (priv->tree_view, tree, node, GTK_CELL_RENDERER_SELECTED);
+        }
+      else
+        {
+          GTK_RBNODE_UNSET_FLAG (node, GTK_RBNODE_IS_SELECTED);
+          _gtk_tree_view_accessible_remove_state (priv->tree_view, tree, node, GTK_CELL_RENDERER_SELECTED);
+        }
 
       _gtk_tree_view_queue_draw_node (priv->tree_view, tree, node, NULL);
 



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