diff options
author | 2024-09-13 16:38:38 +0200 | |
---|---|---|
committer | 2024-09-13 16:38:38 +0200 | |
commit | 9d9ac0ff35f23c15bd2f4dd252855c8638e0f746 (patch) | |
tree | 02f05bfd737811d472eb3a92b803f67e5c7c0ede | |
parent | 2e3082d6651d35a8239d19ab745507e1553e2ab1 (diff) | |
download | iced-9d9ac0ff35f23c15bd2f4dd252855c8638e0f746.tar.gz iced-9d9ac0ff35f23c15bd2f4dd252855c8638e0f746.tar.bz2 iced-9d9ac0ff35f23c15bd2f4dd252855c8638e0f746.zip |
Add `on_open` handler to `combo_box` widget
Co-authored-by: Wail Abou <abou.w@hotmail.com>
-rw-r--r-- | widget/src/combo_box.rs | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/widget/src/combo_box.rs b/widget/src/combo_box.rs index 62785b2c..a51701ca 100644 --- a/widget/src/combo_box.rs +++ b/widget/src/combo_box.rs @@ -41,6 +41,7 @@ pub struct ComboBox< selection: text_input::Value, on_selected: Box<dyn Fn(T) -> Message>, on_option_hovered: Option<Box<dyn Fn(T) -> Message>>, + on_open: Option<Message>, on_close: Option<Message>, on_input: Option<Box<dyn Fn(String) -> Message>>, menu_class: <Theme as menu::Catalog>::Class<'a>, @@ -77,6 +78,7 @@ where on_selected: Box::new(on_selected), on_option_hovered: None, on_input: None, + on_open: None, on_close: None, menu_class: <Theme as Catalog>::default_menu(), padding: text_input::DEFAULT_PADDING, @@ -104,6 +106,13 @@ where self } + /// Sets the message that will be produced when the [`ComboBox`] is + /// opened. + pub fn on_open(mut self, message: Message) -> Self { + self.on_open = Some(message); + self + } + /// Sets the message that will be produced when the outside area /// of the [`ComboBox`] is pressed. pub fn on_close(mut self, message: Message) -> Self { @@ -632,15 +641,19 @@ where text_input_state.is_focused() }; - if started_focused && !is_focused && !published_message_to_shell { - if let Some(message) = self.on_close.take() { - shell.publish(message); - } - } - - // Focus changed, invalidate widget tree to force a fresh `view` if started_focused != is_focused { + // Focus changed, invalidate widget tree to force a fresh `view` shell.invalidate_widgets(); + + if !published_message_to_shell { + if is_focused { + if let Some(on_open) = self.on_open.take() { + shell.publish(on_open); + } + } else if let Some(on_close) = self.on_close.take() { + shell.publish(on_close); + } + } } event_status |