Como criar uma linha de total no GtkTreeView

Explicação

Por questões estéticas ou para facilidade de visualização, é conveniente criar uma linha ao final da lista, indicando as somatórias dos valores, principalmente se sua lista for grande. Para isso temos um sinal da classe GtkCellLayout que é atribuído pelo método set_cell_data_func(). Com ele podemos executar uma função sempre que um novo valor for atribuído à uma celula. A idéia é enviar uma linha normal, e dizer ao callback que ela é a linha total, assim podemos diferencia-la do resto da lista.

Imagem

Solução

Utilizamos o método set_cell_data_func() da classe GtkCellLayout.

Exemplo

widgets['trvTeste'] = new GtkTreeView($model);	
			
			// Cria a colunas
			$render = new GtkCellRendererText();
			$column = new GtkTreeViewColumn("Couna 1", $render, "text", 0);
			$this->widgets['trvTeste']->append_column($column);
			// Conecta a coluna ao sinal de renderização
			$column->set_cell_data_func($render, array($this, "treeview_onRender"));
			
			$render = new GtkCellRendererText();
			$column = new GtkTreeViewColumn("Coluna 2", $render, "text", 1);
			$this->widgets['trvTeste']->append_column($column);
			// Conecta a coluna ao sinal de renderização
			$column->set_cell_data_func($render, array($this, "treeview_onRender"));
			
			// Popula o model
			$model->append(array("Valor 1", 1.0));
			$model->append(array("Valor 2", 2.2));
			$model->append(array("Valor 3", 3.6));
			$model->append(array("Valor 4", 4.1));
			$model->append(array("Valor 5", 5.3));
			
			// Cria o valor total
			$total = 1.0 + 2.2 + 3.6 + 4.1 + 5.3;
			
			// Cria a linha do valor total
			$model->append(array("TOTAL", $total));
			
			// Cria a janela
			$this->widgets['frmTeste'] = new GtkWindow();
			$this->widgets['frmTeste']->set_size_request(200, 200);
			$this->widgets['frmTeste']->set_resizable(FALSE);
			$this->widgets['frmTeste']->set_title("Teste");
			$this->widgets['frmTeste']->add($this->widgets['trvTeste']);
			$this->widgets['frmTeste']->set_position(GTK::WIN_POS_CENTER);
			$this->widgets['frmTeste']->show_all();
			
			// Conecta o destroy
			$this->widgets['frmTeste']->connect_simple(
				"destroy", 
				array("Gtk", "main_quit")
			);
		}
		
		// Método de renderização do treeview
		public function treeview_onRender($column, $cell, $model, $iter)
		{
			// Verifica se é a linha do valor total
			$columnValue = $model->get_value($iter, 0);
			if($columnValue == "TOTAL")
			{
				$color = "#F1AFAF";
			}
			else
			{
				$color = "#FFFFFF";
			}
			
			// Pinta a linha
			$cell->set_property("cell-background", $color);
			$cell->set_property("cell-background", $color); 
		}
	}

	// Inicia a aplicação
	$teste = new Teste();
	gtk::main();

Referências

http://gtk.php.net/manual/en/gtk.gtkcelllayout.method.set_cell_data_func.php