[ruby-gnome2-doc-cvs] [Hiki] create - tut-treeview-selection-handle

Back to archive index

ruby-gnome2-hiki-pt_BR****@sourc***** ruby-gnome2-hiki-pt_BR****@sourc*****
2004年 4月 11日 (日) 00:32:08 JST


-------------------------
REMOTE_ADDR = 200.216.145.78
REMOTE_HOST = 
        URL = http://ruby-gnome2.sourceforge.jp/pt_BR/?tut-treeview-selection-handle
-------------------------
= Gerenciando Sele$Bgu(Bes
{{link "tut-treeview-renderer-bold", nil, "tut-treeview", "tut-treeview-selection-doubleclick"}}

Uma das habilidades mais b$BaT(Bicas de um "view" de lista ou $BaS(Bvore que as linhas podem ser selecionadas ou deselecionadas ("unselected"). As sele$Bnw(Bes s$BeP(B gerenciadas usand o objeto Gtk::TreeSelection de um "tree view". Todo "tree view" automaticamente tem um Gtk::TreeSelection associado a ele, e vocpode peglo usando Gtk::TreeView#selection. As sele$Bnw(Bes s$BeP(B gerenciadas completamente no lado do "tree view", o que significa que o "model" sabe nada sobre quais linhas est$BeP(B selecionadas ou n$BeP(B. N$BeP(B existe raz$BeP(B em particular de por quo gerenciamento de sele$Bne(Bo n$BeP(B poderia ter sido implementado com m$BqU(Bodos acessando o componente de "tree view" diretamente, mas por raz$B(Bs de clareza das "APIs" e de c$B(Bigo, os desenvolvedores da GTK+ decidiram criar esse objeto especial GtkTreeSelection que ent$BeP(B interamente lida com o componente "tree view". 

Existem tr$BsT(B maneiras de lidar com sele$Bnw(Bes de "tree view": vocpega uma lista de linhas atualmente selecionadas quando vocprecisa, por exemplo dentro de um m$BqU(Bodo de menu de contexto, ou vocmant$BqN(B o controle de todas as a$Bnw(Bes de sele$Bne(Bo e desele$Bne(Bo e mant$BqN(B uma lista por perto das linhas atualmente selecionadas para quando precisar; como um $B(Btimo recurso, voctamb$BqN(B pode navegar a sua lista ou $BaS(Bvore e verificar cada linha para verificar se ela estselecionada ou n$BeP(B (o que voctem que se vocse vocquiser todas as linhas que n$BeP(B est$BeP(B selecionadas, por exemplo).

== Modos de Sele$Bne(Bo

Vocpode usar Gtk::TreeSelection#mode= para influenciar a maneira que as sele$Bnw(Bes s$BeP(B gerenciadas. Existem quatro modos de sele$Bne(Bo: 

* Gtk::SELECTION_NONE - nenhum $ByU(Bem pode ser selecionado
* Gtk::SELECTION_SINGLE - apenas um $ByU(Bem pode ser selecionado
* Gtk::SELECTION_BROWSE - exatamente um $ByU(Bem estsempre selecionado
* Gtk::SELECTION_MULTIPLE - qualquer n$B(Bero de $ByU(Bems pode ser selecionado

== Pegando as Linhas que Est$BeP(B Atualmente Selecionadas

vocpode acessar as linhas selecionadas atualmente navegando todas as linhas selecionadas com Gtk::TreeSelection#selected_each.

Se o modo de sele$Bne(Bo que vocestusando for Gtk::SELECTION_SINGLE ou Gtk::SELECTION_BROWSE, a maneira mais conveniente de conseguir a linha selecionada com o m$BqU(Bodo Gtk::TreeSelection#selected, o qual retornarum Gtk::TreeIter apontando para a linha selecionada (se a linha estselecionada), ou nil de outro modo. Ele usado assim:

  selection = view.selection

  if iter = selection.selected
    puts "a linha selecionada #{iter[0]}"
  else
    puts "nenhuma linha selecionada"
  end

Uma coisa que vocprecisa ter cuidado ao remover linhas de um "model" com o m$BqU(Bodo Gtk::TreeSelection#selected_each method. A solu$Bne(Bo mais f$BaD(Bil para remover linhas m$B(Btiplas foi descrita ((<anteriormente|tut-treeview-model-remove>)), i.e., pega refer$BsO(Bcias de linha de $BaS(Bvore para todas as linhas selecionadas e ent$BeP(B remove as linhas uma por uma. Vocn$BeP(B pode remover as linhas de dentro do bloco de c$B(Bigo em qualquer caso, isso simplesmente n$BeP(B permitido.

Eis um exemplo de como usar Gtk::TreeSelection#selected_each:

  selection.selected_each do |model, path, iter|
    puts "#{iter[0]} estselecionado"
  end

== Usando Fun$Bnw(Bes de Sele$Bne(Bo

Vocpode configurar uma fun$Bne(Bo de sele$Bne(Bo "custom" com Gtk::TreeSelection#set_select_function. Esse bloco de c$B(Bigo serent$BeP(B chamado toda vez que uma linha for ser selecionada ou deselecionada (significando: ele serchamado antes que o status da sele$Bne(Bo dessa linha seja alterado). Fun$Bnw(Bes de sele$Bne(Bo s$BeP(B usadas comumente para as coisas a seguir:

* Manter o controle dos itens atualmente selecionados (ent$BeP(B vocmant$BqN(B uma lista de itens selecionados). Nesse caso, note novamente que o seu bloco de c$B(Bigo chamado antes que o status de sele$Bne(Bo da linha seja alterado. Em outras palavras: se a linha for ser selecionada, ent$BeP(B o argumento boolean path_currently_selected que passado ainda FALSE. Tamb$BqN(B note que ele pode n$BeP(B ser sempre chamado quando uma linha for removida, assim voctem que deselecionar a linha antes de vocremovla para ter certeza que a sua fun$Bne(Bo de sele$Bne(Bo seja chamada e remove a linha da sua lista, ou verificar a validade de uma linha quando vocprocessa a lista de sele$Bne(Bo que vocmant$BqN(B. Vocn$BeP(B deve armazenar os caminhos de $BaS(Bvore na sua lista de linhas selecionadas, porque sempre que as linhas forem adicionadas ou removidas ou o "model" for reordenado, os caminhos podem apontar para outras linhas. Use refer$BsO(Bcias de linhas de 
 $BaS(Bvore e outra maneira especial de identificar a linha.
* Dizer para a GTK+ se ela pode selecionar ou deselecionar uma linha espec$ByG(Bicar (Por outro lado, vocdeve certificar-se que $B(Bvio para o usu$BaS(Bio se uma linha pode ser selecionada ou n$BeP(B, porque o usu$BaS(Bio pode ficar confuso se ele simplesmente n$BeP(B puder selecionar ou deselecionar uma linha). Isso feito retornando TRUE ou FALSE.
* Tomando a$Bne(Bo adicional quando uma linha for selecionada ou n$BeP(B. 

Outro exemplo simples:

  selection.set_select_function do |selection, model, path, currently_selected|
    if iter = model.get_iter(path)
      if ! currently_selected
        puts "#{iter[0]} estquase para ser selecionada"
          else
        puts "#{iter[0]} estquase para ser deselecionada"
      end
    end

    # permite o estado de sele$Bne(Bo ser alterado
    true
  end

== Verificando se uma Linha EstSelecionada

Vocpode verificar se uma dada linha estselecionada ou n$BeP(B usando os m$BqU(Bodos Gtk::TreeSelection#iter_is_selected? e Gtk::TreeSelection#path_is_selected?. Se vocquiser saber todas as linhas que ((*n$BeP(B*)) est$BeP(B selecionadas, por exemplo, vocpoderia navegar a lista ou $BaS(Bvore inteira, e usar esses m$BqU(Bodos para verificar cada linha se ela estselecionada ou n$BeP(B.

== Selecionando e Deselecionando Linhas

Vocpod selecionar ou deselecionar linhas manualmente com Gtk::TreeSelection#select_iter, Gtk::TreeSelection#select_path, Gtk::TreeSelection#unselect_iter, Gtk::TreeSelection#unselect_path, Gtk::TreeSelection#select_all, e Gtk::TreeSelection#unselect_all, caso vocalgum dia precise fazer isso.

== Pegando o N$B(Bero de Linhas Selecionadas

Algumas vezes vocquer saber o n$B(Bero de linhas que est$BeP(B atualmente selecionadas (por exemplo para configurar entradas de menu de contexto ativa ou inativa antes de fazer aparecer um menu de contexto). Se vocestiver usando o modo de sele$Bne(Bo Gtk::SELECTION_SINGLE ou Gtk::SELECTION_BROWSE, isso trivial para checar com Gtk::TreeSelection#selected, o qual retornarum Gtk::TreeIter se uma linha estiver selecionada ou nil, caso contr$BaS(Bio. Obviamente, se vocestiver usando Gtk::SELECTION_NONE, o n$B(Bero de linhas selecionadas sersempre 0.

Se vocestiver usando Gtk::SELECTION_MULTIPLE ou quiser uma maneira mais geral que funciona para todos os modos, eis um m$BqU(Bodo simples, usando o m$BqU(Bodo Gtk::TreeSelection#selected_each:

  def count_selected_rows(selection)
    count = 0
    selection.selected_each { count += 1 }
    count
  end





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