Weird behaviour of GtkCTree



Hi,

I am writing an application with GtkCTree.

What I want the GtkCTree to do is :

When a parent node is selected, all the children of that node should also
be selected, i.e turn blue etc.

However I only seem to get this to work on certain situations : 

If I select nodes using the up/down arrow keys - works
If I single-click a collapsed parent node and then expand it - works

Situations it doesnt work: 

If I single-click an expanded parent node, the child node doesnt turn blue.
If I double-click a collapsed parent node, causing it to expand, child node isnt 
blue



I edited a ctree example i found to illustrate the problem, its attached if 
anyone wants to try it out.

Is there something I am missing out or is this a problem with GtkCTree?
Would really appreciate the help
Thanks
Louise
#include <gtk/gtk.h>

/* User clicked the "Add List" button. */
void button_add_clicked( gpointer data )
{
    int indx;
 
    /* Something silly to add to the list. 4 rows of 2 columns each */
    gchar *drink[4][2] = { { "Milk",    "3 Oz" },
                           { "Water",   "6 l" },
                           { "Carrots", "2" },
                           { "Snakes",  "55" } };
    gchar *food[4][2] = { { "sweet",    "3 Oz" },
                           { "more sweet",   "6 l" },
                           { "cake", "2" },
                           { "more cakes",  "55" } };

    /* Here we do the actual adding of the text. It's done once for
     * each row.
     */
    for ( indx=0 ; indx < 4 ; indx++ ) {
	GtkCTreeNode *node =	gtk_ctree_insert_node((GtkCTree *) data, NULL, NULL, drink[indx],0,NULL, NULL,NULL,NULL, FALSE, TRUE);
	gtk_ctree_insert_node((GtkCTree *) data, node,   NULL, food[indx],0,NULL, NULL,NULL,NULL, FALSE, TRUE);
	}

    return;
}

/* User clicked the "Clear List" button. */
void button_clear_clicked( gpointer data )
{
    /* Clear the list using gtk_clist_clear. This is much faster than
     * calling gtk_clist_remove once for each row.
     */
    gtk_clist_clear( (GtkCList *) data);

    return;
}

/* If we come here, then the user has selected a row in the list. */
void selection_made( GtkCTree      *ctree,
GtkCTreeNode            *node,
gint            column,
                      gpointer        data )
 {
	gtk_signal_handler_block_by_func(GTK_OBJECT(ctree), selection_made, data);	
	gtk_ctree_select_recursive(GTK_CTREE(ctree),node);
	gtk_signal_handler_unblock_by_func(GTK_OBJECT(ctree), selection_made, data);	

     return;
 }

 int main( int    argc,
           gchar *argv[] )
 {                                  
     GtkWidget *window;
     GtkWidget *vbox, *hbox;
     GtkWidget *scrolled_window, *ctree;
     GtkWidget *button_add, *button_clear;    
     gchar *titles[2] = { "Ingredients", "Amount" };

     gtk_init(&argc, &argv);
     
     window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
     gtk_widget_set_usize(GTK_WIDGET(window), 300, 150);

     gtk_window_set_title(GTK_WINDOW(window), "GtkCList Example");
     gtk_signal_connect(GTK_OBJECT(window),
                        "destroy",
                        GTK_SIGNAL_FUNC(gtk_main_quit),
                        NULL);
     
     vbox=gtk_vbox_new(FALSE, 5);
     gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
     gtk_container_add(GTK_CONTAINER(window), vbox);
     gtk_widget_show(vbox);
     
     /* Create a scrolled window to pack the CList widget into */
     scrolled_window = gtk_scrolled_window_new (NULL, NULL);
     gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
                                     GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);

     gtk_box_pack_start(GTK_BOX(vbox), scrolled_window, TRUE, TRUE, 0);
     gtk_widget_show (scrolled_window);

     /* Create the CList. For this example we use 2 columns */
     ctree = gtk_ctree_new( 2, 0);

     /* When a selection is made, we want to know about it. The callback
      * used is selection_made, and its code can be found further down */
     gtk_signal_connect(GTK_OBJECT(ctree), "tree_select_row",
                        GTK_SIGNAL_FUNC(selection_made),
                        NULL);

     /* It isn't necessary to shadow the border, but it looks nice :) */
     gtk_clist_set_shadow_type (GTK_CLIST(ctree), GTK_SHADOW_OUT);

     /* What however is important, is that we set the column widths as
      * they will never be right otherwise. Note that the columns are
      * numbered from 0 and up (to 1 in this case).
      */
     gtk_clist_set_column_width (GTK_CLIST(ctree), 0, 150);
     gtk_clist_set_selection_mode (GTK_CLIST(ctree),GTK_SELECTION_EXTENDED);

     /* Add the CList widget to the vertical box and show it. */
     gtk_container_add(GTK_CONTAINER(scrolled_window), ctree);
     gtk_widget_show(ctree);

     /* Create the buttons and add them to the window. See the button
      * tutorial for more examples and comments on this.
      */
     hbox = gtk_hbox_new(FALSE, 0);
     gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0);
     gtk_widget_show(hbox);

     button_add = gtk_button_new_with_label("Add List");
     button_clear = gtk_button_new_with_label("Clear List");

     gtk_box_pack_start(GTK_BOX(hbox), button_add, TRUE, TRUE, 0);
     gtk_box_pack_start(GTK_BOX(hbox), button_clear, TRUE, TRUE, 0);

     /* Connect our callbacks to the three buttons */
     gtk_signal_connect_object(GTK_OBJECT(button_add), "clicked",
                               GTK_SIGNAL_FUNC(button_add_clicked),
                               (gpointer) ctree);
     gtk_signal_connect_object(GTK_OBJECT(button_clear), "clicked",
                               GTK_SIGNAL_FUNC(button_clear_clicked),
                               (gpointer) ctree);

     gtk_widget_show(button_add);
     gtk_widget_show(button_clear);

     /* The interface is completely set up so we show the window and
      * enter the gtk_main loop.
      */
     gtk_widget_show(window);
     gtk_main();
     
     return(0);
 }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]