Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

eframe web: access app from WebHandle #1886

Merged
merged 6 commits into from
Sep 9, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions crates/eframe/src/epi.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@

#![warn(missing_docs)] // Let's keep `epi` well-documented.

#[cfg(target_arch = "wasm32")]
use std::any::Any;

#[cfg(not(target_arch = "wasm32"))]
pub use crate::native::run::RequestRepaintEvent;
#[cfg(not(target_arch = "wasm32"))]
Expand Down Expand Up @@ -66,6 +69,15 @@ pub trait App {
/// To force a repaint, call [`egui::Context::request_repaint`] at any time (e.g. from another thread).
fn update(&mut self, ctx: &egui::Context, frame: &mut Frame);

/// Handle to the app.
///
/// Can be used from web to interact or other external context
/// Implementation is needed, because downcasting Box<dyn App> -> Box<dyn Any> to get &ConcreteApp is not simple in current rust.
///
/// Just return &mut *self
#[cfg(target_arch = "wasm32")]
fn as_any_mut(&mut self) -> &mut dyn Any;

/// Called on shutdown, and perhaps at regular intervals. Allows you to save state.
///
/// Only called when the "persistence" feature is enabled.
Expand Down
5 changes: 5 additions & 0 deletions crates/eframe/src/web/backend.rs
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,11 @@ impl AppRunner {
&self.egui_ctx
}

/// Get mutable access to the concrete [`App`] we enclose.
pub fn app_mut<ConreteApp: 'static + crate::App>(&mut self) -> &mut ConreteApp {
self.app.as_any_mut().downcast_mut::<ConreteApp>().unwrap()
}

pub fn auto_save(&mut self) {
let now = now_sec();
let time_since_last_save = now - self.last_save_time;
Expand Down
8 changes: 8 additions & 0 deletions crates/egui_demo_app/src/apps/custom3d_glow.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
use std::sync::Arc;

#[cfg(target_arch = "wasm32")]
use core::any::Any;

use eframe::egui_glow;
use egui::mutex::Mutex;
use egui_glow::glow;
Expand Down Expand Up @@ -48,6 +51,11 @@ impl eframe::App for Custom3d {
self.rotating_triangle.lock().destroy(gl);
}
}

#[cfg(target_arch = "wasm32")]
fn as_any_mut(&mut self) -> &mut dyn Any {
&mut *self
}
}

impl Custom3d {
Expand Down
8 changes: 8 additions & 0 deletions crates/egui_demo_app/src/apps/custom3d_wgpu.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
use std::sync::Arc;

#[cfg(target_arch = "wasm32")]
use core::any::Any;

use eframe::{
egui_wgpu::{self, wgpu},
wgpu::util::DeviceExt,
Expand Down Expand Up @@ -117,6 +120,11 @@ impl eframe::App for Custom3d {
});
});
}

#[cfg(target_arch = "wasm32")]
fn as_any_mut(&mut self) -> &mut dyn Any {
&mut *self
}
}

impl Custom3d {
Expand Down
8 changes: 8 additions & 0 deletions crates/egui_demo_app/src/apps/http_app.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
use egui_extras::RetainedImage;
use poll_promise::Promise;

#[cfg(target_arch = "wasm32")]
use core::any::Any;

struct Resource {
/// HTTP response
response: ehttp::Response,
Expand Down Expand Up @@ -106,6 +109,11 @@ impl eframe::App for HttpApp {
}
});
}

#[cfg(target_arch = "wasm32")]
fn as_any_mut(&mut self) -> &mut dyn Any {
&mut *self
}
}

fn ui_url(ui: &mut egui::Ui, frame: &mut eframe::Frame, url: &mut String) -> bool {
Expand Down
7 changes: 6 additions & 1 deletion crates/egui_demo_app/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ pub struct WebHandle {
#[wasm_bindgen]
impl WebHandle {
#[wasm_bindgen]
#[cfg(target_arch = "wasm32")]
pub fn stop_web(&self) -> Result<(), wasm_bindgen::JsValue> {
let mut app = self.handle.lock();
let res = app.destroy();
Expand All @@ -43,6 +42,12 @@ impl WebHandle {

res
}

#[wasm_bindgen]
pub fn set_some_content_from_javasript(&mut self, _some_data: &str) {
let _app = self.handle.lock().app_mut::<WrapApp>();
// _app.data = some_data;
}
}

#[cfg(target_arch = "wasm32")]
Expand Down
28 changes: 28 additions & 0 deletions crates/egui_demo_app/src/wrap_app.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ use egui_demo_lib::is_mobile;
#[cfg(feature = "glow")]
use eframe::glow;

#[cfg(target_arch = "wasm32")]
use core::any::Any;

#[derive(Default)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
struct EasyMarkApp {
Expand All @@ -13,6 +16,11 @@ impl eframe::App for EasyMarkApp {
fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
self.editor.panels(ctx);
}

#[cfg(target_arch = "wasm32")]
fn as_any_mut(&mut self) -> &mut dyn Any {
&mut *self
}
}

// ----------------------------------------------------------------------------
Expand All @@ -27,6 +35,11 @@ impl eframe::App for DemoApp {
fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
self.demo_windows.ui(ctx);
}

#[cfg(target_arch = "wasm32")]
fn as_any_mut(&mut self) -> &mut dyn Any {
&mut *self
}
}

// ----------------------------------------------------------------------------
Expand All @@ -46,6 +59,11 @@ impl eframe::App for FractalClockApp {
.ui(ui, Some(crate::seconds_since_midnight()));
});
}

#[cfg(target_arch = "wasm32")]
fn as_any_mut(&mut self) -> &mut dyn Any {
&mut *self
}
}

// ----------------------------------------------------------------------------
Expand All @@ -70,6 +88,11 @@ impl eframe::App for ColorTestApp {
});
});
}

#[cfg(target_arch = "wasm32")]
fn as_any_mut(&mut self) -> &mut dyn Any {
&mut *self
}
}

// ----------------------------------------------------------------------------
Expand Down Expand Up @@ -225,6 +248,11 @@ impl eframe::App for WrapApp {
custom3d.on_exit(gl);
}
}

#[cfg(target_arch = "wasm32")]
fn as_any_mut(&mut self) -> &mut dyn Any {
&mut *self
}
}

impl WrapApp {
Expand Down
5 changes: 5 additions & 0 deletions examples/custom_3d_three-d/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,11 @@ impl eframe::App for MyApp {
});
});
}

#[cfg(target_arch = "wasm32")]
fn as_any_mut(&mut self) -> &mut dyn Any {
&mut *self
}
}

/// We get a [`glow::Context`] from `eframe` and we want to construct a [`ThreeDApp`].
Expand Down