egui_web: Fix use of egui on devices with both touch and mouse (#654)

This commit is contained in:
Emil Ernerfeldt 2021-08-28 08:37:07 +02:00 committed by GitHub
parent c6a0db8602
commit 9bc95289cc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 49 additions and 63 deletions

View file

@ -6,7 +6,8 @@ All notable changes to the `egui_web` integration will be noted in this file.
## Unreleased ## Unreleased
### Fixed 🐛 ### Fixed 🐛
* Fix alpha blending for WebGL2 and WebGL1 with sRGB support backends, now having identical results as egui_glium * Fix alpha blending for WebGL2 and WebGL1 with sRGB support backends, now having identical results as egui_glium.
* Fix use of egui on devices with both touch and mouse.
## 0.14.0 - 2021-08-24 ## 0.14.0 - 2021-08-24

View file

@ -78,9 +78,6 @@ impl WebBackend {
/// Data gathered between frames. /// Data gathered between frames.
#[derive(Default)] #[derive(Default)]
pub struct WebInput { pub struct WebInput {
/// Is this a touch screen? If so, we ignore mouse events.
pub is_touch: bool,
/// Required because we don't get a position on touched /// Required because we don't get a position on touched
pub latest_touch_pos: Option<egui::Pos2>, pub latest_touch_pos: Option<egui::Pos2>,

View file

@ -852,26 +852,24 @@ fn install_canvas_events(runner_ref: &AppRunnerRef) -> Result<(), JsValue> {
let event_name = "mousedown"; let event_name = "mousedown";
let runner_ref = runner_ref.clone(); let runner_ref = runner_ref.clone();
let closure = Closure::wrap(Box::new(move |event: web_sys::MouseEvent| { let closure = Closure::wrap(Box::new(move |event: web_sys::MouseEvent| {
let mut runner_lock = runner_ref.0.lock(); if let Some(button) = button_from_mouse_event(&event) {
if !runner_lock.input.is_touch { let mut runner_lock = runner_ref.0.lock();
if let Some(button) = button_from_mouse_event(&event) { let pos = pos_from_mouse_event(runner_lock.canvas_id(), &event);
let pos = pos_from_mouse_event(runner_lock.canvas_id(), &event); let modifiers = runner_lock.input.raw.modifiers;
let modifiers = runner_lock.input.raw.modifiers; runner_lock
runner_lock .input
.input .raw
.raw .events
.events .push(egui::Event::PointerButton {
.push(egui::Event::PointerButton { pos,
pos, button,
button, pressed: true,
pressed: true, modifiers,
modifiers, });
}); runner_lock.needs_repaint.set_true();
runner_lock.needs_repaint.set_true();
event.stop_propagation();
event.prevent_default();
}
} }
event.stop_propagation();
event.prevent_default();
}) as Box<dyn FnMut(_)>); }) as Box<dyn FnMut(_)>);
canvas.add_event_listener_with_callback(event_name, closure.as_ref().unchecked_ref())?; canvas.add_event_listener_with_callback(event_name, closure.as_ref().unchecked_ref())?;
closure.forget(); closure.forget();
@ -882,17 +880,15 @@ fn install_canvas_events(runner_ref: &AppRunnerRef) -> Result<(), JsValue> {
let runner_ref = runner_ref.clone(); let runner_ref = runner_ref.clone();
let closure = Closure::wrap(Box::new(move |event: web_sys::MouseEvent| { let closure = Closure::wrap(Box::new(move |event: web_sys::MouseEvent| {
let mut runner_lock = runner_ref.0.lock(); let mut runner_lock = runner_ref.0.lock();
if !runner_lock.input.is_touch { let pos = pos_from_mouse_event(runner_lock.canvas_id(), &event);
let pos = pos_from_mouse_event(runner_lock.canvas_id(), &event); runner_lock
runner_lock .input
.input .raw
.raw .events
.events .push(egui::Event::PointerMoved(pos));
.push(egui::Event::PointerMoved(pos)); runner_lock.needs_repaint.set_true();
runner_lock.needs_repaint.set_true(); event.stop_propagation();
event.stop_propagation(); event.prevent_default();
event.prevent_default();
}
}) as Box<dyn FnMut(_)>); }) as Box<dyn FnMut(_)>);
canvas.add_event_listener_with_callback(event_name, closure.as_ref().unchecked_ref())?; canvas.add_event_listener_with_callback(event_name, closure.as_ref().unchecked_ref())?;
closure.forget(); closure.forget();
@ -902,27 +898,25 @@ fn install_canvas_events(runner_ref: &AppRunnerRef) -> Result<(), JsValue> {
let event_name = "mouseup"; let event_name = "mouseup";
let runner_ref = runner_ref.clone(); let runner_ref = runner_ref.clone();
let closure = Closure::wrap(Box::new(move |event: web_sys::MouseEvent| { let closure = Closure::wrap(Box::new(move |event: web_sys::MouseEvent| {
let mut runner_lock = runner_ref.0.lock(); if let Some(button) = button_from_mouse_event(&event) {
if !runner_lock.input.is_touch { let mut runner_lock = runner_ref.0.lock();
if let Some(button) = button_from_mouse_event(&event) { let pos = pos_from_mouse_event(runner_lock.canvas_id(), &event);
let pos = pos_from_mouse_event(runner_lock.canvas_id(), &event); let modifiers = runner_lock.input.raw.modifiers;
let modifiers = runner_lock.input.raw.modifiers; runner_lock
runner_lock .input
.input .raw
.raw .events
.events .push(egui::Event::PointerButton {
.push(egui::Event::PointerButton { pos,
pos, button,
button, pressed: false,
pressed: false, modifiers,
modifiers, });
}); runner_lock.needs_repaint.set_true();
runner_lock.needs_repaint.set_true();
event.stop_propagation();
event.prevent_default();
}
manipulate_agent(runner_lock.canvas_id(), runner_lock.input.latest_touch_pos); manipulate_agent(runner_lock.canvas_id(), runner_lock.input.latest_touch_pos);
} }
event.stop_propagation();
event.prevent_default();
}) as Box<dyn FnMut(_)>); }) as Box<dyn FnMut(_)>);
canvas.add_event_listener_with_callback(event_name, closure.as_ref().unchecked_ref())?; canvas.add_event_listener_with_callback(event_name, closure.as_ref().unchecked_ref())?;
closure.forget(); closure.forget();
@ -933,12 +927,10 @@ fn install_canvas_events(runner_ref: &AppRunnerRef) -> Result<(), JsValue> {
let runner_ref = runner_ref.clone(); let runner_ref = runner_ref.clone();
let closure = Closure::wrap(Box::new(move |event: web_sys::MouseEvent| { let closure = Closure::wrap(Box::new(move |event: web_sys::MouseEvent| {
let mut runner_lock = runner_ref.0.lock(); let mut runner_lock = runner_ref.0.lock();
if !runner_lock.input.is_touch { runner_lock.input.raw.events.push(egui::Event::PointerGone);
runner_lock.input.raw.events.push(egui::Event::PointerGone); runner_lock.needs_repaint.set_true();
runner_lock.needs_repaint.set_true(); event.stop_propagation();
event.stop_propagation(); event.prevent_default();
event.prevent_default();
}
}) as Box<dyn FnMut(_)>); }) as Box<dyn FnMut(_)>);
canvas.add_event_listener_with_callback(event_name, closure.as_ref().unchecked_ref())?; canvas.add_event_listener_with_callback(event_name, closure.as_ref().unchecked_ref())?;
closure.forget(); closure.forget();
@ -954,7 +946,6 @@ fn install_canvas_events(runner_ref: &AppRunnerRef) -> Result<(), JsValue> {
pos_from_touch_event(runner_lock.canvas_id(), &event, &mut latest_touch_pos_id); pos_from_touch_event(runner_lock.canvas_id(), &event, &mut latest_touch_pos_id);
runner_lock.input.latest_touch_pos_id = latest_touch_pos_id; runner_lock.input.latest_touch_pos_id = latest_touch_pos_id;
runner_lock.input.latest_touch_pos = Some(pos); runner_lock.input.latest_touch_pos = Some(pos);
runner_lock.input.is_touch = true;
let modifiers = runner_lock.input.raw.modifiers; let modifiers = runner_lock.input.raw.modifiers;
runner_lock runner_lock
.input .input
@ -986,7 +977,6 @@ fn install_canvas_events(runner_ref: &AppRunnerRef) -> Result<(), JsValue> {
pos_from_touch_event(runner_lock.canvas_id(), &event, &mut latest_touch_pos_id); pos_from_touch_event(runner_lock.canvas_id(), &event, &mut latest_touch_pos_id);
runner_lock.input.latest_touch_pos_id = latest_touch_pos_id; runner_lock.input.latest_touch_pos_id = latest_touch_pos_id;
runner_lock.input.latest_touch_pos = Some(pos); runner_lock.input.latest_touch_pos = Some(pos);
runner_lock.input.is_touch = true;
runner_lock runner_lock
.input .input
.raw .raw
@ -1007,7 +997,6 @@ fn install_canvas_events(runner_ref: &AppRunnerRef) -> Result<(), JsValue> {
let runner_ref = runner_ref.clone(); let runner_ref = runner_ref.clone();
let closure = Closure::wrap(Box::new(move |event: web_sys::TouchEvent| { let closure = Closure::wrap(Box::new(move |event: web_sys::TouchEvent| {
let mut runner_lock = runner_ref.0.lock(); let mut runner_lock = runner_ref.0.lock();
runner_lock.input.is_touch = true;
if let Some(pos) = runner_lock.input.latest_touch_pos { if let Some(pos) = runner_lock.input.latest_touch_pos {
let modifiers = runner_lock.input.raw.modifiers; let modifiers = runner_lock.input.raw.modifiers;
// First release mouse to click: // First release mouse to click:
@ -1042,7 +1031,6 @@ fn install_canvas_events(runner_ref: &AppRunnerRef) -> Result<(), JsValue> {
let runner_ref = runner_ref.clone(); let runner_ref = runner_ref.clone();
let closure = Closure::wrap(Box::new(move |event: web_sys::TouchEvent| { let closure = Closure::wrap(Box::new(move |event: web_sys::TouchEvent| {
let mut runner_lock = runner_ref.0.lock(); let mut runner_lock = runner_ref.0.lock();
runner_lock.input.is_touch = true;
push_touches(&mut *runner_lock, egui::TouchPhase::Cancel, &event); push_touches(&mut *runner_lock, egui::TouchPhase::Cancel, &event);
event.stop_propagation(); event.stop_propagation();
event.prevent_default(); event.prevent_default();