use teksilo_core::widget::EventContext;
use crate::toast::registry::ToastRegistry;
use crate::toast::{Toast, ToastHandle, ToastRoute};
pub trait EventContextToastExt {
fn show_toast(&mut self, toast: Toast) -> ToastHandle;
fn dismiss_toast(&mut self, handle: &ToastHandle);
}
impl EventContextToastExt for EventContext<'_> {
fn show_toast(&mut self, mut toast: Toast) -> ToastHandle {
if toast.target.is_none() {
toast.target = self.window().map(|w| ToastRoute::Window(w.id()));
}
let Some(registry) = self.app_state::<ToastRegistry>().cloned() else {
warn_missing_install();
return ToastHandle::new(crate::toast::ToastHandleInner {
entry_id: 0,
dismissed: std::cell::Cell::new(true),
registry: ToastRegistry::new(crate::toast::host::ToastInstallOptions::default()),
});
};
let (handle, overflow_callback) = registry.enqueue(toast);
if let Some((cause, cb)) = overflow_callback {
cb(cause, self);
}
handle
}
fn dismiss_toast(&mut self, handle: &ToastHandle) {
let handle = handle.clone();
handle.dismiss(self);
}
}
fn warn_missing_install() {
thread_local! {
static WARNED: std::cell::Cell<bool> = const { std::cell::Cell::new(false) };
}
WARNED.with(|w| {
if !w.get() {
eprintln!(
"[teksilo-widgets::toast] ctx.show_toast(...) called without install_toast(opts) \
on the TeksiloAppBuilder — the toast was dropped. See teksilo::install_toast \
or teksilo_widgets::toast docs."
);
w.set(true);
}
});
}