From 41d1f4a7cdafd0bf15d7a8213697932a2dc6e8ba Mon Sep 17 00:00:00 2001 From: Jason Hansen Date: Mon, 1 Jul 2024 18:53:45 -0600 Subject: [PATCH] feat(segmented_button): add on_middle_press --- src/widget/nav_bar.rs | 9 +++++ src/widget/segmented_button/widget.rs | 49 ++++++++++++++++++--------- 2 files changed, 42 insertions(+), 16 deletions(-) diff --git a/src/widget/nav_bar.rs b/src/widget/nav_bar.rs index 3aa45818..246293cc 100644 --- a/src/widget/nav_bar.rs +++ b/src/widget/nav_bar.rs @@ -101,6 +101,15 @@ impl<'a, Message: Clone + 'static> NavBar<'a, Message> { self } + /// Emitted when the middle mouse button is pressed on a button. + pub fn on_middle_press(mut self, on_middle_press: T) -> Self + where + T: Fn(Id) -> Message + 'static, + { + self.segmented_button = self.segmented_button.on_middle_press(on_middle_press); + self + } + /// Handle the dnd drop event. pub fn on_dnd_drop( mut self, diff --git a/src/widget/segmented_button/widget.rs b/src/widget/segmented_button/widget.rs index 55bdabe8..a38c2f49 100644 --- a/src/widget/segmented_button/widget.rs +++ b/src/widget/segmented_button/widget.rs @@ -134,6 +134,8 @@ where #[setters(skip)] pub(super) on_context: Option Message + 'static>>, #[setters(skip)] + pub(super) on_middle_press: Option Message + 'static>>, + #[setters(skip)] pub(super) on_dnd_drop: Option, String, DndAction) -> Message + 'static>>, pub(super) mimes: Vec, @@ -183,6 +185,7 @@ where on_activate: None, on_close: None, on_context: None, + on_middle_press: None, on_dnd_drop: None, on_dnd_enter: None, on_dnd_leave: None, @@ -237,6 +240,15 @@ where self } + /// Emitted when the middle mouse button is pressed on a button. + pub fn on_middle_press(mut self, on_middle_press: T) -> Self + where + T: Fn(Entity) -> Message + 'static, + { + self.on_middle_press = Some(Box::new(on_middle_press)); + self + } + /// Check if an item is enabled. fn is_enabled(&self, key: Entity) -> bool { self.model.items.get(key).map_or(false, |item| item.enabled) @@ -878,24 +890,19 @@ where return event::Status::Captured; } - if let Event::Mouse(mouse::Event::ButtonPressed( - mouse::Button::Middle, - )) = event - { - state.middle_clicked = Some(Item::Tab(key)); - } + if self.on_middle_press.is_none() { + // Emit close message if the tab is middle clicked. + if let Event::Mouse(mouse::Event::ButtonReleased( + mouse::Button::Middle, + )) = event + { + if state.middle_clicked == Some(Item::Tab(key)) { + shell.publish(on_close(key)); + return event::Status::Captured; + } - // Emit close message if the tab is middle clicked. - if let Event::Mouse(mouse::Event::ButtonReleased( - mouse::Button::Middle, - )) = event - { - if state.middle_clicked == Some(Item::Tab(key)) { - shell.publish(on_close(key)); - return event::Status::Captured; + state.middle_clicked = None; } - - state.middle_clicked = None; } } } @@ -931,6 +938,16 @@ where } } } + + if let Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Middle)) = + event + { + state.middle_clicked = Some(Item::Tab(key)); + if let Some(on_middle_press) = self.on_middle_press.as_ref() { + shell.publish(on_middle_press(key)); + return event::Status::Captured; + } + } } break;