diff options
author | Jay Painter <jpaint@src.gnome.org> | 1998-03-08 20:44:01 +0000 |
---|---|---|
committer | Jay Painter <jpaint@src.gnome.org> | 1998-03-08 20:44:01 +0000 |
commit | 85f1364922265a19e99c3fca647f884716589446 (patch) | |
tree | c11b357ef0e9d7c09e9f4d11288e2fb5e8cd8ea6 /gtk | |
parent | e60864761c98f7375b0b15cdf65dd71c674bd044 (diff) | |
download | gtk+-85f1364922265a19e99c3fca647f884716589446.tar.gz |
changed clist->selection GList so its data elements are casted row indexes instead
of pointers. I also cleaned up a few bugs with GTK_SELECTION_MULTIPLE mode, and some
signal synronization problems with removing selected rows.
Diffstat (limited to 'gtk')
-rw-r--r-- | gtk/gtkclist.c | 194 | ||||
-rw-r--r-- | gtk/testgtk.c | 113 |
2 files changed, 228 insertions, 79 deletions
diff --git a/gtk/gtkclist.c b/gtk/gtkclist.c index 7755b86bc0..6d696bfbfe 100644 --- a/gtk/gtkclist.c +++ b/gtk/gtkclist.c @@ -102,6 +102,13 @@ enum LAST_SIGNAL }; +enum +{ + SYNC_REMOVE, + SYNC_INSERT +}; + + typedef void (*GtkCListSignal1) (GtkObject * object, gint arg1, gint arg2, @@ -113,6 +120,10 @@ typedef void (*GtkCListSignal2) (GtkObject * object, gpointer data); +static void sync_selection (GtkCList * clist, + gint row, + gint mode); + /* GtkCList Methods */ static void gtk_clist_class_init (GtkCListClass * klass); static void gtk_clist_init (GtkCList * clist); @@ -1267,6 +1278,9 @@ gtk_clist_insert (GtkCList * clist, clist->row_list = g_list_insert (clist->row_list, clist_row, row); clist->rows++; + + /* syncronize the selection list */ + sync_selection (clist, row, SYNC_INSERT); } /* redraw the list if it isn't frozen */ @@ -1283,7 +1297,7 @@ void gtk_clist_remove (GtkCList * clist, gint row) { - gint was_visible; + gint was_visible, was_selected; GList *list; GtkCListRow *clist_row; @@ -1294,11 +1308,33 @@ gtk_clist_remove (GtkCList * clist, return; was_visible = gtk_clist_row_is_visible (clist, row); + was_selected = 0; /* get the row we're going to delete */ list = g_list_nth (clist->row_list, row); clist_row = list->data; + /* if we're removing a selected row, we have to make sure + * it's properly unselected, and then sync up the clist->selected + * list to reflect the deincrimented indexies of rows after the + * removal */ + if (clist_row->state == GTK_STATE_SELECTED) + { + was_selected = 1; + + switch (clist->selection_mode) + { + case GTK_SELECTION_SINGLE: + case GTK_SELECTION_BROWSE: + case GTK_SELECTION_MULTIPLE: + gtk_clist_unselect_row (clist, row, -1); + break; + + default: + break; + } + } + /* reset the row end pointer if we're removing at the * end of the list */ if (row == clist->rows - 1) @@ -1306,6 +1342,27 @@ gtk_clist_remove (GtkCList * clist, clist->row_list = g_list_remove (clist->row_list, clist_row); clist->rows--; + sync_selection (clist, row, SYNC_REMOVE); + + /* preform any selections required by the selection mode */ + if (was_selected) + { + switch (clist->selection_mode) + { + case GTK_SELECTION_BROWSE: + if (row == clist->rows) + gtk_clist_select_row (clist, row - 1, -1); + else + gtk_clist_select_row (clist, row, -1); + break; + + default: + break; + } + } + + /* toast the row */ + row_delete (clist, clist_row); /* redraw the row if it isn't frozen */ if (!GTK_CLIST_FROZEN (clist)) @@ -1315,26 +1372,35 @@ gtk_clist_remove (GtkCList * clist, if (was_visible) draw_rows (clist, NULL); } +} - if (clist_row->state == GTK_STATE_SELECTED) +static void +sync_selection (GtkCList * clist, + gint row, + gint mode) +{ + GList *list; + + list = clist->selection; + while (list) { - switch (clist->selection_mode) - { - case GTK_SELECTION_BROWSE: - if (row >= clist->rows) - row--; - gtk_clist_select_row (clist, row, -1); - break; - - default: - break; - } + if ((gint) list->data >= row) + switch (mode) + { + case SYNC_INSERT: + (gint) list->data = (gint) list->data + 1; + break; - /* remove from selection list */ - clist->selection = g_list_remove (clist->selection, clist_row); - } + case SYNC_REMOVE: + (gint) list->data = (gint) list->data - 1; + break; - row_delete (clist, clist_row); + default: + break; + } + + list = list->next; + } } void @@ -1402,11 +1468,9 @@ gtk_clist_set_row_data_full (GtkCList * clist, clist_row->data = data; clist_row->destroy = destroy; - /* - * re-send the selected signal if data is changed/added + /* re-send the selected signal if data is changed/added * so the application can respond to the new data -- - * this could be questionable behavior - */ + * this could be questionable behavior */ if (clist_row->state == GTK_STATE_SELECTED) gtk_clist_select_row (clist, 0, 0); } @@ -2782,77 +2846,67 @@ toggle_row (GtkCList * clist, { gint i; GList *list; - GtkCListRow *clist_row; + GtkCListRow *clist_row, *selected_row; + + i = 0; + list = clist->row_list; + selected_row = NULL; switch (clist->selection_mode) { case GTK_SELECTION_SINGLE: - i = 0; - list = clist->row_list; while (list) { clist_row = list->data; list = list->next; if (row == i) - { - if (clist_row->state == GTK_STATE_SELECTED) - gtk_signal_emit (GTK_OBJECT (clist), clist_signals[UNSELECT_ROW], - row, column, event); - else - gtk_signal_emit (GTK_OBJECT (clist), clist_signals[SELECT_ROW], - row, column, event); - } + selected_row = clist_row; else if (clist_row->state == GTK_STATE_SELECTED) - { - gtk_signal_emit (GTK_OBJECT (clist), clist_signals[UNSELECT_ROW], - i, column, event); - } + gtk_signal_emit (GTK_OBJECT (clist), clist_signals[UNSELECT_ROW], + i, column, event); i++; } + + if (selected_row && selected_row->state == GTK_STATE_SELECTED) + gtk_signal_emit (GTK_OBJECT (clist), clist_signals[UNSELECT_ROW], + row, column, event); + else + gtk_signal_emit (GTK_OBJECT (clist), clist_signals[SELECT_ROW], + row, column, event); break; + case GTK_SELECTION_BROWSE: - i = 0; - list = clist->row_list; while (list) { clist_row = list->data; list = list->next; - if (row == i) - gtk_signal_emit (GTK_OBJECT (clist), clist_signals[SELECT_ROW], - row, column, event); - else if (clist_row->state == GTK_STATE_SELECTED) + if (i != row && clist_row->state == GTK_STATE_SELECTED) gtk_signal_emit (GTK_OBJECT (clist), clist_signals[UNSELECT_ROW], i, column, event); i++; } + + gtk_signal_emit (GTK_OBJECT (clist), clist_signals[SELECT_ROW], + row, column, event); break; - case GTK_SELECTION_MULTIPLE: - i = 0; - list = clist->row_list; - while (list) - { - clist_row = list->data; - list = list->next; - if (row == i) - { - if (clist_row->state == GTK_STATE_SELECTED) - gtk_signal_emit (GTK_OBJECT (clist), clist_signals[SELECT_ROW], - row, column, event); - else - gtk_signal_emit (GTK_OBJECT (clist), clist_signals[UNSELECT_ROW], - i, column, event); - } + case GTK_SELECTION_MULTIPLE: + clist_row = (g_list_nth (clist->row_list, row))->data; - i++; - } + if (clist_row->state == GTK_STATE_SELECTED) + gtk_signal_emit (GTK_OBJECT (clist), clist_signals[UNSELECT_ROW], + row, column, event); + else + gtk_signal_emit (GTK_OBJECT (clist), clist_signals[SELECT_ROW], + row, column, event); break; + case GTK_SELECTION_EXTENDED: break; @@ -2882,15 +2936,15 @@ select_row (GtkCList * clist, clist_row = list->data; list = list->next; - if (row == i) - gtk_signal_emit (GTK_OBJECT (clist), clist_signals[SELECT_ROW], - row, column, event); - else if (clist_row->state == GTK_STATE_SELECTED) + if (row != i && clist_row->state == GTK_STATE_SELECTED) gtk_signal_emit (GTK_OBJECT (clist), clist_signals[UNSELECT_ROW], i, column, event); i++; } + + gtk_signal_emit (GTK_OBJECT (clist), clist_signals[SELECT_ROW], + row, column, event); break; case GTK_SELECTION_MULTIPLE: @@ -2916,15 +2970,7 @@ unselect_row (GtkCList * clist, switch (clist->selection_mode) { case GTK_SELECTION_SINGLE: - gtk_signal_emit (GTK_OBJECT (clist), clist_signals[UNSELECT_ROW], - row, column, event); - break; - case GTK_SELECTION_BROWSE: - /* you can't force unselect a row in browse mode, because a row - * must always be selected */ - break; - case GTK_SELECTION_MULTIPLE: gtk_signal_emit (GTK_OBJECT (clist), clist_signals[UNSELECT_ROW], row, column, event); @@ -2956,7 +3002,7 @@ real_select_row (GtkCList * clist, if (clist_row->state == GTK_STATE_NORMAL) { clist_row->state = GTK_STATE_SELECTED; - clist->selection = g_list_append (clist->selection, clist_row); + clist->selection = g_list_append (clist->selection, (gpointer) row); if (!GTK_CLIST_FROZEN (clist) && gtk_clist_row_is_visible (clist, row)) draw_row (clist, NULL, row, clist_row); @@ -2981,7 +3027,7 @@ real_unselect_row (GtkCList * clist, if (clist_row->state == GTK_STATE_SELECTED) { clist_row->state = GTK_STATE_NORMAL; - clist->selection = g_list_remove (clist->selection, clist_row); + clist->selection = g_list_remove (clist->selection, (gpointer) row); if (!GTK_CLIST_FROZEN (clist) && gtk_clist_row_is_visible (clist, row)) draw_row (clist, NULL, row, clist_row); diff --git a/gtk/testgtk.c b/gtk/testgtk.c index 4859fcc595..90e69b7315 100644 --- a/gtk/testgtk.c +++ b/gtk/testgtk.c @@ -2654,6 +2654,7 @@ select_clist (GtkWidget *widget, gchar *text; GdkPixmap *pixmap; GdkBitmap *mask; + GList *list; g_print ("GtkCList Selection: row %d column %d button %d\n", row, column, bevent ? bevent->button : 0); @@ -2689,14 +2690,97 @@ select_clist (GtkWidget *widget, } } - g_print ("\n\n"); + /* print selections list */ + g_print ("\nSelected Rows:"); + list = GTK_CLIST (widget)->selection; + while (list) + { + g_print (" %d ", (gint) list->data); + list = list->next; + } + + g_print ("\n\n\n"); + + clist_selected_row = row; +} + +void +unselect_clist (GtkWidget *widget, + gint row, + gint column, + GdkEventButton * bevent) +{ + gint i; + guint8 spacing; + gchar *text; + GdkPixmap *pixmap; + GdkBitmap *mask; + GList *list; + + g_print ("GtkCList Unselection: row %d column %d button %d\n", + row, column, bevent ? bevent->button : 0); + + for (i = 0; i < TESTGTK_CLIST_COLUMNS; i++) + { + switch (gtk_clist_get_cell_type (GTK_CLIST (widget), row, i)) + { + case GTK_CELL_TEXT: + g_print ("CELL %d GTK_CELL_TEXT\n", i); + gtk_clist_get_text (GTK_CLIST (widget), row, i, &text); + g_print ("TEXT: %s\n", text); + break; + + case GTK_CELL_PIXMAP: + g_print ("CELL %d GTK_CELL_PIXMAP\n", i); + gtk_clist_get_pixmap (GTK_CLIST (widget), row, i, &pixmap, &mask); + g_print ("PIXMAP: %d\n", (int) pixmap); + g_print ("MASK: %d\n", (int) mask); + break; + + case GTK_CELL_PIXTEXT: + g_print ("CELL %d GTK_CELL_PIXTEXT\n", i); + gtk_clist_get_pixtext (GTK_CLIST (widget), row, i, &text, &spacing, &pixmap, &mask); + g_print ("TEXT: %s\n", text); + g_print ("SPACING: %d\n", spacing); + g_print ("PIXMAP: %d\n", (int) pixmap); + g_print ("MASK: %d\n", (int) mask); + break; + + default: + break; + } + } + + /* print selections list */ + g_print ("\nSelected Rows:"); + list = GTK_CLIST (widget)->selection; + while (list) + { + g_print (" %d ", (gint) list->data); + list = list->next; + } + + g_print ("\n\n\n"); clist_selected_row = row; } void -list_selection_clist (GtkWidget *widget, gpointer data) +insert_row_clist (GtkWidget *widget, gpointer data) { + static char *text[] = + { + "This", + "is", + "a", + "inserted", + "row", + "la la la la la", + "la la la la" + }; + + gtk_clist_insert (GTK_CLIST (data), clist_selected_row, text); + clist_rows++; } void @@ -2804,6 +2888,16 @@ create_clist () gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0); gtk_widget_show (box2); + button = gtk_button_new_with_label ("Insert Row"); + gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0); + + gtk_signal_connect (GTK_OBJECT (button), + "clicked", + (GtkSignalFunc) insert_row_clist, + (gpointer) clist); + + gtk_widget_show (button); + button = gtk_button_new_with_label ("Show Title Buttons"); gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0); @@ -2840,14 +2934,20 @@ create_clist () (GtkSignalFunc) select_clist, NULL); + gtk_signal_connect (GTK_OBJECT (clist), + "unselect_row", + (GtkSignalFunc) unselect_clist, + NULL); + gtk_clist_set_column_width (GTK_CLIST (clist), 0, 100); for (i = 1; i < TESTGTK_CLIST_COLUMNS; i++) gtk_clist_set_column_width (GTK_CLIST (clist), i, 80); gtk_clist_set_selection_mode (GTK_CLIST (clist), GTK_SELECTION_BROWSE); - - gtk_clist_set_policy (GTK_CLIST (clist), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_clist_set_policy (GTK_CLIST (clist), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); gtk_clist_set_column_justification (GTK_CLIST (clist), 1, GTK_JUSTIFY_RIGHT); gtk_clist_set_column_justification (GTK_CLIST (clist), 2, GTK_JUSTIFY_CENTER); @@ -2896,7 +2996,10 @@ create_clist () if (!GTK_WIDGET_VISIBLE (window)) gtk_widget_show (window); else - gtk_widget_destroy (window); + { + clist_rows = 0; + gtk_widget_destroy (window); + } } |