Re: GtkTree remove/add problem
- From: Jim Edwards <jimedwards altavista com>
- To: Rafael Peregrino <rafael peregrino innominate com>
- Cc: GTK+ Application Development Mailing List <gtk-app-devel-list gnome org>, GTK+ Mailing List <gtk-list gnome org>
- Subject: Re: GtkTree remove/add problem
- Date: Tue, 31 Jul 2001 15:13:08 +0000
Rafael,
The first answer is gtktree is depreciated use gtkctree which inherits
from gtkclist
Rafael Peregrino wrote:
> Hi ALL,
>
> I'm working on a program in which a gtktree must be frequently updated
> by a timeout function. In order to keep this thing simple, I only want
> to clear all tree items and create them again. So, if new data is read,
> they simply appear on the gtktree when I reconstruct it. And exactly
> there I'm having a problem: once I've cleared all tree items, I'm not
> able to insert items on the tree anymore. Surely I'm overlooking
> something. Here an excerpt of my code (the code constructs the tree
> correctly the first time it's realized):
>
> void
> on_tree_realize (GtkWidget *widget, gpointer user_data)
> {
> ...
>
> /* If is as rebuild, clear all tree items */
> if(rebuild_tree) {
> gtk_tree_clear_items (tree, 0, -1);
> rebuild_tree = FALSE;
> }
>
> /* Call function to build the tree */
> populate_tree (GTK_TREE(widget));
> }
>
> void
> populate_tree(GtkTree *tree)
> {
> GList *item_list = NULL, *swap_list = NULL, *node;
> GtkWidget *subtree, *root_item, *root_hbox;
> GtkWidget *root_pixmap, *root_label;
>
> /* Create the root item */
> root_item = gtk_tree_item_new ();
>
> /* Create the root hbox which will contain the
> * root_item label and pixmap
> */
> root_hbox = gtk_hbox_new (FALSE, 2);
>
> /* Show the root hbox */
> gtk_widget_show (root_hbox);
>
> /* Pack the root hbox into the tree root item */
> gtk_container_add (GTK_CONTAINER (root_item), root_hbox);
>
> /* Create the root pixmap */
> root_pixmap = create_pixmap (gtk_widget_get_toplevel\
> (GTK_WIDGET(tree)),
> "root.xpm");
>
> /* Set root_pixmap alignment properly */
> gtk_misc_set_alignment (GTK_MISC (root_pixmap), 0.0, 0.5);
>
> /* Show root_pixmap */
> gtk_widget_show (root_pixmap);
>
> /* Pack the root pixmap into root_hbox */
> gtk_box_pack_start (GTK_BOX (root_hbox), root_pixmap,
> FALSE, FALSE, 0);
>
> /* Create root_label */
> root_label = gtk_label_new ("Root");
>
> /* Set root_label alignment properly */
> gtk_misc_set_alignment (GTK_MISC (root_label), 0.0, 0.5);
>
> /* Show the root label*/
> gtk_widget_show (root_label);
>
> /* Pack root label into the root hbox */
> gtk_box_pack_start (GTK_BOX (root_hbox), root_label,
> FALSE, FALSE, 0);
>
> /* Add root item to the tree root */
> gtk_tree_append (GTK_TREE(tree), root_item);
>
> /* Show item */
> gtk_widget_show (root_item);
>
> /* Read the list of available items */
> swap_list = read_item_list("list\n");
>
> /* Copying all the the items from swap_list into item_list */
> foreach(swap_list, node) {
> item_list = g_list_insert(item_list,
> g_strdup((gchar *) node->data), 0);
> }
>
> /* Revert the glist and remove the NULL pointer allocated to
> * initialize the GList in the function read_item_list()
> */
> item_list = g_list_reverse (item_list);
> g_list_remove(item_list, NULL);
>
> /* Create the subtree (it's a subtree of root) */
> subtree = gtk_tree_new();
>
> /* Set the item subtree - note that you cannot do this until
> * the root item has been added to its parent tree!
> */
> gtk_tree_item_set_subtree (GTK_TREE_ITEM(root_item), subtree);
>
> /* Populate the tree */
> foreach(item_list, node) {
> GtkWidget *item, *item_hbox, *item_pixmap, *item_label;
>
> /* Create a tree item */
> item = gtk_tree_item_new ();
> /* Create a hbox which will contain the item label and pixmap */
> item_hbox = gtk_hbox_new (FALSE, 2);
> gtk_widget_ref (item_hbox);
> /* Show the hbox */
> gtk_widget_show (item_hbox);
> /* Pack the hbox into the tree item */
> gtk_container_add (GTK_CONTAINER (item), item_hbox);
> /* Create the item pixmap */
> item_pixmap = create_pixmap (gtk_widget_get_toplevel\
> (GTK_WIDGET(tree)),
> "item.xpm");
> /* Set pixmap alignment properly */
> gtk_misc_set_alignment (GTK_MISC (item_pixmap), 0.0, 0.5);
> /* Show the item pixmap */
> gtk_widget_show (item_pixmap);
> /* Pack the pixmap into the hbox */
> gtk_box_pack_start (GTK_BOX (item_hbox), item_pixmap,
> FALSE, FALSE, 0);
> /* Create the item label */
> item_label = gtk_label_new ((gchar *) node->data);
> /* Set label alignment properly */
> gtk_misc_set_alignment (GTK_MISC (item_label), 0.0, 0.5);
> /* Show the item label*/
> gtk_widget_show (item_label);
> /* Pack item label into the hbox */
> gtk_box_pack_start (GTK_BOX (item_hbox), item_label,
> FALSE, FALSE, 0);
> /* Connect select signal to handle item selections */
> gtk_signal_connect (GTK_OBJECT(item), "select",
> GTK_SIGNAL_FUNC(on_tree_select_subitem),
> item_label);
> /* Add item to the item tree */
> gtk_tree_append (GTK_TREE(subtree), item);
> /* Show item */
> gtk_widget_show (item);
> }
>
> /* Free glist */
> g_list_free(item_list);
> g_list_free(swap_list);
> g_list_free(node);
> }
>
> Does anyone have a clue, what am I doing wrong? I've already tried to
> increase the reference count of the gtktree, but I know that the tree
> wasn't removed. Just it's children pointer is NULL after the items are
> cleared. But cause I create them again, this should not be a problem at
> all, should it?
>
> Thanks in advance for the help!
>
> Greetings,
>
> Rafael
> P.S. ('foreach' is a macro that iterates through all items of a GList.)
> --
> rafael peregrino innominate com
> software engineer innominate AG
> server appliances the linux architects
> tel: +49.30.308806-81 fax: -77 http://www.innominate.com
>
> _______________________________________________
> gtk-list mailing list
> gtk-list gnome org
> http://mail.gnome.org/mailman/listinfo/gtk-list
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]