cvs: php-gtk-doc /manual/pt_BR/tutorials treeview.xml
[email protected] ("Fernando Correa da Concei??o") Wed, 11 Apr 2007 06:00:00 -0000
| Newsgroups | php.gtk.doc |
|---|---|
| Message-ID | <cvsfernandoc1176271200@cvsserver> |
fernandoc Wed Apr 11 06:00:00 2007 UTC
Added files:
/php-gtk-doc/manual/pt_BR/tutorials treeview.xml
Log:
New translation
fernandoc-20070411060000.txt
(text/plain, 11.5 KB)
http://cvs.php.net/viewvc.cgi/php-gtk-doc/manual/pt_BR/tutorials/treeview.xml?view=markup&rev=1.1
Index: php-gtk-doc/manual/pt_BR/tutorials/treeview.xml
+++ php-gtk-doc/manual/pt_BR/tutorials/treeview.xml
<?xml version="1.0" encoding="utf-8" ?>
<!-- EN-Revision: 1.1 Maintainer: fernandoc Status: ready -->
<chapter id="tutorials.treeview">
<title>Tutorial GtkTreeView (básico)</title>
<sect1 id="tutorials.treeview.intro">
<title>Introdução</title>
<para>
Agradecimentos a Lars Wirzenius pela
<ulink url="http://liw.iki.fi/liw/texts/gtktreeview-tutorial.html">versão original</ulink>
deste tutorial escrito para o PyGtk. Mudanças no documento foram apenas para
refletir o estado atual da base de código do Gtk+ e para ser aplicável ao PHP-Gtk2.
</para>
<para>
A versão 2.0 do Gtk+ introduz a sua terceira geração de widgets de arvore e
lista. A versão 1.0 tinha GtkList e GtkTree, versão 1.2
tinha <classname>GtkCList</classname> e <classname>GtkCTree</classname>,
e agora a versão 2.0 tem <classname>GtkTreeView</classname>,
o qual serve como ambos arvore e lista. Com cada versão, a
força e utilidade dos widgets tem crescido.
</para>
<para>
<classname>GtkTreeView</classname> usa uma aproximação Modelo/Vista/Controlador.
Isto significa que o código é dividido em uma estrutura de dados representando
os dados do usuário ("o modelo"), o widget que exibem os dados e
interagem com o usuário ("a vista"), e alguma lógica para manter
as coisas felizmente unidas ("o controlador"). O modelo é implementado por
<classname>GtkTreeModel</classname> (atualmente, as classes que implementam esta interface), a
vista pelo GtkTreeView com alguns auxiliares e o controle pelo
código do usuário.
</para>
<simpara>
Isto parace desnecessáriamente complicado, mas a complexidade
é local, e esta aproximação atualmente simplifica a estrutura geral
do programa. Por exemplo, várias vezes é necessário ver os dados
(ex. modelo) de maneiras diferentes, ou em janelas diferentes. Pense,
por exemplo, de um editor de programação: o mesmo código-fonte
pode ser visto em várias janelas ao mesmo tempo, e mudanças em uma
vista devem ser exibidas em todas as outras também. Assim, faz
sentido separar o armazanamento do texto da sua exibição, ao invés
de armazanar o texto em cada widget em cada janela.
</simpara>
<simpara>
A aplicação de exemplo neste artigo permite ao usuário gerenciar
uma arvore de pastas. As pastas são virtuais, não diretórios reais no
sistema de arquivos, para manter o código simples. O exemplo é atualmente
derivado de Lodju, no qual as pastas não tem nada a ver com
o sistea de arquivos.
</simpara>
<para>
A <ulink url="&url.gnomeAPI;">documentação oficial
da referência da API do Gtk+ 2.0 para o GtkTreeView</ulink>
deve ser lida em conjunto com este tutorial, mesmo sendo ela um pouco
dispersa em alguns detalhes.
</para>
<para>
Eu agradeço o pessoal no
<ulink url="&url.gtkIRCchannel;">Canal de IRC do Desenvolvedor Gtk+</ulink> pelo
encorajamento e apoio.
</para>
</sect1>
<sect1 id="tutorials.treeview.model">
<title>O modelo: GtkTreeModel e GtkTreeStore</title>
<para>
<classname>GtkTreeModel</classname> é a definição da interface para a parte de modelo do
<classname>GtkTreeView</classname>. O programador da aplicação pode definir o seu próprio modelo
mas o GtkTreeView provê os dois mais populares: uma lista linear
com <classname>GtkListStore</classname>, e uma arvore hierarquica com
<classname>GtkTreeStore</classname>. 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 <classname>GtkListStore</classname>, este artigo irá discutir
apenas o GtkTreeStore.
</para>
<para>
O primeiro passo é usar <classname>GtkTreeView</classname>, então, configurar um
<classname>GtkTreeStore</classname> 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.
</para>
<example>
<title>Modelo</title>
<programlisting role="php"><![CDATA[$model = new GtkTreeStore(Gtk::TYPE_PHP_VALUE, Gtk::TYPE_STRING);]]></programlisting>
</example>
<para>
Aqui nos criamos um <classname>GtkTreeStore</classname> 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
<link linkend="gtkenum">GTK Enums</link>.
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.
</para>
<note>
Não importa em qual ordem você define as colunas.
A ordem na qual <classname>GtkTreeStore</classname>
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.
</note>
<simpara>
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 <function class="GtkTreeStore">insert_before</function> no PHP.
</simpara>
<example>
<title>Criar Linha</title>
<programlisting role="php"><![CDATA[$folder = new_folder();
$iter = $model->insert_before(null, null);
$model->set($iter, 0, $folder);
$model->set($iter, 1, $folder['name']);]]></programlisting>
</example>
<simpara>
Este código primeiro insere uma linha em branco no modelo,
então define os valores em ambas as células.
</simpara>
<para>
Um GtkTreeModel permite ao programador se referir a linhas de várias maneiras.
Nós vemos mais aqui o objeto <classname>GtkTreeIter</classname>,
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.
</para>
<para>
Objetos <classname>GtkTreeIter</classname> são também usados como argumentos para
<function class="GtkTreeStore">insert_before</function>, para definir o parente
do novo ramo,
e vizinho que é para seguir o novo ramo. Se o parente for <literal>NULL</literal>,
como no exemplo acima, o novo ramo é adicionado para o nível superior,
e se o vizinho for <literal>NULL</literal>, então o ramo se torna
o ultimo filho do parente.
</para>
<simpara>
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.
</simpara>
<simpara>
Você também pode remover linhas (gtk_tree_store_remove a.k.a.
$model-><function class="GtkTreeStore">remove</function>).
Para outras operações, por favor veja a documentação de referência da API.
</simpara>
</sect1>
<sect1 id="tutorials.treeview.view">
<title>A visão: GtkTreeView, GtkTreeViewColumn, GtkCellRenderer</title>
<para>
O widget GtkTreeView é a visão na aproximação Modelo/Vista/Controlador.
Ela cuida de mostrar os dados guardados em um modelo
(<classname>GtkTreeStore</classname> ou <classname>GtkListStore</classname>)
para o usuário. Você pode ter vários
GtkTreeViews para um único modelo, e mudanças no modelo serão
exibidos automaticamente em todos eles.
</para>
<simpara>
Para usar o GtkTreeView, você precisa criar o widget em sí, então criar
<classname>GtkTreeViewColumn</classname>s para as colunas a exibir e
<classname>GtkCellRenderer</classname>s
para dizer para as colunas como exibir uma célula na coluna.
</simpara>
<example>
<title>TreeView e Renderer</title>
<programlisting role="php"><![CDATA[$view = new GtkTreeView($model);
$renderer = new GtkCellRendererText();
$column = new GtkTreeViewColumn("Folder", $renderer, "text", 1);
$view->append_column($column);]]></programlisting>
</example>
<simpara>
Este código cria um novo GtkTreeView a anexa-o ao modelo.
Então cria um cell renderer de texto e uma coluna e adiciona estes para
a visão. "Folder" é o nome da coluna, exibida ao topo
da coluna.
</simpara>
<para>
Existem vários <classname>GtkCellRenderer</classname>s na biblioteca Gtk+, e
você pode escrever o seu próprio, se estes não forem o suficiente.
</para>
<para>
As seleções do usuário em um GtkTreeView (por visão) são seguidas
usando o objeto <classname>GtkTreeSelection</classname>.
Se o seu código necessita saber quando
o usuário muda a seleção, conecte com o sinal
<signalname class="GtkTreeSelection">changed</signalname> do GtkTreeSelection.
Você também pode fazer o objeto da seleção chamar uma função
para cada ramo selecionado, ou mudar atráves de programação a
seleção. Veja a documentação da API para detalhes.
</para>
<example>
<title>O sinal "changed" da seleção</title>
<programlisting role="php"><![CDATA[$selection = $view->get_selection();
$selection->connect("changed", "display_selected_folder");]]></programlisting>
</example>
<para>
Este código conecta o sinal "changed" a função
(<literal>display_selected_folder()</literal>)
que exibe o conteúdo da pasta selecionada.
</para>
<simpara>
Você precisa dizer ao GtkTreeView explicitamente que é permitido ao
usuário rearanjar a arvore de pastas usando drag-and-drop. Felizmente,
após dizer isto uma vez, o widget se encarrega de cuidar do resto.
</simpara>
<example>
<title>Reordenando com Drag-and-Drop</title>
<programlisting role="php"><![CDATA[$view->set_reorderable(true);]]></programlisting>
<para>
Isto é tudo o que você precisa para ativar o drag-and-drop no widget.
</para>
</example>
<simpara>
A mesma coisa pode ser feita manualmente se você escolher não ativar
o drag-and-drop removendo o ramo filho da arvore e inserindo-o de volta
como filho de outro ramo.
</simpara>
<example>
<title>Reordenamento manual</title>
<programlisting role="php"><![CDATA[$folder = $model->get_value($old_iter, 0);
$model->remove($old_iter);
$new_iter = $model->insert_before($new_parent, null);
$model->set($new_iter, 0, $folder);
$model->set($new_iter, 1, $folder['name']);]]></programlisting>
</example>
<para>
Este código move um ramo de <literal>old_iter</literal> para ser o último filho
do ramo <literal>new_parent</literal>.
</para>
<simpara>
Quando este tutorial foi escrito/portado havia um bug no PHP-Gtk2 que
a ordem dos parãmetros para <function class="GtkTreeStore">insert_before</function>
e <function class="GtkTreeStore">insert_after</function> foram trocadas. O
código acima não irá funcionar (nem o código do exemplo abaixo) sem trocar a
ordem dos parâmetros. Na versão <literal>php-gtk-2.0.0 alpha</literal>,
a ordem ainda é <literal>(sibling, parent)</literal> e deveria ser
<literal>(parent, sibling)</literal>. Isto já foi modificado no CVS.
</simpara>
<example>
<title>Código fonte de exemplo</title>
<programlisting role="php">
<xi:include xmlns:xi="http://www.w3.org/2001/XInclude"
href="&directory.examples;/tutorials/treeview/full.phpw" parse="text">
<xi:fallback>FIXME: MISSING XINCLUDE CONTENT</xi:fallback>
</xi:include>
</programlisting>
</example>
</sect1>
</chapter>