feat(segmented_button): add on_middle_press

This commit is contained in:
Jason Hansen 2024-07-01 18:53:45 -06:00 committed by GitHub
parent bfbff0773a
commit 41d1f4a7cd
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 42 additions and 16 deletions

View file

@ -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<T>(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<D: AllowedMimeTypes>(
mut self,

View file

@ -134,6 +134,8 @@ where
#[setters(skip)]
pub(super) on_context: Option<Box<dyn Fn(Entity) -> Message + 'static>>,
#[setters(skip)]
pub(super) on_middle_press: Option<Box<dyn Fn(Entity) -> Message + 'static>>,
#[setters(skip)]
pub(super) on_dnd_drop:
Option<Box<dyn Fn(Entity, Vec<u8>, String, DndAction) -> Message + 'static>>,
pub(super) mimes: Vec<String>,
@ -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<T>(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;