Кажется, ничего не происходит при попытке добавить к `gtk :: ListBox` из обработчика событий в приложении GTK-RS - PullRequest
1 голос
/ 26 апреля 2020

Я пытаюсь добавить в gtk::ListBox контейнер из закрытия обработки события несвязанного виджета. Поле списка, о котором идет речь, извлекается через gtk::Builder, например, так:

let notes_list: gtk::ListBox = builder.get_object(NOTES_LIST_BOX_ID).unwrap();

И обработчик событий, в котором я не могу добавить notes_list (обратите внимание, что я пробовал без * Макрос 1007 *, с сильными и слабыми ссылками, обертывающий указатель Rc и т. Д. c., Но, похоже, ничего не меняется):

open_menu_item.connect_activate(clone!(@strong state, @strong notes_list => move |_| {
    println!("Open database menu item activated");

    // Seemingly can't add to notes_list from within this closure???
    notes_list.add(&gtk::Label::new(Some("TEST"))); // Doesn't work???

    let dialog = gtk::FileChooserDialog::with_buttons::<gtk::Window>(
        Some("Open database file"),
        None,
        gtk::FileChooserAction::Open,
        &[("_Cancel", gtk::ResponseType::Cancel),
          ("_Open", gtk::ResponseType::Accept)]
    );

    dialog.connect_response(clone!(@weak state, @weak notes_list => move |this, res| {
        if res == gtk::ResponseType::Accept {
            let file = this.get_file().unwrap();
            let path_buf = file.get_path().unwrap();

            println!("Opening database file: {}", path_buf.as_path().display());

            let mut state = state.borrow_mut();

            state.db = database::database_in_file(path_buf.as_path()).ok();
            state.update_notes_list(&notes_list);
        }

        this.close();
    }));

    dialog.show_all();
}));

Сообщение об ошибке не отображается - ожидаемое поведение (т. Е. добавление gtk::Label к списку) не происходит.

Полный код этого модуля (и остальная часть моего грязного кода): https://github.com/WiredSound/nos/blob/master/src/gui.rs

Если бы кто-нибудь мог помочь мне понять это, я был бы очень признателен, спасибо.

1 Ответ

1 голос
/ 28 апреля 2020

Виджеты в GTK3 по умолчанию скрыты. Это означает, что вызов show_all() для контейнера покажет все его current child. Если вы добавляете нового потомка, вы отвечаете за вызов show(), чтобы сделать его видимым.

В вашем обработчике сигналов вы добавляете gtk::Label в список, но вам также нужно сделать его видимым.

...