|
| 1 | +use crate::oscillator::Params; |
| 2 | +use wasm_bindgen::{closure::Closure, JsCast, JsValue}; |
| 3 | +use web_sys::{AudioContext, HtmlInputElement, HtmlLabelElement}; |
| 4 | + |
| 5 | +pub fn create_gui(params: &'static Params, ctx: AudioContext) { |
| 6 | + let window = web_sys::window().unwrap(); |
| 7 | + let document = window.document().unwrap(); |
| 8 | + let body = document.body().unwrap(); |
| 9 | + |
| 10 | + let volume = add_slider(&document, &body, "Volume:").unwrap(); |
| 11 | + let frequency = add_slider(&document, &body, "Frequency:").unwrap(); |
| 12 | + volume.set_value("0"); |
| 13 | + frequency.set_min("20"); |
| 14 | + frequency.set_value("60"); |
| 15 | + |
| 16 | + let listener = Closure::<dyn FnMut(_)>::new(move |_: web_sys::Event| { |
| 17 | + params.set_frequency(frequency.value().parse().unwrap()); |
| 18 | + params.set_volume(volume.value().parse().unwrap()); |
| 19 | + ctx.resume().unwrap(); |
| 20 | + }) |
| 21 | + .into_js_value(); |
| 22 | + |
| 23 | + body.add_event_listener_with_callback("input", listener.as_ref().unchecked_ref()) |
| 24 | + .unwrap(); |
| 25 | +} |
| 26 | + |
| 27 | +fn add_slider( |
| 28 | + document: &web_sys::Document, |
| 29 | + body: &web_sys::HtmlElement, |
| 30 | + name: &str, |
| 31 | +) -> Result<HtmlInputElement, JsValue> { |
| 32 | + let input: HtmlInputElement = document.create_element("input")?.unchecked_into(); |
| 33 | + let label: HtmlLabelElement = document.create_element("label")?.unchecked_into(); |
| 34 | + input.set_type("range"); |
| 35 | + label.set_text_content(Some(name)); |
| 36 | + label.append_child(&input)?; |
| 37 | + body.append_child(&label)?; |
| 38 | + Ok(input) |
| 39 | +} |
0 commit comments