From db30e552d2aff8cdc0446c43726d30f60629470c Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Wed, 26 Dec 2018 10:46:23 +0100 Subject: [PATCH] Add proper button function --- docs/emgui_bg.wasm | Bin 147138 -> 159333 bytes docs/frontend.js | 35 ++++++++---- docs/frontend.ts | 61 +++++++++++++++----- docs/index.html | 1 - src/app.rs | 28 +++++++++ src/gui.rs | 100 ++++++++++++++++++++++++++++++++ src/lib.rs | 138 +++++---------------------------------------- src/types.rs | 61 ++++++++++++++++++-- 8 files changed, 269 insertions(+), 155 deletions(-) create mode 100644 src/app.rs create mode 100644 src/gui.rs diff --git a/docs/emgui_bg.wasm b/docs/emgui_bg.wasm index 3856f3f0821b191a17816f61cc6f23dace1e7ba6..1855cb8efce6273f59d5bec4188588289fb98993 100644 GIT binary patch delta 46310 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 E7oQh1BLDyZ delta 37256 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 { - const mouse_pos = mouse_pos_from_event(canvas, evt); - paint_gui(canvas, mouse_pos); + g_mouse_pos = mouse_pos_from_event(canvas, evt); + paint_gui(canvas, get_input(canvas)); + }, + false, + ); + + canvas.addEventListener( + "mouseleave", + (evt) => { + g_mouse_pos = { x: -1000.0, y: -1000.0 }; + paint_gui(canvas, get_input(canvas)); }, false, ); @@ -189,11 +211,22 @@ function initialize() { canvas.addEventListener( "mousedown", (evt) => { - const mouse_pos = mouse_pos_from_event(canvas, evt); - paint_gui(canvas, mouse_pos); + g_mouse_pos = mouse_pos_from_event(canvas, evt); + g_mouse_down = true; + paint_gui(canvas, get_input(canvas)); }, false, ); - paint_gui(canvas, { x: 0, y: 0 }); + canvas.addEventListener( + "mouseup", + (evt) => { + g_mouse_pos = mouse_pos_from_event(canvas, evt); + g_mouse_down = false; + paint_gui(canvas, get_input(canvas)); + }, + false, + ); + + paint_gui(canvas, get_input(canvas)); } diff --git a/docs/index.html b/docs/index.html index 13f8a303..2308071f 100644 --- a/docs/index.html +++ b/docs/index.html @@ -41,4 +41,3 @@ - diff --git a/src/app.rs b/src/app.rs new file mode 100644 index 00000000..e9e885d7 --- /dev/null +++ b/src/app.rs @@ -0,0 +1,28 @@ +use gui::Gui; + +pub struct App { + count: i32, +} + +impl App { + pub fn new() -> Self { + App { count: 0 } + } + + pub fn show_gui(&mut self, gui: &mut Gui) { + if gui.button("Click me").clicked { + self.count += 1; + } + if gui.button("Or click me instead!").clicked { + self.count += 1; + } + + gui.label(format!( + "The buttons have been clicked {} times", + self.count + )); + + let commands_json = serde_json::to_string_pretty(&gui.paint_commands()).unwrap(); + gui.label(format!("All paint commands:\n{}", commands_json)); + } +} diff --git a/src/gui.rs b/src/gui.rs new file mode 100644 index 00000000..2f268a90 --- /dev/null +++ b/src/gui.rs @@ -0,0 +1,100 @@ +use types::*; + +#[derive(Default)] +pub struct InteractInfo { + pub hovering: bool, + pub clicked: bool, +} + +// TODO: implement Gui on this so we can add children to a widget +// pub struct Widget {} + +pub struct Gui { + commands: Vec, + input: GuiInput, + + cursor: Vec2, +} + +impl Gui { + pub fn new(input: GuiInput) -> Self { + Gui { + commands: vec![PaintCmd::Clear { + fill_style: "#44444400".to_string(), + }], + input, + cursor: Vec2 { x: 32.0, y: 32.0 }, + } + } + + pub fn input(&self) -> &GuiInput { + &self.input + } + + pub fn into_commands(self) -> Vec { + self.commands + } + + pub fn paint_commands(&self) -> &[PaintCmd] { + &self.commands + } + + fn rect(&mut self, rect: Rect, fill_style: String) -> InteractInfo { + let hovering = rect.contains(self.input.mouse_pos); + let clicked = hovering && self.input.mouse_clicked; + let ii = InteractInfo { hovering, clicked }; + self.commands.push(PaintCmd::RoundedRect { + fill_style, + pos: rect.pos, + corner_radius: 5.0, + size: rect.size, + }); + ii + } + + fn text>(&mut self, pos: Vec2, text: S) { + self.commands.push(PaintCmd::Text { + fill_style: "#ffffffbb".to_string(), + font: "14px Palatino".to_string(), + pos, + text: text.into(), + text_align: TextAlign::Start, + }); + } + + // ------------------------------------------------------------------------ + + pub fn button>(&mut self, text: S) -> InteractInfo { + let rect = Rect { + pos: self.cursor, + size: Vec2 { x: 200.0, y: 32.0 }, // TODO: get from some settings + }; + let hovering = rect.contains(self.input.mouse_pos); + let fill_style = if hovering { + "#444444ff".to_string() + } else { + "#222222ff".to_string() + }; + let ii = self.rect(rect, fill_style); + self.text( + Vec2 { + x: rect.pos.x + 4.0, + y: rect.center().y + 14.0 / 2.0, + }, + text, + ); + self.cursor.y += rect.size.y + 16.0; + ii + } + + pub fn label>(&mut self, text: S) { + for line in text.into().split("\n") { + let pos = self.cursor; + self.text(pos, line); + self.cursor.y += 16.0; + } + self.cursor.y += 16.0; // Padding + } + + // ------------------------------------------------------------------------ +} diff --git a/src/lib.rs b/src/lib.rs index 00d3383f..34140abb 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -11,10 +11,12 @@ use std::sync::Mutex; use wasm_bindgen::prelude::*; -mod types; - use types::*; +pub mod app; +pub mod gui; +pub mod types; + /* // Fast compilation, slow code: @@ -30,133 +32,21 @@ fn foo(x: &dyn T); fn foo(x: &Trait); */ -#[derive(Default)] -pub struct InteractInfo { - pub is_hovering: bool, -} - -// TODO: implement Gui on this so we can add children to a widget -// pub struct Widget {} - -pub struct Gui { - commands: Vec, - input: Input, -} - -impl Gui { - pub fn new(input: Input) -> Self { - Gui { - commands: vec![PaintCmd::Clear { - fill_style: "#44444400".to_string(), - }], - input, - } - } - - pub fn input(&self) -> &Input { - &self.input - } - - pub fn into_commands(self) -> Vec { - self.commands - } - - pub fn rect(&mut self, rect: Rect) -> InteractInfo { - let ii = InteractInfo { - is_hovering: rect.contains(&self.input.mouse_pos), - }; - self.commands.push(PaintCmd::RoundedRect { - fill_style: "#ffffff10".to_string(), - pos: rect.pos, - corner_radius: 40.0, - size: rect.size, - }); - ii - } - - pub fn text(&mut self, pos: Vec2, text: String) { - self.commands.push(PaintCmd::Text { - fill_style: "#11ff00".to_string(), - font: "14px Palatino".to_string(), - pos, - text, - text_align: TextAlign::Start, - }); - } -} - -struct App { - count: i32, -} - -impl App { - fn new() -> Self { - App { count: 0 } - } - - fn show_gui(&mut self, gui: &mut Gui, input: &Input) { - gui.rect(Rect { - pos: Vec2 { x: 0.0, y: 0.0 }, - size: input.screen_size, - }); - - gui.rect(Rect { - pos: Vec2 { x: 50.0, y: 50.0 }, - size: Vec2 { - x: (input.screen_size.x - 100.0) / 3.0, - y: (input.screen_size.y - 100.0), - }, - }); - - let is_hovering = gui - .rect(Rect { - pos: Vec2 { x: 100.0, y: 100.0 }, - size: Vec2 { x: 200.0, y: 200.0 }, - }).is_hovering; - - if is_hovering { - self.count += 1; - } - - gui.text( - Vec2 { x: 100.0, y: 350.0 }, - format!( - "Mouse pos: {} {}, is_hovering: {}", - input.mouse_pos.x, input.mouse_pos.y, is_hovering - ), - ); - - let m = input.mouse_pos; - let hw = 32.0; - gui.rect(Rect { - pos: Vec2 { - x: m.x - hw, - y: m.y - hw, - }, - size: Vec2 { - x: 2.0 * hw, - y: 2.0 * hw, - }, - }); - - gui.text( - Vec2 { x: 100.0, y: 400.0 }, - format!("Count: {}", self.count), - ); - } -} - #[wasm_bindgen] -pub fn show_gui(input_json: &str) -> String { +pub fn show_gui(raw_input_json: &str) -> String { + // TODO: faster interface than JSON + let raw_input: RawInput = serde_json::from_str(raw_input_json).unwrap(); + lazy_static::lazy_static! { - static ref APP: Mutex = Mutex::new(App::new()); + static ref APP: Mutex = Mutex::new(app::App::new()); + static ref LAST_INPUT: Mutex = Default::default(); } - // TODO: faster interface than JSON - let input: Input = serde_json::from_str(input_json).unwrap(); + let gui_input = GuiInput::from_last_and_new(&LAST_INPUT.lock().unwrap(), &raw_input); + *LAST_INPUT.lock().unwrap() = raw_input; - let mut gui = Gui::new(input); - APP.lock().unwrap().show_gui(&mut gui, &input); + let mut gui = gui::Gui::new(gui_input); + APP.lock().unwrap().show_gui(&mut gui); let commands = gui.into_commands(); serde_json::to_string(&commands).unwrap() } diff --git a/src/types.rs b/src/types.rs index c66535fb..d25efe8a 100644 --- a/src/types.rs +++ b/src/types.rs @@ -1,30 +1,79 @@ -#[derive(Clone, Copy, Debug, Deserialize, Serialize)] +#[derive(Clone, Copy, Debug, Default, Deserialize, Serialize)] pub struct Vec2 { pub x: f32, pub y: f32, } -#[derive(Clone, Copy, Debug, Deserialize, Serialize)] +#[derive(Clone, Copy, Debug, Default, Deserialize, Serialize)] pub struct Rect { pub pos: Vec2, pub size: Vec2, } impl Rect { - pub fn contains(&self, p: &Vec2) -> bool { + pub fn contains(&self, p: Vec2) -> bool { self.pos.x <= p.x && p.x <= self.pos.x + self.size.x && self.pos.y <= p.y && p.y <= self.pos.y + self.size.y } + + pub fn center(&self) -> Vec2 { + Vec2 { + x: self.pos.x + self.size.x / 2.0, + y: self.pos.y + self.size.y / 2.0, + } + } } -#[derive(Clone, Copy, Debug, Deserialize)] -pub struct Input { - pub screen_size: Vec2, +// ---------------------------------------------------------------------------- + +/// What the integration gives to the gui. +#[derive(Clone, Copy, Debug, Default, Deserialize)] +pub struct RawInput { + /// Is the button currently down? + pub mouse_down: bool, + + /// Current position of the mouse in points. pub mouse_pos: Vec2, + + /// Size of the screen in points. + pub screen_size: Vec2, } +/// What the gui maintains +#[derive(Clone, Copy, Debug)] +pub struct GuiInput { + /// Is the button currently down? + pub mouse_down: bool, + + /// The mouse went from !down to down + pub mouse_clicked: bool, + + /// The mouse went from down to !down + pub mouse_released: bool, + + /// Current position of the mouse in points. + pub mouse_pos: Vec2, + + /// Size of the screen in points. + pub screen_size: Vec2, +} + +impl GuiInput { + pub fn from_last_and_new(last: &RawInput, new: &RawInput) -> GuiInput { + GuiInput { + mouse_down: new.mouse_down, + mouse_clicked: !last.mouse_down && new.mouse_down, + mouse_released: last.mouse_down && !new.mouse_down, + mouse_pos: new.mouse_pos, + screen_size: new.screen_size, + } + } +} + +// ---------------------------------------------------------------------------- + #[derive(Clone, Copy, Debug, Serialize)] #[serde(rename_all = "snake_case")] pub enum TextAlign {