[gimp] Make sure don't lose the selected item when the tree get collapsed



commit fd224caa103bc5c4b433b64444e23e42cd4ee86b
Author: Michael Natterer <mitch gimp org>
Date:   Sun Sep 13 22:39:01 2009 +0200

    Make sure don't lose the selected item when the tree get collapsed
    
    Collapsing the tree gets rid of any selection in the collapsed branch,
    and doesn't restore it upon exapnding. So connect to the
    GtkTreeView::row-expanded signal and select the active item manually.
    
    Had to add evil hack that makes sure we don't try this on child items
    that are currently being inserted, because our parent class has no
    choice but to expand the tree while the item is not completely
    inserted in all subclasses yet.

 app/widgets/gimpitemtreeview.c |   40 ++++++++++++++++++++++++++++++++++++++++
 1 files changed, 40 insertions(+), 0 deletions(-)
---
diff --git a/app/widgets/gimpitemtreeview.c b/app/widgets/gimpitemtreeview.c
index 3d51ccd..060c503 100644
--- a/app/widgets/gimpitemtreeview.c
+++ b/app/widgets/gimpitemtreeview.c
@@ -88,6 +88,8 @@ struct _GimpItemTreeViewPriv
   GimpTreeHandler *visible_changed_handler;
   GimpTreeHandler *linked_changed_handler;
   GimpTreeHandler *lock_content_changed_handler;
+
+  gboolean         inserting_item; /* EEK */
 };
 
 
@@ -186,6 +188,11 @@ static void   gimp_item_tree_view_toggle_clicked    (GtkCellRendererToggle *togg
                                                      GimpItemTreeView  *view,
                                                      GimpUndoType       undo_type);
 
+static void   gimp_item_tree_view_row_expanded      (GtkTreeView       *tree_view,
+                                                     GtkTreeIter       *iter,
+                                                     GtkTreePath       *path,
+                                                     GimpItemTreeView  *item_view);
+
 
 G_DEFINE_TYPE_WITH_CODE (GimpItemTreeView, gimp_item_tree_view,
                          GIMP_TYPE_CONTAINER_TREE_VIEW,
@@ -339,6 +346,10 @@ gimp_item_tree_view_constructor (GType                  type,
                                                 G_CALLBACK (gimp_item_tree_view_name_edited),
                                                 item_view);
 
+  g_signal_connect (tree_view->view, "row-expanded",
+                    G_CALLBACK (gimp_item_tree_view_row_expanded),
+                    tree_view);
+
   column = gtk_tree_view_column_new ();
   gtk_tree_view_insert_column (tree_view->view, column, 0);
 
@@ -903,9 +914,13 @@ gimp_item_tree_view_insert_item (GimpContainerView *view,
   GimpItem              *item      = GIMP_ITEM (viewable);
   GtkTreeIter           *iter;
 
+  item_view->priv->inserting_item = TRUE;
+
   iter = parent_view_iface->insert_item (view, viewable,
                                          parent_insert_data, index);
 
+  item_view->priv->inserting_item = FALSE;
+
   gtk_tree_store_set (GTK_TREE_STORE (tree_view->model), iter,
                       item_view->priv->model_column_visible,
                       gimp_item_get_visible (item),
@@ -1534,3 +1549,28 @@ gimp_item_tree_view_toggle_clicked (GtkCellRendererToggle *toggle,
 
   gtk_tree_path_free (path);
 }
+
+
+/*  GtkTreeView callbacks  */
+
+static void
+gimp_item_tree_view_row_expanded (GtkTreeView      *tree_view,
+                                  GtkTreeIter      *iter,
+                                  GtkTreePath      *path,
+                                  GimpItemTreeView *item_view)
+{
+  /*  don't select the item while it is being inserted  */
+  if (! item_view->priv->inserting_item)
+    {
+      GimpItemTreeViewClass *item_view_class;
+      GimpItem              *active_item;
+
+      item_view_class = GIMP_ITEM_TREE_VIEW_GET_CLASS (item_view);
+
+      active_item = item_view_class->get_active_item (item_view->priv->image);
+
+      if (active_item)
+        gimp_container_view_select_item (GIMP_CONTAINER_VIEW (item_view),
+                                         GIMP_VIEWABLE (active_item));
+    }
+}



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