egui_web glow painter: return errors instead of panic

This commit is contained in:
Emil Ernerfeldt 2022-01-31 19:15:48 +01:00
parent ef81a52951
commit 871a200ecf
3 changed files with 15 additions and 20 deletions

View File

@ -8,9 +8,9 @@ pub use egui::{pos2, Color32};
fn create_painter(canvas_id: &str) -> Result<Box<dyn Painter>, JsValue> { fn create_painter(canvas_id: &str) -> Result<Box<dyn Painter>, JsValue> {
// Glow takes precedence: // Glow takes precedence:
#[cfg(all(feature = "glow"))] #[cfg(all(feature = "glow"))]
return Ok(Box::new(crate::glow_wrapping::WrappedGlowPainter::new( return Ok(Box::new(
canvas_id, crate::glow_wrapping::WrappedGlowPainter::new(canvas_id).map_err(JsValue::from)?,
))); ));
#[cfg(all(feature = "webgl", not(feature = "glow")))] #[cfg(all(feature = "webgl", not(feature = "glow")))]
if let Ok(webgl2_painter) = webgl2::WebGl2Painter::new(canvas_id) { if let Ok(webgl2_painter) = webgl2::WebGl2Painter::new(canvas_id) {

View File

@ -1,4 +1,3 @@
use crate::{canvas_element_or_die, console_error};
use egui::{ClippedMesh, Rgba}; use egui::{ClippedMesh, Rgba};
use egui_glow::glow; use egui_glow::glow;
use wasm_bindgen::JsCast; use wasm_bindgen::JsCast;
@ -15,27 +14,21 @@ pub(crate) struct WrappedGlowPainter {
} }
impl WrappedGlowPainter { impl WrappedGlowPainter {
pub fn new(canvas_id: &str) -> Self { pub fn new(canvas_id: &str) -> Result<Self, String> {
let canvas = canvas_element_or_die(canvas_id); let canvas = crate::canvas_element_or_die(canvas_id);
let (glow_ctx, shader_prefix) = init_glow_context_from_canvas(&canvas); let (glow_ctx, shader_prefix) = init_glow_context_from_canvas(&canvas)?;
let dimension = [canvas.width() as i32, canvas.height() as i32]; let dimension = [canvas.width() as i32, canvas.height() as i32];
let painter = egui_glow::Painter::new(&glow_ctx, Some(dimension), shader_prefix) let painter = egui_glow::Painter::new(&glow_ctx, Some(dimension), shader_prefix)
.map_err(|error| { .map_err(|error| format!("Error starting glow painter: {}", error))?;
console_error(format!(
"some error occurred in initializing glow painter\n {}",
error
))
})
.unwrap();
Self { Ok(Self {
glow_ctx, glow_ctx,
canvas, canvas,
canvas_id: canvas_id.to_owned(), canvas_id: canvas_id.to_owned(),
painter, painter,
} })
} }
} }
@ -90,7 +83,9 @@ impl crate::Painter for WrappedGlowPainter {
} }
/// Returns glow context and shader prefix. /// Returns glow context and shader prefix.
fn init_glow_context_from_canvas(canvas: &HtmlCanvasElement) -> (glow::Context, &'static str) { fn init_glow_context_from_canvas(
canvas: &HtmlCanvasElement,
) -> Result<(glow::Context, &'static str), String> {
const BEST_FIRST: bool = true; const BEST_FIRST: bool = true;
let result = if BEST_FIRST { let result = if BEST_FIRST {
@ -103,9 +98,9 @@ fn init_glow_context_from_canvas(canvas: &HtmlCanvasElement) -> (glow::Context,
}; };
if let Some(result) = result { if let Some(result) = result {
result Ok(result)
} else { } else {
panic!("WebGL isn't supported"); Err("WebGL isn't supported".into())
} }
} }

View File

@ -35,7 +35,7 @@ impl WebGlPainter {
let gl = canvas let gl = canvas
.get_context("webgl")? .get_context("webgl")?
.ok_or_else(|| JsValue::from("Failed to get WebGl context"))? .ok_or_else(|| JsValue::from("Failed to get WebGL context"))?
.dyn_into::<WebGlRenderingContext>()?; .dyn_into::<WebGlRenderingContext>()?;
// -------------------------------------------------------------------- // --------------------------------------------------------------------