gtk-rs / gtk

DEPRECATED, use https://github.com/gtk-rs/gtk3-rs repository instead!
https://gtk-rs.org/
MIT License
1.25k stars 82 forks source link

EntryCompletion - selecting a completion suggestion clears the entry instead of setting it #773

Closed JMS55 closed 5 years ago

JMS55 commented 5 years ago
    let model = ListStore::new(&[str::static_type()]);
    model.insert_with_values(None, &[0], &[&"Abandoned Ship - Good Rod"]);
    model.insert_with_values(None, &[0], &[&"Abandoned Ship - Old Rod"]);
    model.insert_with_values(None, &[0], &[&"Abandoned Ship - Super Rod"]);
    model.insert_with_values(None, &[0], &[&"Abandoned Ship - Surfing"]);
    model.insert_with_values(None, &[0], &[&"Altering Cave"]);
    model.insert_with_values(None, &[0], &[&"Artisan Cave"]);
    model.insert_with_values(None, &[0], &[&"Cave of Origin - 1F"]);
    model.insert_with_values(None, &[0], &[&"Cave of Origin - B1f"]);
    model.insert_with_values(None, &[0], &[&"Cave of Origin - Entrance"]);
    model.insert_with_values(None, &[0], &[&"Desert Underpass"]);
    model.insert_with_values(None, &[0], &[&"Ever Grande City - Good Rod"]);
    model.insert_with_values(None, &[0], &[&"Ever Grande City - Old Rod"]);
    model.insert_with_values(None, &[0], &[&"Ever Grande City - Super Rod"]);
    model.insert_with_values(None, &[0], &[&"Ever Grande City - Surfing"]);
    model.insert_with_values(None, &[0], &[&"Fiery Path"]);
    model.insert_with_values(None, &[0], &[&"Fortree City - Good Rod"]);
    model.insert_with_values(None, &[0], &[&"Fortree City - Old Rod"]);
    model.insert_with_values(None, &[0], &[&"Fortree City - Super Rod"]);
    model.insert_with_values(None, &[0], &[&"Fortree City - Surfing"]);
    model.insert_with_values(None, &[0], &[&"Granite Cave - 1F - Land"]);
    model.insert_with_values(None, &[0], &[&"Granite Cave - B1F - Land"]);
    model.insert_with_values(None, &[0], &[&"Granite Cave - B2F - Land"]);
    model.insert_with_values(None, &[0], &[&"Granite Cave - Rock Smash"]);
    model.insert_with_values(None, &[0], &[&"Granite Cave - Steven's Room - Land"]);
    model.insert_with_values(None, &[0], &[&"Jagged Pass"]);

    let text_renderer = CellRendererText::new();
    text_renderer.set_alignment(0.5, 0.5);

    let combobox = ComboBox::new_with_model_and_entry(&model);
    combobox.pack_start(&text_renderer, false);
    combobox.add_attribute(&text_renderer, "text", 0);
    combobox.set_entry_text_column(0);

    let completion = EntryCompletion::new();
    completion.set_model(&model);
    completion.pack_start(&text_renderer, false);
    completion.add_attribute(&text_renderer, "text", 0);
    completion.set_match_func(|completion, user_input, model_iter| {
        let row = completion
            .get_model()
            .unwrap()
            .get_value(&model_iter, 0)
            .get::<&str>()
            .unwrap()
            .to_lowercase();
        for word in user_input.split(" ") {
            if !row.contains(word) {
                return false;
            }
        }
        true
    });

    // Neither the default function, nor a custom function work
    completion.connect_match_selected(|completion, model, model_iter| {
        completion
            .get_entry()
            .unwrap()
            .downcast::<Entry>()
            .unwrap()
            .set_text(model.get_value(&model_iter, 0).get::<&str>().unwrap());
        Inhibit(false)
    });

    let entry = combobox.get_child().unwrap().downcast::<Entry>().unwrap();
    entry.set_completion(Some(&completion));

    combobox // add this to a window or something
JMS55 commented 5 years ago

My bad actually, I needed to call completion.set_text_column(0);