diff options
author | Kristian Rietveld <kris@gtk.org> | 2002-10-22 23:05:29 +0000 |
---|---|---|
committer | Kristian Rietveld <kristian@src.gnome.org> | 2002-10-22 23:05:29 +0000 |
commit | ecb42dc78969437f18569dfcdc70ddec61ac9121 (patch) | |
tree | 4536b725e30bfddebbff2338d1195f5b55b7cd90 | |
parent | fbccc0848ded858cf6681050cc8c880fe9c91c00 (diff) | |
download | gtk+-ecb42dc78969437f18569dfcdc70ddec61ac9121.tar.gz |
Another feature to create truly ugly TreeViews!: style properties for the
Wed Oct 23 01:03:43 2002 Kristian Rietveld <kris@gtk.org>
Another feature to create truly ugly TreeViews!: style properties
for the even/odd colors used for row hinting. (#71595, reported
by Owen Taylor).
* gtk/gtktreeview.c (gtk_tree_view_class_init): add even_row_color
and odd_row_color style properties.
* gtk/gtkstyle.c (get_darkened_gc): support darken_count == 0 case,
(gtk_default_draw_flat_box): rework cell coloring code to support
user-provided even/odd row colors.
Wed Oct 23 01:01:52 2002 Kristian Rietveld <kris@gtk.org>
Cache signal IDs to speed up signal emission. This is a good speedup
because GtkTreeModel emits a big number of signals.
* gtk/gtktreemodel.c (gtk_tree_model_base_init): save IDs returned
by g_signal_new,
(gtk_tree_model_row_changed): use g_signal_emit instead of
g_signal_emit_by_name,
(gtk_tree_model_row_inserted): ditto,
(gtk_tree_model_row_has_child_toggled): ditto,
(gtk_tree_model_row_deleted): ditto,
(gtk_tree_model_rows_reordered): ditto.
Wed Oct 23 00:56:15 2002 Kristian Rietveld <kris@gtk.org>
* gtk/gtktreeselection.c (model_changed): new function,
(gtk_tree_selection_selected_foreach): monitor changes in the model,
bail out if the model has been changed from the foreach func.
(#50263, reported by Havoc Pennington).
* gtk/gtktreeselection.c (_gtk_tree_selection_internal_select_node):
free anchor if applicable (#94868, reported and testcase provided by
Daniel Elstner).
-rw-r--r-- | ChangeLog | 38 | ||||
-rw-r--r-- | ChangeLog.pre-2-10 | 38 | ||||
-rw-r--r-- | ChangeLog.pre-2-2 | 38 | ||||
-rw-r--r-- | ChangeLog.pre-2-4 | 38 | ||||
-rw-r--r-- | ChangeLog.pre-2-6 | 38 | ||||
-rw-r--r-- | ChangeLog.pre-2-8 | 38 | ||||
-rw-r--r-- | gtk/gtkstyle.c | 108 | ||||
-rw-r--r-- | gtk/gtktreemodel.c | 117 | ||||
-rw-r--r-- | gtk/gtktreeselection.c | 73 | ||||
-rw-r--r-- | gtk/gtktreeview.c | 14 |
10 files changed, 474 insertions, 66 deletions
@@ -1,3 +1,41 @@ +Wed Oct 23 01:03:43 2002 Kristian Rietveld <kris@gtk.org> + + Another feature to create truly ugly TreeViews!: style properties + for the even/odd colors used for row hinting. (#71595, reported + by Owen Taylor). + + * gtk/gtktreeview.c (gtk_tree_view_class_init): add even_row_color + and odd_row_color style properties. + + * gtk/gtkstyle.c (get_darkened_gc): support darken_count == 0 case, + (gtk_default_draw_flat_box): rework cell coloring code to support + user-provided even/odd row colors. + +Wed Oct 23 01:01:52 2002 Kristian Rietveld <kris@gtk.org> + + Cache signal IDs to speed up signal emission. This is a good speedup + because GtkTreeModel emits a big number of signals. + + * gtk/gtktreemodel.c (gtk_tree_model_base_init): save IDs returned + by g_signal_new, + (gtk_tree_model_row_changed): use g_signal_emit instead of + g_signal_emit_by_name, + (gtk_tree_model_row_inserted): ditto, + (gtk_tree_model_row_has_child_toggled): ditto, + (gtk_tree_model_row_deleted): ditto, + (gtk_tree_model_rows_reordered): ditto. + +Wed Oct 23 00:56:15 2002 Kristian Rietveld <kris@gtk.org> + + * gtk/gtktreeselection.c (model_changed): new function, + (gtk_tree_selection_selected_foreach): monitor changes in the model, + bail out if the model has been changed from the foreach func. + (#50263, reported by Havoc Pennington). + + * gtk/gtktreeselection.c (_gtk_tree_selection_internal_select_node): + free anchor if applicable (#94868, reported and testcase provided by + Daniel Elstner). + 2002-10-23 Matthias Clasen <maclas@gmx.de> * gdk/linux-fb/gdkselection-fb.c (gdk_text_property_to_utf8_list_for_display): diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 7b6e590bd5..3cd7b2036a 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,41 @@ +Wed Oct 23 01:03:43 2002 Kristian Rietveld <kris@gtk.org> + + Another feature to create truly ugly TreeViews!: style properties + for the even/odd colors used for row hinting. (#71595, reported + by Owen Taylor). + + * gtk/gtktreeview.c (gtk_tree_view_class_init): add even_row_color + and odd_row_color style properties. + + * gtk/gtkstyle.c (get_darkened_gc): support darken_count == 0 case, + (gtk_default_draw_flat_box): rework cell coloring code to support + user-provided even/odd row colors. + +Wed Oct 23 01:01:52 2002 Kristian Rietveld <kris@gtk.org> + + Cache signal IDs to speed up signal emission. This is a good speedup + because GtkTreeModel emits a big number of signals. + + * gtk/gtktreemodel.c (gtk_tree_model_base_init): save IDs returned + by g_signal_new, + (gtk_tree_model_row_changed): use g_signal_emit instead of + g_signal_emit_by_name, + (gtk_tree_model_row_inserted): ditto, + (gtk_tree_model_row_has_child_toggled): ditto, + (gtk_tree_model_row_deleted): ditto, + (gtk_tree_model_rows_reordered): ditto. + +Wed Oct 23 00:56:15 2002 Kristian Rietveld <kris@gtk.org> + + * gtk/gtktreeselection.c (model_changed): new function, + (gtk_tree_selection_selected_foreach): monitor changes in the model, + bail out if the model has been changed from the foreach func. + (#50263, reported by Havoc Pennington). + + * gtk/gtktreeselection.c (_gtk_tree_selection_internal_select_node): + free anchor if applicable (#94868, reported and testcase provided by + Daniel Elstner). + 2002-10-23 Matthias Clasen <maclas@gmx.de> * gdk/linux-fb/gdkselection-fb.c (gdk_text_property_to_utf8_list_for_display): diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 7b6e590bd5..3cd7b2036a 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,41 @@ +Wed Oct 23 01:03:43 2002 Kristian Rietveld <kris@gtk.org> + + Another feature to create truly ugly TreeViews!: style properties + for the even/odd colors used for row hinting. (#71595, reported + by Owen Taylor). + + * gtk/gtktreeview.c (gtk_tree_view_class_init): add even_row_color + and odd_row_color style properties. + + * gtk/gtkstyle.c (get_darkened_gc): support darken_count == 0 case, + (gtk_default_draw_flat_box): rework cell coloring code to support + user-provided even/odd row colors. + +Wed Oct 23 01:01:52 2002 Kristian Rietveld <kris@gtk.org> + + Cache signal IDs to speed up signal emission. This is a good speedup + because GtkTreeModel emits a big number of signals. + + * gtk/gtktreemodel.c (gtk_tree_model_base_init): save IDs returned + by g_signal_new, + (gtk_tree_model_row_changed): use g_signal_emit instead of + g_signal_emit_by_name, + (gtk_tree_model_row_inserted): ditto, + (gtk_tree_model_row_has_child_toggled): ditto, + (gtk_tree_model_row_deleted): ditto, + (gtk_tree_model_rows_reordered): ditto. + +Wed Oct 23 00:56:15 2002 Kristian Rietveld <kris@gtk.org> + + * gtk/gtktreeselection.c (model_changed): new function, + (gtk_tree_selection_selected_foreach): monitor changes in the model, + bail out if the model has been changed from the foreach func. + (#50263, reported by Havoc Pennington). + + * gtk/gtktreeselection.c (_gtk_tree_selection_internal_select_node): + free anchor if applicable (#94868, reported and testcase provided by + Daniel Elstner). + 2002-10-23 Matthias Clasen <maclas@gmx.de> * gdk/linux-fb/gdkselection-fb.c (gdk_text_property_to_utf8_list_for_display): diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 7b6e590bd5..3cd7b2036a 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,41 @@ +Wed Oct 23 01:03:43 2002 Kristian Rietveld <kris@gtk.org> + + Another feature to create truly ugly TreeViews!: style properties + for the even/odd colors used for row hinting. (#71595, reported + by Owen Taylor). + + * gtk/gtktreeview.c (gtk_tree_view_class_init): add even_row_color + and odd_row_color style properties. + + * gtk/gtkstyle.c (get_darkened_gc): support darken_count == 0 case, + (gtk_default_draw_flat_box): rework cell coloring code to support + user-provided even/odd row colors. + +Wed Oct 23 01:01:52 2002 Kristian Rietveld <kris@gtk.org> + + Cache signal IDs to speed up signal emission. This is a good speedup + because GtkTreeModel emits a big number of signals. + + * gtk/gtktreemodel.c (gtk_tree_model_base_init): save IDs returned + by g_signal_new, + (gtk_tree_model_row_changed): use g_signal_emit instead of + g_signal_emit_by_name, + (gtk_tree_model_row_inserted): ditto, + (gtk_tree_model_row_has_child_toggled): ditto, + (gtk_tree_model_row_deleted): ditto, + (gtk_tree_model_rows_reordered): ditto. + +Wed Oct 23 00:56:15 2002 Kristian Rietveld <kris@gtk.org> + + * gtk/gtktreeselection.c (model_changed): new function, + (gtk_tree_selection_selected_foreach): monitor changes in the model, + bail out if the model has been changed from the foreach func. + (#50263, reported by Havoc Pennington). + + * gtk/gtktreeselection.c (_gtk_tree_selection_internal_select_node): + free anchor if applicable (#94868, reported and testcase provided by + Daniel Elstner). + 2002-10-23 Matthias Clasen <maclas@gmx.de> * gdk/linux-fb/gdkselection-fb.c (gdk_text_property_to_utf8_list_for_display): diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 7b6e590bd5..3cd7b2036a 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,41 @@ +Wed Oct 23 01:03:43 2002 Kristian Rietveld <kris@gtk.org> + + Another feature to create truly ugly TreeViews!: style properties + for the even/odd colors used for row hinting. (#71595, reported + by Owen Taylor). + + * gtk/gtktreeview.c (gtk_tree_view_class_init): add even_row_color + and odd_row_color style properties. + + * gtk/gtkstyle.c (get_darkened_gc): support darken_count == 0 case, + (gtk_default_draw_flat_box): rework cell coloring code to support + user-provided even/odd row colors. + +Wed Oct 23 01:01:52 2002 Kristian Rietveld <kris@gtk.org> + + Cache signal IDs to speed up signal emission. This is a good speedup + because GtkTreeModel emits a big number of signals. + + * gtk/gtktreemodel.c (gtk_tree_model_base_init): save IDs returned + by g_signal_new, + (gtk_tree_model_row_changed): use g_signal_emit instead of + g_signal_emit_by_name, + (gtk_tree_model_row_inserted): ditto, + (gtk_tree_model_row_has_child_toggled): ditto, + (gtk_tree_model_row_deleted): ditto, + (gtk_tree_model_rows_reordered): ditto. + +Wed Oct 23 00:56:15 2002 Kristian Rietveld <kris@gtk.org> + + * gtk/gtktreeselection.c (model_changed): new function, + (gtk_tree_selection_selected_foreach): monitor changes in the model, + bail out if the model has been changed from the foreach func. + (#50263, reported by Havoc Pennington). + + * gtk/gtktreeselection.c (_gtk_tree_selection_internal_select_node): + free anchor if applicable (#94868, reported and testcase provided by + Daniel Elstner). + 2002-10-23 Matthias Clasen <maclas@gmx.de> * gdk/linux-fb/gdkselection-fb.c (gdk_text_property_to_utf8_list_for_display): diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 7b6e590bd5..3cd7b2036a 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,41 @@ +Wed Oct 23 01:03:43 2002 Kristian Rietveld <kris@gtk.org> + + Another feature to create truly ugly TreeViews!: style properties + for the even/odd colors used for row hinting. (#71595, reported + by Owen Taylor). + + * gtk/gtktreeview.c (gtk_tree_view_class_init): add even_row_color + and odd_row_color style properties. + + * gtk/gtkstyle.c (get_darkened_gc): support darken_count == 0 case, + (gtk_default_draw_flat_box): rework cell coloring code to support + user-provided even/odd row colors. + +Wed Oct 23 01:01:52 2002 Kristian Rietveld <kris@gtk.org> + + Cache signal IDs to speed up signal emission. This is a good speedup + because GtkTreeModel emits a big number of signals. + + * gtk/gtktreemodel.c (gtk_tree_model_base_init): save IDs returned + by g_signal_new, + (gtk_tree_model_row_changed): use g_signal_emit instead of + g_signal_emit_by_name, + (gtk_tree_model_row_inserted): ditto, + (gtk_tree_model_row_has_child_toggled): ditto, + (gtk_tree_model_row_deleted): ditto, + (gtk_tree_model_rows_reordered): ditto. + +Wed Oct 23 00:56:15 2002 Kristian Rietveld <kris@gtk.org> + + * gtk/gtktreeselection.c (model_changed): new function, + (gtk_tree_selection_selected_foreach): monitor changes in the model, + bail out if the model has been changed from the foreach func. + (#50263, reported by Havoc Pennington). + + * gtk/gtktreeselection.c (_gtk_tree_selection_internal_select_node): + free anchor if applicable (#94868, reported and testcase provided by + Daniel Elstner). + 2002-10-23 Matthias Clasen <maclas@gmx.de> * gdk/linux-fb/gdkselection-fb.c (gdk_text_property_to_utf8_list_for_display): diff --git a/gtk/gtkstyle.c b/gtk/gtkstyle.c index 397532d684..692482ae9e 100644 --- a/gtk/gtkstyle.c +++ b/gtk/gtkstyle.c @@ -3340,7 +3340,7 @@ get_darkened_gc (GdkWindow *window, gint darken_count) { GdkColor src = *color; - GdkColor shaded; + GdkColor shaded = *color; GdkGC *gc; gc = gdk_gc_new (window); @@ -3410,27 +3410,115 @@ gtk_default_draw_flat_box (GtkStyle *style, * for that row. */ - /* FIXME when we have style properties, clean this up. - */ - else if (!strcmp ("cell_even", detail) || !strcmp ("cell_odd", detail) || !strcmp ("cell_even_ruled", detail)) { - gc1 = style->base_gc[state_type]; + GdkColor *color = NULL; + + gtk_widget_style_get (widget, + "even_row_color", &color, + NULL); + + if (color) + { + freeme = get_darkened_gc (window, color, 0); + gc1 = freeme; + + gdk_color_free (color); + } + else + gc1 = style->base_gc[state_type]; } + else if (!strcmp ("cell_odd_ruled", detail)) + { + GdkColor *color; + + gtk_widget_style_get (widget, + "odd_row_color", &color, + NULL); + + if (color) + { + freeme = get_darkened_gc (window, color, 0); + gc1 = freeme; + + gdk_color_free (color); + } + else + { + gtk_widget_style_get (widget, + "even_row_color", &color, + NULL); + + if (color) + { + freeme = get_darkened_gc (window, color, 1); + gdk_color_free (color); + } + else + freeme = get_darkened_gc (window, &style->base[state_type], 1); + gc1 = freeme; + } + } else if (!strcmp ("cell_even_sorted", detail) || !strcmp ("cell_odd_sorted", detail) || - !strcmp ("cell_odd_ruled", detail) || !strcmp ("cell_even_ruled_sorted", detail)) { - freeme = get_darkened_gc (window, &style->base[state_type], 1); - gc1 = freeme; + GdkColor *color = NULL; + + if (!strcmp ("cell_odd_sorted", detail)) + gtk_widget_style_get (widget, + "odd_row_color", &color, + NULL); + else + gtk_widget_style_get (widget, + "even_row_color", &color, + NULL); + + if (color) + { + freeme = get_darkened_gc (window, color, 1); + gc1 = freeme; + + gdk_color_free (color); + } + else + { + freeme = get_darkened_gc (window, &style->base[state_type], 1); + gc1 = freeme; + } } else if (!strcmp ("cell_odd_ruled_sorted", detail)) { - freeme = get_darkened_gc (window, &style->base[state_type], 2); - gc1 = freeme; + GdkColor *color = NULL; + + gtk_widget_style_get (widget, + "odd_row_color", &color, + NULL); + + if (color) + { + freeme = get_darkened_gc (window, color, 1); + gc1 = freeme; + + gdk_color_free (color); + } + else + { + gtk_widget_style_get (widget, + "even_row_color", &color, + NULL); + + if (color) + { + freeme = get_darkened_gc (window, color, 2); + gdk_color_free (color); + } + else + freeme = get_darkened_gc (window, &style->base[state_type], 2); + gc1 = freeme; + } } else gc1 = style->bg_gc[state_type]; diff --git a/gtk/gtktreemodel.c b/gtk/gtktreemodel.c index c8ebd1c856..9d56769724 100644 --- a/gtk/gtktreemodel.c +++ b/gtk/gtktreemodel.c @@ -37,6 +37,18 @@ }G_STMT_END +enum { + ROW_CHANGED, + ROW_INSERTED, + ROW_HAS_CHILD_TOGGLED, + ROW_DELETED, + ROWS_REORDERED, + LAST_SIGNAL +}; + +static guint tree_model_signals[LAST_SIGNAL] = { 0 }; + + struct _GtkTreePath { gint depth; @@ -83,51 +95,56 @@ gtk_tree_model_base_init (gpointer g_class) if (! initialized) { - g_signal_new ("row_changed", - GTK_TYPE_TREE_MODEL, - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GtkTreeModelIface, row_changed), - NULL, NULL, - _gtk_marshal_VOID__BOXED_BOXED, - G_TYPE_NONE, 2, - GTK_TYPE_TREE_PATH, - GTK_TYPE_TREE_ITER); - g_signal_new ("row_inserted", - GTK_TYPE_TREE_MODEL, - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GtkTreeModelIface, row_inserted), - NULL, NULL, - _gtk_marshal_VOID__BOXED_BOXED, - G_TYPE_NONE, 2, - GTK_TYPE_TREE_PATH, - GTK_TYPE_TREE_ITER); - g_signal_new ("row_has_child_toggled", - GTK_TYPE_TREE_MODEL, - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GtkTreeModelIface, row_has_child_toggled), - NULL, NULL, - _gtk_marshal_VOID__BOXED_BOXED, - G_TYPE_NONE, 2, - GTK_TYPE_TREE_PATH, - GTK_TYPE_TREE_ITER); - g_signal_new ("row_deleted", - GTK_TYPE_TREE_MODEL, - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GtkTreeModelIface, row_deleted), - NULL, NULL, - _gtk_marshal_VOID__BOXED, - G_TYPE_NONE, 1, - GTK_TYPE_TREE_PATH); - g_signal_new ("rows_reordered", - GTK_TYPE_TREE_MODEL, - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GtkTreeModelIface, rows_reordered), - NULL, NULL, - _gtk_marshal_VOID__BOXED_BOXED_POINTER, - G_TYPE_NONE, 3, - GTK_TYPE_TREE_PATH, - GTK_TYPE_TREE_ITER, - G_TYPE_POINTER); + tree_model_signals[ROW_CHANGED] = + g_signal_new ("row_changed", + GTK_TYPE_TREE_MODEL, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GtkTreeModelIface, row_changed), + NULL, NULL, + _gtk_marshal_VOID__BOXED_BOXED, + G_TYPE_NONE, 2, + GTK_TYPE_TREE_PATH, + GTK_TYPE_TREE_ITER); + tree_model_signals[ROW_INSERTED] = + g_signal_new ("row_inserted", + GTK_TYPE_TREE_MODEL, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GtkTreeModelIface, row_inserted), + NULL, NULL, + _gtk_marshal_VOID__BOXED_BOXED, + G_TYPE_NONE, 2, + GTK_TYPE_TREE_PATH, + GTK_TYPE_TREE_ITER); + tree_model_signals[ROW_HAS_CHILD_TOGGLED] = + g_signal_new ("row_has_child_toggled", + GTK_TYPE_TREE_MODEL, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GtkTreeModelIface, row_has_child_toggled), + NULL, NULL, + _gtk_marshal_VOID__BOXED_BOXED, + G_TYPE_NONE, 2, + GTK_TYPE_TREE_PATH, + GTK_TYPE_TREE_ITER); + tree_model_signals[ROW_DELETED] = + g_signal_new ("row_deleted", + GTK_TYPE_TREE_MODEL, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GtkTreeModelIface, row_deleted), + NULL, NULL, + _gtk_marshal_VOID__BOXED, + G_TYPE_NONE, 1, + GTK_TYPE_TREE_PATH); + tree_model_signals[ROWS_REORDERED] = + g_signal_new ("rows_reordered", + GTK_TYPE_TREE_MODEL, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GtkTreeModelIface, rows_reordered), + NULL, NULL, + _gtk_marshal_VOID__BOXED_BOXED_POINTER, + G_TYPE_NONE, 3, + GTK_TYPE_TREE_PATH, + GTK_TYPE_TREE_ITER, + G_TYPE_POINTER); initialized = TRUE; } } @@ -1164,7 +1181,7 @@ gtk_tree_model_row_changed (GtkTreeModel *tree_model, g_return_if_fail (path != NULL); g_return_if_fail (iter != NULL); - g_signal_emit_by_name (tree_model, "row_changed", path, iter); + g_signal_emit (tree_model, tree_model_signals[ROW_CHANGED], NULL, path, iter); } /** @@ -1184,7 +1201,7 @@ gtk_tree_model_row_inserted (GtkTreeModel *tree_model, g_return_if_fail (path != NULL); g_return_if_fail (iter != NULL); - g_signal_emit_by_name (tree_model, "row_inserted", path, iter); + g_signal_emit (tree_model, tree_model_signals[ROW_INSERTED], NULL, path, iter); } /** @@ -1205,7 +1222,7 @@ gtk_tree_model_row_has_child_toggled (GtkTreeModel *tree_model, g_return_if_fail (path != NULL); g_return_if_fail (iter != NULL); - g_signal_emit_by_name (tree_model, "row_has_child_toggled", path, iter); + g_signal_emit (tree_model, tree_model_signals[ROW_HAS_CHILD_TOGGLED], NULL, path, iter); } /** @@ -1225,7 +1242,7 @@ gtk_tree_model_row_deleted (GtkTreeModel *tree_model, g_return_if_fail (GTK_IS_TREE_MODEL (tree_model)); g_return_if_fail (path != NULL); - g_signal_emit_by_name (tree_model, "row_deleted", path); + g_signal_emit (tree_model, tree_model_signals[ROW_DELETED], NULL, path); } /** @@ -1249,7 +1266,7 @@ gtk_tree_model_rows_reordered (GtkTreeModel *tree_model, g_return_if_fail (GTK_IS_TREE_MODEL (tree_model)); g_return_if_fail (new_order != NULL); - g_signal_emit_by_name (tree_model, "rows_reordered", path, iter, new_order); + g_signal_emit (tree_model, tree_model_signals[ROWS_REORDERED], NULL, path, iter, new_order); } diff --git a/gtk/gtktreeselection.c b/gtk/gtktreeselection.c index 40546838c5..6c1211e5a5 100644 --- a/gtk/gtktreeselection.c +++ b/gtk/gtktreeselection.c @@ -580,6 +580,15 @@ gtk_tree_selection_count_selected_rows (GtkTreeSelection *selection) return count; } +/* gtk_tree_selection_selected_foreach helper */ +static void +model_changed (gpointer data) +{ + gboolean *stop = (gboolean *)data; + + *stop = TRUE; +} + /** * gtk_tree_selection_selected_foreach: * @selection: A #GtkTreeSelection. @@ -600,6 +609,9 @@ gtk_tree_selection_selected_foreach (GtkTreeSelection *selection, GtkRBNode *node; GtkTreeIter iter; + guint inserted_id, deleted_id, reordered_id; + gboolean stop = FALSE, has_next = FALSE, has_parent = FALSE; + g_return_if_fail (GTK_IS_TREE_SELECTION (selection)); g_return_if_fail (selection->tree_view != NULL); g_return_if_fail (selection->tree_view->priv->model != NULL); @@ -628,6 +640,20 @@ gtk_tree_selection_selected_foreach (GtkTreeSelection *selection, while (node->left != tree->nil) node = node->left; + /* connect to signals to monitor changes in treemodel */ + inserted_id = g_signal_connect_swapped (selection->tree_view->priv->model, + "row_inserted", + G_CALLBACK (model_changed), + &stop); + deleted_id = g_signal_connect_swapped (selection->tree_view->priv->model, + "row_deleted", + G_CALLBACK (model_changed), + &stop); + reordered_id = g_signal_connect_swapped (selection->tree_view->priv->model, + "rows_reordered", + G_CALLBACK (model_changed), + &stop); + /* find the node internally */ path = gtk_tree_path_new_first (); gtk_tree_model_get_iter (selection->tree_view->priv->model, @@ -637,6 +663,10 @@ gtk_tree_selection_selected_foreach (GtkTreeSelection *selection, { if (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_SELECTED)) (* func) (selection->tree_view->priv->model, path, &iter, data); + + if (stop) + goto out; + if (node->children) { gboolean has_child; @@ -649,8 +679,10 @@ gtk_tree_selection_selected_foreach (GtkTreeSelection *selection, tmp = iter; has_child = gtk_tree_model_iter_children (selection->tree_view->priv->model, &iter, &tmp); gtk_tree_path_append_index (path, 0); - /* Sanity Check! */ - TREE_VIEW_INTERNAL_ASSERT_VOID (has_child); + + /* we do the sanity check at the bottom of this function */ + if (has_child) + goto out; } else { @@ -678,21 +710,47 @@ gtk_tree_selection_selected_foreach (GtkTreeSelection *selection, tree = tree->parent_tree; if (tree == NULL) { - gtk_tree_path_free (path); /* we've run out of tree */ /* We're done with this function */ - return; + + goto out; } + has_parent = gtk_tree_model_iter_parent (selection->tree_view->priv->model, &iter, &tmp_iter); gtk_tree_path_up (path); - /* Sanity check */ - TREE_VIEW_INTERNAL_ASSERT_VOID (has_parent); + + /* we do the sanity check at the bottom of this function */ + if (has_parent) + goto out; } } while (!done); } } while (TRUE); + +out: + if (path) + gtk_tree_path_free (path); + + g_signal_handler_disconnect (selection->tree_view->priv->model, + inserted_id); + g_signal_handler_disconnect (selection->tree_view->priv->model, + deleted_id); + g_signal_handler_disconnect (selection->tree_view->priv->model, + reordered_id); + + /* check if we have to spew a scary message */ + if (has_next) + TREE_VIEW_INTERNAL_ASSERT_VOID (has_next); + if (has_parent) + TREE_VIEW_INTERNAL_ASSERT_VOID (has_parent); + if (stop) + g_warning + ("The model has been modified from within gtk_tree_selection_foreach.\n" + "This function is for observing the selections of the tree only. If\n" + "you are trying to get all selected items from the tree, try using\n" + "gtk_tree_selection_get_selected_rows instead.\n"); } /** @@ -1281,6 +1339,9 @@ _gtk_tree_selection_internal_select_node (GtkTreeSelection *selection, if (gtk_tree_selection_real_select_node (selection, tree, node, TRUE)) { dirty = TRUE; + if (selection->tree_view->priv->anchor) + gtk_tree_row_reference_free (selection->tree_view->priv->anchor); + selection->tree_view->priv->anchor = gtk_tree_row_reference_new_proxy (G_OBJECT (selection->tree_view), selection->tree_view->priv->model, path); } diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c index 0c47b7dfd8..6aaf2b84cc 100644 --- a/gtk/gtktreeview.c +++ b/gtk/gtktreeview.c @@ -639,6 +639,20 @@ gtk_tree_view_class_init (GtkTreeViewClass *class) TRUE, G_PARAM_READABLE)); + gtk_widget_class_install_style_property (widget_class, + g_param_spec_boxed ("even_row_color", + _("Even Row Color"), + _("Color to use for even rows"), + GDK_TYPE_COLOR, +G_PARAM_READABLE)); + + gtk_widget_class_install_style_property (widget_class, + g_param_spec_boxed ("odd_row_color", + _("Odd Row Color"), + _("Color to use for odd rows"), + GDK_TYPE_COLOR, +G_PARAM_READABLE)); + /* Signals */ widget_class->set_scroll_adjustments_signal = g_signal_new ("set_scroll_adjustments", |