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,