1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
use crate::widget::WidgetId; use std::{any::Any, sync::mpsc::Sender}; pub type Message = Box<dyn Any + Send + Sync>; pub type Messages = Vec<Message>; #[derive(Clone)] pub struct MessageSender(Sender<(WidgetId, Message)>); impl MessageSender { pub fn new(sender: Sender<(WidgetId, Message)>) -> Self { Self(sender) } pub fn write<T>(&self, id: WidgetId, message: T) -> bool where T: 'static + Any + Send + Sync, { self.0.send((id, Box::new(message))).is_ok() } pub fn write_raw(&self, id: WidgetId, message: Message) -> bool { self.0.send((id, message)).is_ok() } pub fn write_raw_all<I>(&self, messages: I) where I: IntoIterator<Item = (WidgetId, Message)>, { for data in messages { drop(self.0.send(data)); } } } pub struct Messenger<'a> { sender: MessageSender, pub messages: &'a [Message], } impl<'a> Messenger<'a> { pub fn new(sender: MessageSender, messages: &'a [Message]) -> Self { Self { sender, messages } } pub fn write<T>(&self, id: WidgetId, message: T) -> bool where T: 'static + Send + Sync, { self.sender.write(id, message) } pub fn write_raw(&self, id: WidgetId, message: Message) -> bool { self.sender.write_raw(id, message) } pub fn write_raw_all<I>(&self, messages: I) where I: IntoIterator<Item = (WidgetId, Message)>, { self.sender.write_raw_all(messages); } }