Files
bevy_cef/src/webview/mesh.rs
not-elm d422e14cf8
Some checks failed
book / deploy (push) Has been cancelled
CI / test (macos-latest) (push) Has been cancelled
CI / test (ubuntu-latest) (push) Has been cancelled
CI / test (windows-latest) (push) Has been cancelled
CI / all-doc-tests (push) Has been cancelled
CI / lint (push) Has been cancelled
fix: restrict on_mouse_wheel to mesh webviews only
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 23:25:15 +09:00

105 lines
2.8 KiB
Rust

mod webview_extend_material;
mod webview_extend_standard_material;
mod webview_material;
pub use crate::common::*;
use crate::system_param::pointer::WebviewPointer;
use crate::webview::webview_sprite::WebviewSpritePlugin;
use bevy::input::mouse::MouseWheel;
use bevy::prelude::*;
use bevy_cef_core::prelude::*;
pub use webview_extend_material::*;
pub use webview_extend_standard_material::*;
pub use webview_material::*;
pub struct MeshWebviewPlugin;
impl Plugin for MeshWebviewPlugin {
fn build(&self, app: &mut App) {
if !app.is_plugin_added::<MeshPickingPlugin>() {
app.add_plugins(MeshPickingPlugin);
}
app.add_plugins((
WebviewMaterialPlugin,
WebviewExtendStandardMaterialPlugin,
WebviewSpritePlugin,
))
.add_systems(
Update,
(
setup_observers,
on_mouse_wheel.run_if(on_message::<MouseWheel>),
),
);
}
}
fn setup_observers(
mut commands: Commands,
webviews: Query<Entity, (Added<WebviewSource>, Or<(With<Mesh3d>, With<Mesh2d>)>)>,
) {
for entity in webviews.iter() {
commands
.entity(entity)
.observe(on_pointer_move)
.observe(on_pointer_pressed)
.observe(on_pointer_released);
}
}
fn on_pointer_move(
trigger: On<Pointer<Move>>,
input: Res<ButtonInput<MouseButton>>,
pointer: WebviewPointer,
browsers: NonSend<Browsers>,
) {
let Some((webview, pos)) = pointer.pos_from_trigger(&trigger) else {
return;
};
browsers.send_mouse_move(&webview, input.get_pressed(), pos, false);
}
fn on_pointer_pressed(
trigger: On<Pointer<Press>>,
browsers: NonSend<Browsers>,
pointer: WebviewPointer,
) {
let Some((webview, pos)) = pointer.pos_from_trigger(&trigger) else {
return;
};
browsers.send_mouse_click(&webview, pos, trigger.button, false);
}
fn on_pointer_released(
trigger: On<Pointer<Release>>,
browsers: NonSend<Browsers>,
pointer: WebviewPointer,
) {
let Some((webview, pos)) = pointer.pos_from_trigger(&trigger) else {
return;
};
browsers.send_mouse_click(&webview, pos, trigger.button, true);
}
fn on_mouse_wheel(
mut er: MessageReader<MouseWheel>,
browsers: NonSend<Browsers>,
pointer: WebviewPointer,
windows: Query<&Window>,
webviews: Query<Entity, (With<WebviewSource>, Or<(With<Mesh3d>, With<Mesh2d>)>)>,
) {
let Some(cursor_pos) = windows.iter().find_map(|window| window.cursor_position()) else {
return;
};
for event in er.read() {
for webview in webviews.iter() {
let Some(pos) = pointer.pointer_pos(webview, cursor_pos) else {
continue;
};
browsers.send_mouse_wheel(&webview, pos, Vec2::new(event.x, event.y));
}
}
}