fix: scroll wheel event warning
This commit is contained in:
parent
3da420fe59
commit
31e01292f9
1 changed files with 54 additions and 18 deletions
|
|
@ -733,25 +733,61 @@ pub fn RealmSceneViewer(
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create wheel handler closure for use in view
|
// Dynamically add/remove wheel listener based on pan mode
|
||||||
let handle_wheel = move |ev: leptos::web_sys::WheelEvent| {
|
// This avoids Chrome's "non-passive wheel listener" warning when not in pan mode
|
||||||
#[cfg(feature = "hydrate")]
|
#[cfg(feature = "hydrate")]
|
||||||
{
|
{
|
||||||
// Only zoom in pan mode and without Ctrl key
|
use std::cell::RefCell;
|
||||||
if is_pan_mode.get() && !ev.ctrl_key() {
|
use std::rc::Rc;
|
||||||
if let Some(zoom_callback) = on_zoom_change {
|
use wasm_bindgen::{closure::Closure, JsCast};
|
||||||
let delta_y = ev.delta_y();
|
|
||||||
// Normalize: scroll up (negative deltaY) = zoom in (positive delta)
|
let wheel_closure: Rc<RefCell<Option<Closure<dyn Fn(web_sys::WheelEvent)>>>> =
|
||||||
// Scroll down (positive deltaY) = zoom out (negative delta)
|
Rc::new(RefCell::new(None));
|
||||||
let zoom_delta = if delta_y < 0.0 { 0.1 } else { -0.1 };
|
let wheel_closure_clone = wheel_closure.clone();
|
||||||
zoom_callback.run(zoom_delta);
|
|
||||||
ev.prevent_default();
|
Effect::new(move |_| {
|
||||||
|
let pan_mode = is_pan_mode.get();
|
||||||
|
|
||||||
|
if let Some(container) = outer_container_ref.get() {
|
||||||
|
let element: &web_sys::Element = &container;
|
||||||
|
|
||||||
|
// Remove existing listener if any
|
||||||
|
if let Some(closure) = wheel_closure_clone.borrow().as_ref() {
|
||||||
|
let _ = element.remove_event_listener_with_callback(
|
||||||
|
"wheel",
|
||||||
|
closure.as_ref().unchecked_ref(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if pan_mode {
|
||||||
|
// Add non-passive wheel listener for zoom
|
||||||
|
let closure = Closure::new(move |ev: web_sys::WheelEvent| {
|
||||||
|
if !ev.ctrl_key() {
|
||||||
|
if let Some(zoom_callback) = on_zoom_change {
|
||||||
|
let delta_y = ev.delta_y();
|
||||||
|
let zoom_delta = if delta_y < 0.0 { 0.1 } else { -0.1 };
|
||||||
|
zoom_callback.run(zoom_delta);
|
||||||
|
ev.prevent_default();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
let options = web_sys::AddEventListenerOptions::new();
|
||||||
|
options.set_passive(false);
|
||||||
|
|
||||||
|
let _ = element.add_event_listener_with_callback_and_add_event_listener_options(
|
||||||
|
"wheel",
|
||||||
|
closure.as_ref().unchecked_ref(),
|
||||||
|
&options,
|
||||||
|
);
|
||||||
|
|
||||||
|
*wheel_closure_clone.borrow_mut() = Some(closure);
|
||||||
|
} else {
|
||||||
|
*wheel_closure_clone.borrow_mut() = None;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
#[cfg(not(feature = "hydrate"))]
|
}
|
||||||
let _ = ev;
|
|
||||||
};
|
|
||||||
|
|
||||||
let aspect_ratio = scene_width as f64 / scene_height as f64;
|
let aspect_ratio = scene_width as f64 / scene_height as f64;
|
||||||
|
|
||||||
|
|
@ -899,7 +935,7 @@ pub fn RealmSceneViewer(
|
||||||
let scene_name = scene.name.clone();
|
let scene_name = scene.name.clone();
|
||||||
|
|
||||||
view! {
|
view! {
|
||||||
<div node_ref=outer_container_ref class=outer_container_class style=outer_container_style on:wheel=handle_wheel>
|
<div node_ref=outer_container_ref class=outer_container_class style=outer_container_style>
|
||||||
<div
|
<div
|
||||||
class=container_class
|
class=container_class
|
||||||
style=container_style
|
style=container_style
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue