Comment créer une zone de liste à sélection multiple dans Ruby Glade / GTK, éventuellement à l'aide de TreeView?
Question
J'essaie de créer une liste à sélection multiple dans le programme Glade / Ruby et je me demande comment procéder, comme quel élément j'ajoute à la fenêtre et le code d'exemple correspondant que je peux utiliser. Je regardais GTKList mais il est dit que c'est obsolète maintenant et que je ne sais pas comment le faire fonctionner en rubis. Les documents de la liste GTK disent d’utiliser TreeView, mais je n’ai aucune idée de la façon de le configurer.
Pour que tout soit bien clair, j'aimerais quelque chose comme ceci, où l'utilisateur peut sélectionner plusieurs entrées:
texte alternatif http://geekswithblogs.net/images/geekswithblogs_net/dotNETvinz/Out .JPG
Merci pour l'aide les gars! Je suis vraiment désespéré sur cette question.
La solution
En gros, vous devez utiliser GtkTreeView et définir son "modèle". propriété à un GtkListStore qui contient vos données. GtkTreeView gère la sélection avec la classe GtkTreeSelection. Utilisez gtk_tree_view_get_selection (ou le mappage correspondant dans ruby-gtk) pour obtenir GtkTreeSelection. Et définissez le mode de sélection sur "plusieurs".
Voici un exemple en Python. En Ruby / Gtk, il devrait en être de même.
import pygtk
pygtk.require('2.0')
import gtk
import gobject
w = gtk.Window()
w.connect('destroy', lambda w:gtk.main_quit())
l = gtk.ListStore(gobject.TYPE_STRING)
l.append(('Vinz',))
l.append(('Jhen',))
l.append(('Chris',))
l.append(('Shynne',))
treeview = gtk.TreeView()
treeview.set_model(l)
column = gtk.TreeViewColumn()
cell = gtk.CellRendererText()
column.pack_start(cell)
column.add_attribute(cell,'text',0)
treeview.append_column(column)
treeview.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
def print_selected(treeselection):
(model,pathlist)=treeselection.get_selected_rows()
print pathlist
treeview.get_selection().connect('changed',lambda s: print_selected(s))
w.add(treeview)
w.show_all()
gtk.main()
Autres conseils
La réponse ci-dessus est correcte, mais si vous l’écriviez en utilisant visualruby, ce serait beaucoup plus facile:
class MyList < VR::Listview
def initialize(:employee_names => String)
add_row(:employee_names => "Vince")
add_row(:employee_names => "Jhen")
add_row(:employee_names => "Chris")
add_row(:employee_names => "Shynne")
end
end
Cela définirait tout exactement comme dans votre exemple, y compris le titre.
Ensuite, il vous suffit de l'ajouter à une boîte ou à une fenêtre de défilement:
class GUI
include GladeGUI
def initialize()
load_glade(__FILE__)
@builder("Scrolledwindow1").add(MyList.new)
show_window()
end
end
Allez à: