Apresentando dados em modo de arvore em GtkTreeView

Explicação

Muitas vezes precisamos mostrar dados em forma de arvore, e encontrei uma solução bem simples de se fazer isso, utilizando GtkTreeView. Com ele, é possivel mudar icone dos nós, adicionar filhos ilimitados, e muito facil configuração e manipulação. Veja um exemplo do que vamos estudar aqui:

Imagem

Solução

A idéia é utilizar a estrutura normal de um GtkTreeView, porem adicionar os itens com o método append do Model. Este método possui como primeiro parametro, o Iter pai, se NULL, é um item da raiz.

Exemplo

append_column(
		new GtkTreeViewColumn("GtkTreeView com filhos", $cell_renderer, "text", 0)
	);
	
	// Adiciona os dados do GtkTreeView
	$pai1 = $model->append(NULL, array("Pai 1"));
		$model->append($pai1, array("Filho 1 do Pai 1"));
		$model->append($pai1, array("Filho 2 do Pai 1"));
		$model->append($pai1, array("Filho 3 do Pai 1"));
	
	$pai2 = $model->append(NULL, array("Pai 2"));
		$model->append($pai2, array("Filho 1 do Pai 2"));
		$filho2_pai2 = $model->append($pai2, array("Filho 2 do Pai 2"));
			$model->append($filho2_pai2, array("Neto 1 do Pai 2"));
			$model->append($filho2_pai2, array("Neto 2 do Pai 2"));
			$model->append($filho2_pai2, array("Neto 3 do Pai 2"));
	
	$pai3 = $model->append(NULL, array("Pai 3"));
	
	// Scrolled
	$scrolled = new GtkScrolledWindow();
	$scrolled->add_with_viewport($view);
	$scrolled->set_policy( Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
			
	// Window
	$window = new GtkWindow();
	$window->add($scrolled);
	$window->set_size_request(500, 500);
	$window->connect_simple("destroy", array(Gtk, main_quit));
	$window->show_all();
	
	
	
	Gtk::main();