mirror of
https://github.com/emilk/egui.git
synced 2026-09-01 14:20:04 -04:00
Merge branch 'master' into cache_galley_lines
This commit is contained in:
@@ -101,7 +101,7 @@ thiserror = "1.0.37"
|
|||||||
type-map = "0.5.0"
|
type-map = "0.5.0"
|
||||||
wasm-bindgen = "0.2"
|
wasm-bindgen = "0.2"
|
||||||
wasm-bindgen-futures = "0.4"
|
wasm-bindgen-futures = "0.4"
|
||||||
web-sys = "0.3.70"
|
web-sys = "0.3.73"
|
||||||
web-time = "1.1.0" # Timekeeping for native and web
|
web-time = "1.1.0" # Timekeeping for native and web
|
||||||
wgpu = { version = "24.0.0", default-features = false }
|
wgpu = { version = "24.0.0", default-features = false }
|
||||||
windows-sys = "0.59"
|
windows-sys = "0.59"
|
||||||
|
|||||||
@@ -499,10 +499,16 @@ pub struct WebOptions {
|
|||||||
/// If the web event corresponding to an egui event should be propagated
|
/// If the web event corresponding to an egui event should be propagated
|
||||||
/// to the rest of the web page.
|
/// to the rest of the web page.
|
||||||
///
|
///
|
||||||
/// The default is `false`, meaning
|
/// The default is `true`, meaning
|
||||||
/// [`stopPropagation`](https://developer.mozilla.org/en-US/docs/Web/API/Event/stopPropagation)
|
/// [`stopPropagation`](https://developer.mozilla.org/en-US/docs/Web/API/Event/stopPropagation)
|
||||||
/// is called on every event.
|
/// is called on every event, and the event is not propagated to the rest of the web page.
|
||||||
pub should_propagate_event: Box<dyn Fn(&egui::Event) -> bool>,
|
pub should_stop_propagation: Box<dyn Fn(&egui::Event) -> bool>,
|
||||||
|
|
||||||
|
/// Whether the web event corresponding to an egui event should have `prevent_default` called
|
||||||
|
/// on it or not.
|
||||||
|
///
|
||||||
|
/// Defaults to true.
|
||||||
|
pub should_prevent_default: Box<dyn Fn(&egui::Event) -> bool>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(target_arch = "wasm32")]
|
#[cfg(target_arch = "wasm32")]
|
||||||
@@ -519,7 +525,8 @@ impl Default for WebOptions {
|
|||||||
|
|
||||||
dithering: true,
|
dithering: true,
|
||||||
|
|
||||||
should_propagate_event: Box::new(|_| false),
|
should_stop_propagation: Box::new(|_| true),
|
||||||
|
should_prevent_default: Box::new(|_| true),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -139,15 +139,20 @@ fn install_keydown(runner_ref: &WebRunner, target: &EventTarget) -> Result<(), J
|
|||||||
{
|
{
|
||||||
if let Some(text) = text_from_keyboard_event(&event) {
|
if let Some(text) = text_from_keyboard_event(&event) {
|
||||||
let egui_event = egui::Event::Text(text);
|
let egui_event = egui::Event::Text(text);
|
||||||
let should_propagate = (runner.web_options.should_propagate_event)(&egui_event);
|
let should_stop_propagation =
|
||||||
|
(runner.web_options.should_stop_propagation)(&egui_event);
|
||||||
|
let should_prevent_default =
|
||||||
|
(runner.web_options.should_prevent_default)(&egui_event);
|
||||||
runner.input.raw.events.push(egui_event);
|
runner.input.raw.events.push(egui_event);
|
||||||
runner.needs_repaint.repaint_asap();
|
runner.needs_repaint.repaint_asap();
|
||||||
|
|
||||||
// If this is indeed text, then prevent any other action.
|
// If this is indeed text, then prevent any other action.
|
||||||
event.prevent_default();
|
if should_prevent_default {
|
||||||
|
event.prevent_default();
|
||||||
|
}
|
||||||
|
|
||||||
// Use web options to tell if the event should be propagated to parent elements.
|
// Use web options to tell if the event should be propagated to parent elements.
|
||||||
if !should_propagate {
|
if should_stop_propagation {
|
||||||
event.stop_propagation();
|
event.stop_propagation();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -184,7 +189,7 @@ pub(crate) fn on_keydown(event: web_sys::KeyboardEvent, runner: &mut AppRunner)
|
|||||||
repeat: false, // egui will fill this in for us!
|
repeat: false, // egui will fill this in for us!
|
||||||
modifiers,
|
modifiers,
|
||||||
};
|
};
|
||||||
let should_propagate = (runner.web_options.should_propagate_event)(&egui_event);
|
let should_stop_propagation = (runner.web_options.should_stop_propagation)(&egui_event);
|
||||||
runner.input.raw.events.push(egui_event);
|
runner.input.raw.events.push(egui_event);
|
||||||
runner.needs_repaint.repaint_asap();
|
runner.needs_repaint.repaint_asap();
|
||||||
|
|
||||||
@@ -201,7 +206,7 @@ pub(crate) fn on_keydown(event: web_sys::KeyboardEvent, runner: &mut AppRunner)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Use web options to tell if the web event should be propagated to parent elements based on the egui event.
|
// Use web options to tell if the web event should be propagated to parent elements based on the egui event.
|
||||||
if !should_propagate {
|
if should_stop_propagation {
|
||||||
event.stop_propagation();
|
event.stop_propagation();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -261,7 +266,7 @@ pub(crate) fn on_keyup(event: web_sys::KeyboardEvent, runner: &mut AppRunner) {
|
|||||||
let modifiers = modifiers_from_kb_event(&event);
|
let modifiers = modifiers_from_kb_event(&event);
|
||||||
runner.input.raw.modifiers = modifiers;
|
runner.input.raw.modifiers = modifiers;
|
||||||
|
|
||||||
let mut propagate_event = false;
|
let mut should_stop_propagation = true;
|
||||||
|
|
||||||
if let Some(key) = translate_key(&event.key()) {
|
if let Some(key) = translate_key(&event.key()) {
|
||||||
let egui_event = egui::Event::Key {
|
let egui_event = egui::Event::Key {
|
||||||
@@ -271,7 +276,7 @@ pub(crate) fn on_keyup(event: web_sys::KeyboardEvent, runner: &mut AppRunner) {
|
|||||||
repeat: false,
|
repeat: false,
|
||||||
modifiers,
|
modifiers,
|
||||||
};
|
};
|
||||||
propagate_event |= (runner.web_options.should_propagate_event)(&egui_event);
|
should_stop_propagation &= (runner.web_options.should_stop_propagation)(&egui_event);
|
||||||
runner.input.raw.events.push(egui_event);
|
runner.input.raw.events.push(egui_event);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -290,7 +295,7 @@ pub(crate) fn on_keyup(event: web_sys::KeyboardEvent, runner: &mut AppRunner) {
|
|||||||
repeat: false,
|
repeat: false,
|
||||||
modifiers,
|
modifiers,
|
||||||
};
|
};
|
||||||
propagate_event |= (runner.web_options.should_propagate_event)(&egui_event);
|
should_stop_propagation &= (runner.web_options.should_stop_propagation)(&egui_event);
|
||||||
runner.input.raw.events.push(egui_event);
|
runner.input.raw.events.push(egui_event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -299,7 +304,7 @@ pub(crate) fn on_keyup(event: web_sys::KeyboardEvent, runner: &mut AppRunner) {
|
|||||||
|
|
||||||
// Use web options to tell if the web event should be propagated to parent elements based on the egui event.
|
// Use web options to tell if the web event should be propagated to parent elements based on the egui event.
|
||||||
let has_focus = runner.input.raw.focused;
|
let has_focus = runner.input.raw.focused;
|
||||||
if has_focus && !propagate_event {
|
if has_focus && should_stop_propagation {
|
||||||
event.stop_propagation();
|
event.stop_propagation();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -310,19 +315,26 @@ fn install_copy_cut_paste(runner_ref: &WebRunner, target: &EventTarget) -> Resul
|
|||||||
if let Ok(text) = data.get_data("text") {
|
if let Ok(text) = data.get_data("text") {
|
||||||
let text = text.replace("\r\n", "\n");
|
let text = text.replace("\r\n", "\n");
|
||||||
|
|
||||||
let mut should_propagate = false;
|
let mut should_stop_propagation = true;
|
||||||
|
let mut should_prevent_default = true;
|
||||||
if !text.is_empty() && runner.input.raw.focused {
|
if !text.is_empty() && runner.input.raw.focused {
|
||||||
let egui_event = egui::Event::Paste(text);
|
let egui_event = egui::Event::Paste(text);
|
||||||
should_propagate = (runner.web_options.should_propagate_event)(&egui_event);
|
should_stop_propagation =
|
||||||
|
(runner.web_options.should_stop_propagation)(&egui_event);
|
||||||
|
should_prevent_default =
|
||||||
|
(runner.web_options.should_prevent_default)(&egui_event);
|
||||||
runner.input.raw.events.push(egui_event);
|
runner.input.raw.events.push(egui_event);
|
||||||
runner.needs_repaint.repaint_asap();
|
runner.needs_repaint.repaint_asap();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Use web options to tell if the web event should be propagated to parent elements based on the egui event.
|
// Use web options to tell if the web event should be propagated to parent elements based on the egui event.
|
||||||
if !should_propagate {
|
if should_stop_propagation {
|
||||||
event.stop_propagation();
|
event.stop_propagation();
|
||||||
}
|
}
|
||||||
event.prevent_default();
|
|
||||||
|
if should_prevent_default {
|
||||||
|
event.prevent_default();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})?;
|
})?;
|
||||||
@@ -340,10 +352,13 @@ fn install_copy_cut_paste(runner_ref: &WebRunner, target: &EventTarget) -> Resul
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Use web options to tell if the web event should be propagated to parent elements based on the egui event.
|
// Use web options to tell if the web event should be propagated to parent elements based on the egui event.
|
||||||
if !(runner.web_options.should_propagate_event)(&egui::Event::Cut) {
|
if (runner.web_options.should_stop_propagation)(&egui::Event::Cut) {
|
||||||
event.stop_propagation();
|
event.stop_propagation();
|
||||||
}
|
}
|
||||||
event.prevent_default();
|
|
||||||
|
if (runner.web_options.should_prevent_default)(&egui::Event::Cut) {
|
||||||
|
event.prevent_default();
|
||||||
|
}
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
runner_ref.add_event_listener(target, "copy", |event: web_sys::ClipboardEvent, runner| {
|
runner_ref.add_event_listener(target, "copy", |event: web_sys::ClipboardEvent, runner| {
|
||||||
@@ -359,10 +374,13 @@ fn install_copy_cut_paste(runner_ref: &WebRunner, target: &EventTarget) -> Resul
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Use web options to tell if the web event should be propagated to parent elements based on the egui event.
|
// Use web options to tell if the web event should be propagated to parent elements based on the egui event.
|
||||||
if !(runner.web_options.should_propagate_event)(&egui::Event::Copy) {
|
if (runner.web_options.should_stop_propagation)(&egui::Event::Copy) {
|
||||||
event.stop_propagation();
|
event.stop_propagation();
|
||||||
}
|
}
|
||||||
event.prevent_default();
|
|
||||||
|
if (runner.web_options.should_prevent_default)(&egui::Event::Copy) {
|
||||||
|
event.prevent_default();
|
||||||
|
}
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
@@ -484,7 +502,7 @@ fn install_pointerdown(runner_ref: &WebRunner, target: &EventTarget) -> Result<(
|
|||||||
|event: web_sys::PointerEvent, runner: &mut AppRunner| {
|
|event: web_sys::PointerEvent, runner: &mut AppRunner| {
|
||||||
let modifiers = modifiers_from_mouse_event(&event);
|
let modifiers = modifiers_from_mouse_event(&event);
|
||||||
runner.input.raw.modifiers = modifiers;
|
runner.input.raw.modifiers = modifiers;
|
||||||
let mut should_propagate = false;
|
let mut should_stop_propagation = true;
|
||||||
if let Some(button) = button_from_mouse_event(&event) {
|
if let Some(button) = button_from_mouse_event(&event) {
|
||||||
let pos = pos_from_mouse_event(runner.canvas(), &event, runner.egui_ctx());
|
let pos = pos_from_mouse_event(runner.canvas(), &event, runner.egui_ctx());
|
||||||
let modifiers = runner.input.raw.modifiers;
|
let modifiers = runner.input.raw.modifiers;
|
||||||
@@ -494,7 +512,7 @@ fn install_pointerdown(runner_ref: &WebRunner, target: &EventTarget) -> Result<(
|
|||||||
pressed: true,
|
pressed: true,
|
||||||
modifiers,
|
modifiers,
|
||||||
};
|
};
|
||||||
should_propagate = (runner.web_options.should_propagate_event)(&egui_event);
|
should_stop_propagation = (runner.web_options.should_stop_propagation)(&egui_event);
|
||||||
runner.input.raw.events.push(egui_event);
|
runner.input.raw.events.push(egui_event);
|
||||||
|
|
||||||
// In Safari we are only allowed to write to the clipboard during the
|
// In Safari we are only allowed to write to the clipboard during the
|
||||||
@@ -506,7 +524,7 @@ fn install_pointerdown(runner_ref: &WebRunner, target: &EventTarget) -> Result<(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Use web options to tell if the web event should be propagated to parent elements based on the egui event.
|
// Use web options to tell if the web event should be propagated to parent elements based on the egui event.
|
||||||
if !should_propagate {
|
if should_stop_propagation {
|
||||||
event.stop_propagation();
|
event.stop_propagation();
|
||||||
}
|
}
|
||||||
// Note: prevent_default breaks VSCode tab focusing, hence why we don't call it here.
|
// Note: prevent_default breaks VSCode tab focusing, hence why we don't call it here.
|
||||||
@@ -536,7 +554,10 @@ fn install_pointerup(runner_ref: &WebRunner, target: &EventTarget) -> Result<(),
|
|||||||
pressed: false,
|
pressed: false,
|
||||||
modifiers,
|
modifiers,
|
||||||
};
|
};
|
||||||
let should_propagate = (runner.web_options.should_propagate_event)(&egui_event);
|
let should_stop_propagation =
|
||||||
|
(runner.web_options.should_stop_propagation)(&egui_event);
|
||||||
|
let should_prevent_default =
|
||||||
|
(runner.web_options.should_prevent_default)(&egui_event);
|
||||||
runner.input.raw.events.push(egui_event);
|
runner.input.raw.events.push(egui_event);
|
||||||
|
|
||||||
// Previously on iOS, the canvas would not receive focus on
|
// Previously on iOS, the canvas would not receive focus on
|
||||||
@@ -555,10 +576,12 @@ fn install_pointerup(runner_ref: &WebRunner, target: &EventTarget) -> Result<(),
|
|||||||
// Make sure we paint the output of the above logic call asap:
|
// Make sure we paint the output of the above logic call asap:
|
||||||
runner.needs_repaint.repaint_asap();
|
runner.needs_repaint.repaint_asap();
|
||||||
|
|
||||||
event.prevent_default();
|
if should_prevent_default {
|
||||||
|
event.prevent_default();
|
||||||
|
}
|
||||||
|
|
||||||
// Use web options to tell if the web event should be propagated to parent elements based on the egui event.
|
// Use web options to tell if the web event should be propagated to parent elements based on the egui event.
|
||||||
if !should_propagate {
|
if should_stop_propagation {
|
||||||
event.stop_propagation();
|
event.stop_propagation();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -600,15 +623,19 @@ fn install_mousemove(runner_ref: &WebRunner, target: &EventTarget) -> Result<(),
|
|||||||
egui::pos2(event.client_x() as f32, event.client_y() as f32),
|
egui::pos2(event.client_x() as f32, event.client_y() as f32),
|
||||||
) {
|
) {
|
||||||
let egui_event = egui::Event::PointerMoved(pos);
|
let egui_event = egui::Event::PointerMoved(pos);
|
||||||
let should_propagate = (runner.web_options.should_propagate_event)(&egui_event);
|
let should_stop_propagation = (runner.web_options.should_stop_propagation)(&egui_event);
|
||||||
|
let should_prevent_default = (runner.web_options.should_prevent_default)(&egui_event);
|
||||||
runner.input.raw.events.push(egui_event);
|
runner.input.raw.events.push(egui_event);
|
||||||
runner.needs_repaint.repaint_asap();
|
runner.needs_repaint.repaint_asap();
|
||||||
|
|
||||||
// Use web options to tell if the web event should be propagated to parent elements based on the egui event.
|
// Use web options to tell if the web event should be propagated to parent elements based on the egui event.
|
||||||
if !should_propagate {
|
if should_stop_propagation {
|
||||||
event.stop_propagation();
|
event.stop_propagation();
|
||||||
}
|
}
|
||||||
event.prevent_default();
|
|
||||||
|
if should_prevent_default {
|
||||||
|
event.prevent_default();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -622,10 +649,13 @@ fn install_mouseleave(runner_ref: &WebRunner, target: &EventTarget) -> Result<()
|
|||||||
runner.needs_repaint.repaint_asap();
|
runner.needs_repaint.repaint_asap();
|
||||||
|
|
||||||
// Use web options to tell if the web event should be propagated to parent elements based on the egui event.
|
// Use web options to tell if the web event should be propagated to parent elements based on the egui event.
|
||||||
if !(runner.web_options.should_propagate_event)(&egui::Event::PointerGone) {
|
if (runner.web_options.should_stop_propagation)(&egui::Event::PointerGone) {
|
||||||
event.stop_propagation();
|
event.stop_propagation();
|
||||||
}
|
}
|
||||||
event.prevent_default();
|
|
||||||
|
if (runner.web_options.should_prevent_default)(&egui::Event::PointerGone) {
|
||||||
|
event.prevent_default();
|
||||||
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -635,7 +665,8 @@ fn install_touchstart(runner_ref: &WebRunner, target: &EventTarget) -> Result<()
|
|||||||
target,
|
target,
|
||||||
"touchstart",
|
"touchstart",
|
||||||
|event: web_sys::TouchEvent, runner| {
|
|event: web_sys::TouchEvent, runner| {
|
||||||
let mut should_propagate = false;
|
let mut should_stop_propagation = true;
|
||||||
|
let mut should_prevent_default = true;
|
||||||
if let Some((pos, _)) = primary_touch_pos(runner, &event) {
|
if let Some((pos, _)) = primary_touch_pos(runner, &event) {
|
||||||
let egui_event = egui::Event::PointerButton {
|
let egui_event = egui::Event::PointerButton {
|
||||||
pos,
|
pos,
|
||||||
@@ -643,7 +674,8 @@ fn install_touchstart(runner_ref: &WebRunner, target: &EventTarget) -> Result<()
|
|||||||
pressed: true,
|
pressed: true,
|
||||||
modifiers: runner.input.raw.modifiers,
|
modifiers: runner.input.raw.modifiers,
|
||||||
};
|
};
|
||||||
should_propagate = (runner.web_options.should_propagate_event)(&egui_event);
|
should_stop_propagation = (runner.web_options.should_stop_propagation)(&egui_event);
|
||||||
|
should_prevent_default = (runner.web_options.should_prevent_default)(&egui_event);
|
||||||
runner.input.raw.events.push(egui_event);
|
runner.input.raw.events.push(egui_event);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -651,10 +683,13 @@ fn install_touchstart(runner_ref: &WebRunner, target: &EventTarget) -> Result<()
|
|||||||
runner.needs_repaint.repaint_asap();
|
runner.needs_repaint.repaint_asap();
|
||||||
|
|
||||||
// Use web options to tell if the web event should be propagated to parent elements based on the egui event.
|
// Use web options to tell if the web event should be propagated to parent elements based on the egui event.
|
||||||
if !should_propagate {
|
if should_stop_propagation {
|
||||||
event.stop_propagation();
|
event.stop_propagation();
|
||||||
}
|
}
|
||||||
event.prevent_default();
|
|
||||||
|
if should_prevent_default {
|
||||||
|
event.prevent_default();
|
||||||
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -667,17 +702,23 @@ fn install_touchmove(runner_ref: &WebRunner, target: &EventTarget) -> Result<(),
|
|||||||
egui::pos2(touch.client_x() as f32, touch.client_y() as f32),
|
egui::pos2(touch.client_x() as f32, touch.client_y() as f32),
|
||||||
) {
|
) {
|
||||||
let egui_event = egui::Event::PointerMoved(pos);
|
let egui_event = egui::Event::PointerMoved(pos);
|
||||||
let should_propagate = (runner.web_options.should_propagate_event)(&egui_event);
|
let should_stop_propagation =
|
||||||
|
(runner.web_options.should_stop_propagation)(&egui_event);
|
||||||
|
let should_prevent_default =
|
||||||
|
(runner.web_options.should_prevent_default)(&egui_event);
|
||||||
runner.input.raw.events.push(egui_event);
|
runner.input.raw.events.push(egui_event);
|
||||||
|
|
||||||
push_touches(runner, egui::TouchPhase::Move, &event);
|
push_touches(runner, egui::TouchPhase::Move, &event);
|
||||||
runner.needs_repaint.repaint_asap();
|
runner.needs_repaint.repaint_asap();
|
||||||
|
|
||||||
// Use web options to tell if the web event should be propagated to parent elements based on the egui event.
|
// Use web options to tell if the web event should be propagated to parent elements based on the egui event.
|
||||||
if !should_propagate {
|
if should_stop_propagation {
|
||||||
event.stop_propagation();
|
event.stop_propagation();
|
||||||
}
|
}
|
||||||
event.prevent_default();
|
|
||||||
|
if should_prevent_default {
|
||||||
|
event.prevent_default();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -691,18 +732,23 @@ fn install_touchend(runner_ref: &WebRunner, target: &EventTarget) -> Result<(),
|
|||||||
egui::pos2(touch.client_x() as f32, touch.client_y() as f32),
|
egui::pos2(touch.client_x() as f32, touch.client_y() as f32),
|
||||||
) {
|
) {
|
||||||
// First release mouse to click:
|
// First release mouse to click:
|
||||||
let mut should_propagate = false;
|
let mut should_stop_propagation = true;
|
||||||
|
let mut should_prevent_default = true;
|
||||||
let egui_event = egui::Event::PointerButton {
|
let egui_event = egui::Event::PointerButton {
|
||||||
pos,
|
pos,
|
||||||
button: egui::PointerButton::Primary,
|
button: egui::PointerButton::Primary,
|
||||||
pressed: false,
|
pressed: false,
|
||||||
modifiers: runner.input.raw.modifiers,
|
modifiers: runner.input.raw.modifiers,
|
||||||
};
|
};
|
||||||
should_propagate |= (runner.web_options.should_propagate_event)(&egui_event);
|
should_stop_propagation &=
|
||||||
|
(runner.web_options.should_stop_propagation)(&egui_event);
|
||||||
|
should_prevent_default &= (runner.web_options.should_prevent_default)(&egui_event);
|
||||||
runner.input.raw.events.push(egui_event);
|
runner.input.raw.events.push(egui_event);
|
||||||
// Then remove hover effect:
|
// Then remove hover effect:
|
||||||
should_propagate |=
|
should_stop_propagation &=
|
||||||
(runner.web_options.should_propagate_event)(&egui::Event::PointerGone);
|
(runner.web_options.should_stop_propagation)(&egui::Event::PointerGone);
|
||||||
|
should_prevent_default &=
|
||||||
|
(runner.web_options.should_prevent_default)(&egui::Event::PointerGone);
|
||||||
runner.input.raw.events.push(egui::Event::PointerGone);
|
runner.input.raw.events.push(egui::Event::PointerGone);
|
||||||
|
|
||||||
push_touches(runner, egui::TouchPhase::End, &event);
|
push_touches(runner, egui::TouchPhase::End, &event);
|
||||||
@@ -710,10 +756,13 @@ fn install_touchend(runner_ref: &WebRunner, target: &EventTarget) -> Result<(),
|
|||||||
runner.needs_repaint.repaint_asap();
|
runner.needs_repaint.repaint_asap();
|
||||||
|
|
||||||
// Use web options to tell if the web event should be propagated to parent elements based on the egui event.
|
// Use web options to tell if the web event should be propagated to parent elements based on the egui event.
|
||||||
if !should_propagate {
|
if should_stop_propagation {
|
||||||
event.stop_propagation();
|
event.stop_propagation();
|
||||||
}
|
}
|
||||||
event.prevent_default();
|
|
||||||
|
if should_prevent_default {
|
||||||
|
event.prevent_default();
|
||||||
|
}
|
||||||
|
|
||||||
// Fix virtual keyboard IOS
|
// Fix virtual keyboard IOS
|
||||||
// Need call focus at the same time of event
|
// Need call focus at the same time of event
|
||||||
@@ -769,16 +818,20 @@ fn install_wheel(runner_ref: &WebRunner, target: &EventTarget) -> Result<(), JsV
|
|||||||
modifiers,
|
modifiers,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let should_propagate = (runner.web_options.should_propagate_event)(&egui_event);
|
let should_stop_propagation = (runner.web_options.should_stop_propagation)(&egui_event);
|
||||||
|
let should_prevent_default = (runner.web_options.should_prevent_default)(&egui_event);
|
||||||
runner.input.raw.events.push(egui_event);
|
runner.input.raw.events.push(egui_event);
|
||||||
|
|
||||||
runner.needs_repaint.repaint_asap();
|
runner.needs_repaint.repaint_asap();
|
||||||
|
|
||||||
// Use web options to tell if the web event should be propagated to parent elements based on the egui event.
|
// Use web options to tell if the web event should be propagated to parent elements based on the egui event.
|
||||||
if !should_propagate {
|
if should_stop_propagation {
|
||||||
event.stop_propagation();
|
event.stop_propagation();
|
||||||
}
|
}
|
||||||
event.prevent_default();
|
|
||||||
|
if should_prevent_default {
|
||||||
|
event.prevent_default();
|
||||||
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:e6f394c2beb51d95edaf8c7ddc9ff62d3f95913ea88a3840245b6bacf8b850cc
|
oid sha256:334f52bfee27f9c467de739696fd7ce7c48ec9013e315dc4b2e61eee58f11287
|
||||||
size 907997
|
size 907997
|
||||||
|
|||||||
@@ -743,7 +743,7 @@ fn tessellate_row(
|
|||||||
mesh.reserve_vertices(row.glyphs.len() * 4);
|
mesh.reserve_vertices(row.glyphs.len() * 4);
|
||||||
|
|
||||||
if format_summary.any_background {
|
if format_summary.any_background {
|
||||||
add_row_backgrounds(job, row, &mut mesh);
|
add_row_backgrounds(point_scale, job, row, &mut mesh);
|
||||||
}
|
}
|
||||||
|
|
||||||
let glyph_index_start = mesh.indices.len();
|
let glyph_index_start = mesh.indices.len();
|
||||||
@@ -781,7 +781,7 @@ fn tessellate_row(
|
|||||||
|
|
||||||
/// Create background for glyphs that have them.
|
/// Create background for glyphs that have them.
|
||||||
/// Creates as few rectangular regions as possible.
|
/// Creates as few rectangular regions as possible.
|
||||||
fn add_row_backgrounds(job: &LayoutJob, row: &Row, mesh: &mut Mesh) {
|
fn add_row_backgrounds(point_scale: PointScale, job: &LayoutJob, row: &Row, mesh: &mut Mesh) {
|
||||||
if row.glyphs.is_empty() {
|
if row.glyphs.is_empty() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -790,6 +790,7 @@ fn add_row_backgrounds(job: &LayoutJob, row: &Row, mesh: &mut Mesh) {
|
|||||||
if let Some((color, start_rect, expand)) = start {
|
if let Some((color, start_rect, expand)) = start {
|
||||||
let rect = Rect::from_min_max(start_rect.left_top(), pos2(stop_x, start_rect.bottom()));
|
let rect = Rect::from_min_max(start_rect.left_top(), pos2(stop_x, start_rect.bottom()));
|
||||||
let rect = rect.expand(expand);
|
let rect = rect.expand(expand);
|
||||||
|
let rect = rect.round_to_pixels(point_scale.pixels_per_point());
|
||||||
mesh.add_colored_rect(rect, color);
|
mesh.add_colored_rect(rect, color);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -884,9 +885,15 @@ fn add_row_hline(
|
|||||||
mesh: &mut Mesh,
|
mesh: &mut Mesh,
|
||||||
stroke_and_y: impl Fn(&Glyph) -> (Stroke, f32),
|
stroke_and_y: impl Fn(&Glyph) -> (Stroke, f32),
|
||||||
) {
|
) {
|
||||||
|
let mut path = crate::tessellator::Path::default(); // reusing path to avoid re-allocations.
|
||||||
|
|
||||||
let mut end_line = |start: Option<(Stroke, Pos2)>, stop_x: f32| {
|
let mut end_line = |start: Option<(Stroke, Pos2)>, stop_x: f32| {
|
||||||
if let Some((stroke, start)) = start {
|
if let Some((stroke, start)) = start {
|
||||||
add_hline(point_scale, [start, pos2(stop_x, start.y)], stroke, mesh);
|
let stop = pos2(stop_x, start.y);
|
||||||
|
path.clear();
|
||||||
|
path.add_line_segment([start, stop]);
|
||||||
|
let feathering = 1.0 / point_scale.pixels_per_point();
|
||||||
|
path.stroke_open(feathering, &PathStroke::from(stroke), mesh);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -916,34 +923,6 @@ fn add_row_hline(
|
|||||||
end_line(line_start.take(), last_right_x);
|
end_line(line_start.take(), last_right_x);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn add_hline(point_scale: PointScale, [start, stop]: [Pos2; 2], stroke: Stroke, mesh: &mut Mesh) {
|
|
||||||
let antialiased = true;
|
|
||||||
|
|
||||||
if antialiased {
|
|
||||||
let mut path = crate::tessellator::Path::default(); // TODO(emilk): reuse this to avoid re-allocations.
|
|
||||||
path.add_line_segment([start, stop]);
|
|
||||||
let feathering = 1.0 / point_scale.pixels_per_point();
|
|
||||||
path.stroke_open(feathering, &PathStroke::from(stroke), mesh);
|
|
||||||
} else {
|
|
||||||
// Thin lines often lost, so this is a bad idea
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
start.y, stop.y,
|
|
||||||
"Horizontal line must be horizontal, but got: {start:?} -> {stop:?}"
|
|
||||||
);
|
|
||||||
|
|
||||||
let min_y = point_scale.round_to_pixel(start.y - 0.5 * stroke.width);
|
|
||||||
let max_y = point_scale.round_to_pixel(min_y + stroke.width);
|
|
||||||
|
|
||||||
let rect = Rect::from_min_max(
|
|
||||||
pos2(point_scale.round_to_pixel(start.x), min_y),
|
|
||||||
pos2(point_scale.round_to_pixel(stop.x), max_y),
|
|
||||||
);
|
|
||||||
|
|
||||||
mesh.add_colored_rect(rect, stroke.color);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
/// Keeps track of good places to break a long row of text.
|
/// Keeps track of good places to break a long row of text.
|
||||||
|
|||||||
@@ -823,13 +823,16 @@ impl Galley {
|
|||||||
/// same as a cursor at the end.
|
/// same as a cursor at the end.
|
||||||
/// This allows implementing text-selection by dragging above/below the galley.
|
/// This allows implementing text-selection by dragging above/below the galley.
|
||||||
pub fn cursor_from_pos(&self, pos: Vec2) -> CCursor {
|
pub fn cursor_from_pos(&self, pos: Vec2) -> CCursor {
|
||||||
|
// Vertical margin around galley improves text selection UX
|
||||||
|
const VMARGIN: f32 = 5.0;
|
||||||
|
|
||||||
if let Some(first_row) = self.rows.first() {
|
if let Some(first_row) = self.rows.first() {
|
||||||
if pos.y < first_row.min_y() {
|
if pos.y < first_row.min_y() - VMARGIN {
|
||||||
return self.begin();
|
return self.begin();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if let Some(last_row) = self.rows.last() {
|
if let Some(last_row) = self.rows.last() {
|
||||||
if last_row.max_y() < pos.y {
|
if last_row.max_y() + VMARGIN < pos.y {
|
||||||
return self.end();
|
return self.end();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user