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},
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<usize>,
hovered: bool,
values: ValuesMinMax,
on_value_changed: Option<SliderValueChangedCallback>,
@@ -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,

View File

@@ -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 {

View File

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

View File

@@ -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 {