J'ai un Gtk :: TreeView avec un Gtk :: TreeModel et un Gtk :: TreeModelFilter. Le modèle d'arbre est comme ceci:Erreur de niveau de pile trop grave Ruby-Gnome2
category1
--> actual row of data
category2
--> actual row of data
Je veux filtrer le contenu de @search_entry, mais je veux category1 à afficher si une ligne en dessous est encore visible, et category2 à cacher s'il n'y a pas les rangées sous elle sont encore visibles. Ma compréhension de Gtk :: TreeModelFilter # set_visible_func est que vous obtenez le modèle et l'iter du "modèle enfant", de sorte que vous pouvez vérifier si vous voulez afficher l'enfant. Cette fonction est appelée sur chaque itérateur du modèle à chaque fois que j'appelle Gtk :: TreeModelFilter # refilter. Donc je dis: si l'iter que vous venez de me donner est au premier niveau, récupérez le chemin, descendez un, convertissez en le même chemin sur le modèle du filtre et utiliser si le nouveau chemin existe pour tester la visibilité.
@store = Gtk::TreeStore.new(Gdk::Pixbuf, String, String, Menagerie::Program, TrueClass)
@tree_filter = Gtk::TreeModelFilter.new(@store)
@treeview.model = @tree_filter
# @first_time gets set to false after the model is loaded the first time
@first_time = true
@tree_filter.set_visible_func do |model, iter|
has_visible_children = true
begin
iter_path = iter.path
if iter_path.depth == 1 && @first_time != true
iter_path.down!
has_visible_children = @tree_filter.convert_child_path_to_path(iter_path) ? true : false
end
rescue => e
puts "THIS ERROR: " + e.message
end
unless @search_entry.text == ""
if [1,2].collect {|i| iter[i] =~ /#{@search_entry.text}/i }.any?
true
elsif iter[4] == true and has_visible_children
true
else
false
end
else
true
end
end
La ligne
has_visible_children = @tree_filter.convert_child_path_to_path(iter_path) ? true : false
provoque une "cette erreur: niveau de pile trop profond" pour chaque sortie iter.
Il y a une récurrence infinie qui se passe ici, mais je ne vois pas où ça se passe ni comment je peux l'éviter. Je suis sûr que j'y pense de la mauvaise façon, mais je l'ai piraté quelques jours sans une percée.
D'accord, je vois. Nous pouvons tout comprendre à partir du TreeModel, sans nous soucier du TreeModelFilter. Et vous avez nettoyé mon code! Merci, Sarah. – method