summaryrefslogtreecommitdiffstats
path: root/widget
diff options
context:
space:
mode:
authorLibravatar Rinat <figurative63@protonmail.com>2023-12-01 10:34:15 +0500
committerLibravatar Héctor Ramón Jiménez <hector@hecrj.dev>2024-02-06 00:10:54 +0100
commit6cf7c4645dab706081f164558e0b5ae228783338 (patch)
tree65079b96d0d8d1c3bac106df8a11794beda32b40 /widget
parentb5b267c31c59d4b80629f8c4ec38d395f8d99eae (diff)
downloadiced-6cf7c4645dab706081f164558e0b5ae228783338.tar.gz
iced-6cf7c4645dab706081f164558e0b5ae228783338.tar.bz2
iced-6cf7c4645dab706081f164558e0b5ae228783338.zip
Add `on_opened` and `on_closed` handlers for `PickList`
Diffstat (limited to 'widget')
-rw-r--r--widget/src/helpers.rs1
-rw-r--r--widget/src/pick_list.rs34
2 files changed, 33 insertions, 2 deletions
diff --git a/widget/src/helpers.rs b/widget/src/helpers.rs
index e13e900a..3f34d165 100644
--- a/widget/src/helpers.rs
+++ b/widget/src/helpers.rs
@@ -271,6 +271,7 @@ pub fn pick_list<'a, Message, Theme, Renderer, T>(
where
T: ToString + PartialEq + 'static,
[T]: ToOwned<Owned = Vec<T>>,
+ Message: Clone,
Renderer: core::text::Renderer,
Theme: pick_list::StyleSheet
+ scrollable::StyleSheet
diff --git a/widget/src/pick_list.rs b/widget/src/pick_list.rs
index 475115c2..a25369b8 100644
--- a/widget/src/pick_list.rs
+++ b/widget/src/pick_list.rs
@@ -35,6 +35,8 @@ pub struct PickList<
Renderer: text::Renderer,
{
on_selected: Box<dyn Fn(T) -> Message + 'a>,
+ on_opened: Option<Message>,
+ on_closed: Option<Message>,
options: Cow<'a, [T]>,
placeholder: Option<String>,
selected: Option<T>,
@@ -53,6 +55,7 @@ impl<'a, T: 'a, Message, Theme, Renderer>
where
T: ToString + PartialEq,
[T]: ToOwned<Owned = Vec<T>>,
+ Message: Clone,
Theme: StyleSheet
+ scrollable::StyleSheet
+ menu::StyleSheet
@@ -72,6 +75,8 @@ where
) -> Self {
Self {
on_selected: Box::new(on_selected),
+ on_opened: None,
+ on_closed: None,
options: options.into(),
placeholder: None,
selected,
@@ -137,6 +142,18 @@ where
self
}
+ /// Sets the message that will be produced when the [`PickList`] Menu is openned menu.
+ pub fn on_opened(mut self, msg: Message) -> Self {
+ self.on_opened = Some(msg);
+ self
+ }
+
+ /// Sets the message that will be produced when the [`PickList`] Menu is closed menu.
+ pub fn on_closed(mut self, msg: Message) -> Self {
+ self.on_closed = Some(msg);
+ self
+ }
+
/// Sets the style of the [`PickList`].
pub fn style(
mut self,
@@ -152,7 +169,7 @@ impl<'a, T: 'a, Message, Theme, Renderer> Widget<Message, Theme, Renderer>
where
T: Clone + ToString + PartialEq + 'static,
[T]: ToOwned<Owned = Vec<T>>,
- Message: 'a,
+ Message: Clone + 'a,
Theme: StyleSheet
+ scrollable::StyleSheet
+ menu::StyleSheet
@@ -213,6 +230,8 @@ where
cursor,
shell,
self.on_selected.as_ref(),
+ self.on_opened.as_ref(),
+ self.on_closed.as_ref(),
self.selected.as_ref(),
&self.options,
|| tree.state.downcast_mut::<State<Renderer::Paragraph>>(),
@@ -290,7 +309,7 @@ impl<'a, T: 'a, Message, Theme, Renderer>
where
T: Clone + ToString + PartialEq + 'static,
[T]: ToOwned<Owned = Vec<T>>,
- Message: 'a,
+ Message: Clone + 'a,
Theme: StyleSheet
+ scrollable::StyleSheet
+ menu::StyleSheet
@@ -474,6 +493,8 @@ pub fn update<'a, T, P, Message>(
cursor: mouse::Cursor,
shell: &mut Shell<'_, Message>,
on_selected: &dyn Fn(T) -> Message,
+ on_opened: Option<&Message>,
+ on_closed: Option<&Message>,
selected: Option<&T>,
options: &[T],
state: impl FnOnce() -> &'a mut State<P>,
@@ -481,6 +502,7 @@ pub fn update<'a, T, P, Message>(
where
T: PartialEq + Clone + 'a,
P: text::Paragraph + 'a,
+ Message: Clone,
{
match event {
Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Left))
@@ -492,12 +514,20 @@ where
// bounds or on the drop-down, either way we close the overlay.
state.is_open = false;
+ if let Some(on_closed) = on_closed {
+ shell.publish(on_closed.clone());
+ }
+
event::Status::Captured
} else if cursor.is_over(layout.bounds()) {
state.is_open = true;
state.hovered_option =
options.iter().position(|option| Some(option) == selected);
+ if let Some(on_opened) = on_opened {
+ shell.publish(on_opened.clone());
+ }
+
event::Status::Captured
} else {
event::Status::Ignored