Создание событий

Именно здесь мы начнем творить волшебство для нашего пользовательского интерфейса. Посмотрите снова на модуль app.rs, потому что сейчас мы добавим метод App::connect_events().

ConnectedApp

Однако, прежде чем мы начнём, заранее создадим обёртку ConnectedApp, реализующую метод then_execute(), который мы видели ранее. Цель будет преобразовывать App в ConnectedApp после того, как в App будет вызван метод App::connect_events().


# #![allow(unused_variables)]
#fn main() {
/// Обёртка `App`, обеспечивывающая запуск программы.
pub struct ConnectedApp(App);

impl ConnectedApp {
    /// Покажем окно и запустим главный цикл событий GTK.
    pub fn then_execute(self) {
        self.0.window.show_all();
        gtk::main();
    }
}
#}

connect_events()

Продолжим и наконец-то добавим метод App::connect_events() в блок impl с типом App, в котором объявим право на владение App и вернём ConnectedApp в конец.


# #![allow(unused_variables)]
#fn main() {
/// Создадим внешнее состояние и сравним всю функциональность UI.
impl App {
    pub fn new() -> App { ... }

    pub fn connect_events(self) -> ConnectedApp {
        // Внешнее состояние для обмена событиями.
        let current_file = Arc::new(RwLock::new(None));

        // Соединим все события, с которыми будет взаимодействовать UI.
        self.editor_changed(
            current_file.clone(),
            &self.header.save.clone()
        );

        // Завернём `App` внутрь `ConnectedApp`, чтобы
        // выполнить программу.
        ConnectedApp(self)
    }
}
#}

С помощью типа ActiveMetadata, который мы создали ранее, создадим переменную RwLock'd current_file, которая содержит Option<ActiveMetadata>. По умолчанию, установленное значение равно None, т.к. сначала не будет доступного файла для отслеживания.

Первым событием будет изменение исходного буфера, который мы реализуем в методе App::editor_changed(). Этот метод будет принимать ссылку на RwLock'd current_file, а также ссылку на кнопку Save. Значение проходит через кнопку сохранения и изменяется в зависимости от чувствительности содержимого буфера.

Если кнопка неактивна, то вы не можете нажать на неё.