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