From: Jonathan Blandford Date: Mon, 2 Apr 2001 23:38:54 +0000 (+0000) Subject: Bug fix to make trees work again when not sorted. X-Git-Url: http://pileus.org/git/?a=commitdiff_plain;h=461216d45b52280b5d578b1b4c441ff8ba08c53c;p=~andy%2Fgtk Bug fix to make trees work again when not sorted. Mon Apr 2 19:36:57 2001 Jonathan Blandford * gtk/gtktreestore.c (gtk_tree_store_init): Bug fix to make trees work again when not sorted. * gtk/gtktreeview.c (gtk_tree_view_class_init): Add "collapse_row" and "expand_row" signal, closing bug 52578. * gtk/gtktreeview.c (gtk_tree_view_expand_row): Add signal support. * gtk/gtktreeview.c (gtk_tree_view_collapse_row): Add signal support. --- diff --git a/ChangeLog b/ChangeLog index 0795916fb..ff20a9db3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +Mon Apr 2 19:36:57 2001 Jonathan Blandford + + * gtk/gtktreestore.c (gtk_tree_store_init): Bug fix to make trees + work again when not sorted. + + * gtk/gtktreeview.c (gtk_tree_view_class_init): Add "collapse_row" + and "expand_row" signal, closing bug 52578. + + * gtk/gtktreeview.c (gtk_tree_view_expand_row): Add signal + support. + + * gtk/gtktreeview.c (gtk_tree_view_collapse_row): Add signal + support. + Mon Apr 2 18:18:07 2001 Owen Taylor * gdk/gdkevents.h: Add GdkEventSetting event for notification diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index 0795916fb..ff20a9db3 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,17 @@ +Mon Apr 2 19:36:57 2001 Jonathan Blandford + + * gtk/gtktreestore.c (gtk_tree_store_init): Bug fix to make trees + work again when not sorted. + + * gtk/gtktreeview.c (gtk_tree_view_class_init): Add "collapse_row" + and "expand_row" signal, closing bug 52578. + + * gtk/gtktreeview.c (gtk_tree_view_expand_row): Add signal + support. + + * gtk/gtktreeview.c (gtk_tree_view_collapse_row): Add signal + support. + Mon Apr 2 18:18:07 2001 Owen Taylor * gdk/gdkevents.h: Add GdkEventSetting event for notification diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 0795916fb..ff20a9db3 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,17 @@ +Mon Apr 2 19:36:57 2001 Jonathan Blandford + + * gtk/gtktreestore.c (gtk_tree_store_init): Bug fix to make trees + work again when not sorted. + + * gtk/gtktreeview.c (gtk_tree_view_class_init): Add "collapse_row" + and "expand_row" signal, closing bug 52578. + + * gtk/gtktreeview.c (gtk_tree_view_expand_row): Add signal + support. + + * gtk/gtktreeview.c (gtk_tree_view_collapse_row): Add signal + support. + Mon Apr 2 18:18:07 2001 Owen Taylor * gdk/gdkevents.h: Add GdkEventSetting event for notification diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 0795916fb..ff20a9db3 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,17 @@ +Mon Apr 2 19:36:57 2001 Jonathan Blandford + + * gtk/gtktreestore.c (gtk_tree_store_init): Bug fix to make trees + work again when not sorted. + + * gtk/gtktreeview.c (gtk_tree_view_class_init): Add "collapse_row" + and "expand_row" signal, closing bug 52578. + + * gtk/gtktreeview.c (gtk_tree_view_expand_row): Add signal + support. + + * gtk/gtktreeview.c (gtk_tree_view_collapse_row): Add signal + support. + Mon Apr 2 18:18:07 2001 Owen Taylor * gdk/gdkevents.h: Add GdkEventSetting event for notification diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 0795916fb..ff20a9db3 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,17 @@ +Mon Apr 2 19:36:57 2001 Jonathan Blandford + + * gtk/gtktreestore.c (gtk_tree_store_init): Bug fix to make trees + work again when not sorted. + + * gtk/gtktreeview.c (gtk_tree_view_class_init): Add "collapse_row" + and "expand_row" signal, closing bug 52578. + + * gtk/gtktreeview.c (gtk_tree_view_expand_row): Add signal + support. + + * gtk/gtktreeview.c (gtk_tree_view_collapse_row): Add signal + support. + Mon Apr 2 18:18:07 2001 Owen Taylor * gdk/gdkevents.h: Add GdkEventSetting event for notification diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 0795916fb..ff20a9db3 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,17 @@ +Mon Apr 2 19:36:57 2001 Jonathan Blandford + + * gtk/gtktreestore.c (gtk_tree_store_init): Bug fix to make trees + work again when not sorted. + + * gtk/gtktreeview.c (gtk_tree_view_class_init): Add "collapse_row" + and "expand_row" signal, closing bug 52578. + + * gtk/gtktreeview.c (gtk_tree_view_expand_row): Add signal + support. + + * gtk/gtktreeview.c (gtk_tree_view_collapse_row): Add signal + support. + Mon Apr 2 18:18:07 2001 Owen Taylor * gdk/gdkevents.h: Add GdkEventSetting event for notification diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 0795916fb..ff20a9db3 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,17 @@ +Mon Apr 2 19:36:57 2001 Jonathan Blandford + + * gtk/gtktreestore.c (gtk_tree_store_init): Bug fix to make trees + work again when not sorted. + + * gtk/gtktreeview.c (gtk_tree_view_class_init): Add "collapse_row" + and "expand_row" signal, closing bug 52578. + + * gtk/gtktreeview.c (gtk_tree_view_expand_row): Add signal + support. + + * gtk/gtktreeview.c (gtk_tree_view_collapse_row): Add signal + support. + Mon Apr 2 18:18:07 2001 Owen Taylor * gdk/gdkevents.h: Add GdkEventSetting event for notification diff --git a/gtk/gtkmarshal.list b/gtk/gtkmarshal.list index 909da41df..1746d351f 100644 --- a/gtk/gtkmarshal.list +++ b/gtk/gtkmarshal.list @@ -22,6 +22,7 @@ # BOOL deprecated alias for BOOLEAN BOOLEAN:BOXED +BOOLEAN:BOXED,BOXED BOOLEAN:OBJECT,INT,INT,UINT BOOLEAN:OBJECT,STRING,STRING,BOXED BOOLEAN:OBJECT,BOXED,BOXED diff --git a/gtk/gtkmarshalers.list b/gtk/gtkmarshalers.list index 909da41df..1746d351f 100644 --- a/gtk/gtkmarshalers.list +++ b/gtk/gtkmarshalers.list @@ -22,6 +22,7 @@ # BOOL deprecated alias for BOOLEAN BOOLEAN:BOXED +BOOLEAN:BOXED,BOXED BOOLEAN:OBJECT,INT,INT,UINT BOOLEAN:OBJECT,STRING,STRING,BOXED BOOLEAN:OBJECT,BOXED,BOXED diff --git a/gtk/gtktreestore.c b/gtk/gtktreestore.c index 710ba3d6d..6fc2d963e 100644 --- a/gtk/gtktreestore.c +++ b/gtk/gtktreestore.c @@ -228,6 +228,7 @@ gtk_tree_store_init (GtkTreeStore *tree_store) tree_store->root = g_node_new (NULL); tree_store->stamp = g_random_int (); tree_store->sort_list = NULL; + tree_store->sort_column_id = -1; } GtkTreeStore * diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c index 74c7a559f..e8a14ed3a 100644 --- a/gtk/gtktreeview.c +++ b/gtk/gtktreeview.c @@ -62,6 +62,8 @@ struct _GtkTreeViewChild enum { ROW_ACTIVATED, + EXPAND_ROW, + COLLAPSE_ROW, LAST_SIGNAL }; @@ -401,15 +403,35 @@ gtk_tree_view_class_init (GtkTreeViewClass *class) GTK_TYPE_NONE, 2, GTK_TYPE_ADJUSTMENT, GTK_TYPE_ADJUSTMENT); - tree_view_signals[ROW_ACTIVATED] = gtk_signal_new ("row_activated", - GTK_RUN_LAST | GTK_RUN_ACTION, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkTreeViewClass, row_activated), - gtk_marshal_VOID__BOXED_OBJECT, - GTK_TYPE_NONE, 2, - GTK_TYPE_TREE_PATH, - GTK_TYPE_TREE_VIEW_COLUMN); - + tree_view_signals[ROW_ACTIVATED] = + gtk_signal_new ("row_activated", + GTK_RUN_LAST | GTK_RUN_ACTION, + GTK_CLASS_TYPE (object_class), + GTK_SIGNAL_OFFSET (GtkTreeViewClass, row_activated), + gtk_marshal_VOID__BOXED_OBJECT, + GTK_TYPE_NONE, 2, + GTK_TYPE_TREE_PATH, + GTK_TYPE_TREE_VIEW_COLUMN); + tree_view_signals[EXPAND_ROW] = + g_signal_newc ("expand_row", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GtkTreeViewClass, expand_row), + _gtk_boolean_handled_accumulator, NULL, + gtk_marshal_BOOLEAN__BOXED_BOXED, + G_TYPE_BOOLEAN, 2, + GTK_TYPE_TREE_ITER, + GTK_TYPE_TREE_PATH); + tree_view_signals[COLLAPSE_ROW] = + g_signal_newc ("collapse_row", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GtkTreeViewClass, collapse_row), + _gtk_boolean_handled_accumulator, NULL, + gtk_marshal_BOOLEAN__BOXED_BOXED, + G_TYPE_BOOLEAN, 2, + GTK_TYPE_TREE_ITER, + GTK_TYPE_TREE_PATH); } static void @@ -1992,47 +2014,67 @@ gtk_tree_view_button_release (GtkWidget *widget, if (tree_view->priv->button_pressed_node == tree_view->priv->prelight_node && GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_ARROW_PRELIT)) { - GtkTreePath *path; + GtkTreePath *path = NULL; GtkTreeIter iter; /* Actually activate the node */ if (tree_view->priv->button_pressed_node->children == NULL) { GtkTreeIter child; - path = _gtk_tree_view_find_path (GTK_TREE_VIEW (widget), + path = _gtk_tree_view_find_path (tree_view, tree_view->priv->button_pressed_tree, tree_view->priv->button_pressed_node); - tree_view->priv->button_pressed_node->children = _gtk_rbtree_new (); - tree_view->priv->button_pressed_node->children->parent_tree = tree_view->priv->button_pressed_tree; - tree_view->priv->button_pressed_node->children->parent_node = tree_view->priv->button_pressed_node; gtk_tree_model_get_iter (tree_view->priv->model, &iter, path); if (gtk_tree_model_iter_children (tree_view->priv->model, &child, &iter)) - gtk_tree_view_build_tree (tree_view, - tree_view->priv->button_pressed_node->children, - &child, - gtk_tree_path_get_depth (path) + 1, - FALSE, - GTK_WIDGET_REALIZED (widget)); + { + gboolean expand; + g_signal_emit (G_OBJECT (tree_view), tree_view_signals[EXPAND_ROW], 0, &iter, path, &expand); + if (! expand) + { + tree_view->priv->button_pressed_node->children = _gtk_rbtree_new (); + tree_view->priv->button_pressed_node->children->parent_tree = tree_view->priv->button_pressed_tree; + tree_view->priv->button_pressed_node->children->parent_node = tree_view->priv->button_pressed_node; + gtk_tree_view_build_tree (tree_view, + tree_view->priv->button_pressed_node->children, + &child, + gtk_tree_path_get_depth (path) + 1, + FALSE, + GTK_WIDGET_REALIZED (widget)); + + } + } } else { + gboolean collapse; + path = _gtk_tree_view_find_path (GTK_TREE_VIEW (widget), - tree_view->priv->button_pressed_node->children, - tree_view->priv->button_pressed_node->children->root); + tree_view->priv->button_pressed_tree, + tree_view->priv->button_pressed_node); gtk_tree_model_get_iter (tree_view->priv->model, &iter, path); + g_signal_emit (G_OBJECT (tree_view), tree_view_signals[COLLAPSE_ROW], 0, &iter, path, &collapse); - gtk_tree_view_discover_dirty (GTK_TREE_VIEW (widget), - tree_view->priv->button_pressed_node->children, - &iter, - gtk_tree_path_get_depth (path)); - gtk_tree_view_unref_tree (GTK_TREE_VIEW (widget), - tree_view->priv->button_pressed_node->children); - _gtk_rbtree_remove (tree_view->priv->button_pressed_node->children); + if (! collapse) + { + GtkTreeIter child_iter; + gtk_tree_path_append_index (path, 0); + gtk_tree_model_iter_children (tree_view->priv->model, + &child_iter, + &iter); + gtk_tree_view_discover_dirty (GTK_TREE_VIEW (widget), + tree_view->priv->button_pressed_node->children, + &child_iter, + gtk_tree_path_get_depth (path)); + gtk_tree_view_unref_tree (GTK_TREE_VIEW (widget), + tree_view->priv->button_pressed_node->children); + _gtk_rbtree_remove (tree_view->priv->button_pressed_node->children); + } } - gtk_tree_path_free (path); + if (path) + gtk_tree_path_free (path); _gtk_tree_view_update_size (GTK_TREE_VIEW (widget)); } @@ -5181,6 +5223,7 @@ gtk_tree_view_expand_row (GtkTreeView *tree_view, GtkTreeIter child; GtkRBTree *tree; GtkRBNode *node; + gboolean expand; g_return_val_if_fail (GTK_IS_TREE_VIEW (tree_view), FALSE); g_return_val_if_fail (tree_view->priv->model != NULL, FALSE); @@ -5199,6 +5242,11 @@ gtk_tree_view_expand_row (GtkTreeView *tree_view, if (! gtk_tree_model_iter_has_child (tree_view->priv->model, &iter)) return FALSE; + g_signal_emit (G_OBJECT (tree_view), tree_view_signals[EXPAND_ROW], 0, &iter, path, &expand); + + if (expand) + return FALSE; + node->children = _gtk_rbtree_new (); node->children->parent_tree = tree; node->children->parent_node = node; @@ -5222,9 +5270,9 @@ gtk_tree_view_expand_row (GtkTreeView *tree_view, * @tree_view: a #GtkTreeView * @path: path to a row in the @tree_view * - * Collapses a row (hides its child rows). + * Collapses a row (hides its child rows, if they exist.) * - * Return value: %TRUE if the row was expanded + * Return value: %TRUE if the row was collapsed. **/ gboolean gtk_tree_view_collapse_row (GtkTreeView *tree_view, @@ -5233,6 +5281,7 @@ gtk_tree_view_collapse_row (GtkTreeView *tree_view, GtkRBTree *tree; GtkRBNode *node; GtkTreeIter iter; + gboolean collapse; g_return_val_if_fail (GTK_IS_TREE_VIEW (tree_view), FALSE); g_return_val_if_fail (tree_view->priv->tree != NULL, FALSE); @@ -5248,6 +5297,12 @@ gtk_tree_view_collapse_row (GtkTreeView *tree_view, return FALSE; gtk_tree_model_get_iter (tree_view->priv->model, &iter, path); + + g_signal_emit (G_OBJECT (tree_view), tree_view_signals[COLLAPSE_ROW], 0, &iter, path, &collapse); + + if (collapse) + return FALSE; + gtk_tree_view_discover_dirty (tree_view, node->children, &iter, @@ -6133,9 +6188,7 @@ open_row_timeout (gpointer data) (pos == GTK_TREE_VIEW_DROP_INTO_OR_AFTER || pos == GTK_TREE_VIEW_DROP_INTO_OR_BEFORE)) { - gtk_tree_view_expand_row (tree_view, - dest_path, - FALSE); + gtk_tree_view_expand_row (tree_view, dest_path, FALSE); tree_view->priv->open_dest_timeout = 0; gtk_tree_path_free (dest_path); diff --git a/gtk/gtktreeview.h b/gtk/gtktreeview.h index bcaf9e5b2..94d7d84aa 100644 --- a/gtk/gtktreeview.h +++ b/gtk/gtktreeview.h @@ -65,13 +65,17 @@ struct _GtkTreeViewClass { GtkContainerClass parent_class; - void (* set_scroll_adjustments) (GtkTreeView *tree_view, - GtkAdjustment *hadjustment, - GtkAdjustment *vadjustment); - void (* row_activated) (GtkTreeView *tree_view, + void (* set_scroll_adjustments) (GtkTreeView *tree_view, + GtkAdjustment *hadjustment, + GtkAdjustment *vadjustment); + void (* row_activated) (GtkTreeView *tree_view, GtkTreeViewColumn *column); - gint (* expand_row) (GtkTreeView *tree_view, - GtkTreeIter *iter); + gint (* expand_row) (GtkTreeView *tree_view, + GtkTreeIter *iter, + GtkTreePath *path); + gint (* collapse_row) (GtkTreeView *tree_view, + GtkTreeIter *iter, + GtkTreePath *path); }; diff --git a/tests/testtreecolumns.c b/tests/testtreecolumns.c index 93c6dab2e..e7e5e144f 100644 --- a/tests/testtreecolumns.c +++ b/tests/testtreecolumns.c @@ -64,7 +64,7 @@ set_visible (GtkCellRendererToggle *cell, if (column) { gtk_tree_view_column_set_visible (column, ! gtk_tree_view_column_get_visible (column)); - gtk_tree_model_changed (model, path, &iter); + gtk_tree_model_range_changed (model, path, &iter, path, &iter); } gtk_tree_path_free (path); }