feat(popover): add on_close message
This commit is contained in:
parent
57256e53e5
commit
a79ac361f1
1 changed files with 18 additions and 2 deletions
|
|
@ -38,6 +38,7 @@ pub struct Popover<'a, Message, Renderer> {
|
|||
// XXX Avoid refcell; improve iced overlay API?
|
||||
popup: Option<RefCell<Element<'a, Message, crate::Theme, Renderer>>>,
|
||||
position: Position,
|
||||
on_close: Option<Message>,
|
||||
}
|
||||
|
||||
impl<'a, Message, Renderer> Popover<'a, Message, Renderer> {
|
||||
|
|
@ -47,6 +48,7 @@ impl<'a, Message, Renderer> Popover<'a, Message, Renderer> {
|
|||
modal: false,
|
||||
popup: None,
|
||||
position: Position::Center,
|
||||
on_close: None,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -56,6 +58,12 @@ impl<'a, Message, Renderer> Popover<'a, Message, Renderer> {
|
|||
self
|
||||
}
|
||||
|
||||
/// Emitted when the popup is closed.
|
||||
pub fn on_close(mut self, on_close: Message) -> Self {
|
||||
self.on_close = Some(on_close);
|
||||
self
|
||||
}
|
||||
|
||||
pub fn popup(mut self, popup: impl Into<Element<'a, Message, crate::Theme, Renderer>>) -> Self {
|
||||
self.popup = Some(RefCell::new(popup.into()));
|
||||
self
|
||||
|
|
@ -69,7 +77,7 @@ impl<'a, Message, Renderer> Popover<'a, Message, Renderer> {
|
|||
// TODO More options for positioning similar to GdkPopup, xdg_popup
|
||||
}
|
||||
|
||||
impl<'a, Message, Renderer> Widget<Message, crate::Theme, Renderer>
|
||||
impl<'a, Message: Clone, Renderer> Widget<Message, crate::Theme, Renderer>
|
||||
for Popover<'a, Message, Renderer>
|
||||
where
|
||||
Renderer: iced_core::Renderer,
|
||||
|
|
@ -143,7 +151,14 @@ where
|
|||
)
|
||||
{
|
||||
let state = tree.state.downcast_mut::<State>();
|
||||
let was_open = state.is_open;
|
||||
state.is_open = cursor_position.is_over(layout.bounds());
|
||||
|
||||
if let Some(on_close) = self.on_close.clone() {
|
||||
if was_open && !state.is_open {
|
||||
shell.publish(on_close);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
self.content.as_widget_mut().on_event(
|
||||
|
|
@ -262,7 +277,7 @@ where
|
|||
impl<'a, Message, Renderer> From<Popover<'a, Message, Renderer>>
|
||||
for Element<'a, Message, crate::Theme, Renderer>
|
||||
where
|
||||
Message: 'static,
|
||||
Message: 'static + Clone,
|
||||
Renderer: iced_core::Renderer + 'static,
|
||||
{
|
||||
fn from(popover: Popover<'a, Message, Renderer>) -> Self {
|
||||
|
|
@ -279,6 +294,7 @@ pub struct Overlay<'a, 'b, Message, Renderer> {
|
|||
impl<'a, 'b, Message, Renderer> overlay::Overlay<Message, crate::Theme, Renderer>
|
||||
for Overlay<'a, 'b, Message, Renderer>
|
||||
where
|
||||
Message: Clone,
|
||||
Renderer: iced_core::Renderer,
|
||||
{
|
||||
fn layout(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue