Adicionando menu de contexto em um GtkTreeview

Ao invés de criarmos botões para manipulação de registros de um GtkTreeview, é possível adicionar um menu de contexto, que são os menus que aparecem ao clicar com o botão direito do mouse. Com eles podemos adicionar, editar, remover e qualquer outra ação referente ao registro selecionado ou não.

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();
	
	/**
	 * @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_position(Gtk::WIN_POS_CENTER_ALWAYS);
		$this->widgets['frmDemo']->set_title("Demo");
		$this->widgets['frmDemo']->connect("destroy", array($this, "frmDemo_unload"));
		$vbox = new GtkVBox();

		// Cria o modelo
		$model = new GtkListStore(GObject::TYPE_STRING, GObject::TYPE_STRING);

		// Creia o treeview
		$this->widgets['trvTeste'] = new GtkTreeView($model);
		$this->widgets['trvTeste']->connect("button-press-event", array($this, "trvTeste_onbutton_press"));
		
		// Cria a colunas
		$column = new GtkTreeViewColumn("Couna 1", new GtkCellRendererText(), "text", 0);
		$this->widgets['trvTeste']->append_column($column);

		$this->widgets['colData'] = new GtkTreeViewColumn("Coluna 2", new GtkCellRendererText(), "text", 1);
		$this->widgets['trvTeste']->append_column($this->widgets['colData']);

		// Cria o menu
		$this->widgets['trvTesteMenu'] = new GtkMenu();
		$menu_item = new GtkMenuItem("Remover selecionado");
		$menu_item->connect("activate", array($this, "mnuRemove_onclick"));
		$this->widgets['trvTesteMenu']->append($menu_item);
		$this->widgets['trvTesteMenu']->show_all();
            
		// Popula o model
		$model->append(array("Valor 1", "03/01/2012"));
		$model->append(array("Valor 2", "02/01/2012"));
		$model->append(array("Valor 3", "01/01/2012"));
		
		// Inicia a aplicação
		$vbox->pack_start($this->widgets['trvTeste']);
		$this->widgets['frmDemo']->add($vbox);
		$this->frmDemo_onload();
	}
	
	/**
	 * Método do carregamento do formulario
	 * 
	 * @name frmDemo_onload()
	 */
	public function frmDemo_onload() {
		// 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();
	}
	
	/**
	 * Método do botão pressionado no treeview
	 * 
	 * @name trvTeste_onbutton_press
	 * @param GtkTreeview $widget Widget GtkTreeview clickado
	 * @param GtkEvent $event Evento ocorrido no widget
	 */
	public function trvTeste_onbutton_press($widget, $event) {
		if($event->button == 3) {
			 $this->widgets['trvTesteMenu']->popup();
		}
	}
	
	/**
	 * Método do click do menu remover
	 * 
	 * @name mnuRemove_onclick
	 * @param GtkMenuItem $widget Item do menu
	 */
	function mnuRemove_onclick($widget) {
		// Busca o produto selecionada 
		$selection = $this->widgets['trvTeste']->get_selection();
		
		// Verifica se algo foi selecionado
		if($selection->count_selected_rows() > 0) {
			// Musca a listagem
			list($model, $iter) = $selection->get_selected();
			
			// Remove o item
			$model->remove($iter);
		}
	}
}
	
/**
 * Inicia o demo
 */
new Demo();

Referências

http://gtk.php.net/manual/en/gtk.gtktreeview.php
http://gtk.php.net/manual/en/gtk.gtkcellrenderertext.php
http://gtk.php.net/manual/en/gtk.gtkmenuitem.php
http://gtk.php.net/manual/en/gtk.gtkmenu.php
http://gtk.php.net/manual/en/gtk.gtktreeselection.php