fix slider behavior with multiple pointers
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
use std::{
|
||||
f32,
|
||||
sync::{
|
||||
atomic::{AtomicUsize, Ordering},
|
||||
Arc,
|
||||
atomic::{AtomicUsize, Ordering},
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user