diff --git a/wgui/src/components/slider.rs b/wgui/src/components/slider.rs index 2672716..bbb0964 100644 --- a/wgui/src/components/slider.rs +++ b/wgui/src/components/slider.rs @@ -7,7 +7,10 @@ use crate::{ animation::{Animation, AnimationEasing}, components::{Component, ComponentBase, ComponentTrait, RefreshData}, drawing::{self}, - event::{self, CallbackDataCommon, EventAlterables, EventListenerCollection, EventListenerKind, StyleSetRequest}, + event::{ + self, CallbackDataCommon, CallbackMetadata, EventAlterables, EventListenerCollection, EventListenerKind, + StyleSetRequest, + }, i18n::Translation, layout::{WidgetID, WidgetPair}, renderer_vk::{ @@ -69,7 +72,7 @@ pub struct Params { } struct State { - dragging: bool, + dragged_by: Option, hovered: bool, values: ValuesMinMax, on_value_changed: Option, @@ -330,7 +333,11 @@ fn register_event_mouse_motion( Box::new(move |common, event_data, (), ()| { let mut state = state.borrow_mut(); - if state.dragging { + let CallbackMetadata::MousePosition(pos) = event_data.metadata else { + unreachable!(); + }; + + if state.dragged_by.is_some_and(|device| device == pos.device) { state.update_value_to_mouse(event_data, &data, common); Ok(EventResult::Consumed) } else { @@ -351,8 +358,12 @@ fn register_event_mouse_press( common.alterables.trigger_haptics(); let mut state = state.borrow_mut(); + let CallbackMetadata::MouseButton(btn) = event_data.metadata else { + unreachable!(); + }; + if state.hovered { - state.dragging = true; + state.dragged_by = Some(btn.device); state.update_value_to_mouse(event_data, &data, common); Ok(EventResult::Consumed) } else { @@ -372,8 +383,8 @@ fn register_event_mouse_release( common.alterables.trigger_haptics(); let mut state = state.borrow_mut(); - if state.dragging { - state.dragging = false; + if state.dragged_by.is_some() { + state.dragged_by = None; Ok(EventResult::Consumed) } else { Ok(EventResult::Pass) @@ -450,7 +461,7 @@ pub fn construct(ess: &mut ConstructEssentials, params: Params) -> anyhow::Resul )?; let state = State { - dragging: false, + dragged_by: None, hovered: false, values: params.values, on_value_changed: None, diff --git a/wgui/src/event.rs b/wgui/src/event.rs index 15874bd..619221d 100644 --- a/wgui/src/event.rs +++ b/wgui/src/event.rs @@ -26,11 +26,13 @@ pub enum MouseButtonIndex { pub struct MouseButton { pub index: MouseButtonIndex, pub pos: Vec2, + pub device: usize, } #[derive(Debug, Clone, Copy)] pub struct MousePosition { pub pos: Vec2, + pub device: usize, } pub struct MouseDownEvent { diff --git a/wgui/src/renderer_vk/text/custom_glyph.rs b/wgui/src/renderer_vk/text/custom_glyph.rs index ed4fd57..4f3412c 100644 --- a/wgui/src/renderer_vk/text/custom_glyph.rs +++ b/wgui/src/renderer_vk/text/custom_glyph.rs @@ -1,8 +1,8 @@ use std::{ f32, sync::{ - atomic::{AtomicUsize, Ordering}, Arc, + atomic::{AtomicUsize, Ordering}, }, }; diff --git a/wgui/src/widget/mod.rs b/wgui/src/widget/mod.rs index dd118f5..43ad633 100644 --- a/wgui/src/widget/mod.rs +++ b/wgui/src/widget/mod.rs @@ -488,6 +488,7 @@ impl WidgetState { CallbackMetadata::MouseButton(event::MouseButton { index: e.index, pos: e.pos, + device: e.device, }), )?); } @@ -500,6 +501,7 @@ impl WidgetState { CallbackMetadata::MouseButton(event::MouseButton { index: e.index, pos: e.pos, + device: e.device, }), )?); } @@ -519,7 +521,10 @@ impl WidgetState { res = Some(self.invoke_listeners( &mut invoke_data, EventListenerKind::MouseMotion, - CallbackMetadata::MousePosition(event::MousePosition { pos: e.pos }), + CallbackMetadata::MousePosition(event::MousePosition { + pos: e.pos, + device: e.device, + }), )?); if self.flags.interactable {