From 51ede4bce64b5add7d162260751a4d4e705f9138 Mon Sep 17 00:00:00 2001 From: Jason Hansen Date: Tue, 31 Dec 2024 16:37:04 -0700 Subject: [PATCH] fix(segmented_button): close context menu when clicked outside --- src/widget/menu/menu_inner.rs | 10 ++++++++-- src/widget/segmented_button/widget.rs | 15 ++++++++++++--- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/widget/menu/menu_inner.rs b/src/widget/menu/menu_inner.rs index 19644b7a..b64fba2c 100644 --- a/src/widget/menu/menu_inner.rs +++ b/src/widget/menu/menu_inner.rs @@ -579,7 +579,7 @@ where .merge(menu_status) } - Mouse(ButtonReleased(Left)) | Touch(FingerLifted { .. }) => { + Mouse(ButtonReleased(_)) | Touch(FingerLifted { .. }) => { let state = self.tree.state.downcast_mut::(); state.pressed = false; @@ -596,7 +596,13 @@ where .iter() .any(|ms| ms.menu_bounds.check_bounds.contains(overlay_cursor)); - if self.close_condition.click_inside && is_inside { + if self.close_condition.click_inside + && is_inside + && matches!( + event, + Mouse(ButtonReleased(Left)) | Touch(FingerLifted { .. }) + ) + { state.reset(); return Captured; } diff --git a/src/widget/segmented_button/widget.rs b/src/widget/segmented_button/widget.rs index 9fa62d49..7841b3ae 100644 --- a/src/widget/segmented_button/widget.rs +++ b/src/widget/segmented_button/widget.rs @@ -910,6 +910,13 @@ where } } + if let Event::Mouse(mouse::Event::ButtonReleased(_)) + | Event::Touch(touch::Event::FingerLifted { .. }) = event + { + state.focused = false; + state.focused_item = Item::None; + } + if let Some(on_activate) = self.on_activate.as_ref() { if let Event::Mouse(mouse::Event::ButtonReleased(mouse::Button::Left)) | Event::Touch(touch::Event::FingerLifted { .. }) = event @@ -928,8 +935,6 @@ where state.show_context = Some(key); state.context_cursor = cursor_position.position().unwrap_or_default(); - state.focused = true; - state.focused_item = Item::Tab(key); let menu_state = tree.children[0].state.downcast_mut::(); @@ -1321,13 +1326,17 @@ where let center_y = bounds.center_y(); + let menu_open = !tree.children.is_empty() + && tree.children[0].state.downcast_ref::().open; + let key_is_active = self.model.is_active(key); let key_is_hovered = self.button_is_hovered(state, key); + let key_has_context_menu_open = menu_open && state.show_context == Some(key); let status_appearance = if self.button_is_focused(state, key) { appearance.focus } else if key_is_active { appearance.active - } else if key_is_hovered { + } else if key_is_hovered || key_has_context_menu_open { appearance.hover } else { appearance.inactive