Esperando texto do Clipboard

Recuperar um conteúdo da área de transferência nos dias de hoje é algo muito comum. Possuir campos somente para jogar dados em algum outro campo não editável torna-se custoso. Neste exemplo, mostro como um evento de colar (Ctrl+V) em uma janela, pode-se adicionar uma linha em um GtkTreeView, para iniciar um processo.

Imagem

screenshot1

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(800, 450);
		$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"));
		$this->widgets['frmDemo']->connect("key-press-event", array($this, "frmDemo_keypress"));
		$vbox = new GtkVBox();
		
		// Cria o modelo
		$model = new GtkListStore(GObject::TYPE_STRING, GObject::TYPE_DOUBLE);
		
		// Creia o treeview
		$this->widgets['trvTeste'] = new GtkTreeView($model);
		$this->widgets['trvTeste']->set_enable_search(FALSE);
		//$this->widgets['trvTeste']->connect("button-press-event", array($this, "trvTeste_onbutton_press"));
		
		// Cria a colunas
		$this->widgets['colModel'] = new GtkTreeViewColumn("Model", new GtkCellRendererText(), "text", 0);
		$this->widgets['colSize'] = new GtkTreeViewColumn("Size", new GtkCellRendererText(), "text", 1);
		$this->widgets['trvTeste']->append_column($this->widgets['colModel']);
		$this->widgets['trvTeste']->append_column($this->widgets['colSize']);
		
		// Inicia a aplicação
		$vbox->pack_start($this->widgets['trvTeste']);
		$this->widgets['frmDemo']->add($vbox);
		$this->frmDemo_onload();
	}
	
	/**
	 * Captura as teclas pressionadas no form
	 *
	 * @name frmDemo_keypress
	 */
	public function frmDemo_keypress($widget, $event) {
		// CTRL + V
		 if(Gdk::CONTROL_MASK && $event->keyval == Gdk::KEY_v) {
			// Recupera o conteudo do clipboard
			$clip = new GtkClipboard();
			$text = $clip->wait_for_text();
			
			// Adiciona a linha
			$this->widgets['trvTeste']->get_model()->append(array($text, 0));
		}
	}
	
	/**
	 * 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();
	}
}
	
/**
 * Inicia o demo
 */
new Demo();

Referências

http://gtk.php.net/manual/en/gtk.gtkcellrenderertext.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
http://gtk.php.net/manual/en/gtk.gtkclipboard.php