Newsgroup: it.comp.os.linux.development
Titolo: vecchio thread su gtk, per Emmanuele

 e così via, dve la colonna usare sono dei checkbox.
 
 Ah, allora è facile:
 
 #v+
 
 /* l'enumeratore per le colonne del TreeStore... */
 enum { COLUMN_NOME, COLUMN_USARE };
 
 [...]
 
 GtkWidget *tree_view;
 
 GtkTreeViewColumn *column_0, *column_1;
 GtkCellRenderer *label_r, *check_r;
 
 /* Iniziamo con i renderer. */
 label_r = gtk_cell_renderer_text_new();
 check_r = gtk_cell_renderer_toggle_new();
 
 /* [...] attacchi i segnali ai due renderer [...] */
 g_signal_connect(G_OBJECT(check_r), "toggled",
 	G_CALLBACK(on_check_toggled), NULL);
 
 /* Creiamo le colonne e agganciamoci il relativo cell renderer. */
 column_0 = gtk_tree_view_column_new_with_attributes("nome",
 	label_r,
 	text, COLUMN_NOME,
 	NULL);
 
 column_1 = gtk_tree_view_column_new_with_attributes("usare",
 	check_r,
 	text, COLUMN_USARE,
 	NULL);
 
 /* Attacca le colonne al tree view. */
 tree_view = gtk_tree_view_new();
 gtk_tree_view_insert_column(GTK_TREE_VIEW(tree_view), column_0, COLUMN_NOME);
 gtk_tree_view_insert_column(GTK_TREE_VIEW(tree_view), column_1, COLUMN_USARE);
 
 #v-
 
 Ho lasciato fuori i callback e la creazione del modello, ma sono
 abbastanza elementari.
 
 I cell renderer di default sono tre (text, toggle e pixbuf), ma possono
 essere subclassati facilmente. Ne puoi mettere anche più d'uno in una
 colonna.

 perché mi ingruma tutte le scritte di debug alla fine e non quando clicko.
Sinceramente, non saprei che dirti...
+++
Il codice che avevo usato non era testato, quindi copiandolo non so
quanto poteva essere utile, se non per dare un modello. :-)
Se vuoi un esempio di ListStore/TreeView funzionante, c'è l'esempio con
il programma gtk-demo: personalmente, ho usato quello per capire come
funzionava tutta la storia.
+++
Questo compila, e funziona correttamente (mi scuso per la lunghezza, ma
può far comodo a chi non ha gtk-demo o non ha capito gli esempi forniti
con la documentazione; con i GtkTreeView succede spesso):
#v+
/* Esempio di TreeView con:
 *	- ListStore;
 *	- CellRendererToggle;
 *	- eventi associati;
 *
 * by Emmanuele Bassi.
 * 
 * ATTENZIONE: questo programma è fornito COSI` COM'E`. Non si danno
 * garanzie, ESPLICITE od IMPLICITE, che questo programma, una volta
 * compilato, funzioni come l'utente presume o intende. L'Autore non
 * si assume, poi, ALCUNA responsabilità sugli eventuali effetti che
 * questo programma potrebbe produrre; effetti che possono andare da
 * una completa perdita di tutti i dati sul disco fisso dell'utente,
 * all'alluvione di rane; dalla morte dei primogeniti d'Egitto, alla
 * caduta di nazioni/imperi; dalla caduta di asteroidi grandi quanto
 * il Texas, fino alla morte entropica di questo Universo, oppure ad
 * un suo collasso in una singolarità, con conseguente nascita di un
 * nuovo Universo. In quest'ultimo caso non è in possibile garantire
 * che le leggi della fisica rimangano invariate, quindi, non si può
 * garantire che questo programma funzioni ancora nello stesso modo.
 *
 * - Per compilare:
 * 	gcc -Wall -O2 \
 *		`pkg-config --cflags --libs gtk+-2.0` \
 *		-o list_store \
 *		list_store.c
 *
 * E non dite che non eravate stati avvertiti! :-)
 */
#include <gtk/gtk.h>
#include <stdio.h>
#include <stdlib.h>
enum {
	COLUMN_LABEL,
	COLUMN_CHECK,
};
GtkListStore *store;
/* Il callback del CellRendererToggle */
void
on_toggle_check (GtkCellRendererToggle *toggle,
                 gchar *path_string,
		 gpointer data)
{
	GtkTreePath *path;
	GtkTreeIter iter;
	gboolean toggled;
 
	fprintf (stderr, "Toggled check at path: %s\n", path_string);
 
	/* Un giro un po' lungo: il meccanismo di base, però, è semplice.
	 * Viene fornito un path in forma di stringa; si converte in un oggetto
	 * TreePath, e da qui si può ottenere l'iteratore per il modello. Nella
	 * lista è un overkill, ma funziona meglio negli alberi.
	 */
	path = gtk_tree_path_new_from_string (p_str);
	gtk_tree_model_get_iter (GTK_TREE_MODEL (store), &iter, path);
	gtk_tree_path_free (path); /* liberare la memoria, sempre */
 
	/* recupero lo stato del modello in questa cella. */
	gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
			COLUMN_CHECK, &toggled,
			-1);
 
	/* For Light is but the left hand of Darkness; and Darkness but the
	 * right hand of Light. Blessed then be also Darkness, and Creation
	 * Unfinished.
	 * 		-- Tenets of the Yomeshta cult
	 */
	toggled = ! toggled;
 
	/* cambio lo stato del modello: il widget poi si aggiornerà da solo. */
	gtk_list_store_set (store, &iter, COLUMN_CHECK, toggled, -1);
}
/* soliti metodi di convenienza */
gboolean
on_delete_event (GtkWidget *widget,
                 GdkEvent *event,
		 gpointer user_data)
{
	gtk_widget_destroy (widget);
	return FALSE;
}
void
on_destroy (GtkWidget *widget,
            gpointer user_data)
{
	gtk_main_quit ();
}
int main (int argc, char *argv[])
{
	GtkWidget *main_window;
	GtkWidget *scrolled_window;
	GtkWidget *tree_view;
 
	GtkTreeViewColumn *column;
	GtkCellRenderer *renderer;
	int i;
 
	gtk_init (&argc, &argv);
 
	store = gtk_list_store_new(2,
			G_TYPE_STRING,		/* COLUMN_LABEL */
			G_TYPE_BOOLEAN);	/* COLUMN_CHECK */
 
	/* riempiamo il modello */
	for (i = 0; i < 10; i++) {
		GtkTreeIter iter;
		gchar *label;
		gboolean toggled = FALSE;
 
		label = g_strdup_printf ("label %d", i);
		if ((i % 2) == 0)	/* accendiamo solo i pari */
			toggled = TRUE;
 
		gtk_list_store_append (store, &iter);
		gtk_list_store_set (store, &iter,
				COLUMN_LABEL, label,
				COLUMN_CHECK, toggled,
				-1);
 
		g_free (label);
	}
 
	tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
 
	/* Creiamo il renderer, e lo agganciamo alla prima colonna.
	 * La proprietà "text" è agganciata alla colonna 0 del modello.
	 */
	renderer = gtk_cell_renderer_text_new ();
	column = gtk_tree_view_column_new_with_attributes ("Label",
			renderer,
			"text", COLUMN_LABEL, NULL);
	gtk_tree_view_insert_column (GTK_TREE_VIEW (tree_view),
		column, COLUMN_LABEL);
 
	/* seconda colonna: come sopra, ma cambiamo il renderer; avendo usato
	 * un GtkCellRenderer, possiamo riutilizzare lo stesso puntatore */
	renderer = gtk_cell_renderer_toggle_new ();
	/* agganciamo *al renderer* il segnale */
	g_signal_connect (G_OBJECT (renderer), "toggled",
			G_CALLBACK (on_toggle_check), NULL);
 
	/* La proprietà "active" è agganciata alla colonna 1 del modello. */
	column = gtk_tree_view_column_new_with_attributes ("Check",
			renderer,
			"active", COLUMN_CHECK, NULL);
 
	gtk_tree_view_insert_column (GTK_TREE_VIEW (tree_view),
		column, COLUMN_CHECK);
 
	/* finestra principale */
	main_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
 
	gtk_window_set_title (GTK_WINDOW (main_window), "TreeView");
	gtk_container_set_border_width (GTK_CONTAINER (main_window), 12);
 
	g_signal_connect (G_OBJECT (main_window), "delete-event",
			G_CALLBACK (on_delete_event), NULL);
 
	g_signal_connect (G_OBJECT (main_window), "destroy",
			G_CALLBACK (on_destroy), NULL);
 
	scrolled_window = gtk_scrolled_window_new (NULL, NULL);
	gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
			GTK_POLICY_NEVER,
			GTK_POLICY_AUTOMATIC);
 
	gtk_container_add (GTK_CONTAINER (scrolled_window), tree_view);
	gtk_widget_show (tree_view);
	gtk_container_add (GTK_CONTAINER (main_window), scrolled_window);
	gtk_widget_show (scrolled_window);
	gtk_widget_show (main_window);
	gtk_main ();
	return EXIT_SUCCESS;
}
#v-
Ciao,
 Emmanuele.
-- 
Emmanuele Bassi (Zefram)           [ 
http://digilander.libero.it/ebassi/
 ]
GnuPG Key fingerprint = 4DD0 C90D 4070 F071 5738  08BD 8ECC DB8F A432 0FF4