From 1b5a1e1acbc0cea69cc2ffca3678cb0e73bfeacf Mon Sep 17 00:00:00 2001 From: Lars Hamann Date: Mon, 22 Jun 1998 17:00:21 +0000 Subject: [PATCH] new CTree line style GTK_CTREE_LINES_TABBED --- ChangeLog | 11 +- ChangeLog.pre-2-0 | 11 +- ChangeLog.pre-2-10 | 11 +- ChangeLog.pre-2-2 | 11 +- ChangeLog.pre-2-4 | 11 +- ChangeLog.pre-2-6 | 11 +- ChangeLog.pre-2-8 | 11 +- gtk/gtkctree.c | 625 +++++++++++++++++++++++++++++++++++++++++---- gtk/gtkctree.h | 3 + gtk/testgtk.c | 118 +++++++-- tests/testgtk.c | 118 +++++++-- 11 files changed, 809 insertions(+), 132 deletions(-) diff --git a/ChangeLog b/ChangeLog index 618d8d87ee..adc2ff0974 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,10 +1,9 @@ -1998-06-21 Raja R Harinath +Mon Jun 22 18:43:11 1998 Lars Hamann - * gtk/Makefile.am (gtk.defs,gtktypebuiltins*): Remove $(srcdir) - from, and clean up, the dependencies. Generate to intermediate - files to prevent problems with Ctrl-C. - - * gtk/genmarshal.pl: Generate `gtkmarshal.[ch]' in $srcdir. + * gtk/gtkctree.c (draw_row): added new "line style" + GTK_CTREE_LINES_TABBED + * gtk/gtkctree.c/h (gtk_ctree_find_glist_ptr): new function to + search the glist pointer of an GtkCTreeRow Fri Jun 19 14:46:56 1998 Stefan Jeske diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index 618d8d87ee..adc2ff0974 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,10 +1,9 @@ -1998-06-21 Raja R Harinath +Mon Jun 22 18:43:11 1998 Lars Hamann - * gtk/Makefile.am (gtk.defs,gtktypebuiltins*): Remove $(srcdir) - from, and clean up, the dependencies. Generate to intermediate - files to prevent problems with Ctrl-C. - - * gtk/genmarshal.pl: Generate `gtkmarshal.[ch]' in $srcdir. + * gtk/gtkctree.c (draw_row): added new "line style" + GTK_CTREE_LINES_TABBED + * gtk/gtkctree.c/h (gtk_ctree_find_glist_ptr): new function to + search the glist pointer of an GtkCTreeRow Fri Jun 19 14:46:56 1998 Stefan Jeske diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 618d8d87ee..adc2ff0974 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,10 +1,9 @@ -1998-06-21 Raja R Harinath +Mon Jun 22 18:43:11 1998 Lars Hamann - * gtk/Makefile.am (gtk.defs,gtktypebuiltins*): Remove $(srcdir) - from, and clean up, the dependencies. Generate to intermediate - files to prevent problems with Ctrl-C. - - * gtk/genmarshal.pl: Generate `gtkmarshal.[ch]' in $srcdir. + * gtk/gtkctree.c (draw_row): added new "line style" + GTK_CTREE_LINES_TABBED + * gtk/gtkctree.c/h (gtk_ctree_find_glist_ptr): new function to + search the glist pointer of an GtkCTreeRow Fri Jun 19 14:46:56 1998 Stefan Jeske diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 618d8d87ee..adc2ff0974 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,10 +1,9 @@ -1998-06-21 Raja R Harinath +Mon Jun 22 18:43:11 1998 Lars Hamann - * gtk/Makefile.am (gtk.defs,gtktypebuiltins*): Remove $(srcdir) - from, and clean up, the dependencies. Generate to intermediate - files to prevent problems with Ctrl-C. - - * gtk/genmarshal.pl: Generate `gtkmarshal.[ch]' in $srcdir. + * gtk/gtkctree.c (draw_row): added new "line style" + GTK_CTREE_LINES_TABBED + * gtk/gtkctree.c/h (gtk_ctree_find_glist_ptr): new function to + search the glist pointer of an GtkCTreeRow Fri Jun 19 14:46:56 1998 Stefan Jeske diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 618d8d87ee..adc2ff0974 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,10 +1,9 @@ -1998-06-21 Raja R Harinath +Mon Jun 22 18:43:11 1998 Lars Hamann - * gtk/Makefile.am (gtk.defs,gtktypebuiltins*): Remove $(srcdir) - from, and clean up, the dependencies. Generate to intermediate - files to prevent problems with Ctrl-C. - - * gtk/genmarshal.pl: Generate `gtkmarshal.[ch]' in $srcdir. + * gtk/gtkctree.c (draw_row): added new "line style" + GTK_CTREE_LINES_TABBED + * gtk/gtkctree.c/h (gtk_ctree_find_glist_ptr): new function to + search the glist pointer of an GtkCTreeRow Fri Jun 19 14:46:56 1998 Stefan Jeske diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 618d8d87ee..adc2ff0974 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,10 +1,9 @@ -1998-06-21 Raja R Harinath +Mon Jun 22 18:43:11 1998 Lars Hamann - * gtk/Makefile.am (gtk.defs,gtktypebuiltins*): Remove $(srcdir) - from, and clean up, the dependencies. Generate to intermediate - files to prevent problems with Ctrl-C. - - * gtk/genmarshal.pl: Generate `gtkmarshal.[ch]' in $srcdir. + * gtk/gtkctree.c (draw_row): added new "line style" + GTK_CTREE_LINES_TABBED + * gtk/gtkctree.c/h (gtk_ctree_find_glist_ptr): new function to + search the glist pointer of an GtkCTreeRow Fri Jun 19 14:46:56 1998 Stefan Jeske diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 618d8d87ee..adc2ff0974 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,10 +1,9 @@ -1998-06-21 Raja R Harinath +Mon Jun 22 18:43:11 1998 Lars Hamann - * gtk/Makefile.am (gtk.defs,gtktypebuiltins*): Remove $(srcdir) - from, and clean up, the dependencies. Generate to intermediate - files to prevent problems with Ctrl-C. - - * gtk/genmarshal.pl: Generate `gtkmarshal.[ch]' in $srcdir. + * gtk/gtkctree.c (draw_row): added new "line style" + GTK_CTREE_LINES_TABBED + * gtk/gtkctree.c/h (gtk_ctree_find_glist_ptr): new function to + search the glist pointer of an GtkCTreeRow Fri Jun 19 14:46:56 1998 Stefan Jeske diff --git a/gtk/gtkctree.c b/gtk/gtkctree.c index 416add4cc5..1d589827d9 100644 --- a/gtk/gtkctree.c +++ b/gtk/gtkctree.c @@ -26,6 +26,7 @@ #include #define PM_SIZE 8 +#define TAB_SIZE (PM_SIZE + 6) #define CELL_SPACING 1 #define CLIST_OPTIMUM_SIZE 512 #define COLUMN_INSET 3 @@ -1066,7 +1067,7 @@ draw_row (GtkCList *clist, if (gdk_rectangle_intersect (area, &row_rectangle, &intersect_rectangle)) { - if (clist_row->state == GTK_STATE_SELECTED || clist_row->fg_set) + if (clist_row->state == GTK_STATE_SELECTED || clist_row->bg_set) gdk_draw_rectangle (clist->clist_window, bg_gc, TRUE, @@ -1108,7 +1109,7 @@ draw_row (GtkCList *clist, cell_rectangle.height); } - if (clist_row->state == GTK_STATE_SELECTED || clist_row->fg_set) + if (clist_row->state == GTK_STATE_SELECTED || clist_row->bg_set) gdk_draw_rectangle (clist->clist_window, bg_gc, TRUE, @@ -1127,6 +1128,7 @@ draw_row (GtkCList *clist, /* iterate and draw all the columns (row cells) and draw their contents */ for (i = 0; i < clist->columns; i++) { + if (!need_redraw && ctree->tree_column != i) continue; @@ -1140,6 +1142,104 @@ draw_row (GtkCList *clist, clip_rectangle.height += CELL_SPACING; } + if (i == ctree->tree_column) + { + + if (clist_row->state == GTK_STATE_SELECTED) + { + gdk_gc_set_foreground (ctree->lines_gc, + >K_WIDGET (ctree)->style-> + fg[GTK_STATE_SELECTED]); + gdk_gc_set_background (ctree->lines_gc, + >K_WIDGET (ctree)->style-> + bg[GTK_STATE_SELECTED]); + } + else + { + gdk_gc_set_foreground (ctree->lines_gc, + >K_WIDGET (ctree)->style-> + fg[GTK_STATE_NORMAL]); + if (clist_row->bg_set) + gdk_gc_set_background (ctree->lines_gc, + &clist_row->background); + } + + if (ctree->line_style == GTK_CTREE_LINES_TABBED) + { + if (clist->column[i].justification == GTK_JUSTIFY_RIGHT) + { + xdest = clip_rectangle.x + clip_rectangle.width - 1 - + (((GtkCTreeRow *) clist_row)->level - 1) * + ctree->tree_indent; + + gdk_draw_line (clist->clist_window, + ctree->lines_gc, + -1, + row_rectangle.y - 1, + MAX (xdest - TAB_SIZE, clip_rectangle.x - 1), + row_rectangle.y - 1); + + if (clist_row == clist->row_list_end->data) + gdk_draw_line + (clist->clist_window, + ctree->lines_gc, + -1, + row_rectangle.y + clist->row_height, + MAX (clip_rectangle.x + clip_rectangle.width - + TAB_SIZE - 1 - + (((GtkCTreeRow *) clist_row)->level > 1) * + MIN (ctree->tree_indent / 2, TAB_SIZE), + clip_rectangle.x - 1), + row_rectangle.y + clist->row_height); + + if (clist_row->state != GTK_STATE_SELECTED) + gdk_draw_rectangle + (clist->clist_window, + widget->style->bg_gc[GTK_STATE_PRELIGHT], + TRUE, + clip_rectangle.x + clip_rectangle.width, + row_rectangle.y, + CELL_SPACING + COLUMN_INSET, + row_rectangle.height); + } + else + { + xdest = clip_rectangle.x + + (((GtkCTreeRow *) clist_row)->level - 1) * + ctree->tree_indent; + + gdk_draw_line (clist->clist_window, + ctree->lines_gc, + MIN (xdest + TAB_SIZE, + clip_rectangle.x + clip_rectangle.width), + row_rectangle.y - 1, + clist->clist_window_width, + row_rectangle.y - 1); + + if (clist_row == clist->row_list_end->data) + gdk_draw_line + (clist->clist_window, ctree->lines_gc, + MIN (clip_rectangle.x + TAB_SIZE + + (((GtkCTreeRow *) clist_row)->level > 1) * + MIN (ctree->tree_indent / 2, TAB_SIZE), + clip_rectangle.x + clip_rectangle.width), + row_rectangle.y + clist->row_height, + clist->clist_window_width, + row_rectangle.y + clist->row_height); + + if (clist_row->state != GTK_STATE_SELECTED) + gdk_draw_rectangle + (clist->clist_window, + widget->style->bg_gc[GTK_STATE_PRELIGHT], + TRUE, + clip_rectangle.x - CELL_SPACING - COLUMN_INSET, + row_rectangle.y, + CELL_SPACING + COLUMN_INSET, + row_rectangle.height); + } + } + } + if (!area) { rect = &clip_rectangle; @@ -1245,35 +1345,26 @@ draw_row (GtkCList *clist, { GdkGC *cgc; GdkGC *tgc; + GdkGC *mbg_gc; GList *work; + GList *work2; gint xoffset; gint yoffset; gint xcenter; gint ycenter; gint offset_x; gint offset_y = 0; + gint next_level; + gint in; + GdkPoint points[6]; xsrc = 0; ysrc = 0; - if (clist_row->state == GTK_STATE_SELECTED) - { - gdk_gc_set_foreground (ctree->lines_gc, - >K_WIDGET (ctree)->style-> - fg[GTK_STATE_SELECTED]); - gdk_gc_set_background (ctree->lines_gc, - >K_WIDGET (ctree)->style-> - bg[GTK_STATE_SELECTED]); - } - else - { - gdk_gc_set_foreground (ctree->lines_gc, - >K_WIDGET (ctree)->style-> - fg[GTK_STATE_NORMAL]); - if (clist_row->bg_set) - gdk_gc_set_background (ctree->lines_gc, - &clist_row->background); - } + yoffset = (clip_rectangle.height - PM_SIZE) / 2; + xoffset = (ctree->tree_indent - PM_SIZE) / 2; + ycenter = clip_rectangle.y + (clip_rectangle.height / 2); + ydest = ycenter - height / 2 + clist_row->cell[i].vertical; gdk_gc_set_clip_origin (fg_gc, 0, 0); gdk_gc_set_clip_rectangle (fg_gc, rect); @@ -1283,11 +1374,6 @@ draw_row (GtkCList *clist, gdk_gc_set_clip_rectangle (ctree->lines_gc, rect); } - yoffset = (clip_rectangle.height - PM_SIZE) / 2; - xoffset = (ctree->tree_indent - PM_SIZE) / 2; - ycenter = clip_rectangle.y + (clip_rectangle.height / 2); - ydest = ycenter - height / 2 + clist_row->cell[i].vertical; - switch (clist->column[i].justification) { case GTK_JUSTIFY_CENTER: @@ -1299,8 +1385,182 @@ draw_row (GtkCList *clist, (((GtkCTreeRow *) clist_row)->level - 1) * ctree->tree_indent; xcenter = xdest + (ctree->tree_indent / 2); - if (ctree->line_style != GTK_CTREE_LINES_NONE) + switch (ctree->line_style) { + case GTK_CTREE_LINES_NONE: + break; + case GTK_CTREE_LINES_TABBED: + xdest = clip_rectangle.x + + (((GtkCTreeRow *) clist_row)->level - 1) * + ctree->tree_indent; + xcenter = xdest + TAB_SIZE; + + gdk_gc_set_clip_origin (clist->bg_gc, 0, 0); + gdk_gc_set_clip_rectangle (clist->bg_gc, rect); + + gdk_gc_set_clip_origin + (widget->style->bg_gc[GTK_STATE_PRELIGHT], 0, 0); + gdk_gc_set_clip_rectangle + (widget->style->bg_gc[GTK_STATE_PRELIGHT], rect); + + work = ((GtkCTreeRow *)clist_row)->parent; + next_level = ((GtkCTreeRow *)clist_row)->level; + + if (!(((GtkCTreeRow *)clist_row)->sibling || + (((GtkCTreeRow *)clist_row)->children && + ((GtkCTreeRow *)clist_row)->expanded))) + { + work2 = gtk_ctree_find_glist_ptr + (ctree, (GtkCTreeRow *) clist_row); + + if (work2->next) + next_level = GTK_CTREE_ROW (work2->next)->level; + else + next_level = 0; + } + + while (work) + { + xcenter -= ctree->tree_indent; + + if (GTK_CTREE_ROW(work)->row.bg_set) + { + gdk_gc_set_foreground + (clist->bg_gc, + &(GTK_CTREE_ROW(work)->row.background)); + mbg_gc = clist->bg_gc; + } + else + mbg_gc = widget->style->bg_gc[GTK_STATE_PRELIGHT]; + + if (clist_row->state != GTK_STATE_SELECTED) + gdk_draw_rectangle (clist->clist_window, mbg_gc, TRUE, + xcenter, rect->y, + ctree->tree_indent, rect->height); + + if (next_level > GTK_CTREE_ROW (work)->level) + gdk_draw_line + (clist->clist_window, ctree->lines_gc, + xcenter, rect->y, + xcenter, rect->y + rect->height); + else + { + gdk_draw_line (clist->clist_window, ctree->lines_gc, + xcenter, clip_rectangle.y, + xcenter, ycenter); + + in = MIN (ctree->tree_indent, 2 * TAB_SIZE); + + if (clist_row->state != GTK_STATE_SELECTED) + { + if ((work2 = GTK_CTREE_ROW (work)->parent) && + GTK_CTREE_ROW(work2)->row.bg_set) + { + gdk_gc_set_foreground + (clist->bg_gc, + &(GTK_CTREE_ROW(work2)->row.background)); + + gdk_draw_rectangle + (clist->clist_window, clist->bg_gc, TRUE, + xcenter, + ycenter, + in / 2 + in % 2, + row_rectangle.height / 2 + 1); + + if (GTK_CTREE_ROW(work)->row.bg_set) + gdk_gc_set_foreground + (clist->bg_gc, + &(GTK_CTREE_ROW(work)->row.background)); + } + else + gdk_draw_rectangle + (clist->clist_window, + widget->style->bg_gc[GTK_STATE_PRELIGHT], + TRUE, + xcenter, + ycenter, + in / 2 + in % 2, + row_rectangle.height / 2 + 1); + + gdk_draw_arc (clist->clist_window, mbg_gc, + TRUE, + xcenter, clip_rectangle.y, + in, clist->row_height, + 180 * 64, 90 * 64); + } + + gdk_draw_arc (clist->clist_window, ctree->lines_gc, + FALSE, + xcenter, clip_rectangle.y, + in, clist->row_height, + 180 * 64, 90 * 64); + } + work = GTK_CTREE_ROW (work)->parent; + } + + if (clist_row->state != GTK_STATE_SELECTED) + gdk_draw_rectangle + (clist->clist_window, + widget->style->bg_gc[GTK_STATE_PRELIGHT], TRUE, + clip_rectangle.x, row_rectangle.y, + TAB_SIZE, row_rectangle.height); + + xcenter = xdest + (ctree->tree_indent / 2); + + if (clist_row->bg_set) + gdk_gc_set_foreground + (clist->bg_gc, &clist_row->background); + + if (((GtkCTreeRow *)clist_row)->is_leaf) + { + points[0].x = xdest + TAB_SIZE; + points[0].y = row_rectangle.y - 1; + + points[1].x = points[0].x - 4; + points[1].y = points[0].y; + + points[2].x = points[1].x - 2; + points[2].y = points[1].y + 3; + + points[3].x = points[2].x; + points[3].y = points[2].y + clist->row_height - 5; + + points[4].x = points[3].x + 2; + points[4].y = points[3].y + 3; + + points[5].x = points[4].x + 4; + points[5].y = points[4].y; + + if (clist_row->state != GTK_STATE_SELECTED) + gdk_draw_polygon (clist->clist_window, bg_gc, TRUE, + points, 6); + + gdk_draw_lines (clist->clist_window, ctree->lines_gc, + points, 6); + } + else + { + if (clist_row->state != GTK_STATE_SELECTED) + gdk_draw_arc (clist->clist_window, bg_gc, TRUE, + xdest, row_rectangle.y - 1, + 2 * TAB_SIZE, clist->row_height, + 90 * 64, 180 * 64); + + gdk_draw_arc (clist->clist_window, ctree->lines_gc, + FALSE, + xdest, row_rectangle.y - 1, + 2 * TAB_SIZE, clist->row_height, + 90 * 64, 180 * 64); + + } + + gdk_gc_set_clip_rectangle (ctree->lines_gc, NULL); + gdk_gc_set_clip_rectangle (clist->bg_gc, NULL); + gdk_gc_set_clip_rectangle + (widget->style->bg_gc[GTK_STATE_PRELIGHT], NULL); + + break; + default: xcenter = xdest + (ctree->tree_indent / 2); if (ctree->line_style == GTK_CTREE_LINES_DOTTED) { @@ -1308,7 +1568,7 @@ draw_row (GtkCList *clist, 2); offset_y = abs ((clip_rectangle.y + clist->voffset) % 2); } - + gdk_draw_line (clist->clist_window, ctree->lines_gc, xcenter, clip_rectangle.y + offset_y, xcenter, (((GtkCTreeRow *)clist_row)->sibling) ? @@ -1317,7 +1577,7 @@ draw_row (GtkCList *clist, gdk_draw_line (clist->clist_window, ctree->lines_gc, xcenter + offset_x, ycenter, xcenter + PM_SIZE / 2 + 2, ycenter); - + work = ((GtkCTreeRow *)clist_row)->parent; while (work) { @@ -1329,11 +1589,11 @@ draw_row (GtkCList *clist, work = GTK_CTREE_ROW (work)->parent; } gdk_gc_set_clip_rectangle (ctree->lines_gc, NULL); + break; } if (((GtkCTreeRow *)clist_row)->children) { - if (clist_row->state == GTK_STATE_SELECTED) { if (clist_row->fg_set) @@ -1351,10 +1611,9 @@ draw_row (GtkCList *clist, gdk_gc_set_clip_rectangle (cgc, rect); - if (ctree->line_style == GTK_CTREE_LINES_NONE) + switch (ctree->line_style) { - GdkPoint points[3]; - + case GTK_CTREE_LINES_NONE: if (!((GtkCTreeRow *)clist_row)->expanded) { points[0].x = xdest + xoffset + (PM_SIZE+2) / 6 + 2; @@ -1382,15 +1641,37 @@ draw_row (GtkCList *clist, TRUE, points, 3); gdk_draw_polygon (clist->clist_window, tgc, FALSE, points, 3); - } - else - { - gdk_draw_rectangle (clist->clist_window, - GTK_WIDGET (clist)->style-> - fg_gc[GTK_STATE_SELECTED], TRUE, - xdest + xoffset, - clip_rectangle.y + yoffset, - PM_SIZE, PM_SIZE); + break; + case GTK_CTREE_LINES_TABBED: + xcenter = xdest + PM_SIZE + 2; + gdk_draw_arc (clist->clist_window, + GTK_WIDGET (clist)->style-> + fg_gc[GTK_STATE_SELECTED], + TRUE, + xcenter - PM_SIZE/2, + ycenter - PM_SIZE/2, + PM_SIZE, PM_SIZE, 0, 360 * 64); + + gdk_draw_line (clist->clist_window, tgc, + xcenter - 2, + ycenter, + xcenter + 2, + ycenter); + + if (!((GtkCTreeRow *)clist_row)->expanded) + gdk_draw_line (clist->clist_window, tgc, + xcenter, clip_rectangle.y + yoffset + 2, + xcenter, + clip_rectangle.y + yoffset + PM_SIZE-2); + break; + default: + gdk_draw_rectangle + (clist->clist_window, + GTK_WIDGET (clist)->style->fg_gc[GTK_STATE_SELECTED], + TRUE, + xdest + xoffset, + clip_rectangle.y + yoffset, + PM_SIZE, PM_SIZE); gdk_draw_rectangle (clist->clist_window, tgc, FALSE, xdest + xoffset, @@ -1404,11 +1685,14 @@ draw_row (GtkCList *clist, if (!((GtkCTreeRow *)clist_row)->expanded) { xcenter = xdest + (ctree->tree_indent / 2); - gdk_draw_line (clist->clist_window, tgc, xcenter, + gdk_draw_line (clist->clist_window, tgc, + xcenter, clip_rectangle.y + yoffset + 2, - xcenter, clip_rectangle.y + yoffset - + PM_SIZE - 2); + xcenter, + clip_rectangle.y + yoffset + + PM_SIZE - 2); } + break; } gdk_gc_set_clip_rectangle (cgc, NULL); @@ -1429,8 +1713,186 @@ draw_row (GtkCList *clist, xdest = clip_rectangle.x + clip_rectangle.width + xoffset - 1 - (((GtkCTreeRow *) clist_row)->level - 1) * ctree->tree_indent; - if (ctree->line_style != GTK_CTREE_LINES_NONE) + switch (ctree->line_style) { + case GTK_CTREE_LINES_NONE: + break; + case GTK_CTREE_LINES_TABBED: + xdest = clip_rectangle.x + clip_rectangle.width - 1 + - (((GtkCTreeRow *) clist_row)->level - 1) + * ctree->tree_indent; + xcenter = xdest - TAB_SIZE; + + gdk_gc_set_clip_origin (clist->bg_gc, 0, 0); + gdk_gc_set_clip_rectangle (clist->bg_gc, rect); + + gdk_gc_set_clip_origin + (widget->style->bg_gc[GTK_STATE_PRELIGHT], 0, 0); + gdk_gc_set_clip_rectangle + (widget->style->bg_gc[GTK_STATE_PRELIGHT], rect); + + work = ((GtkCTreeRow *)clist_row)->parent; + next_level = ((GtkCTreeRow *)clist_row)->level; + + if (!(((GtkCTreeRow *)clist_row)->sibling || + (((GtkCTreeRow *)clist_row)->children && + ((GtkCTreeRow *)clist_row)->expanded))) + { + work2 = gtk_ctree_find_glist_ptr + (ctree, (GtkCTreeRow *) clist_row); + + if (work2->next) + next_level = GTK_CTREE_ROW (work2->next)->level; + else + next_level = 0; + } + + while (work) + { + xcenter += ctree->tree_indent; + + if (GTK_CTREE_ROW(work)->row.bg_set) + { + gdk_gc_set_foreground + (clist->bg_gc, + &(GTK_CTREE_ROW(work)->row.background)); + mbg_gc = clist->bg_gc; + } + else + mbg_gc = widget->style->bg_gc[GTK_STATE_PRELIGHT]; + + if (clist_row->state != GTK_STATE_SELECTED) + gdk_draw_rectangle (clist->clist_window, + mbg_gc, TRUE, + xcenter - ctree->tree_indent + 1, + rect->y, + ctree->tree_indent, + rect->height); + + if (next_level > GTK_CTREE_ROW (work)->level) + gdk_draw_line + (clist->clist_window, ctree->lines_gc, + xcenter, rect->y, + xcenter, rect->y + rect->height); + else + { + gdk_draw_line (clist->clist_window, ctree->lines_gc, + xcenter, clip_rectangle.y, + xcenter, ycenter); + + in = MIN (ctree->tree_indent, 2 * TAB_SIZE); + + if (clist_row->state != GTK_STATE_SELECTED) + { + if ((work2 = GTK_CTREE_ROW (work)->parent) && + GTK_CTREE_ROW(work2)->row.bg_set) + { + gdk_gc_set_foreground + (clist->bg_gc, + &(GTK_CTREE_ROW(work2)->row.background)); + + gdk_draw_rectangle + (clist->clist_window, clist->bg_gc, TRUE, + xcenter + 1 - in / 2 - in % 2, + ycenter, + in / 2 + in % 2, + row_rectangle.height / 2 + 1); + + if (GTK_CTREE_ROW(work)->row.bg_set) + gdk_gc_set_foreground + (clist->bg_gc, + &(GTK_CTREE_ROW(work)->row.background)); + } + else + gdk_draw_rectangle + (clist->clist_window, + widget->style->bg_gc[GTK_STATE_PRELIGHT], + TRUE, + xcenter + 1 - in / 2 - in % 2, + ycenter, + in / 2 + in % 2, + row_rectangle.height / 2 + 1); + + gdk_draw_arc (clist->clist_window, mbg_gc, TRUE, + xcenter - in, clip_rectangle.y, + in, clist->row_height, + 270 * 64, 90 * 64); + } + + gdk_draw_arc (clist->clist_window, ctree->lines_gc, + FALSE, + xcenter - in, clip_rectangle.y, + in, clist->row_height, + 270 * 64, 90 * 64); + } + + work = GTK_CTREE_ROW (work)->parent; + } + + if (clist_row->state != GTK_STATE_SELECTED) + gdk_draw_rectangle + (clist->clist_window, + widget->style->bg_gc[GTK_STATE_PRELIGHT], TRUE, + xcenter + 1, row_rectangle.y, + TAB_SIZE, row_rectangle.height); + + xcenter = xdest - (ctree->tree_indent / 2); + + if (clist_row->bg_set) + gdk_gc_set_foreground + (clist->bg_gc, &clist_row->background); + + if (((GtkCTreeRow *)clist_row)->is_leaf) + { + points[0].x = xdest - TAB_SIZE; + points[0].y = row_rectangle.y - 1; + + points[1].x = points[0].x + 4; + points[1].y = points[0].y; + + points[2].x = points[1].x + 2; + points[2].y = points[1].y + 3; + + points[3].x = points[2].x; + points[3].y = points[2].y + clist->row_height - 5; + + points[4].x = points[3].x - 2; + points[4].y = points[3].y + 3; + + points[5].x = points[4].x - 4; + points[5].y = points[4].y; + + if (clist_row->state != GTK_STATE_SELECTED) + gdk_draw_polygon (clist->clist_window, bg_gc, TRUE, + points, 6); + + gdk_draw_lines (clist->clist_window, ctree->lines_gc, + points, 6); + } + else + { + if (clist_row->state != GTK_STATE_SELECTED) + gdk_draw_arc (clist->clist_window, bg_gc, TRUE, + xdest - 2 * TAB_SIZE, + row_rectangle.y - 1, + 2 * TAB_SIZE, clist->row_height, + 270 * 64, 180 * 64); + + gdk_draw_arc (clist->clist_window, ctree->lines_gc, + FALSE, + xdest - 2 * TAB_SIZE, + row_rectangle.y - 1, + 2 * TAB_SIZE, clist->row_height, + 270 * 64, 180 * 64); + } + + gdk_gc_set_clip_rectangle (ctree->lines_gc, NULL); + gdk_gc_set_clip_rectangle (clist->bg_gc, NULL); + gdk_gc_set_clip_rectangle + (widget->style->bg_gc[GTK_STATE_PRELIGHT], NULL); + + break; + default: xcenter = xdest - (ctree->tree_indent / 2); if (ctree->line_style == GTK_CTREE_LINES_DOTTED) { @@ -1438,7 +1900,7 @@ draw_row (GtkCList *clist, 2); offset_y = abs ((clip_rectangle.y + clist->voffset) % 2); } - + gdk_draw_line (clist->clist_window, ctree->lines_gc, xcenter, clip_rectangle.y + offset_y, xcenter, @@ -1448,7 +1910,7 @@ draw_row (GtkCList *clist, gdk_draw_line (clist->clist_window, ctree->lines_gc, xcenter - offset_x, ycenter, xcenter - PM_SIZE / 2 - 2, ycenter); - + work = ((GtkCTreeRow *)clist_row)->parent; while (work) { @@ -1461,10 +1923,10 @@ draw_row (GtkCList *clist, } gdk_gc_set_clip_rectangle (ctree->lines_gc, NULL); } + if (((GtkCTreeRow *)clist_row)->children) { - if (clist_row->state == GTK_STATE_SELECTED) { if (clist_row->fg_set) @@ -1482,10 +1944,9 @@ draw_row (GtkCList *clist, gdk_gc_set_clip_rectangle (cgc, rect); - if (ctree->line_style == GTK_CTREE_LINES_NONE) + switch (ctree->line_style) { - GdkPoint points[3]; - + case GTK_CTREE_LINES_NONE: if (!((GtkCTreeRow *)clist_row)->expanded) { points[0].x = xdest - xoffset - (PM_SIZE+2) / 6 - 2; @@ -1513,9 +1974,33 @@ draw_row (GtkCList *clist, TRUE, points, 3); gdk_draw_polygon (clist->clist_window, tgc, FALSE, points, 3); - } - else - { + break; + case GTK_CTREE_LINES_TABBED: + xcenter = xdest - PM_SIZE - 2; + + gdk_draw_arc (clist->clist_window, + GTK_WIDGET (clist)->style-> + fg_gc[GTK_STATE_SELECTED], + TRUE, + xcenter - PM_SIZE/2, + ycenter - PM_SIZE/2, + PM_SIZE, PM_SIZE, 0, 360 * 64); + + gdk_draw_line (clist->clist_window, tgc, + xcenter - 2, + ycenter, + xcenter + 2, + ycenter); + + if (!((GtkCTreeRow *)clist_row)->expanded) + { + gdk_draw_line (clist->clist_window, tgc, xcenter, + clip_rectangle.y + yoffset + 2, + xcenter, clip_rectangle.y + yoffset + + PM_SIZE - 2); + } + break; + default: gdk_draw_rectangle (clist->clist_window, GTK_WIDGET(clist)->style-> fg_gc[GTK_STATE_SELECTED], TRUE, @@ -2659,12 +3144,14 @@ ctree_is_hot_spot (GtkCTree *ctree, + clist->column[ctree->tree_column].area.width + clist->hoffset /*+ cell->horizontal +*/ - (tree_row->level - 1) * ctree->tree_indent - - PM_SIZE - 1; + - PM_SIZE - 1 - + (ctree->line_style == GTK_CTREE_LINES_TABBED) * ((PM_SIZE / 2) + 1); } else { xl = clist->column[ctree->tree_column].area.x + clist->hoffset - + cell->horizontal + (tree_row->level - 1) * ctree->tree_indent; + + cell->horizontal + (tree_row->level - 1) * ctree->tree_indent + + (ctree->line_style == GTK_CTREE_LINES_TABBED) * ((PM_SIZE / 2) + 2); } return (x >= xl && x <= xl + PM_SIZE && y >= yu && y <= yu + PM_SIZE); @@ -2994,6 +3481,27 @@ gtk_ctree_last (GtkCTree *ctree, return node; } +GList * +gtk_ctree_find_glist_ptr (GtkCTree *ctree, + GtkCTreeRow *ctree_row) +{ + GList *node; + + g_return_val_if_fail (ctree != NULL, FALSE); + g_return_val_if_fail (GTK_IS_CTREE (ctree), FALSE); + g_return_val_if_fail (ctree_row != NULL, FALSE); + + if (ctree_row->parent) + node = GTK_CTREE_ROW(ctree_row->parent)->children; + else + node = GTK_CLIST (ctree)->row_list; + + while (node->data != ctree_row) + node = GTK_CTREE_ROW (node)->sibling; + + return node; +} + gint gtk_ctree_find (GtkCTree *ctree, GList *node, @@ -3763,6 +4271,11 @@ gtk_ctree_set_line_style (GtkCTree *ctree, GDK_LINE_ON_OFF_DASH, None, None); gdk_gc_set_dashes (ctree->lines_gc, 0, "\1\1", 2); break; + case GTK_CTREE_LINES_TABBED: + if (GTK_WIDGET_REALIZED (ctree)) + gdk_gc_set_line_attributes (ctree->lines_gc, 1, GDK_LINE_SOLID, + None, None); + break; case GTK_CTREE_LINES_NONE: break; default: diff --git a/gtk/gtkctree.h b/gtk/gtkctree.h index dda1184bcd..7f2fdc33c3 100644 --- a/gtk/gtkctree.h +++ b/gtk/gtkctree.h @@ -54,6 +54,7 @@ typedef enum { GTK_CTREE_LINES_SOLID, GTK_CTREE_LINES_DOTTED, + GTK_CTREE_LINES_TABBED, GTK_CTREE_LINES_NONE } GtkCTreeLineStyle; @@ -182,6 +183,8 @@ gboolean gtk_ctree_is_visible (GtkCTree *ctree, GList *node); GList * gtk_ctree_last (GtkCTree *ctree, GList *node); +GList * gtk_ctree_find_glist_ptr (GtkCTree *ctree, + GtkCTreeRow *ctree_row); gint gtk_ctree_find (GtkCTree *ctree, GList *node, GList *child); diff --git a/gtk/testgtk.c b/gtk/testgtk.c index 955dd06a49..cbbc35a9e5 100644 --- a/gtk/testgtk.c +++ b/gtk/testgtk.c @@ -3584,6 +3584,7 @@ static GtkWidget *omenu3; static GtkWidget *spin1; static GtkWidget *spin2; static GtkWidget *spin3; +static GdkColor *col_bg; #define RADIOMENUTOGGLED(_rmi_, __i) { \ GSList * __g; \ @@ -3800,23 +3801,51 @@ void change_indent (GtkWidget *widget, GtkCTree *ctree) gtk_ctree_set_indent (ctree, GTK_ADJUSTMENT (widget)->value); } +void change_row_height (GtkWidget *widget, GtkCList *clist) +{ + gtk_clist_set_row_height (clist, GTK_ADJUSTMENT (widget)->value); +} + void toggle_reorderable (GtkWidget *widget, GtkCTree *ctree) { gtk_ctree_set_reorderable (ctree, GTK_TOGGLE_BUTTON (widget)->active); } +void set_background (GtkCTree *ctree, GList *node, gpointer data) +{ + if (!node) + return; + + if (ctree->line_style != GTK_CTREE_LINES_TABBED) + { + if (GTK_CTREE_ROW (node)->is_leaf) + gtk_ctree_set_background + (ctree, node, + GTK_CTREE_ROW (GTK_CTREE_ROW (node)->parent)->row.data); + else + gtk_ctree_set_background (ctree, node, GTK_CTREE_ROW (node)->row.data); + } + else + gtk_ctree_set_background (ctree, node, NULL); +} + void toggle_line_style (GtkWidget *widget, GtkCTree *ctree) { gint i; - if (!GTK_WIDGET_MAPPED (widget)) return; RADIOMENUTOGGLED ((GtkRadioMenuItem *) (((GtkOptionMenu *)omenu2)->menu_item),i); - - gtk_ctree_set_line_style (ctree, (GtkCTreeLineStyle) (2-i)); + + if ((ctree->line_style == GTK_CTREE_LINES_TABBED && + ((GtkCTreeLineStyle) (3-i)) != GTK_CTREE_LINES_TABBED) || + (ctree->line_style != GTK_CTREE_LINES_TABBED && + ((GtkCTreeLineStyle) (3-i)) == GTK_CTREE_LINES_TABBED)) + gtk_ctree_pre_recursive (ctree, GTK_CLIST (ctree)->row_list, + set_background, NULL); + gtk_ctree_set_line_style (ctree, (GtkCTreeLineStyle) (3-i)); } void toggle_justify (GtkWidget *widget, GtkCTree *ctree) @@ -3829,7 +3858,7 @@ void toggle_justify (GtkWidget *widget, GtkCTree *ctree) RADIOMENUTOGGLED ((GtkRadioMenuItem *) (((GtkOptionMenu *)omenu3)->menu_item),i); - gtk_clist_set_column_justification (GTK_CLIST (ctree), 0, + gtk_clist_set_column_justification (GTK_CLIST (ctree), ctree->tree_column, (GtkJustification) (1-i)); } @@ -3847,7 +3876,6 @@ void toggle_sel_mode (GtkWidget *widget, GtkCTree *ctree) after_press (ctree, NULL); } - void build_recursive (GtkCTree *ctree, gint cur_depth, gint depth, gint num_books, gint num_pages, GList *parent) { @@ -3856,7 +3884,7 @@ void build_recursive (GtkCTree *ctree, gint cur_depth, gint depth, gchar buf2[60]; GList *sibling; gint i; - + text[0] = buf1; text[1] = buf2; sibling = NULL; @@ -3868,6 +3896,9 @@ void build_recursive (GtkCTree *ctree, gint cur_depth, gint depth, sprintf (buf2, "Item %d-%d", cur_depth, i); sibling = gtk_ctree_insert (ctree, parent, sibling, text, 5, pixmap3, mask3, NULL, NULL, TRUE, FALSE); + + if (ctree->line_style == GTK_CTREE_LINES_TABBED) + gtk_ctree_set_background (ctree, sibling, col_bg); } if (cur_depth == depth) @@ -3880,7 +3911,36 @@ void build_recursive (GtkCTree *ctree, gint cur_depth, gint depth, sprintf (buf2, "Item %d-%d", cur_depth, i); sibling = gtk_ctree_insert (ctree, parent, sibling, text, 5, pixmap1, mask1, pixmap2, mask2, FALSE, FALSE); - build_recursive (ctree, cur_depth + 1, depth, num_books, num_pages, sibling); + + col_bg = g_new (GdkColor, 1); + + if (cur_depth % 3 == 0) + { + col_bg->red = 10000 * (cur_depth % 6); + col_bg->green = 0; + col_bg->blue = 65535 - ((i * 10000) % 65535); + } + else if (cur_depth % 3 == 1) + { + col_bg->red = 10000 * (cur_depth % 6); + col_bg->green = 65535 - ((i * 10000) % 65535); + col_bg->blue = 0; + } + else + { + col_bg->red = 65535 - ((i * 10000) % 65535); + col_bg->green = 0; + col_bg->blue = 10000 * (cur_depth % 6); + } + + gdk_color_alloc (gtk_widget_get_colormap (GTK_WIDGET (ctree)), col_bg); + gtk_ctree_set_row_data_full (ctree, sibling, col_bg, g_free); + + if (ctree->line_style == GTK_CTREE_LINES_TABBED) + gtk_ctree_set_background (ctree, sibling, col_bg); + + build_recursive (ctree, cur_depth + 1, depth, num_books, num_pages, + sibling); } } @@ -3916,6 +3976,15 @@ void rebuild_tree (GtkWidget *widget, GtkCTree *ctree) parent = gtk_ctree_insert (ctree, NULL, NULL, text, 5, pixmap1, mask1, pixmap2, mask2, FALSE, TRUE); + col_bg = g_new (GdkColor, 1); + col_bg->red = 0; + col_bg->green = 45000; + col_bg->blue = 55000; + gdk_color_alloc (gtk_widget_get_colormap (GTK_WIDGET (ctree)), col_bg); + gtk_ctree_set_row_data_full (ctree, parent, col_bg, g_free); + if (ctree->line_style == GTK_CTREE_LINES_TABBED) + gtk_ctree_set_background (ctree, parent, col_bg); + build_recursive (ctree, 1, d, b, p, parent); gtk_clist_thaw (GTK_CLIST (ctree)); after_press (ctree, NULL); @@ -3959,9 +4028,7 @@ void create_ctree (void) gtk_object_ref (GTK_OBJECT (tooltips)); gtk_object_sink (GTK_OBJECT (tooltips)); - gtk_object_set_data_full (GTK_OBJECT (window), - "tooltips", - tooltips, + gtk_object_set_data_full (GTK_OBJECT (window), "tooltips", tooltips, (GtkDestroyNotify) gtk_object_unref); vbox = gtk_vbox_new (FALSE, 0); @@ -3995,9 +4062,9 @@ void create_ctree (void) button = gtk_button_new_with_label ("Close"); gtk_box_pack_end (GTK_BOX (hbox), button, TRUE, TRUE, 0); - gtk_signal_connect_object(GTK_OBJECT (button), "clicked", - (GtkSignalFunc) gtk_widget_destroy, - GTK_OBJECT(window)); + gtk_signal_connect_object (GTK_OBJECT (button), "clicked", + (GtkSignalFunc) gtk_widget_destroy, + GTK_OBJECT(window)); button = gtk_button_new_with_label ("Rebuild tree"); gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0); @@ -4017,8 +4084,6 @@ void create_ctree (void) GTK_SIGNAL_FUNC (after_move), NULL); gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (ctree), TRUE, TRUE, 0); gtk_clist_column_titles_passive (GTK_CLIST (ctree)); - gtk_clist_set_column_justification (GTK_CLIST (ctree), 2, - GTK_JUSTIFY_RIGHT); gtk_clist_set_selection_mode (GTK_CLIST (ctree), GTK_SELECTION_MULTIPLE); gtk_clist_set_policy (GTK_CLIST (ctree), GTK_POLICY_ALWAYS, GTK_POLICY_AUTOMATIC); @@ -4051,6 +4116,18 @@ void create_ctree (void) gtk_container_border_width (GTK_CONTAINER (hbox), 5); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0); + label = gtk_label_new ("Row height :"); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0); + + adj = (GtkAdjustment *) gtk_adjustment_new (20, 12, 100, 1, 10, 0); + spinner = gtk_spin_button_new (adj, 0, 0); + gtk_tooltips_set_tip (tooltips, spinner, + "Row height of list items", NULL); + gtk_signal_connect (GTK_OBJECT (adj), "value_changed", + GTK_SIGNAL_FUNC (change_row_height), ctree); + gtk_box_pack_start (GTK_BOX (hbox), spinner, FALSE, TRUE, 5); + gtk_clist_set_row_height ( GTK_CLIST (ctree), adj->value); + button = gtk_button_new_with_label ("Select all"); gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (select_all), ctree); @@ -4109,10 +4186,17 @@ void create_ctree (void) gtk_signal_connect (GTK_OBJECT (menu_item), "activate", GTK_SIGNAL_FUNC (toggle_line_style), ctree); group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menu_item)); - gtk_menu_append (GTK_MENU (menu), menu_item); gtk_check_menu_item_set_state (GTK_CHECK_MENU_ITEM (menu_item), TRUE); + gtk_menu_append (GTK_MENU (menu), menu_item); gtk_widget_show (menu_item); - + + menu_item = gtk_radio_menu_item_new_with_label (group, "Tabbed"); + gtk_signal_connect (GTK_OBJECT (menu_item), "activate", + GTK_SIGNAL_FUNC (toggle_line_style), ctree); + group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menu_item)); + gtk_menu_append (GTK_MENU (menu), menu_item); + gtk_widget_show (menu_item); + menu_item = gtk_radio_menu_item_new_with_label (group, "No lines"); gtk_signal_connect (GTK_OBJECT (menu_item), "activate", GTK_SIGNAL_FUNC (toggle_line_style), ctree); diff --git a/tests/testgtk.c b/tests/testgtk.c index 955dd06a49..cbbc35a9e5 100644 --- a/tests/testgtk.c +++ b/tests/testgtk.c @@ -3584,6 +3584,7 @@ static GtkWidget *omenu3; static GtkWidget *spin1; static GtkWidget *spin2; static GtkWidget *spin3; +static GdkColor *col_bg; #define RADIOMENUTOGGLED(_rmi_, __i) { \ GSList * __g; \ @@ -3800,23 +3801,51 @@ void change_indent (GtkWidget *widget, GtkCTree *ctree) gtk_ctree_set_indent (ctree, GTK_ADJUSTMENT (widget)->value); } +void change_row_height (GtkWidget *widget, GtkCList *clist) +{ + gtk_clist_set_row_height (clist, GTK_ADJUSTMENT (widget)->value); +} + void toggle_reorderable (GtkWidget *widget, GtkCTree *ctree) { gtk_ctree_set_reorderable (ctree, GTK_TOGGLE_BUTTON (widget)->active); } +void set_background (GtkCTree *ctree, GList *node, gpointer data) +{ + if (!node) + return; + + if (ctree->line_style != GTK_CTREE_LINES_TABBED) + { + if (GTK_CTREE_ROW (node)->is_leaf) + gtk_ctree_set_background + (ctree, node, + GTK_CTREE_ROW (GTK_CTREE_ROW (node)->parent)->row.data); + else + gtk_ctree_set_background (ctree, node, GTK_CTREE_ROW (node)->row.data); + } + else + gtk_ctree_set_background (ctree, node, NULL); +} + void toggle_line_style (GtkWidget *widget, GtkCTree *ctree) { gint i; - if (!GTK_WIDGET_MAPPED (widget)) return; RADIOMENUTOGGLED ((GtkRadioMenuItem *) (((GtkOptionMenu *)omenu2)->menu_item),i); - - gtk_ctree_set_line_style (ctree, (GtkCTreeLineStyle) (2-i)); + + if ((ctree->line_style == GTK_CTREE_LINES_TABBED && + ((GtkCTreeLineStyle) (3-i)) != GTK_CTREE_LINES_TABBED) || + (ctree->line_style != GTK_CTREE_LINES_TABBED && + ((GtkCTreeLineStyle) (3-i)) == GTK_CTREE_LINES_TABBED)) + gtk_ctree_pre_recursive (ctree, GTK_CLIST (ctree)->row_list, + set_background, NULL); + gtk_ctree_set_line_style (ctree, (GtkCTreeLineStyle) (3-i)); } void toggle_justify (GtkWidget *widget, GtkCTree *ctree) @@ -3829,7 +3858,7 @@ void toggle_justify (GtkWidget *widget, GtkCTree *ctree) RADIOMENUTOGGLED ((GtkRadioMenuItem *) (((GtkOptionMenu *)omenu3)->menu_item),i); - gtk_clist_set_column_justification (GTK_CLIST (ctree), 0, + gtk_clist_set_column_justification (GTK_CLIST (ctree), ctree->tree_column, (GtkJustification) (1-i)); } @@ -3847,7 +3876,6 @@ void toggle_sel_mode (GtkWidget *widget, GtkCTree *ctree) after_press (ctree, NULL); } - void build_recursive (GtkCTree *ctree, gint cur_depth, gint depth, gint num_books, gint num_pages, GList *parent) { @@ -3856,7 +3884,7 @@ void build_recursive (GtkCTree *ctree, gint cur_depth, gint depth, gchar buf2[60]; GList *sibling; gint i; - + text[0] = buf1; text[1] = buf2; sibling = NULL; @@ -3868,6 +3896,9 @@ void build_recursive (GtkCTree *ctree, gint cur_depth, gint depth, sprintf (buf2, "Item %d-%d", cur_depth, i); sibling = gtk_ctree_insert (ctree, parent, sibling, text, 5, pixmap3, mask3, NULL, NULL, TRUE, FALSE); + + if (ctree->line_style == GTK_CTREE_LINES_TABBED) + gtk_ctree_set_background (ctree, sibling, col_bg); } if (cur_depth == depth) @@ -3880,7 +3911,36 @@ void build_recursive (GtkCTree *ctree, gint cur_depth, gint depth, sprintf (buf2, "Item %d-%d", cur_depth, i); sibling = gtk_ctree_insert (ctree, parent, sibling, text, 5, pixmap1, mask1, pixmap2, mask2, FALSE, FALSE); - build_recursive (ctree, cur_depth + 1, depth, num_books, num_pages, sibling); + + col_bg = g_new (GdkColor, 1); + + if (cur_depth % 3 == 0) + { + col_bg->red = 10000 * (cur_depth % 6); + col_bg->green = 0; + col_bg->blue = 65535 - ((i * 10000) % 65535); + } + else if (cur_depth % 3 == 1) + { + col_bg->red = 10000 * (cur_depth % 6); + col_bg->green = 65535 - ((i * 10000) % 65535); + col_bg->blue = 0; + } + else + { + col_bg->red = 65535 - ((i * 10000) % 65535); + col_bg->green = 0; + col_bg->blue = 10000 * (cur_depth % 6); + } + + gdk_color_alloc (gtk_widget_get_colormap (GTK_WIDGET (ctree)), col_bg); + gtk_ctree_set_row_data_full (ctree, sibling, col_bg, g_free); + + if (ctree->line_style == GTK_CTREE_LINES_TABBED) + gtk_ctree_set_background (ctree, sibling, col_bg); + + build_recursive (ctree, cur_depth + 1, depth, num_books, num_pages, + sibling); } } @@ -3916,6 +3976,15 @@ void rebuild_tree (GtkWidget *widget, GtkCTree *ctree) parent = gtk_ctree_insert (ctree, NULL, NULL, text, 5, pixmap1, mask1, pixmap2, mask2, FALSE, TRUE); + col_bg = g_new (GdkColor, 1); + col_bg->red = 0; + col_bg->green = 45000; + col_bg->blue = 55000; + gdk_color_alloc (gtk_widget_get_colormap (GTK_WIDGET (ctree)), col_bg); + gtk_ctree_set_row_data_full (ctree, parent, col_bg, g_free); + if (ctree->line_style == GTK_CTREE_LINES_TABBED) + gtk_ctree_set_background (ctree, parent, col_bg); + build_recursive (ctree, 1, d, b, p, parent); gtk_clist_thaw (GTK_CLIST (ctree)); after_press (ctree, NULL); @@ -3959,9 +4028,7 @@ void create_ctree (void) gtk_object_ref (GTK_OBJECT (tooltips)); gtk_object_sink (GTK_OBJECT (tooltips)); - gtk_object_set_data_full (GTK_OBJECT (window), - "tooltips", - tooltips, + gtk_object_set_data_full (GTK_OBJECT (window), "tooltips", tooltips, (GtkDestroyNotify) gtk_object_unref); vbox = gtk_vbox_new (FALSE, 0); @@ -3995,9 +4062,9 @@ void create_ctree (void) button = gtk_button_new_with_label ("Close"); gtk_box_pack_end (GTK_BOX (hbox), button, TRUE, TRUE, 0); - gtk_signal_connect_object(GTK_OBJECT (button), "clicked", - (GtkSignalFunc) gtk_widget_destroy, - GTK_OBJECT(window)); + gtk_signal_connect_object (GTK_OBJECT (button), "clicked", + (GtkSignalFunc) gtk_widget_destroy, + GTK_OBJECT(window)); button = gtk_button_new_with_label ("Rebuild tree"); gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0); @@ -4017,8 +4084,6 @@ void create_ctree (void) GTK_SIGNAL_FUNC (after_move), NULL); gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (ctree), TRUE, TRUE, 0); gtk_clist_column_titles_passive (GTK_CLIST (ctree)); - gtk_clist_set_column_justification (GTK_CLIST (ctree), 2, - GTK_JUSTIFY_RIGHT); gtk_clist_set_selection_mode (GTK_CLIST (ctree), GTK_SELECTION_MULTIPLE); gtk_clist_set_policy (GTK_CLIST (ctree), GTK_POLICY_ALWAYS, GTK_POLICY_AUTOMATIC); @@ -4051,6 +4116,18 @@ void create_ctree (void) gtk_container_border_width (GTK_CONTAINER (hbox), 5); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0); + label = gtk_label_new ("Row height :"); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0); + + adj = (GtkAdjustment *) gtk_adjustment_new (20, 12, 100, 1, 10, 0); + spinner = gtk_spin_button_new (adj, 0, 0); + gtk_tooltips_set_tip (tooltips, spinner, + "Row height of list items", NULL); + gtk_signal_connect (GTK_OBJECT (adj), "value_changed", + GTK_SIGNAL_FUNC (change_row_height), ctree); + gtk_box_pack_start (GTK_BOX (hbox), spinner, FALSE, TRUE, 5); + gtk_clist_set_row_height ( GTK_CLIST (ctree), adj->value); + button = gtk_button_new_with_label ("Select all"); gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (select_all), ctree); @@ -4109,10 +4186,17 @@ void create_ctree (void) gtk_signal_connect (GTK_OBJECT (menu_item), "activate", GTK_SIGNAL_FUNC (toggle_line_style), ctree); group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menu_item)); - gtk_menu_append (GTK_MENU (menu), menu_item); gtk_check_menu_item_set_state (GTK_CHECK_MENU_ITEM (menu_item), TRUE); + gtk_menu_append (GTK_MENU (menu), menu_item); gtk_widget_show (menu_item); - + + menu_item = gtk_radio_menu_item_new_with_label (group, "Tabbed"); + gtk_signal_connect (GTK_OBJECT (menu_item), "activate", + GTK_SIGNAL_FUNC (toggle_line_style), ctree); + group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menu_item)); + gtk_menu_append (GTK_MENU (menu), menu_item); + gtk_widget_show (menu_item); + menu_item = gtk_radio_menu_item_new_with_label (group, "No lines"); gtk_signal_connect (GTK_OBJECT (menu_item), "activate", GTK_SIGNAL_FUNC (toggle_line_style), ctree);