如何为GTK输入完成编写自定义匹配功能?

时间:2019-08-28 15:35:19

标签: rust gtk

我想通过EntryCompletion对GTK set_match_func功能进行模糊搜索。文档非常有限。

请注意,该代码适用于默认的EntryCompletion

该函数应如下所示:

fn custom_entry_completion(store: &gtk::EntryCompletion, text: &str, ti: &gtk::TreeIter) -> bool {
    println!("{} // {:?}", text, ti);
    true
}

我想将其嵌入如下所示:

let completion_countries = gtk::EntryCompletion::new();
completion_countries.set_match_func(custom_entry_completion);

我想进行模糊匹配,但我想我会自己处理这一部分。最有用的例子是匹配不区分大小写或匹配字符串的最后部分(或其他内容)的示例。我正在寻找一个好的例子(最好是不安全的)和/或好的文档。

所以我需要从TreeIter中获取值,并检查匹配项是否符合我的期望。因此,我的问题是如何从TreeIter中获取要与之比较的text项。

1 个答案:

答案 0 :(得分:1)

文档

一个例子

fn custom_entry_completion(store: &gtk::EntryCompletion, text: &str, ti: &gtk::TreeIter) -> bool {
    let tree_model = store.get_model().unwrap();
    let text_column = store.get_text_column();

    let ti_text_value = tree_model.get_value(ti, text_column);

    if ti_text_value.is::<String>() {
        let value = ti_text_value.get::<String>().unwrap();
        println!("{:?} // {:?}", text, value);
    } else {
        println!("{:?} // not a string", text);
    }

    true
}

entry_completion.rs示例一起使用时的控制台输出:

"adfs" // "France"
"adfs" // "Italy"
"adfs" // "Italy"
"adfs" // "Sweden"
"adfs" // "Sweden"
"adfs" // "Switzerland"
"adfs" // "Switzerland"
"adfssdf" // "France"
"adfssdf" // "Italy"
"adfssdf" // "Sweden"
"adfssdf" // "Switzerland"