Utilizando GtkCellRendererToggle com Checkbox dentro de um GtkTreeview

Seguindo a linha do GtkTreeview, muitas vezes precisamos selecionar quais itens precisamos tratar. Ativar o multiselection pode resolver um muitos casos, porem, algumas vezes precisamos ter um controle maior, em uma lista grande de registros. Assim, uma coluna onde podemos ir marcando as linhas que queremos pode ajudar muito

Imagem

Utilizando checkbox dentro de um treeview

Exemplo

/**
 * Seta a codificação do programa
 */
ini_set("php-gtk.codepage", "UTF-8");

/**
 * Classe de exemplo
 * 
 * @name Demo
 * @author Bruno P. Gonçalves <http: //bruno.pitteli.com.br></http:>
 * @download <http: //code.google.com/p/fabulafw></http:>
 */
class Demo {
	/**
	 * Armazena os widgets necessarios
	 * 
	 * @access private
	 * @property array $widgets
	 */
	public $widgets = array();
	
	/**
	 * Armazena os valores do radio
	 * 
	 * @access private
	 * @property array $values
	 */
	private $values = array();
	
	/**
	 * @name __construct()
	 * @return Demo
	 */
	public function __construct() {
		// Cria a janela
		$this->widgets['frmDemo'] = new GtkWindow();
		$this->widgets['frmDemo']->set_size_request(250, 250);
		$this->widgets['frmDemo']->set_resizable(FALSE);
		$this->widgets['frmDemo']->set_title("Demo");
		$this->widgets['frmDemo']->set_position(GTK::WIN_POS_CENTER);
		$this->widgets['frmDemo']->connect("destroy", array($this, "frmDemo_unload"));
		
		// Cria o modelo
		$model = new GtkListStore(GObject::TYPE_BOOLEAN, GObject::TYPE_STRING);
		
		// Cria o treeview
		$this->widgets['trvDemo'] = new GtkTreeView($model);
		
		// Cria a coluna do radio
		$cell_renderer = new GtkCellRendererToggle();
		$cell_renderer->set_property('activatable', true);
		$column = new GtkTreeViewColumn('Select', $cell_renderer, 'active', 0);
		$cell_renderer->connect('toggled', array($this, 'trvDemo_ontoggle'), $model);
		$this->widgets['trvDemo']->append_column($column);
		
		// Cria a coluna simples
		$render = new GtkCellRendererText();
		$column = new GtkTreeViewColumn("Coluna 2", $render, "text", 1);
		$this->widgets['trvDemo']->append_column($column);
		// Inicia a aplicação
		$this->widgets['frmDemo']->add($this->widgets['trvDemo']);
		$this->frmDemo_onload();
	}
		
	/**
	 * Método do carregamento do formulario
	 * 
	 * @name frmDemo_onload()
	 */
	public function frmDemo_onload() {
		// Popula o model
		$this->addNewRow(array(FALSE, "Item 1"));
		$this->addNewRow(array(FALSE, "Item 2"));
		$this->addNewRow(array(TRUE, "Item 3"));
		$this->addNewRow(array(FALSE, "Item 4"));
		
		// Inicia a aplicação
		$this->widgets['frmDemo']->show_all();
		Gtk::main();
	}
	
	/**
	 * Método do descarregamento do formulario
	 * 
	 * @name frmDemo_unload()
	 */
	public function frmDemo_unload() {
		// Encerra a aplicação
		Gtk::main_quit();
		exit(0);
	}
	
	/**
	 * Método que adiciona novas linhas ao treeview
	 * 
	 * @name addNewRow
	 * @param array $values Valores para adicionar no treeview
	 */
	public function addNewRow($values) {
		// Busca o model e adiciona os valores
		$model = $this->widgets['trvDemo']->get_model();
		$model->append($values);
	
		// Adiciona o valor inicial do toogle 
		$this->values[] = $values[0];
	}
	
	/**
	 * Método que muda o valor do toggle
	 * 
	 * @name trvDemo_ontoggle
	 * @param GtkWidget $widget Widget clicado
	 * @param int $row Numedo da linha
	 * @param int $value Valor clicado
	 */
	public function trvDemo_ontoggle($renderer, $row, $model) {
		// Recupera o iter
		$iter = $model->get_iter($row);
		
		// Seta o valor
		$model->set($iter, 0, !$model->get_value($iter, 0));
	}
}
	
/**
 * Inicia o demo
 */
new Demo();

Referências

http://gtk.php.net/manual/en/gtk.gtktreeiter.php
http://gtk.php.net/manual/en/gtk.gtkcellrenderertoggle.php
http://gtk.php.net/manual/en/gtk.gtktreeviewcolumn.php
http://gtk.php.net/manual/en/gtk.gtkliststore.php
http://gtk.php.net/manual/en/gtk.gtktreeview.php