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.
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.
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.
$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.