Add on_open handler to combo_box widget
Co-authored-by: Wail Abou <abou.w@hotmail.com>
This commit is contained in:
parent
2e3082d665
commit
9d9ac0ff35
1 changed files with 20 additions and 7 deletions
|
|
@ -41,6 +41,7 @@ pub struct ComboBox<
|
||||||
selection: text_input::Value,
|
selection: text_input::Value,
|
||||||
on_selected: Box<dyn Fn(T) -> Message>,
|
on_selected: Box<dyn Fn(T) -> Message>,
|
||||||
on_option_hovered: Option<Box<dyn Fn(T) -> Message>>,
|
on_option_hovered: Option<Box<dyn Fn(T) -> Message>>,
|
||||||
|
on_open: Option<Message>,
|
||||||
on_close: Option<Message>,
|
on_close: Option<Message>,
|
||||||
on_input: Option<Box<dyn Fn(String) -> Message>>,
|
on_input: Option<Box<dyn Fn(String) -> Message>>,
|
||||||
menu_class: <Theme as menu::Catalog>::Class<'a>,
|
menu_class: <Theme as menu::Catalog>::Class<'a>,
|
||||||
|
|
@ -77,6 +78,7 @@ where
|
||||||
on_selected: Box::new(on_selected),
|
on_selected: Box::new(on_selected),
|
||||||
on_option_hovered: None,
|
on_option_hovered: None,
|
||||||
on_input: None,
|
on_input: None,
|
||||||
|
on_open: None,
|
||||||
on_close: None,
|
on_close: None,
|
||||||
menu_class: <Theme as Catalog>::default_menu(),
|
menu_class: <Theme as Catalog>::default_menu(),
|
||||||
padding: text_input::DEFAULT_PADDING,
|
padding: text_input::DEFAULT_PADDING,
|
||||||
|
|
@ -104,6 +106,13 @@ where
|
||||||
self
|
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
|
/// Sets the message that will be produced when the outside area
|
||||||
/// of the [`ComboBox`] is pressed.
|
/// of the [`ComboBox`] is pressed.
|
||||||
pub fn on_close(mut self, message: Message) -> Self {
|
pub fn on_close(mut self, message: Message) -> Self {
|
||||||
|
|
@ -632,15 +641,19 @@ where
|
||||||
text_input_state.is_focused()
|
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 {
|
if started_focused != is_focused {
|
||||||
|
// Focus changed, invalidate widget tree to force a fresh `view`
|
||||||
shell.invalidate_widgets();
|
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
|
event_status
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue