diff options
author | Shawn Amundson <amundson@src.gnome.org> | 1997-12-19 05:41:45 +0000 |
---|---|---|
committer | Shawn Amundson <amundson@src.gnome.org> | 1997-12-19 05:41:45 +0000 |
commit | e9f322e2f020e977c1fe6b0fb93807d978da16a2 (patch) | |
tree | 92a73bb1e4adb1ac440fb602a9118486df969f04 /gtk/gtktreeitem.c | |
parent | f7b1fa3aedc6e639812d85aaf7ad8f06f84219ad (diff) | |
download | gtk+-e9f322e2f020e977c1fe6b0fb93807d978da16a2.tar.gz |
Changes from Bolliet Jerome <bolliet@in2p3.fr> to gtktree.
Corrects a bug in gtk_tree_remove_items and gtk_tree_item_destroy.
Adds the possibility to connect all items by lines. This is the
default now. You can overide this with the function
gtk_tree_set_view_line which take a tree and a boolean.
This tree widget looks way more finished with the lines. Very
nice. Check it out and run gtk/testtree.
-Shawn
Diffstat (limited to 'gtk/gtktreeitem.c')
-rw-r--r-- | gtk/gtktreeitem.c | 107 |
1 files changed, 99 insertions, 8 deletions
diff --git a/gtk/gtktreeitem.c b/gtk/gtktreeitem.c index ecff341f89..ab8180f808 100644 --- a/gtk/gtktreeitem.c +++ b/gtk/gtktreeitem.c @@ -448,6 +448,7 @@ gtk_tree_item_size_allocate (GtkWidget *widget, GtkTreeItem* item; GtkAllocation child_allocation; guint border_width; + int temp; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_TREE_ITEM (widget)); @@ -470,6 +471,7 @@ gtk_tree_item_size_allocate (GtkWidget *widget, child_allocation.x = border_width + GTK_TREE(widget->parent)->current_indent; child_allocation.y = GTK_CONTAINER (widget)->border_width; +#ifdef 0 child_allocation.height = allocation->height - child_allocation.y * 2; child_allocation.width = item->pixmaps_box->requisition.width; @@ -478,6 +480,18 @@ gtk_tree_item_size_allocate (GtkWidget *widget, gtk_widget_size_allocate (item->pixmaps_box, &child_allocation); child_allocation.height += 2; +#else + child_allocation.width = item->pixmaps_box->requisition.width; + child_allocation.height = item->pixmaps_box->requisition.height; + + temp = allocation->height - child_allocation.height; + child_allocation.y += ( temp / 2 ) + ( temp % 2 ); + + gtk_widget_size_allocate (item->pixmaps_box, &child_allocation); + + child_allocation.y = GTK_CONTAINER (widget)->border_width; + child_allocation.height = allocation->height - child_allocation.y * 2; +#endif child_allocation.x += item->pixmaps_box->requisition.width+DEFAULT_DELTA; child_allocation.width = @@ -488,6 +502,67 @@ gtk_tree_item_size_allocate (GtkWidget *widget, } +static void +gtk_tree_item_draw_lines(GtkWidget *widget) +{ + GtkTreeItem* item; + GtkTree* tree; + guint lx1, ly1, lx2, ly2; + + item = GTK_TREE_ITEM(widget); + tree = GTK_TREE(widget->parent); + + /* draw vertical line */ + lx1 = item->pixmaps_box->allocation.width; + lx1 = lx2 = ( lx1 / 2 ) + ( lx1 % 2 ) + + GTK_CONTAINER(widget)->border_width + 1 + tree->current_indent; + ly1 = 0; + ly2 = widget->allocation.height; + + if(g_list_last(tree->children)->data == (gpointer)widget) + ly2 = (ly2 / 2) + (ly2 % 2); + + if(tree != tree->root_tree) + gdk_draw_line(widget->window, widget->style->black_gc, + lx1, ly1, lx2, ly2); + + /* draw vertical line for subtree connecting */ + if(g_list_last(tree->children)->data != (gpointer)widget) + ly2 = (ly2 / 2) + (ly2 % 2); + + lx2 += DEFAULT_DELTA; + + if(item->subtree && item->expanded) + gdk_draw_line(widget->window, widget->style->black_gc, + lx2, ly2, lx2, widget->allocation.height); + + /* draw horizontal line */ + ly1 = ly2; + lx2 += 2; + + gdk_draw_line(widget->window, widget->style->black_gc, + lx1, ly1, lx2, ly2); + + lx2 -= DEFAULT_DELTA+2; + ly1 = 0; + ly2 = widget->allocation.height; + + if(tree != tree->root_tree) + { + item = GTK_TREE_ITEM(tree->tree_owner); + tree = GTK_TREE(GTK_WIDGET(tree)->parent); + while(tree != tree->root_tree) { + lx1 = lx2 -= tree->indent_value; + + if(g_list_last(tree->children)->data != (gpointer)item) + gdk_draw_line(widget->window, widget->style->black_gc, + lx1, ly1, lx2, ly2); + item = GTK_TREE_ITEM(tree->tree_owner); + tree = GTK_TREE(GTK_WIDGET(tree)->parent); + } + } +} + static void gtk_tree_item_draw (GtkWidget *widget, GdkRectangle *area) @@ -526,6 +601,8 @@ gtk_tree_item_draw (GtkWidget *widget, child_area.x, child_area.y, child_area.width, child_area.height); +/* gtk_tree_item_draw_lines(widget); */ + if (tree_item->pixmaps_box && GTK_WIDGET_VISIBLE(tree_item->pixmaps_box) && gtk_widget_intersect (tree_item->pixmaps_box, area, &child_area)) @@ -585,6 +662,9 @@ gtk_tree_item_draw_focus (GtkWidget *widget) gdk_draw_rectangle (widget->window, gc, FALSE, dx, 0, widget->allocation.width - 1 - dx, widget->allocation.height - 1); + + if(GTK_TREE(widget->parent)->view_line) + gtk_tree_item_draw_lines(widget); } } @@ -660,11 +740,11 @@ gtk_real_tree_item_select (GtkItem *item) if (GTK_WIDGET (item)->state == GTK_STATE_SELECTED) return; - gtk_widget_set_state (GTK_WIDGET (item), GTK_STATE_SELECTED); - if(GTK_TREE(GTK_WIDGET(item)->parent)->view_mode == GTK_TREE_VIEW_LINE) gtk_widget_set_state (GTK_TREE_ITEM (item)->pixmaps_box, GTK_STATE_SELECTED); - + + gtk_widget_set_state (GTK_WIDGET (item), GTK_STATE_SELECTED); + gtk_widget_queue_draw (GTK_WIDGET (item)); } @@ -678,12 +758,15 @@ gtk_real_tree_item_deselect (GtkItem *item) if (GTK_WIDGET (item)->state == GTK_STATE_NORMAL) return; - gtk_widget_set_state (GTK_WIDGET (item), GTK_STATE_NORMAL); - - if(GTK_TREE(GTK_WIDGET(item)->parent)->view_mode == GTK_TREE_VIEW_LINE) - gtk_widget_set_state (GTK_TREE_ITEM (item)->pixmaps_box, GTK_STATE_NORMAL); + if(GTK_WIDGET_MAPPED(GTK_WIDGET (item))) + { + gtk_widget_set_state (GTK_WIDGET (item), GTK_STATE_NORMAL); + + if(GTK_TREE(GTK_WIDGET(item)->parent)->view_mode == GTK_TREE_VIEW_LINE) + gtk_widget_set_state (GTK_TREE_ITEM (item)->pixmaps_box, GTK_STATE_NORMAL); - gtk_widget_queue_draw (GTK_WIDGET (item)); + gtk_widget_queue_draw (GTK_WIDGET (item)); + } } static void @@ -801,6 +884,14 @@ gtk_tree_item_destroy (GtkObject *object) gtk_widget_destroy (child); } + /* free pixmaps box */ + if((child = item->pixmaps_box)) + { + child->parent = NULL; + gtk_object_unref (GTK_OBJECT (child)); + gtk_widget_destroy (child); + } + if (GTK_OBJECT_CLASS (parent_class)->destroy) (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); |