egui_web: Fix use of egui on devices with both touch and mouse (#654)
This commit is contained in:
parent
c6a0db8602
commit
9bc95289cc
3 changed files with 49 additions and 63 deletions
|
@ -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
|
||||||
|
|
|
@ -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>,
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in a new issue