Remove 'Web' from GuiInput
This commit is contained in:
parent
555d7aed20
commit
ae6080405c
8 changed files with 63 additions and 66 deletions
1
Cargo.lock
generated
1
Cargo.lock
generated
|
@ -379,6 +379,7 @@ dependencies = [
|
||||||
"emigui 0.1.0",
|
"emigui 0.1.0",
|
||||||
"emigui_wasm 0.1.0",
|
"emigui_wasm 0.1.0",
|
||||||
"serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)",
|
"serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"serde_derive 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"serde_json 1.0.53 (registry+https://github.com/rust-lang/crates.io-index)",
|
"serde_json 1.0.53 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"wasm-bindgen 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
|
"wasm-bindgen 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
|
@ -55,11 +55,19 @@
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
var g_wasm_app = null;
|
var g_wasm_app = null;
|
||||||
|
|
||||||
function paint_gui(canvas, input) {
|
function paint_gui(canvas) {
|
||||||
if (g_wasm_app === null) {
|
if (g_wasm_app === null) {
|
||||||
g_wasm_app = wasm_bindgen.new_webgl_gui("canvas", pixels_per_point());
|
g_wasm_app = wasm_bindgen.new_webgl_gui("canvas", pixels_per_point());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let input = {
|
||||||
|
emigui: get_emigui_input(canvas),
|
||||||
|
web: {
|
||||||
|
location: window.location.toString(),
|
||||||
|
location_hash: window.location.hash.toString(), // i.e. #fragment
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
let output = JSON.parse(wasm_bindgen.run_gui(g_wasm_app, JSON.stringify(input)));
|
let output = JSON.parse(wasm_bindgen.run_gui(g_wasm_app, JSON.stringify(input)));
|
||||||
// console.log(`output: ${JSON.stringify(output)}`);
|
// console.log(`output: ${JSON.stringify(output)}`);
|
||||||
document.body.style.cursor = from_emigui_cursor(output.cursor_icon);
|
document.body.style.cursor = from_emigui_cursor(output.cursor_icon);
|
||||||
|
@ -103,7 +111,7 @@
|
||||||
canvas.height = window.innerHeight * pixels_per_point();
|
canvas.height = window.innerHeight * pixels_per_point();
|
||||||
}
|
}
|
||||||
|
|
||||||
function get_input(canvas) {
|
function get_emigui_input(canvas) {
|
||||||
var input = {
|
var input = {
|
||||||
mouse_down: g_mouse_down,
|
mouse_down: g_mouse_down,
|
||||||
mouse_pos: g_mouse_pos,
|
mouse_pos: g_mouse_pos,
|
||||||
|
@ -113,11 +121,6 @@
|
||||||
time: window.performance.now() / 1000.0,
|
time: window.performance.now() / 1000.0,
|
||||||
seconds_since_midnight: seconds_since_midnight(),
|
seconds_since_midnight: seconds_since_midnight(),
|
||||||
events: g_events,
|
events: g_events,
|
||||||
|
|
||||||
web: {
|
|
||||||
location: window.location.toString(),
|
|
||||||
location_hash: window.location.hash.toString(), // i.e. #fragment
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
g_scroll_delta_x = 0;
|
g_scroll_delta_x = 0;
|
||||||
g_scroll_delta_y = 0;
|
g_scroll_delta_y = 0;
|
||||||
|
@ -146,7 +149,7 @@
|
||||||
function paint() {
|
function paint() {
|
||||||
var canvas = document.getElementById("canvas");
|
var canvas = document.getElementById("canvas");
|
||||||
auto_resize_canvas(canvas);
|
auto_resize_canvas(canvas);
|
||||||
paint_gui(canvas, get_input(canvas));
|
paint_gui(canvas);
|
||||||
}
|
}
|
||||||
|
|
||||||
function paint_and_schedule() {
|
function paint_and_schedule() {
|
||||||
|
|
|
@ -13,7 +13,7 @@ pub fn criterion_benchmark(c: &mut Criterion) {
|
||||||
b.iter(|| {
|
b.iter(|| {
|
||||||
ctx.begin_frame(raw_input.clone());
|
ctx.begin_frame(raw_input.clone());
|
||||||
let mut ui = ctx.fullscreen_ui();
|
let mut ui = ctx.fullscreen_ui();
|
||||||
example_app.ui(&mut ui);
|
example_app.ui(&mut ui, "");
|
||||||
ctx.end_frame()
|
ctx.end_frame()
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
|
@ -10,6 +10,8 @@ use crate::{color::*, containers::*, examples::FractalClock, widgets::*, *};
|
||||||
#[derive(Default, Deserialize, Serialize)]
|
#[derive(Default, Deserialize, Serialize)]
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub struct ExampleApp {
|
pub struct ExampleApp {
|
||||||
|
previous_web_location_hash: String,
|
||||||
|
|
||||||
open_windows: OpenWindows,
|
open_windows: OpenWindows,
|
||||||
// TODO: group the following together as ExampleWindows
|
// TODO: group the following together as ExampleWindows
|
||||||
example_window: ExampleWindow,
|
example_window: ExampleWindow,
|
||||||
|
@ -17,7 +19,20 @@ pub struct ExampleApp {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ExampleApp {
|
impl ExampleApp {
|
||||||
pub fn ui(&mut self, ui: &mut Ui) {
|
/// `web_location_hash`: for web demo only. e.g. "#fragmet".
|
||||||
|
pub fn ui(&mut self, ui: &mut Ui, web_location_hash: &str) {
|
||||||
|
if self.previous_web_location_hash != web_location_hash {
|
||||||
|
// #fragment end of URL:
|
||||||
|
if web_location_hash == "#clock" {
|
||||||
|
self.open_windows = OpenWindows {
|
||||||
|
fractal_clock: true,
|
||||||
|
..OpenWindows::none()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
self.previous_web_location_hash = web_location_hash.to_owned();
|
||||||
|
}
|
||||||
|
|
||||||
show_menu_bar(ui, &mut self.open_windows);
|
show_menu_bar(ui, &mut self.open_windows);
|
||||||
self.windows(ui.ctx());
|
self.windows(ui.ctx());
|
||||||
}
|
}
|
||||||
|
@ -31,24 +46,9 @@ impl ExampleApp {
|
||||||
open_windows,
|
open_windows,
|
||||||
example_window,
|
example_window,
|
||||||
fractal_clock,
|
fractal_clock,
|
||||||
|
..
|
||||||
} = self;
|
} = self;
|
||||||
|
|
||||||
if ctx.previus_input().web != ctx.input().web {
|
|
||||||
let location_hash = ctx
|
|
||||||
.input()
|
|
||||||
.web
|
|
||||||
.as_ref()
|
|
||||||
.map(|web| web.location_hash.as_str());
|
|
||||||
|
|
||||||
// #fragment end of URL:
|
|
||||||
if location_hash == Some("#clock") {
|
|
||||||
*open_windows = OpenWindows {
|
|
||||||
fractal_clock: true,
|
|
||||||
..OpenWindows::none()
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Window::new("Examples")
|
Window::new("Examples")
|
||||||
.open(&mut open_windows.examples)
|
.open(&mut open_windows.examples)
|
||||||
.default_pos(pos2(32.0, 100.0))
|
.default_pos(pos2(32.0, 100.0))
|
||||||
|
|
|
@ -31,9 +31,6 @@ pub struct RawInput {
|
||||||
|
|
||||||
/// In-order events received this frame
|
/// In-order events received this frame
|
||||||
pub events: Vec<Event>,
|
pub events: Vec<Event>,
|
||||||
|
|
||||||
/// Web-only input
|
|
||||||
pub web: Option<Web>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// What emigui maintains
|
/// What emigui maintains
|
||||||
|
@ -61,9 +58,6 @@ pub struct GuiInput {
|
||||||
|
|
||||||
/// In-order events received this frame
|
/// In-order events received this frame
|
||||||
pub events: Vec<Event>,
|
pub events: Vec<Event>,
|
||||||
|
|
||||||
/// Web-only input
|
|
||||||
pub web: Option<Web>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// What emigui maintains
|
/// What emigui maintains
|
||||||
|
@ -91,14 +85,6 @@ pub struct MouseInput {
|
||||||
pub velocity: Vec2,
|
pub velocity: Vec2,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Default, Eq, Ord, PartialEq, PartialOrd, Deserialize)]
|
|
||||||
#[serde(default)]
|
|
||||||
pub struct Web {
|
|
||||||
pub location: String,
|
|
||||||
/// i.e. "#fragment"
|
|
||||||
pub location_hash: String,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, Debug, Eq, Ord, PartialEq, PartialOrd, Deserialize)]
|
#[derive(Clone, Debug, Eq, Ord, PartialEq, PartialOrd, Deserialize)]
|
||||||
#[serde(rename_all = "snake_case")]
|
#[serde(rename_all = "snake_case")]
|
||||||
pub enum Event {
|
pub enum Event {
|
||||||
|
@ -149,27 +135,32 @@ impl GuiInput {
|
||||||
dt,
|
dt,
|
||||||
seconds_since_midnight: new.seconds_since_midnight,
|
seconds_since_midnight: new.seconds_since_midnight,
|
||||||
events: new.events.clone(),
|
events: new.events.clone(),
|
||||||
web: new.web.clone(),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl MouseInput {
|
impl MouseInput {
|
||||||
pub fn from_last_and_new(last: &RawInput, new: &RawInput) -> MouseInput {
|
pub fn from_last_and_new(last: &GuiInput, new: &RawInput) -> MouseInput {
|
||||||
let delta = new
|
let delta = new
|
||||||
.mouse_pos
|
.mouse_pos
|
||||||
.and_then(|new| last.mouse_pos.map(|last| new - last))
|
.and_then(|new| last.mouse.pos.map(|last| new - last))
|
||||||
.unwrap_or_default();
|
.unwrap_or_default();
|
||||||
let dt = (new.time - last.time) as f32;
|
let dt = (new.time - last.time) as f32;
|
||||||
let mut velocity = delta / dt;
|
let mut velocity = delta / dt;
|
||||||
if !velocity.is_finite() {
|
if !velocity.is_finite() {
|
||||||
velocity = Vec2::zero();
|
velocity = Vec2::zero();
|
||||||
}
|
}
|
||||||
|
let pressed = !last.mouse.down && new.mouse_down;
|
||||||
|
let mut press_origin = last.mouse.press_origin;
|
||||||
|
if pressed {
|
||||||
|
press_origin = new.mouse_pos;
|
||||||
|
}
|
||||||
MouseInput {
|
MouseInput {
|
||||||
down: new.mouse_down && new.mouse_pos.is_some(),
|
down: new.mouse_down && new.mouse_pos.is_some(),
|
||||||
pressed: !last.mouse_down && new.mouse_down,
|
pressed,
|
||||||
released: last.mouse_down && !new.mouse_down,
|
released: last.mouse.down && !new.mouse_down,
|
||||||
pos: new.mouse_pos,
|
pos: new.mouse_pos,
|
||||||
|
press_origin,
|
||||||
delta,
|
delta,
|
||||||
velocity,
|
velocity,
|
||||||
}
|
}
|
||||||
|
@ -188,9 +179,6 @@ impl RawInput {
|
||||||
ui.add(label!("pixels_per_point: {:?}", self.pixels_per_point));
|
ui.add(label!("pixels_per_point: {:?}", self.pixels_per_point));
|
||||||
ui.add(label!("time: {:.3} s", self.time));
|
ui.add(label!("time: {:.3} s", self.time));
|
||||||
ui.add(label!("events: {:?}", self.events));
|
ui.add(label!("events: {:?}", self.events));
|
||||||
if let Some(web) = &self.web {
|
|
||||||
web.ui(ui);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -207,9 +195,6 @@ impl GuiInput {
|
||||||
ui.add(label!("pixels_per_point: {}", self.pixels_per_point));
|
ui.add(label!("pixels_per_point: {}", self.pixels_per_point));
|
||||||
ui.add(label!("time: {:.3} s", self.time));
|
ui.add(label!("time: {:.3} s", self.time));
|
||||||
ui.add(label!("events: {:?}", self.events));
|
ui.add(label!("events: {:?}", self.events));
|
||||||
if let Some(web) = &self.web {
|
|
||||||
web.ui(ui);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -228,11 +213,3 @@ impl MouseInput {
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Web {
|
|
||||||
pub fn ui(&self, ui: &mut crate::Ui) {
|
|
||||||
use crate::label;
|
|
||||||
ui.add(label!("location: '{}'", self.location));
|
|
||||||
ui.add(label!("location_hash: '{}'", self.location_hash));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -109,7 +109,7 @@ fn main() {
|
||||||
let emigui_start = Instant::now();
|
let emigui_start = Instant::now();
|
||||||
ctx.begin_frame(raw_input.clone()); // TODO: avoid clone
|
ctx.begin_frame(raw_input.clone()); // TODO: avoid clone
|
||||||
let mut ui = ctx.fullscreen_ui();
|
let mut ui = ctx.fullscreen_ui();
|
||||||
example_app.ui(&mut ui);
|
example_app.ui(&mut ui, "");
|
||||||
let mut ui = ui.centered_column(ui.available().width().min(480.0));
|
let mut ui = ui.centered_column(ui.available().width().min(480.0));
|
||||||
ui.set_layout(Layout::vertical(Align::Min));
|
ui.set_layout(Layout::vertical(Align::Min));
|
||||||
ui.add(label!("Emigui running inside of Glium").text_style(TextStyle::Heading));
|
ui.add(label!("Emigui running inside of Glium").text_style(TextStyle::Heading));
|
||||||
|
|
|
@ -9,6 +9,7 @@ crate-type = ["cdylib", "rlib"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
serde = "1"
|
serde = "1"
|
||||||
|
serde_derive = "1"
|
||||||
serde_json = "1"
|
serde_json = "1"
|
||||||
wasm-bindgen = "0.2"
|
wasm-bindgen = "0.2"
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,21 @@ use {
|
||||||
|
|
||||||
use wasm_bindgen::prelude::*;
|
use wasm_bindgen::prelude::*;
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Default, serde_derive::Deserialize)]
|
||||||
|
#[serde(default)]
|
||||||
|
struct WebInput {
|
||||||
|
emigui: RawInput,
|
||||||
|
web: Web,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Default, serde_derive::Deserialize)]
|
||||||
|
#[serde(default)]
|
||||||
|
pub struct Web {
|
||||||
|
pub location: String,
|
||||||
|
/// i.e. "#fragment"
|
||||||
|
pub location_hash: String,
|
||||||
|
}
|
||||||
|
|
||||||
#[wasm_bindgen]
|
#[wasm_bindgen]
|
||||||
pub struct State {
|
pub struct State {
|
||||||
example_app: ExampleApp,
|
example_app: ExampleApp,
|
||||||
|
@ -34,13 +49,13 @@ impl State {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run(&mut self, raw_input: RawInput) -> Result<Output, JsValue> {
|
fn run(&mut self, web_input: WebInput) -> Result<Output, JsValue> {
|
||||||
let everything_start = now_sec();
|
let everything_start = now_sec();
|
||||||
|
|
||||||
self.ctx.begin_frame(raw_input);
|
self.ctx.begin_frame(web_input.emigui);
|
||||||
|
|
||||||
let mut ui = self.ctx.fullscreen_ui();
|
let mut ui = self.ctx.fullscreen_ui();
|
||||||
self.example_app.ui(&mut ui);
|
self.example_app.ui(&mut ui, &web_input.web.location_hash);
|
||||||
let mut ui = ui.centered_column(ui.available().width().min(480.0));
|
let mut ui = ui.centered_column(ui.available().width().min(480.0));
|
||||||
ui.set_layout(Layout::vertical(Align::Min));
|
ui.set_layout(Layout::vertical(Align::Min));
|
||||||
ui.add(label!("Emigui!").text_style(TextStyle::Heading));
|
ui.add(label!("Emigui!").text_style(TextStyle::Heading));
|
||||||
|
@ -101,9 +116,9 @@ pub fn new_webgl_gui(canvas_id: &str, pixels_per_point: f32) -> Result<State, Js
|
||||||
}
|
}
|
||||||
|
|
||||||
#[wasm_bindgen]
|
#[wasm_bindgen]
|
||||||
pub fn run_gui(state: &mut State, raw_input_json: &str) -> Result<String, JsValue> {
|
pub fn run_gui(state: &mut State, web_input_json: &str) -> Result<String, JsValue> {
|
||||||
// TODO: nicer interface than JSON
|
// TODO: nicer interface than JSON
|
||||||
let raw_input: RawInput = serde_json::from_str(raw_input_json).unwrap();
|
let web_input: WebInput = serde_json::from_str(web_input_json).unwrap();
|
||||||
let output = state.run(raw_input)?;
|
let output = state.run(web_input)?;
|
||||||
Ok(serde_json::to_string(&output).unwrap())
|
Ok(serde_json::to_string(&output).unwrap())
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue