egui_web: Repaint at least every seconds

Just in case the app needs it, e.g. because it has finished a download.
This commit is contained in:
Emil Ernerfeldt 2020-11-18 01:07:32 +01:00
parent fad0029119
commit 86cfd0dcd3
2 changed files with 18 additions and 0 deletions

View file

@ -200,6 +200,7 @@ pub fn start(app_runner: AppRunner) -> Result<AppRunnerRef, JsValue> {
let runner_ref = AppRunnerRef(Arc::new(Mutex::new(app_runner))); let runner_ref = AppRunnerRef(Arc::new(Mutex::new(app_runner)));
install_canvas_events(&runner_ref)?; install_canvas_events(&runner_ref)?;
install_document_events(&runner_ref)?; install_document_events(&runner_ref)?;
repaint_every_ms(&runner_ref, 1000)?; // just in case. TODO: make it a parameter
paint_and_schedule(runner_ref.clone())?; paint_and_schedule(runner_ref.clone())?;
Ok(runner_ref) Ok(runner_ref)
} }

View file

@ -424,6 +424,23 @@ fn install_document_events(runner_ref: &AppRunnerRef) -> Result<(), JsValue> {
Ok(()) Ok(())
} }
/// Repaint at least every `ms` milliseconds.
fn repaint_every_ms(runner_ref: &AppRunnerRef, milliseconds: i32) -> Result<(), JsValue> {
assert!(milliseconds >= 0);
use wasm_bindgen::JsCast;
let window = web_sys::window().unwrap();
let runner_ref = runner_ref.clone();
let closure = Closure::wrap(Box::new(move || {
runner_ref.0.lock().needs_repaint = true;
}) as Box<dyn FnMut()>);
window.set_interval_with_callback_and_timeout_and_arguments_0(
closure.as_ref().unchecked_ref(),
milliseconds,
)?;
closure.forget();
Ok(())
}
fn modifiers_from_event(event: &web_sys::KeyboardEvent) -> egui::Modifiers { fn modifiers_from_event(event: &web_sys::KeyboardEvent) -> egui::Modifiers {
egui::Modifiers { egui::Modifiers {
alt: event.alt_key(), alt: event.alt_key(),