From a234a45ea6e9d79a44f6741dff8ccd48cb29db94 Mon Sep 17 00:00:00 2001 From: ellieplayswow <164806095+ellieplayswow@users.noreply.github.com> Date: Mon, 10 Mar 2025 15:21:34 +0000 Subject: [PATCH] fix(segmented_button): ignore button release / finger lifted events when dragged out of target --- src/widget/segmented_button/widget.rs | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/widget/segmented_button/widget.rs b/src/widget/segmented_button/widget.rs index 7841b3a..e40465d 100644 --- a/src/widget/segmented_button/widget.rs +++ b/src/widget/segmented_button/widget.rs @@ -592,6 +592,7 @@ where wheel_timestamp: Default::default(), dnd_state: Default::default(), fingers_pressed: Default::default(), + pressed_item: None, }) } @@ -918,11 +919,25 @@ where } if let Some(on_activate) = self.on_activate.as_ref() { - if let Event::Mouse(mouse::Event::ButtonReleased(mouse::Button::Left)) + if let Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Left)) + | Event::Touch(touch::Event::FingerPressed { .. }) = event + { + state.pressed_item = Some(Item::Tab(key)); + } else if let Event::Mouse(mouse::Event::ButtonReleased( + mouse::Button::Left, + )) | Event::Touch(touch::Event::FingerLifted { .. }) = event { - shell.publish(on_activate(key)); - return event::Status::Captured; + let mut can_activate = true; + if state.pressed_item != Some(Item::Tab(key)) { + can_activate = false; + } + + if can_activate { + shell.publish(on_activate(key)); + state.pressed_item = None; + return event::Status::Captured; + } } } @@ -1666,6 +1681,8 @@ pub struct LocalState { pub dnd_state: crate::widget::dnd_destination::State>, /// Tracks multi-touch events fingers_pressed: HashSet, + /// The currently pressed item + pressed_item: Option, } #[derive(Debug, Default, PartialEq)]