Adicionando 2 radio buttons em uma só coluna do GtkTreeview

O GtkTreeview é o widget mais comum de ser usado. Isso por que sua forma de apresentar os dados é simples a ponto de deixar os dados visualmente mais bem vistos. Algumas vezes aproveitamos essa facilidade para adicionar ações tambem. Uma forma de utilizar ações é adicionar radio buttons, evitando assim de usar Combobox para poucas opções

Imagem

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
		$toggle01 = new GtkCellRendererToggle();
		$toggle02 = new GtkCellRendererToggle();

		$toggle01->set_radio(TRUE);
		$toggle02->set_radio(TRUE);

		$labelNao = new GtkCellRendererText();
		$labelNao->set_property("text", "Não");

		$labelSim = new GtkCellRendererText();
		$labelSim->set_property("text", "Sim");

		$toggle01->connect("toggled", array($this, "trvDemo_ontoggle"), 0);
		$toggle02->connect("toggled", array($this, "trvDemo_ontoggle"), 1);

		$column = new GtkTreeViewColumn("Ativar?", $toggle01, "active", 0);
		$this->widgets['trvDemo']->append_column($column);
		$column->pack_start($labelNao);
		$column->pack_start($toggle02);
		$column->pack_start($labelSim);

		// Adiciona o callback que mostrará o combo selecionado
		$column->set_cell_data_func($toggle01, array($this, "trvDemo_onrender"), $toggle01, $toggle02);

		// 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($width, $row,  $value) {
		// Adiciona o valor no vetor
		$this->values[$row] = $value;
	}

	/**
	 * Método que estiliza o treeview
	 * 
	 * @name trvDemo_ontoggle
	 * @param GtkWidget $widget Widget clicado
	 * @param int $row Numedo da linha
	 * @param int $value Valor clicado
	 */
	public function trvDemo_onrender($column, $cell, $model, $iter, $toggle01, $toggle02) {
		// Busca a linha
		$path = $model->get_path($iter);

		// Renderiza o radio conforme o vetor
		if($this->values[$path[0]] == 0) {
			$toggle01->set_active(TRUE);
			$toggle02->set_active(FALSE);
		}
		else {
			$toggle01->set_active(FALSE);
			$toggle02->set_active(TRUE);
		}
	}
}
	
/**
 * 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