fix slider behavior with multiple pointers

This commit is contained in:
galister
2025-12-20 19:56:43 +09:00
parent 4c06fef35d
commit a60476b47e
4 changed files with 27 additions and 9 deletions

View File

@@ -7,7 +7,10 @@ use crate::{
animation::{Animation, AnimationEasing}, animation::{Animation, AnimationEasing},
components::{Component, ComponentBase, ComponentTrait, RefreshData}, components::{Component, ComponentBase, ComponentTrait, RefreshData},
drawing::{self}, drawing::{self},
event::{self, CallbackDataCommon, EventAlterables, EventListenerCollection, EventListenerKind, StyleSetRequest}, event::{
self, CallbackDataCommon, CallbackMetadata, EventAlterables, EventListenerCollection, EventListenerKind,
StyleSetRequest,
},
i18n::Translation, i18n::Translation,
layout::{WidgetID, WidgetPair}, layout::{WidgetID, WidgetPair},
renderer_vk::{ renderer_vk::{
@@ -69,7 +72,7 @@ pub struct Params {
} }
struct State { struct State {
dragging: bool, dragged_by: Option<usize>,
hovered: bool, hovered: bool,
values: ValuesMinMax, values: ValuesMinMax,
on_value_changed: Option<SliderValueChangedCallback>, on_value_changed: Option<SliderValueChangedCallback>,
@@ -330,7 +333,11 @@ fn register_event_mouse_motion(
Box::new(move |common, event_data, (), ()| { Box::new(move |common, event_data, (), ()| {
let mut state = state.borrow_mut(); 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); state.update_value_to_mouse(event_data, &data, common);
Ok(EventResult::Consumed) Ok(EventResult::Consumed)
} else { } else {
@@ -351,8 +358,12 @@ fn register_event_mouse_press(
common.alterables.trigger_haptics(); common.alterables.trigger_haptics();
let mut state = state.borrow_mut(); let mut state = state.borrow_mut();
let CallbackMetadata::MouseButton(btn) = event_data.metadata else {
unreachable!();
};
if state.hovered { if state.hovered {
state.dragging = true; state.dragged_by = Some(btn.device);
state.update_value_to_mouse(event_data, &data, common); state.update_value_to_mouse(event_data, &data, common);
Ok(EventResult::Consumed) Ok(EventResult::Consumed)
} else { } else {
@@ -372,8 +383,8 @@ fn register_event_mouse_release(
common.alterables.trigger_haptics(); common.alterables.trigger_haptics();
let mut state = state.borrow_mut(); let mut state = state.borrow_mut();
if state.dragging { if state.dragged_by.is_some() {
state.dragging = false; state.dragged_by = None;
Ok(EventResult::Consumed) Ok(EventResult::Consumed)
} else { } else {
Ok(EventResult::Pass) Ok(EventResult::Pass)
@@ -450,7 +461,7 @@ pub fn construct(ess: &mut ConstructEssentials, params: Params) -> anyhow::Resul
)?; )?;
let state = State { let state = State {
dragging: false, dragged_by: None,
hovered: false, hovered: false,
values: params.values, values: params.values,
on_value_changed: None, on_value_changed: None,

View File

@@ -26,11 +26,13 @@ pub enum MouseButtonIndex {
pub struct MouseButton { pub struct MouseButton {
pub index: MouseButtonIndex, pub index: MouseButtonIndex,
pub pos: Vec2, pub pos: Vec2,
pub device: usize,
} }
#[derive(Debug, Clone, Copy)] #[derive(Debug, Clone, Copy)]
pub struct MousePosition { pub struct MousePosition {
pub pos: Vec2, pub pos: Vec2,
pub device: usize,
} }
pub struct MouseDownEvent { pub struct MouseDownEvent {

View File

@@ -1,8 +1,8 @@
use std::{ use std::{
f32, f32,
sync::{ sync::{
atomic::{AtomicUsize, Ordering},
Arc, Arc,
atomic::{AtomicUsize, Ordering},
}, },
}; };

View File

@@ -488,6 +488,7 @@ impl WidgetState {
CallbackMetadata::MouseButton(event::MouseButton { CallbackMetadata::MouseButton(event::MouseButton {
index: e.index, index: e.index,
pos: e.pos, pos: e.pos,
device: e.device,
}), }),
)?); )?);
} }
@@ -500,6 +501,7 @@ impl WidgetState {
CallbackMetadata::MouseButton(event::MouseButton { CallbackMetadata::MouseButton(event::MouseButton {
index: e.index, index: e.index,
pos: e.pos, pos: e.pos,
device: e.device,
}), }),
)?); )?);
} }
@@ -519,7 +521,10 @@ impl WidgetState {
res = Some(self.invoke_listeners( res = Some(self.invoke_listeners(
&mut invoke_data, &mut invoke_data,
EventListenerKind::MouseMotion, EventListenerKind::MouseMotion,
CallbackMetadata::MousePosition(event::MousePosition { pos: e.pos }), CallbackMetadata::MousePosition(event::MousePosition {
pos: e.pos,
device: e.device,
}),
)?); )?);
if self.flags.interactable { if self.flags.interactable {