1
0
mirror of https://github.com/emilk/egui.git synced 2026-08-31 05:40:03 -04:00

Storage and frame refactor (#1418)

The purpose of this is to expose `frame.storage()` and `frame.storage_mut()` so users can save/load app state from the `App::update` function, without having to add another parameter to that function.

Changes:
* Added `Frame::storage()` and `Frame::storage_mut()`
* `App::update` now takes a `&mut Frame` rather than just `&Frame`
* `Frame` is no longer `Clone` or `Sync` (doesn't have to be since https://github.com/emilk/egui/pull/1366)
This commit is contained in:
Emil Ernerfeldt
2022-03-25 21:19:31 +01:00
committed by GitHub
parent bc0fdefceb
commit b7ebe16cfb
27 changed files with 157 additions and 199 deletions

View File

@@ -130,7 +130,6 @@ pub struct AppRunner {
pub(crate) input: WebInput,
app: Box<dyn epi::App>,
pub(crate) needs_repaint: std::sync::Arc<NeedRepaint>,
storage: LocalStorage,
last_save_time: f64,
screen_reader: crate::screen_reader::ScreenReader,
pub(crate) text_cursor_pos: Option<egui::Pos2>,
@@ -144,7 +143,7 @@ impl AppRunner {
let prefer_dark_mode = crate::prefer_dark_mode();
let frame = epi::Frame::new(epi::backend::FrameData {
let frame = epi::Frame {
info: epi::IntegrationInfo {
name: "egui_web",
web_info: Some(epi::WebInfo {
@@ -155,7 +154,8 @@ impl AppRunner {
native_pixels_per_point: Some(native_pixels_per_point()),
},
output: Default::default(),
});
storage: Some(Box::new(LocalStorage::default())),
};
let needs_repaint: std::sync::Arc<NeedRepaint> = Default::default();
@@ -175,12 +175,10 @@ impl AppRunner {
egui_ctx.set_visuals(egui::Visuals::light());
}
let storage = LocalStorage::default();
let app = app_creator(&epi::CreationContext {
egui_ctx: egui_ctx.clone(),
integration_info: frame.info(),
storage: Some(&storage),
storage: frame.storage(),
gl: painter.painter.gl().clone(),
});
@@ -191,7 +189,6 @@ impl AppRunner {
input: Default::default(),
app,
needs_repaint,
storage,
last_save_time: now_sec(),
screen_reader: Default::default(),
text_cursor_pos: None,
@@ -216,7 +213,9 @@ impl AppRunner {
if self.app.persist_egui_memory() {
save_memory(&self.egui_ctx);
}
self.app.save(&mut self.storage);
if let Some(storage) = self.frame.storage_mut() {
self.app.save(storage);
}
self.last_save_time = now;
}
}
@@ -247,7 +246,7 @@ impl AppRunner {
let raw_input = self.input.new_frame(canvas_size);
let full_output = self.egui_ctx.run(raw_input, |egui_ctx| {
self.app.update(egui_ctx, &self.frame);
self.app.update(egui_ctx, &mut self.frame);
});
let egui::FullOutput {
platform_output,
@@ -271,7 +270,7 @@ impl AppRunner {
} = app_output;
}
self.frame.lock().info.cpu_usage = Some((now_sec() - frame_start) as f32);
self.frame.info.cpu_usage = Some((now_sec() - frame_start) as f32);
Ok((needs_repaint, clipped_primitives))
}

View File

@@ -509,11 +509,9 @@ fn install_document_events(runner_container: &AppRunnerContainer) -> Result<(),
runner_container.add_event_listener(
&document,
"hashchange",
|_: web_sys::Event, runner_lock| {
let mut frame_lock = runner_lock.frame.lock();
|_: web_sys::Event, mut runner_lock| {
// `epi::Frame::info(&self)` clones `epi::IntegrationInfo`, but we need to modify the original here
if let Some(web_info) = &mut frame_lock.info.web_info {
if let Some(web_info) = &mut runner_lock.frame.info.web_info {
web_info.location.hash = location_hash();
}
},