diff options
author | Lars Hamann <lars@src.gnome.org> | 1998-09-11 13:52:42 +0000 |
---|---|---|
committer | Lars Hamann <lars@src.gnome.org> | 1998-09-11 13:52:42 +0000 |
commit | cb7c4d6c7fc277d68b542e991c76e3174335f068 (patch) | |
tree | b3674d93c0dff6bf49a728a2981b8986b06bcac7 | |
parent | 6d13f0f9b336986ca246ae469a59aeb04853b31d (diff) | |
download | gdk-pixbuf-cb7c4d6c7fc277d68b542e991c76e3174335f068.tar.gz |
new function to set/unset the selectable flag of a single row.
* gtk/gtkclist.c (gtk_clist_set_selectable): new function
to set/unset the selectable flag of a single row.
(gtk_clist_get_selectable): new function
to get the state of the selectable flag
* gtk/gtkctree.c (gtk_ctree_node_set_selectable)
(gtk_ctree_node_get_selectable): clist analogons
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | ChangeLog.pre-2-0 | 10 | ||||
-rw-r--r-- | ChangeLog.pre-2-10 | 10 | ||||
-rw-r--r-- | ChangeLog.pre-2-2 | 10 | ||||
-rw-r--r-- | ChangeLog.pre-2-4 | 10 | ||||
-rw-r--r-- | ChangeLog.pre-2-6 | 10 | ||||
-rw-r--r-- | ChangeLog.pre-2-8 | 10 | ||||
-rw-r--r-- | gtk/gtkclist.c | 139 | ||||
-rw-r--r-- | gtk/gtkclist.h | 12 | ||||
-rw-r--r-- | gtk/gtkctree.c | 125 | ||||
-rw-r--r-- | gtk/gtkctree.h | 5 |
11 files changed, 288 insertions, 63 deletions
@@ -1,3 +1,13 @@ +Fri Sep 11 15:25:10 1998 Lars Hamann <lars@gtk.org> + + * gtk/gtkclist.c (gtk_clist_set_selectable): new function + to set/unset the selectable flag of a single row. + (gtk_clist_get_selectable): new function + to get the state of the selectable flag + + * gtk/gtkctree.c (gtk_ctree_node_set_selectable) + (gtk_ctree_node_get_selectable): clist analogons + Thu Sep 10 17:04:03 1998 Raph Levien <raph@gimp.org> * gtk/testrgb.c (testrgb_rgb_test): Small changes to the test diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index b940e6e22..1ed33d347 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,13 @@ +Fri Sep 11 15:25:10 1998 Lars Hamann <lars@gtk.org> + + * gtk/gtkclist.c (gtk_clist_set_selectable): new function + to set/unset the selectable flag of a single row. + (gtk_clist_get_selectable): new function + to get the state of the selectable flag + + * gtk/gtkctree.c (gtk_ctree_node_set_selectable) + (gtk_ctree_node_get_selectable): clist analogons + Thu Sep 10 17:04:03 1998 Raph Levien <raph@gimp.org> * gtk/testrgb.c (testrgb_rgb_test): Small changes to the test diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index b940e6e22..1ed33d347 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,13 @@ +Fri Sep 11 15:25:10 1998 Lars Hamann <lars@gtk.org> + + * gtk/gtkclist.c (gtk_clist_set_selectable): new function + to set/unset the selectable flag of a single row. + (gtk_clist_get_selectable): new function + to get the state of the selectable flag + + * gtk/gtkctree.c (gtk_ctree_node_set_selectable) + (gtk_ctree_node_get_selectable): clist analogons + Thu Sep 10 17:04:03 1998 Raph Levien <raph@gimp.org> * gtk/testrgb.c (testrgb_rgb_test): Small changes to the test diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index b940e6e22..1ed33d347 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,13 @@ +Fri Sep 11 15:25:10 1998 Lars Hamann <lars@gtk.org> + + * gtk/gtkclist.c (gtk_clist_set_selectable): new function + to set/unset the selectable flag of a single row. + (gtk_clist_get_selectable): new function + to get the state of the selectable flag + + * gtk/gtkctree.c (gtk_ctree_node_set_selectable) + (gtk_ctree_node_get_selectable): clist analogons + Thu Sep 10 17:04:03 1998 Raph Levien <raph@gimp.org> * gtk/testrgb.c (testrgb_rgb_test): Small changes to the test diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index b940e6e22..1ed33d347 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,13 @@ +Fri Sep 11 15:25:10 1998 Lars Hamann <lars@gtk.org> + + * gtk/gtkclist.c (gtk_clist_set_selectable): new function + to set/unset the selectable flag of a single row. + (gtk_clist_get_selectable): new function + to get the state of the selectable flag + + * gtk/gtkctree.c (gtk_ctree_node_set_selectable) + (gtk_ctree_node_get_selectable): clist analogons + Thu Sep 10 17:04:03 1998 Raph Levien <raph@gimp.org> * gtk/testrgb.c (testrgb_rgb_test): Small changes to the test diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index b940e6e22..1ed33d347 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,13 @@ +Fri Sep 11 15:25:10 1998 Lars Hamann <lars@gtk.org> + + * gtk/gtkclist.c (gtk_clist_set_selectable): new function + to set/unset the selectable flag of a single row. + (gtk_clist_get_selectable): new function + to get the state of the selectable flag + + * gtk/gtkctree.c (gtk_ctree_node_set_selectable) + (gtk_ctree_node_get_selectable): clist analogons + Thu Sep 10 17:04:03 1998 Raph Levien <raph@gimp.org> * gtk/testrgb.c (testrgb_rgb_test): Small changes to the test diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index b940e6e22..1ed33d347 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,13 @@ +Fri Sep 11 15:25:10 1998 Lars Hamann <lars@gtk.org> + + * gtk/gtkclist.c (gtk_clist_set_selectable): new function + to set/unset the selectable flag of a single row. + (gtk_clist_get_selectable): new function + to get the state of the selectable flag + + * gtk/gtkctree.c (gtk_ctree_node_set_selectable) + (gtk_ctree_node_get_selectable): clist analogons + Thu Sep 10 17:04:03 1998 Raph Levien <raph@gimp.org> * gtk/testrgb.c (testrgb_rgb_test): Small changes to the test diff --git a/gtk/gtkclist.c b/gtk/gtkclist.c index 720f7d6e4..c2579a7b6 100644 --- a/gtk/gtkclist.c +++ b/gtk/gtkclist.c @@ -1624,6 +1624,66 @@ gtk_clist_set_shift (GtkCList * clist, GTK_CLIST_CLASS_FW (clist)->draw_row (clist, NULL, row, clist_row); } +void +gtk_clist_set_selectable (GtkCList *clist, + gint row, + gboolean selectable) +{ + GtkCListRow *clist_row; + + g_return_if_fail (clist != NULL); + g_return_if_fail (GTK_IS_CLIST (clist)); + + if (row < 0 || row >= clist->rows) + return; + + clist_row = (g_list_nth (clist->row_list, row))->data; + + if (selectable == clist_row->selectable) + return; + + clist_row->selectable = selectable; + + if (!selectable && clist_row->state == GTK_STATE_SELECTED) + { + if (clist->anchor >= 0 && + clist->selection_mode == GTK_SELECTION_EXTENDED) + { + if ((gdk_pointer_is_grabbed () && GTK_WIDGET_HAS_FOCUS (clist))) + { + GTK_CLIST_UNSET_FLAG (clist, CLIST_DRAG_SELECTION); + gtk_grab_remove (GTK_WIDGET (clist)); + gdk_pointer_ungrab (GDK_CURRENT_TIME); + if (clist->htimer) + { + gtk_timeout_remove (clist->htimer); + clist->htimer = 0; + } + if (clist->vtimer) + { + gtk_timeout_remove (clist->vtimer); + clist->vtimer = 0; + } + } + GTK_CLIST_CLASS_FW (clist)->resync_selection (clist, NULL); + } + unselect_row (clist, row, -1, NULL); + } +} + +gboolean +gtk_clist_get_selectable (GtkCList *clist, + gint row) +{ + g_return_val_if_fail (clist != NULL, FALSE); + g_return_val_if_fail (GTK_IS_CLIST (clist), FALSE); + + if (row < 0 || row >= clist->rows) + return FALSE; + + return GTK_CLIST_ROW (g_list_nth (clist->row_list, row))->selectable; +} + gint gtk_clist_append (GtkCList * clist, gchar * text[]) @@ -4010,7 +4070,7 @@ real_select_row (GtkCList * clist, clist_row = (g_list_nth (clist->row_list, row))->data; - if (clist_row->state != GTK_STATE_NORMAL) + if (clist_row->state != GTK_STATE_NORMAL || !clist_row->selectable) return; clist_row->state = GTK_STATE_SELECTED; @@ -4716,6 +4776,7 @@ row_new (GtkCList * clist) clist_row->fg_set = FALSE; clist_row->bg_set = FALSE; + clist_row->selectable = TRUE; clist_row->state = GTK_STATE_NORMAL; clist_row->data = NULL; clist_row->destroy = NULL; @@ -4901,7 +4962,15 @@ gtk_clist_focus_in (GtkWidget *widget, if (clist->selection_mode == GTK_SELECTION_BROWSE && clist->selection == NULL && clist->focus_row > -1) - select_row (clist, clist->focus_row, -1, (GdkEvent *) event); + { + GList *list; + + list = g_list_nth (clist->row_list, clist->focus_row); + if (list && GTK_CLIST_ROW (list)->selectable) + select_row (clist, clist->focus_row, -1, (GdkEvent *) event); + else + gtk_widget_draw_focus (widget); + } else gtk_widget_draw_focus (widget); @@ -4970,10 +5039,8 @@ toggle_focus_row (GtkCList *clist) { case GTK_SELECTION_SINGLE: case GTK_SELECTION_MULTIPLE: - toggle_row (clist, clist->focus_row, 0, NULL); break; - case GTK_SELECTION_EXTENDED: g_list_free (clist->undo_selection); g_list_free (clist->undo_unselection); @@ -4991,7 +5058,6 @@ toggle_focus_row (GtkCList *clist) GTK_CLIST_CLASS_FW (clist)->resync_selection (clist, NULL); break; - default: break; } @@ -5267,7 +5333,6 @@ resync_selection (GtkCList *clist, if (clist->undo_selection) { - list = clist->selection; clist->selection = clist->undo_selection; clist->selection_end = g_list_last (clist->selection); @@ -5280,30 +5345,36 @@ resync_selection (GtkCList *clist, if (row < i || row > e) { clist_row = g_list_nth (clist->row_list, row)->data; - clist_row->state = GTK_STATE_SELECTED; - unselect_row (clist, row, -1, event); - clist->undo_selection = g_list_prepend - (clist->undo_selection, GINT_TO_POINTER (row)); + if (clist_row->selectable) + { + clist_row->state = GTK_STATE_SELECTED; + unselect_row (clist, row, -1, event); + clist->undo_selection = g_list_prepend + (clist->undo_selection, GINT_TO_POINTER (row)); + } } } } for (list = g_list_nth (clist->row_list, i); i <= e; i++, list = list->next) - if (g_list_find (clist->selection, GINT_TO_POINTER(i))) + if (GTK_CLIST_ROW (list)->selectable) { - if (GTK_CLIST_ROW (list)->state == GTK_STATE_NORMAL) + if (g_list_find (clist->selection, GINT_TO_POINTER(i))) { - GTK_CLIST_ROW (list)->state = GTK_STATE_SELECTED; - unselect_row (clist, i, -1, event); - clist->undo_selection = g_list_prepend (clist->undo_selection, - GINT_TO_POINTER (i)); + if (GTK_CLIST_ROW (list)->state == GTK_STATE_NORMAL) + { + GTK_CLIST_ROW (list)->state = GTK_STATE_SELECTED; + unselect_row (clist, i, -1, event); + clist->undo_selection = g_list_prepend (clist->undo_selection, + GINT_TO_POINTER (i)); + } + } + else if (GTK_CLIST_ROW (list)->state == GTK_STATE_SELECTED) + { + GTK_CLIST_ROW (list)->state = GTK_STATE_NORMAL; + clist->undo_unselection = g_list_prepend (clist->undo_unselection, + GINT_TO_POINTER (i)); } - } - else if (GTK_CLIST_ROW (list)->state == GTK_STATE_SELECTED) - { - GTK_CLIST_ROW (list)->state = GTK_STATE_NORMAL; - clist->undo_unselection = g_list_prepend (clist->undo_unselection, - GINT_TO_POINTER (i)); } for (list = clist->undo_unselection; list; list = list->next) @@ -5397,12 +5468,13 @@ update_extended_selection (GtkCList *clist, { for (i = s1, list = g_list_nth (clist->row_list, i); i <= e1; i++, list = list->next) - { - if (GTK_CLIST_CLASS_FW (clist)->selection_find (clist, i, list)) - GTK_CLIST_ROW (list)->state = GTK_STATE_SELECTED; - else - GTK_CLIST_ROW (list)->state = GTK_STATE_NORMAL; - } + if (GTK_CLIST_ROW (list)->selectable) + { + if (GTK_CLIST_CLASS_FW (clist)->selection_find (clist, i, list)) + GTK_CLIST_ROW (list)->state = GTK_STATE_SELECTED; + else + GTK_CLIST_ROW (list)->state = GTK_STATE_NORMAL; + } top = ROW_TOP_YPIXEL (clist, clist->focus_row); @@ -5434,7 +5506,8 @@ update_extended_selection (GtkCList *clist, { for (i = s2, list = g_list_nth (clist->row_list, i); i <= e2; i++, list = list->next) - if (GTK_CLIST_ROW (list)->state != clist->anchor_state) + if (GTK_CLIST_ROW (list)->selectable && + GTK_CLIST_ROW (list)->state != clist->anchor_state) GTK_CLIST_ROW (list)->state = clist->anchor_state; top = ROW_TOP_YPIXEL (clist, clist->focus_row); @@ -5459,7 +5532,7 @@ update_extended_selection (GtkCList *clist, gtk_clist_moveto (clist, clist->focus_row, -1, 1, 0); y2 = ROW_TOP_YPIXEL (clist, s2); - h2 = (e2-s2+1) * (clist->row_height + CELL_SPACING); + h2 = (e2 - s2 + 1) * (clist->row_height + CELL_SPACING); } area.y = MAX (0, MIN (y1, y2)); @@ -5947,7 +6020,8 @@ fake_unselect_all (GtkCList * clist, if (row >= 0 && (work = g_list_nth (clist->row_list, row))) { - if (GTK_CLIST_ROW (work)->state == GTK_STATE_NORMAL) + if (GTK_CLIST_ROW (work)->state == GTK_STATE_NORMAL && + GTK_CLIST_ROW (work)->selectable) { GTK_CLIST_ROW (work)->state = GTK_STATE_SELECTED; @@ -5982,7 +6056,8 @@ fake_toggle_row (GtkCList *clist, { GList *work; - if (!(work = g_list_nth (clist->row_list, row))) + if (!(work = g_list_nth (clist->row_list, row))|| + !GTK_CLIST_ROW (work)->selectable) return; if (GTK_CLIST_ROW (work)->state == GTK_STATE_NORMAL) diff --git a/gtk/gtkclist.h b/gtk/gtkclist.h index eed34ccc1..1e482bcf4 100644 --- a/gtk/gtkclist.h +++ b/gtk/gtkclist.h @@ -275,8 +275,9 @@ struct _GtkCListRow gpointer data; GtkDestroyNotify destroy; - gint fg_set : 1; - gint bg_set : 1; + gint fg_set : 1; + gint bg_set : 1; + gint selectable : 1; }; /* Cell Structures */ @@ -518,6 +519,13 @@ void gtk_clist_set_shift (GtkCList *clist, gint vertical, gint horizontal); +/* set/get selectable flag of a single row */ +void gtk_clist_set_selectable (GtkCList *clist, + gint row, + gboolean selectable); +gboolean gtk_clist_get_selectable (GtkCList *clist, + gint row); + /* append returns the index of the row you just added, making * it easier to append and modify a row */ diff --git a/gtk/gtkctree.c b/gtk/gtkctree.c index b8b2ea381..a60a92449 100644 --- a/gtk/gtkctree.c +++ b/gtk/gtkctree.c @@ -3239,7 +3239,8 @@ tree_select (GtkCTree *ctree, GtkCTreeNode *node, gpointer data) { - if (node && GTK_CTREE_ROW (node)->row.state != GTK_STATE_SELECTED) + if (node && GTK_CTREE_ROW (node)->row.state != GTK_STATE_SELECTED && + GTK_CTREE_ROW (node)->row.selectable) gtk_signal_emit (GTK_OBJECT (ctree), ctree_signals[TREE_SELECT_ROW], node, -1); } @@ -3315,11 +3316,12 @@ row_new (GtkCTree *ctree) GTK_CELL_PIXTEXT (ctree_row->row.cell[ctree->tree_column])->text = NULL; - ctree_row->row.fg_set = FALSE; - ctree_row->row.bg_set = FALSE; - ctree_row->row.state = GTK_STATE_NORMAL; - ctree_row->row.data = NULL; - ctree_row->row.destroy = NULL; + ctree_row->row.fg_set = FALSE; + ctree_row->row.bg_set = FALSE; + ctree_row->row.selectable = TRUE; + ctree_row->row.state = GTK_STATE_NORMAL; + ctree_row->row.data = NULL; + ctree_row->row.destroy = NULL; ctree_row->level = 0; ctree_row->expanded = FALSE; @@ -3379,7 +3381,8 @@ real_select_row (GtkCList *clist, g_return_if_fail (clist != NULL); g_return_if_fail (GTK_IS_CTREE (clist)); - if ((node = g_list_nth (clist->row_list, row))) + if ((node = g_list_nth (clist->row_list, row)) && + GTK_CTREE_ROW (node)->row.selectable) gtk_signal_emit (GTK_OBJECT (clist), ctree_signals[TREE_SELECT_ROW], node, column); } @@ -3413,7 +3416,8 @@ real_tree_select (GtkCTree *ctree, g_return_if_fail (ctree != NULL); g_return_if_fail (GTK_IS_CTREE (ctree)); - if (!node || GTK_CTREE_ROW (node)->row.state == GTK_STATE_SELECTED) + if (!node || GTK_CTREE_ROW (node)->row.state == GTK_STATE_SELECTED || + !GTK_CTREE_ROW (node)->row.selectable) return; clist = GTK_CLIST (ctree); @@ -3502,13 +3506,14 @@ tree_toggle_selection (GtkCTree *ctree, if (node && GTK_CTREE_ROW (node)->row.state == GTK_STATE_SELECTED) gtk_signal_emit (GTK_OBJECT (ctree), ctree_signals[TREE_UNSELECT_ROW], node, column); - else if (node) + else if (node && GTK_CTREE_ROW (node)->row.selectable) gtk_signal_emit (GTK_OBJECT (ctree), ctree_signals[TREE_SELECT_ROW], node, column); break; case GTK_SELECTION_BROWSE: - if (node && GTK_CTREE_ROW (node)->row.state == GTK_STATE_NORMAL) + if (node && GTK_CTREE_ROW (node)->row.state == GTK_STATE_NORMAL && + GTK_CTREE_ROW (node)->row.selectable) gtk_signal_emit (GTK_OBJECT (ctree), ctree_signals[TREE_SELECT_ROW], node, column); break; @@ -3523,7 +3528,8 @@ select_row_recursive (GtkCTree *ctree, GtkCTreeNode *node, gpointer data) { - if (!node || GTK_CTREE_ROW (node)->row.state == GTK_STATE_SELECTED) + if (!node || GTK_CTREE_ROW (node)->row.state == GTK_STATE_SELECTED || + !GTK_CTREE_ROW (node)->row.selectable) return; GTK_CLIST (ctree)->undo_unselection = @@ -4553,8 +4559,9 @@ gtk_ctree_select (GtkCTree *ctree, g_return_if_fail (GTK_IS_CTREE (ctree)); g_return_if_fail (node != NULL); - gtk_signal_emit (GTK_OBJECT (ctree), ctree_signals[TREE_SELECT_ROW], - node, -1); + if (GTK_CTREE_ROW (node)->row.selectable) + gtk_signal_emit (GTK_OBJECT (ctree), ctree_signals[TREE_SELECT_ROW], + node, -1); } void @@ -4799,6 +4806,60 @@ gtk_ctree_node_set_shift (GtkCTree *ctree, tree_draw_node (ctree, node); } +void +gtk_ctree_node_set_selectable (GtkCTree *ctree, + GtkCTreeNode *node, + gboolean selectable) +{ + g_return_if_fail (ctree != NULL); + g_return_if_fail (GTK_IS_CTREE (ctree)); + g_return_if_fail (node != NULL); + + if (selectable == GTK_CTREE_ROW (node)->row.selectable) + return; + + GTK_CTREE_ROW (node)->row.selectable = selectable; + + if (!selectable && GTK_CTREE_ROW (node)->row.state == GTK_STATE_SELECTED) + { + GtkCList *clist; + + clist = GTK_CLIST (ctree); + + if (clist->anchor >= 0 && + clist->selection_mode == GTK_SELECTION_EXTENDED) + { + if ((gdk_pointer_is_grabbed () && GTK_WIDGET_HAS_FOCUS (clist))) + { + GTK_CLIST_UNSET_FLAG (clist, CLIST_DRAG_SELECTION); + gtk_grab_remove (GTK_WIDGET (clist)); + gdk_pointer_ungrab (GDK_CURRENT_TIME); + if (clist->htimer) + { + gtk_timeout_remove (clist->htimer); + clist->htimer = 0; + } + if (clist->vtimer) + { + gtk_timeout_remove (clist->vtimer); + clist->vtimer = 0; + } + } + GTK_CLIST_CLASS_FW (clist)->resync_selection (clist, NULL); + } + gtk_ctree_unselect (ctree, node); + } +} + +gboolean +gtk_ctree_node_get_selectable (GtkCTree *ctree, + GtkCTreeNode *node) +{ + g_return_val_if_fail (node != NULL, FALSE); + + return GTK_CTREE_ROW (node)->row.selectable; +} + GtkCellType gtk_ctree_node_get_cell_type (GtkCTree *ctree, GtkCTreeNode *node, @@ -5327,7 +5388,8 @@ fake_unselect_all (GtkCList *clist, if (row >= 0 && (focus_node = g_list_nth (clist->row_list, row))) { - if (GTK_CTREE_ROW (focus_node)->row.state == GTK_STATE_NORMAL) + if (GTK_CTREE_ROW (focus_node)->row.state == GTK_STATE_NORMAL && + GTK_CTREE_ROW (focus_node)->row.selectable) { GTK_CTREE_ROW (focus_node)->row.state = GTK_STATE_SELECTED; @@ -5410,7 +5472,7 @@ resync_selection (GtkCList *clist, GdkEvent *event) if (row >= i && row <= e) unselect = FALSE; } - if (unselect) + if (unselect && GTK_CTREE_ROW (node)->row.selectable) { GTK_CTREE_ROW (node)->row.state = GTK_STATE_SELECTED; gtk_ctree_unselect (ctree, node); @@ -5423,21 +5485,24 @@ resync_selection (GtkCList *clist, GdkEvent *event) for (node = GTK_CTREE_NODE (g_list_nth (clist->row_list, i)); i <= e; i++, node = GTK_CTREE_NODE_NEXT (node)) - if (g_list_find (clist->selection, node)) + if (GTK_CTREE_ROW (node)->row.selectable) { - if (GTK_CTREE_ROW (node)->row.state == GTK_STATE_NORMAL) + if (g_list_find (clist->selection, node)) { - GTK_CTREE_ROW (node)->row.state = GTK_STATE_SELECTED; - gtk_ctree_unselect (ctree, node); - clist->undo_selection = g_list_prepend (clist->undo_selection, - node); + if (GTK_CTREE_ROW (node)->row.state == GTK_STATE_NORMAL) + { + GTK_CTREE_ROW (node)->row.state = GTK_STATE_SELECTED; + gtk_ctree_unselect (ctree, node); + clist->undo_selection = g_list_prepend (clist->undo_selection, + node); + } + } + else if (GTK_CTREE_ROW (node)->row.state == GTK_STATE_SELECTED) + { + GTK_CTREE_ROW (node)->row.state = GTK_STATE_NORMAL; + clist->undo_unselection = g_list_prepend (clist->undo_unselection, + node); } - } - else if (GTK_CTREE_ROW (node)->row.state == GTK_STATE_SELECTED) - { - GTK_CTREE_ROW (node)->row.state = GTK_STATE_NORMAL; - clist->undo_unselection = g_list_prepend (clist->undo_unselection, - node); } for (list = clist->undo_unselection; list; list = list->next) @@ -5471,10 +5536,12 @@ real_undo_selection (GtkCList *clist) ctree = GTK_CTREE (clist); for (work = clist->undo_selection; work; work = work->next) - gtk_ctree_select (ctree, GTK_CTREE_NODE (work->data)); + if (GTK_CTREE_ROW (work->data)->row.selectable) + gtk_ctree_select (ctree, GTK_CTREE_NODE (work->data)); for (work = clist->undo_unselection; work; work = work->next) - gtk_ctree_unselect (ctree, GTK_CTREE_NODE (work->data)); + if (GTK_CTREE_ROW (work->data)->row.selectable) + gtk_ctree_unselect (ctree, GTK_CTREE_NODE (work->data)); if (GTK_WIDGET_HAS_FOCUS (clist) && clist->focus_row != clist->undo_anchor) { diff --git a/gtk/gtkctree.h b/gtk/gtkctree.h index 01774921c..2739fd755 100644 --- a/gtk/gtkctree.h +++ b/gtk/gtkctree.h @@ -321,6 +321,11 @@ void gtk_ctree_node_set_shift (GtkCTree *ctree, gint column, gint vertical, gint horizontal); +void gtk_ctree_node_set_selectable (GtkCTree *ctree, + GtkCTreeNode *node, + gboolean selectable); +gboolean gtk_ctree_node_get_selectable (GtkCTree *ctree, + GtkCTreeNode *node); GtkCellType gtk_ctree_node_get_cell_type (GtkCTree *ctree, GtkCTreeNode *node, gint column); |