[ruby-gnome2-doc-cvs] [Hiki] update - tut-treeview-model-reference

Back to archive index

ruby-gnome2-hiki-pt_BR****@sourc***** ruby-gnome2-hiki-pt_BR****@sourc*****
2004年 4月 11日 (日) 12:36:50 JST


-------------------------
REMOTE_ADDR = 200.216.145.78
REMOTE_HOST = 
        URL = http://ruby-gnome2.sourceforge.jp/pt_BR/?tut-treeview-model-reference
-------------------------
  = Referenciando a Linhas: Gtk::TreeIter, Gtk::TreePath, Gtk::TreeRowReference
  {{link "tut-treeview-model-data", "tut-treeview-model", "tut-treeview", "tut-treeview-model-add"}}
  
  Existem diferentes maneiras de referenciar a uma linha espec$ByG(Bica. As duas que vocterque lidar s$BeP(B o Gtk::TreeIter e o Gtk::TreePath.
  
  Um Gtk::TreePath uma maneira comparativamente direta de descrever a posi$Bne(Bo l$B(Bica de uma linha no "model". Como um Gtk::TreeView sempre mostra todas as linhas em um "model", um caminho de $BaS(Bvore ("tree path") sempre descreve a mesma linha em ambos, no "model" e no "view".
  
  {{image_right "treepath.png"}}
  
  A figura mostra o caminho de $BaS(Bvore em forma de string pr$B(Bimo ao r$B(Bulo. Basicamente, ele apenas conta os filhos da raiz ("root") imagin$BaS(Bia da "tree view". Uma string vazia de caminho de $BaS(Bvore especificaria essa raiz invis$ByW(Bel imagin$BaS(Bia. Agora 'Songs' o primeiro filho (a partir da raiz) e assim o seu caminho de $BaS(Bvore apenas "0". 'Videos' o segundo filho a partir da raiz, e eu caminho de $BaS(Bvore "1". 'oggs' o segundo filho do primeiro item a partir da raiz, assim o seu caminho de $BaS(Bvore "0:1". Ent$BeP(B vocapenas conta a partir do root para a linha em quest$BeP(B, e voce pega o seu caminho de $BaS(Bvore. Vocpode conseguir um novo Gtk::TreePath de um caminho em forma de string usando Gtk::TreePath.new, e vocpode converter um dado Gtk::TreePath na sua nota$Bne(Bo de string com Gtk::TreePath#to_str. Comumente vocraramente terque lidar com a nota$Bne(Bo de string, ela descrita meramente para demonstrar o conce
 ito de caminhos de $BaS(Bvore.
  
  Em vez de nota$Bne(Bo de string, o Gtk::TreePath usa um array de integer internamente. Vocpode pegar a profundidade (i.e., o n$ByW(Bel de  "nesting") de um caminho de $BaS(Bvore com Gtk::TreePath#depth. Uma profundidade de 0 o "node" da raiz invis$ByW(Bel imagin$BaS(Bia do "tree view" e do "model". Uma profundidade de 1 significa que o caminho de $BaS(Bvore descreve uma linha de n$ByW(Bel superior. Como as listas s$BeP(B apenas $BaS(Bvores sem "nodes" filhos, todas as linhas em uma lista sempre tem caminhos de $BaS(Bvores de profundidade 1. O Gtk::TreePath#indices retorna o array de integer interno de um caminho de $BaS(Bvore. Vocraramente precisaroperar com eles tamb$BqN(B.
  
  Se vocoperar com caminhos de $BaS(Bvores, sermais prov$BaW(Bel que vocuse um caminho de $BaS(Bvore dado, e use m$BqU(Bodos como  Gtk::TreePath#up!, Gtk::TreePath#down!, Gtk::TreePath#next!, Gtk::TreePath#prev!, Gtk::TreePath#ancestor?, Gtk::TreePath#decendent?. Note que dessa maneira vocpode construir e operar em caminhos de $BaS(Bvore que referem as linhas que n$BeP(B existem no "model" ou no "view".
  
  Outra maneira para referir a uma linha em uma lista ou "model" de $BaS(Bvore o Gtk::TreeIter. Um "iter" de $BaS(Bvore apenas uma estrutura que cont$BqN(B alguns ponteiros que significam alguma coisa para o "model" que vocestusando. "Iters" de $BaS(Bvore s$BeP(B usados internamente pelos "models", e eles frequentemente cont$BsN(B um ponteiro direto para os dados internos da linha em quest$BeP(B. Vocn$BeP(B deve nunca olhar no conte$B(Bo de um "iter" de $BaS(Bvore e vocn$BeP(B deve modificlo diretamente tamb$BqN(B. Todos os "models" de $BaS(Bvore prov$BsN(B m$BqU(Bodos que operam nos "iters" de $BaS(Bvore (ex.: pegue o "iter" de $BaS(Bvore para o filho de uma linha especificada poe um dado "iter" de $BaS(Bvore, etc.).
  
  "Iters" de $BaS(Bvore s$BeP(B frequentemente usados para recuperar dados de um armazenador, e para colocar dados em um armazenador. Voctamb$BqN(B pega um "iter" de $BaS(Bvore como resultado se vocadicionar uma nova linha ao armazenador usando Gtk::ListStore#append ou Gtk::TreeStore#append.
  
  "Iters" de $BaS(Bvore s$BeP(B frequentemente apenas v$BaM(Bidos por um curto per$ByP(Bdo de tempo, e podem tornar-se inv$BaM(Bidos se o armazenador for alterado. Assim comumente uma mid$BqJ(Ba armazenar "iters" de $BaS(Bvore. Vocpode usar Gtk::TreeModel#flags para pegar os "flags" de um "model", e checar se o "flag" ITERS_PERSIST estconfigurado (no caso de um "iter" de $BaS(Bvore estarv$BaM(Bido desde que a linha exista), mas existe uma maneira melhor de manter o controle de uma linha: Gtk::TreeRowReference.
  
  Um GtkTreeRowReference basicamente um objeto que leva um caminho de $BaS(Bvore, e assiste o "model" por altera$Bnw(Bes. Se algo for alterado, como linhas sendo inseridas ou removidas, ou linhas sendo reordenadas, o objeto de refer$BsO(Bcia de linha de $BaS(Bvore mantero dado caminho de $BaS(Bvore atualizado, assim ele sempre apontarpara a mesma linha de antes.
  
  Na pr$BaU(Bica um programador pode usar refer$BsO(Bcias de linha de $BaS(Bvore para manter o controle de linhas pelo tempo necess$BaS(Bio, ou armazenar "iters" de $BaS(Bvore diretamente (se, e apenas se, o "model" tem "iters" persistentes). Ambos o Gtk::ListStore e o Gtk::TreeStore t$BsN(B "iters" persistentes. Usar refer$BsO(Bcias de linha de $BaS(Bvore definitivamente a maneira certa de fazer as coisas, mas vem com um consider$BaW(Bel "overhead" que pode impactar a performance em caso de $BaS(Bvores que t$BsN(B uma grande quantidade de linhas.
  
  "Iters" de $BaS(Bvore podem facilmente ser convertidos em caminhos de $BaS(Bvore usando using Gtk::TreeIter#path, e caminhos de $BaS(Bvore podem facilmente ser convertidos em "iters" de $BaS(Bvore usando Gtk::TreeModel#get_iter. Refer$BsO(Bcias de linha de $BaS(Bvore revelam o caminho atual de uma linha com Gtk::TreeRowReference#.path. N$BeP(B existe uma maneira direta para pegar um "iter" de $BaS(Bvore de uma refer$BsO(Bcia de linha de $BaS(Bvore, voctem que recuperar o caminho da refer$BsO(Bcia de linha de $BaS(Bvore primeiro e ent$BeP(B convertlo em um "iter" de $BaS(Bvore.
  
  Como os "iters" de $BaS(Bvore s$BeP(B v$BaM(Bidos por um curto tempo, eles comumente s$BeP(B alocados no "heap", como o exemplo a seguir:
  
   def traverse_list_store (liststore)
     # pega a primeira linha em um armazenador de lista
     return unless iter = liststore.iter_first
  
     begin   
       # ... faz algo com essa linha usando o "iter" ...
       # (Aqui coluna 0 do armazenador de lista do tipo String)
       iter[0] = "Silva"
     end while iter.next!
  
     true
   end
  
  O c$B(Bigo acima pede para o "model" preencher a estrutura de "iter" para fazlo apontar para a primeira linha no armazenador de lista. Se existe uma primeira linhae o armazenador n$BeP(B estvazio, o "iter" serconfigurado, e o Gtk::TreeModel#iter_first retornarTRUE. Se n$BeP(B existe uma primeira linha, ele apenas retornarFALSE. Se uma primeira linha existe, o loop while seriniciado e n$B(B mudaremos algum dos dados da primeira linha. Ent$BeP(B a gente pede para que o "model" fa$BmB(B o dado "iter" apontar para a pr$B(Bima linha, atque n$BeP(B existem mais linhas, que serent$BeP(B que o Gtk::TreeIter#next! retornarFALSE. Em vez de navegar o armazenador de lista a gente podia tamb$BqN(B ter usado Gtk::TreeModel#each.
  
   liststore.each { |model,path,iter| iter[0]= "Silva" }





ruby-gnome2-cvs メーリングリストの案内
Back to archive index