improv(context-drawer): import definitions and add map method

This commit is contained in:
Michael Aaron Murphy 2025-04-21 18:12:41 +02:00
parent 1abd6d7578
commit 7aadfe6ba6
No known key found for this signature in database
GPG key ID: B2732D4240C9212C
3 changed files with 35 additions and 2 deletions

View file

@ -62,4 +62,22 @@ impl<'a, Message: Clone + 'static> ContextDrawer<'a, Message> {
self.footer = Some(footer.into());
self
}
pub fn map<Out: Clone + 'static>(
mut self,
on_message: fn(Message) -> Out,
) -> ContextDrawer<'a, Out> {
ContextDrawer {
title: self.title,
content: self.content.map(on_message),
header: self.header.map(|el| el.map(on_message)),
footer: self.footer.map(|el| el.map(on_message)),
on_close: on_message(self.on_close),
header_actions: self
.header_actions
.into_iter()
.map(|el| el.map(on_message))
.collect(),
}
}
}

View file

@ -10,6 +10,7 @@ mod action;
pub use action::Action;
use cosmic_config::CosmicConfigEntry;
pub mod context_drawer;
pub use context_drawer::{ContextDrawer, context_drawer};
pub mod cosmic;
#[cfg(all(feature = "winit", feature = "multi-window"))]
pub(crate) mod multi_window;
@ -22,7 +23,6 @@ use crate::prelude::*;
use crate::theme::THEME;
use crate::widget::{container, horizontal_space, id_container, menu, nav_bar, popover};
use apply::Apply;
use context_drawer::ContextDrawer;
use iced::window;
use iced::{Length, Subscription};
pub use settings::Settings;

View file

@ -164,12 +164,27 @@ impl<'a, Message: Clone + 'static> ContextDrawer<'a, Message> {
}
/// Sets the [`Id`] of the [`ContextDrawer`].
#[inline]
pub fn id(mut self, id: iced_core::widget::Id) -> Self {
self.id = Some(id);
self
}
// Optionally assigns message to `on_close` event.
/// Map the message type of the context drawer to another
#[inline]
pub fn map<Out: Clone + 'static>(
mut self,
on_message: fn(Message) -> Out,
) -> ContextDrawer<'a, Out> {
ContextDrawer {
id: self.id,
content: self.content.map(on_message),
drawer: self.drawer.map(on_message),
on_close: self.on_close.map(on_message),
}
}
/// Optionally assigns message to `on_close` event.
#[inline]
pub fn on_close_maybe(mut self, message: Option<Message>) -> Self {
self.on_close = message;