From 51666f34fde53953d6663275c49d20d21a77a534 Mon Sep 17 00:00:00 2001 From: Jean-Gabriel Gill-Couture Date: Mon, 19 Jun 2023 01:26:02 -0400 Subject: [PATCH] feat: Started working on canvas background, got something working in the end, wasted a lot of time figuring out dependencies --- Cargo.lock | 2 + Cargo.toml | 13 +++++- src/app.rs | 25 ++++++------ src/components/background.rs | 76 ++++++++++++++++++++++++++++++++++++ src/components/mod.rs | 2 + 5 files changed, 106 insertions(+), 12 deletions(-) create mode 100644 src/components/background.rs diff --git a/Cargo.lock b/Cargo.lock index 03e39c3..9b15ed4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1424,6 +1424,7 @@ dependencies = [ "cfg-if", "console_error_panic_hook", "console_log", + "js-sys", "leptos", "leptos_actix", "leptos_meta", @@ -1431,6 +1432,7 @@ dependencies = [ "log", "simple_logger", "wasm-bindgen", + "web-sys", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 064a9ce..ad16f45 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,7 +20,18 @@ leptos_actix = { version = "0.2", optional = true } leptos_router = { version = "0.2", default-features = false } log = "0.4" simple_logger = "4" -wasm-bindgen = "0.2" +wasm-bindgen = "=0.2.84" +js-sys = "0.3.51" + +[dependencies.web-sys] +version = "0.3.4" +features = [ + 'CanvasRenderingContext2d', + 'Document', + 'Element', + 'HtmlCanvasElement', + 'Window', +] [features] hydrate = ["leptos/hydrate", "leptos_meta/hydrate", "leptos_router/hydrate"] diff --git a/src/app.rs b/src/app.rs index 1861b63..49acffe 100644 --- a/src/app.rs +++ b/src/app.rs @@ -1,3 +1,5 @@ +use crate::components::BackgroundProps; +use crate::components::Background; use crate::routes::whymdc::*; use crate::routes::home::*; use crate::routes::blog::*; @@ -23,17 +25,18 @@ pub fn App(cx: Scope) -> impl IntoView { // content for this welcome page
-
- -
- - }/> - }/> - }/> - + +
+ +
+ + }/> + }/> + }/> +
diff --git a/src/components/background.rs b/src/components/background.rs new file mode 100644 index 0000000..7ae5502 --- /dev/null +++ b/src/components/background.rs @@ -0,0 +1,76 @@ + +use std::f64; +use leptos::html::Canvas; +use leptos::*; +use wasm_bindgen::JsCast; + +#[component] +pub fn Background(cx: Scope) -> impl IntoView { + let canvas = create_node_ref::(cx); + + canvas.on_load(cx, move |_| { + log!("in canvas"); + let context = canvas + .get() + .expect("canvas is mounted") + .get_context("2d") + .ok() + .flatten() + .expect("canvas to have context") + .unchecked_into::(); + log!("context = {:#?}", context); + context.begin_path(); + + // Draw the outer circle. + context + .arc(75.0, 75.0, 50.0, 0.0, f64::consts::PI * 2.0) + .unwrap(); + + // Draw the mouth. + context.move_to(110.0, 75.0); + context.arc(75.0, 75.0, 35.0, 0.0, f64::consts::PI).unwrap(); + + // Draw the left eye. + context.move_to(65.0, 65.0); + context + .arc(60.0, 65.0, 5.0, 0.0, f64::consts::PI * 2.0) + .unwrap(); + + // Draw the right eye. + context.move_to(95.0, 65.0); + context + .arc(90.0, 65.0, 5.0, 0.0, f64::consts::PI * 2.0) + .unwrap(); + + context.stroke(); + }); + view! { cx, +
+ +
+ } +} + +// #[component] +// fn ComponentA(cx: Scope) -> impl IntoView { +// let canvas = NodeRef::>::new(cx); +// let on_click = move |_| { +// // checks to see if node has been rendered +// let context = canvas.get() +// // if you're able to click the button, canvas should already be there +// .expect("canvas to have been mounted") +// // here's the getContext() call +// .get_context("2d") +// // it returns Result, ...> +// // so we massage the types a little +// .ok() +// .flatten() +// .expect("canvas to have context") +// .unchecked_into::(); +// leptos::log!("context = {:#?}", context); +// }; +// view! { cx, +// +// +// } +// } diff --git a/src/components/mod.rs b/src/components/mod.rs index 4470f23..d9ed078 100644 --- a/src/components/mod.rs +++ b/src/components/mod.rs @@ -1,4 +1,6 @@ mod codeblock; mod code; +mod background; pub use codeblock::*; pub use code::*; +pub use background::*;