Обновление WebViews
Первой фичей, с нашим пользовательским интерфейсом, будет динамическое обновление web предпросмотра. Начнём с создания нового метода App::editor_changed() для App, который принимает компонент current_file и ссылку на кнопку save, для отключения и включения кнопки через некоторое время, чтобы указать, были ли сделаны изменения, требующие сохранения.
# #![allow(unused_variables)] #fn main() { /// Обновляет WebView при изменении SourceBuffer. fn editor_changed( &self, current_file: Arc<RwLock<Option<ActiveMetadata>>>, save_button: &Button, ) { let preview = self.content.preview.clone(); let save_button = save_button.clone(); self.content.source.buff.connect_changed(move |editor| { if let Some(markdown) = get_buffer(&editor) { preview.load_html(&render(&markdown), None); if let Some(ref current_file) = *current_file.read().unwrap() { let has_same_sum = current_file.is_same_as(&markdown.as_bytes()); save_button.set_sensitive(!has_same_sum); } } }); } #}
connect_changed()
В коде выше вы могли заметить, что мы вызываем метод connect_changed из исходного буфера, чтобы обновить просмотр и изменить кнопку сохранения, как только буфер будет изменён.
Получение текста из Source Buffer
Используем функцию get_buffer() из модуля misc.rs:
# #![allow(unused_variables)] #fn main() { if let Some(markdown) = get_buffer(&editor) { } #}
Мы можем получить текст в буфере редактора.
Обновление Web просмотра
# #![allow(unused_variables)] #fn main() { preview.load_html(&render(&markdown), None); #}
Здесь мы используем функцию render() из модуля preview
для преобразования Markdown
текста в HTML строку и незамедлительно
передаём этот HTML в наш preview
с помощью метода load_html().
Изменение кнопки Save
Этот раздел - последний фрагмент задачи, где мы получаем read-only блокировку для текущего файла и проверяем: генерируется ли текст в буфере с таким же хешем, как и хеш хранящийся на диске. Если хеш совпадает - кнопка сохранения будет неактивна. Если не совпадает - она будет активна.
# #![allow(unused_variables)] #fn main() { if let Some(ref current_file) = *current_file.read().unwrap() { let has_same_sum = current_file.is_same_as(&markdown.as_bytes()); save_button.set_sensitive(!has_same_sum); } #}