decor mouse hover & leave

This commit is contained in:
galister
2026-01-04 11:18:29 +09:00
parent f5dc5449ad
commit c2446f028f

View File

@@ -1,3 +1,4 @@
use anyhow::Context;
use glam::{Affine2, Affine3A, Quat, Vec2, Vec3, vec2, vec3}; use glam::{Affine2, Affine3A, Quat, Vec2, Vec3, vec2, vec3};
use smithay::{ use smithay::{
desktop::PopupManager, desktop::PopupManager,
@@ -87,6 +88,7 @@ pub struct WvrWindowBackend {
inner_extent: [u32; 3], inner_extent: [u32; 3],
mouse_transform: Affine2, mouse_transform: Affine2,
uv_range: RangeInclusive<f32>, uv_range: RangeInclusive<f32>,
panel_hovered: bool,
} }
impl WvrWindowBackend { impl WvrWindowBackend {
@@ -143,6 +145,7 @@ impl WvrWindowBackend {
panel, panel,
mouse_transform: Affine2::ZERO, mouse_transform: Affine2::ZERO,
uv_range: 0.0..=1.0, uv_range: 0.0..=1.0,
panel_hovered: false,
}) })
} }
@@ -379,7 +382,17 @@ impl OverlayBackend for WvrWindowBackend {
let transformed = self.mouse_transform.transform_point2(hit.uv); let transformed = self.mouse_transform.transform_point2(hit.uv);
if !self.uv_range.contains(&transformed.x) || !self.uv_range.contains(&transformed.y) { if !self.uv_range.contains(&transformed.x) || !self.uv_range.contains(&transformed.y) {
return self.panel.on_hover(app, hit); let Some(meta) = self.meta.as_ref() else {
return HoverResult::default();
};
let mut hit2 = hit.clone();
hit2.uv.y *= meta.extent[1] as f32 / (meta.extent[1] - self.inner_extent[1]) as f32;
self.panel_hovered = true;
return self.panel.on_hover(app, &hit2);
} else if self.panel_hovered {
self.panel.on_left(app, hit.pointer);
self.panel_hovered = false;
} }
let clamped = transformed.clamp(Vec2::ZERO, Vec2::ONE); let clamped = transformed.clamp(Vec2::ZERO, Vec2::ONE);
@@ -397,14 +410,24 @@ impl OverlayBackend for WvrWindowBackend {
} }
fn on_left(&mut self, app: &mut state::AppState, pointer: usize) { fn on_left(&mut self, app: &mut state::AppState, pointer: usize) {
if self.panel_hovered {
self.panel.on_left(app, pointer); self.panel.on_left(app, pointer);
self.panel_hovered = false;
}
} }
fn on_pointer(&mut self, app: &mut state::AppState, hit: &input::PointerHit, pressed: bool) { fn on_pointer(&mut self, app: &mut state::AppState, hit: &input::PointerHit, pressed: bool) {
let transformed = self.mouse_transform.transform_point2(hit.uv); let transformed = self.mouse_transform.transform_point2(hit.uv);
if !self.uv_range.contains(&transformed.x) || !self.uv_range.contains(&transformed.y) { if !self.uv_range.contains(&transformed.x) || !self.uv_range.contains(&transformed.y) {
return self.panel.on_pointer(app, hit, pressed); let Some(meta) = self.meta.as_ref() else {
return;
};
let mut hit2 = hit.clone();
hit2.uv.y *= meta.extent[1] as f32 / (meta.extent[1] - self.inner_extent[1]) as f32;
self.panel_hovered = true;
return self.panel.on_pointer(app, &hit2, pressed);
} }
if let Some(index) = match hit.mode { if let Some(index) = match hit.mode {