我有一个带有 Gtk::TreeModel 和 Gtk::TreeModelFilter 的 Gtk::TreeView。树模型是这样的:
category1
--> actual row of data
category2
--> actual row of data
我想过滤@search_entry 的内容,但如果category1 下的行仍然可见,则显示category1,如果category2 下没有行仍然可见,则隐藏category2。我对 Gtk::TreeModelFilter#set_visible_func 的理解是从“子模型”中获取模型和迭代器,这样就可以检查是否显示子迭代器。每次我调用 Gtk::TreeModelFilter#refilter 时,模型中的每个迭代都会调用此函数。因此我的意思是:如果您刚刚给我的迭代在第一级,则获取路径,降级,转换为过滤器模型上的相同路径,并使用新路径是否存在来测试可见性。
@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
线
has_visible_children = @tree_filter.convert_child_path_to_path(iter_path) ? true : false
导致每个迭代器的“此错误:堆栈级别太深”输出。
这里有一个无限递归,但我不知道它发生在哪里,也不知道如何避免它。我确定我在考虑这个错误的方式,但我已经在这几天没有突破。