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