TREE WIDGET

 

Per creare un GtkTree possiamo usare la solita funzione:

GtkWidget *gtk_tree_new( void );

Ora che abbiamo il widget possaimo creare un item attraverso la funzione:

GtkWidget *gtk_tree_item_new_with_label( gchar *label );

Per aggiungere questo item al tree usiamo invece:

void gtk_tree_append( GtkTree *tree,
GtkWidget *tree_item );

void gtk_tree_prepend( GtkTree *tree,
GtkWidget *tree_item );

void gtk_tree_insert( GtkTree *tree,
GtkWidget *tree_item,
gint position );

a seconda se lo vogliamo inserire all'inizio alla fine o ad una posizione specifica.

Con quest'altra funzione aggiungiamo invece un figlio ad un item:

void gtk_tree_item_set_subtree( GtkTreeItem *tree_item,
GtkWidget *subtree );

Quando aggiungiamo un subtree appare prima di questo un segno + o meno a seconda che abbia a sua volta figli o no. Premendo sul segno il ramo dell'albero subirà un "expand" o un "collapse", mostrando o meno i figli.

Anche per il GtkTree possiamo settare il selection type:

void gtk_tree_set_selection_mode( GtkTree *tree,
GtkSelectionMode mode );

Per quanto riguarda i segnali, il primo segnale rilevante riguarda la selezione e si spiega da solo:

void selection_changed( GtkTree *tree );

Questo segnale sarà emesso quando viene selezionato/deselezionato un child.

void select_child( GtkTree *tree,
GtkWidget *child );

void unselect_child (GtkTree *tree,
GtkWidget *child);

Questo invece rimuove una lista di items dal tree:

void gtk_tree_remove_items( GtkTree *tree,
GList *items );

Con questa funzione possiamo invece rimuovere una serie di item dalla posizione start alla posizione end:

void gtk_tree_clear_items( GtkTree *tree,
gint start,
gint end );

Seleziona l'item alla posizione specificata ed emette il relativo segnale:

void gtk_tree_select_item( GtkTree *tree,
gint item );

Quella che segue è invece la funzione che deseleziona:

void gtk_tree_unselect_item( GtkTree *tree,
gint item );

Queste invece si posono usare con i figli:

void gtk_tree_select_child( GtkTree *tree,
GtkWidget *tree_item );

void gtk_tree_unselect_child( GtkTree *tree,
GtkWidget *tree_item );

La funzione che segue ritorna la posizione del figlio nel tree, (-1 se non lo trova):

gint gtk_tree_child_position( GtkTree *tree,
GtkWidget *child );

Quest'altra setta il selection mode:

void gtk_tree_set_selection_mode( GtkTree *tree,
GtkSelectionMode mode );

I valori possibili sono i soliti:

GTK_SELECTION_SINGLE
GTK_SELECTION_BROWSE
GTK_SELECTION_MULTIPLE
GTK_SELECTION_EXTENDED

Quest'altra funzione può essere settata a TRUE o FALSE a seconda che si voglia che gli items siano collegati da linee o meno.

void gtk_tree_set_view_lines( GtkTree *tree,
guint flag );

 

 

ESEMPIO

#include <gtk/gtk.h>

/* Per tutti i segnali GtkItem:: e GtkTreeItem:: */
static void cb_itemsignal (GtkWidget *item, gchar *signame)
{
gchar *name;
GtkLabel *label;

/* Per accedere alla label */
label = GTK_LABEL (GTK_BIN (item)->child);
/* Prende il testo della label */
gtk_label_get (label, &name);
/* Ricava il livello dell'item nel tree */
g_print ("%s called for item %s->%p, level %d\n", signame, name,
item, GTK_TREE (item->parent)->level);
}

/* Questa non è mai chiamata */
static void cb_unselect_child (GtkWidget *root_tree, GtkWidget *child,
GtkWidget *subtree)
{
g_print ("unselect_child called for root tree %p, subtree %p, child %p\n",
root_tree, subtree, child);
}

/* Questa è chiamata ogni volta ch si cikka su un item */
static void cb_select_child (GtkWidget *root_tree, GtkWidget *child,
GtkWidget *subtree)
{
g_print ("select_child called for root tree %p, subtree %p, child %p\n",
root_tree, subtree, child);
}

static void cb_selection_changed (GtkWidget *tree)
{
GList *i;

g_print ("selection_change called for tree %p\n", tree);
g_print ("selected objects are:\n");

i = GTK_TREE_SELECTION(tree);
while (i){
gchar *name;
GtkLabel *label;
GtkWidget *item;

/* Ricava unGtkWidget pointer al nodo */
item = GTK_WIDGET (i->data);
label = GTK_LABEL (GTK_BIN (item)->child);
gtk_label_get (label, &name);
g_print ("\t%s on level %d\n", name, GTK_TREE
(item->parent)->level);
i = i->next;
}
}

int main (int argc, char *argv[])
{
GtkWidget *window, *scrolled_win, *tree;
static gchar *itemnames[] = {"Foo", "Bar", "Baz", "Quux",
"Maurice"};
gint i;

gtk_init (&argc, &argv);

/* la finestra principale */
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_signal_connect (GTK_OBJECT(window), "delete_event",
GTK_SIGNAL_FUNC (gtk_main_quit), NULL);
gtk_container_set_border_width (GTK_CONTAINER(window), 5);

/* La scrolled window */
scrolled_win = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
GTK_POLICY_AUTOMATIC,
GTK_POLICY_AUTOMATIC);
gtk_widget_set_usize (scrolled_win, 150, 200);
gtk_container_add (GTK_CONTAINER(window), scrolled_win);
gtk_widget_show (scrolled_win);

/* Crea il tree */
tree = gtk_tree_new();
g_print ("root tree is %p\n", tree);
/* connette tutti i segnali GtkTree:: */
gtk_signal_connect (GTK_OBJECT(tree), "select_child",
GTK_SIGNAL_FUNC(cb_select_child), tree);
gtk_signal_connect (GTK_OBJECT(tree), "unselect_child",
GTK_SIGNAL_FUNC(cb_unselect_child), tree);
gtk_signal_connect (GTK_OBJECT(tree), "selection_changed",
GTK_SIGNAL_FUNC(cb_selection_changed), tree);

gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW(scrolled_win),
tree);
/* Setta il selection mode */
gtk_tree_set_selection_mode (GTK_TREE(tree),
GTK_SELECTION_MULTIPLE);
/* Visualizza il tree */
gtk_widget_show (tree);

for (i = 0; i < 5; i++){
GtkWidget *subtree, *item;
gint j;

/* Crea un tree item */
item = gtk_tree_item_new_with_label (itemnames[i]);
/* Connect all GtkItem:: and GtkTreeItem:: signals */
gtk_signal_connect (GTK_OBJECT(item), "select",
GTK_SIGNAL_FUNC(cb_itemsignal), "select");
gtk_signal_connect (GTK_OBJECT(item), "deselect",
GTK_SIGNAL_FUNC(cb_itemsignal), "deselect");
gtk_signal_connect (GTK_OBJECT(item), "toggle",
GTK_SIGNAL_FUNC(cb_itemsignal), "toggle");
gtk_signal_connect (GTK_OBJECT(item), "expand",
GTK_SIGNAL_FUNC(cb_itemsignal), "expand");
gtk_signal_connect (GTK_OBJECT(item), "collapse",
GTK_SIGNAL_FUNC(cb_itemsignal), "collapse");
/* Lo aggiunge al parent tree */
gtk_tree_append (GTK_TREE(tree), item);
/* Lo visualizza */
gtk_widget_show (item);
/* Crea il subtree */
subtree = gtk_tree_new();
g_print ("-> item %s->%p, subtree %p\n", itemnames[i], item,
subtree);

/* Connette i segnali */
gtk_signal_connect (GTK_OBJECT(subtree), "select_child",
GTK_SIGNAL_FUNC(cb_select_child), subtree);
gtk_signal_connect (GTK_OBJECT(subtree), "unselect_child",
GTK_SIGNAL_FUNC(cb_unselect_child), subtree);

gtk_tree_set_selection_mode (GTK_TREE(subtree),
GTK_SELECTION_SINGLE);
gtk_tree_set_view_mode (GTK_TREE(subtree), GTK_TREE_VIEW_ITEM);
/* Rende questo item un subtree */
gtk_tree_item_set_subtree (GTK_TREE_ITEM(item), subtree);

for (j = 0; j < 5; j++){
GtkWidget *subitem;
/* Crea un subtree */
subitem = gtk_tree_item_new_with_label (itemnames[j]);
/* Connette i segnali GtkItem:: e GtkTreeItem:: */
gtk_signal_connect (GTK_OBJECT(subitem), "select",
GTK_SIGNAL_FUNC(cb_itemsignal), "select");
gtk_signal_connect (GTK_OBJECT(subitem), "deselect",
GTK_SIGNAL_FUNC(cb_itemsignal), "deselect");
gtk_signal_connect (GTK_OBJECT(subitem), "toggle",
GTK_SIGNAL_FUNC(cb_itemsignal), "toggle");
gtk_signal_connect (GTK_OBJECT(subitem), "expand",
GTK_SIGNAL_FUNC(cb_itemsignal), "expand");
gtk_signal_connect (GTK_OBJECT(subitem), "collapse",
GTK_SIGNAL_FUNC(cb_itemsignal), "collapse");
g_print ("-> -> item %s->%p\n", itemnames[j], subitem);
/* Lo aggiunge al parent */
gtk_tree_append (GTK_TREE(subtree), subitem);
/* Lo visualizza */
gtk_widget_show (subitem);
}
}

/* Visualizza la finestra ed entra nel ciclo principale */
gtk_widget_show (window);
gtk_main();
return 0;
}

 

Torna all'indice