summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector@hecrj.dev>2024-09-13 16:38:38 +0200
committerLibravatar Héctor Ramón Jiménez <hector@hecrj.dev>2024-09-13 16:38:38 +0200
commit9d9ac0ff35f23c15bd2f4dd252855c8638e0f746 (patch)
tree02f05bfd737811d472eb3a92b803f67e5c7c0ede
parent2e3082d6651d35a8239d19ab745507e1553e2ab1 (diff)
downloadiced-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.rs27
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