Forum und email

O modelo: GtkTreeModel e GtkTreeStore

GtkTreeModel é a definição da interface para a parte de modelo do GtkTreeView. O programador da aplicação pode definir o seu próprio modelo mas o GtkTreeView provê os dois mais populares: uma lista linear com GtkListStore, e uma arvore hierarquica com GtkTreeStore. O manual de referência de GtkTreeView diz que uns poucos programadores de aplicações vão precisar usar alguma outra coisa, e eles devem estar certos. Já que eu tenho pouca experiência com GtkListStore, este artigo irá discutir apenas o GtkTreeStore.

O primeiro passo é usar GtkTreeView, então, configurar um GtkTreeStore para manter os seus dados. O modelo contém algum número de linhas e cada linha contém o mesmo número de colunas. As células em cada coluna contém o mesmo tipo de dados. Estas colunas são declaradas quando o modelo é criado, entretanto elas podem ser modificadas depois, se necessário.

Exemplo 10.1. Modelo

$model = new GtkTreeStore(Gtk::TYPE_PHP_VALUE, Gtk::TYPE_STRING);

Aqui nos criamos um GtkTreeStore com duas colunas. A primeira coluna contém uma variável PHP (de qualquer tipo), e a segunda uma string. Existem vários tipos diferentes disponíveis, veja GTK Enums. Nós estaremos usando a primeira coluna para guadar uma matriz contendo toda a informação sobre uma pasta e a segunda coluna para mostrar o seu nome.

Não importa em qual ordem você define as colunas. A ordem na qual GtkTreeStore conhece elas não afetas como elas são exibidas para os usuários. Não é mesmo nem necessário mostrar todas as colunas para o usuário.

Ramos podem ser adicionados em um GtkTreeStore de diversas maneiras. Minha preferência é usar a função gtk_tree_store_insert_before, conhecido como o método insert_before() no PHP.

Exemplo 10.2. Criar Linha

$folder = new_folder();
$iter = $model->insert_before(null, null);
$model->set($iter, 0, $folder);
$model->set($iter, 1, $folder['name']);

Este código primeiro insere uma linha em branco no modelo, então define os valores em ambas as células.

Um GtkTreeModel permite ao programador se referir a linhas de várias maneiras. Nós vemos mais aqui o objeto GtkTreeIter, o qual essencialmente funciona como um ponteiro para a linha. Nós então usamos este ponteiro, mais um número de coluna, para se referir a uma célula.

Objetos GtkTreeIter são também usados como argumentos para insert_before() , para definir o parente do novo ramo, e vizinho que é para seguir o novo ramo. Se o parente for NULL, como no exemplo acima, o novo ramo é adicionado para o nível superior, e se o vizinho for NULL, então o ramo se torna o ultimo filho do parente.

Os objetos GtkTreeIter podem ser temporários, e podem se tornar inválidos quando a arvore for modificada pela adição ou remoção de ramos. Provavelmente é uma má idéia guarda-los.

Você também pode remover linhas (gtk_tree_store_remove a.k.a. $model->remove() ). Para outras operações, por favor veja a documentação de referência da API.