use std::sync::{mpsc, Arc, Mutex};
use dces::entity::Entity;
use crate::{event::*, shell::WindowRequest};
#[derive(Clone, Default, Debug)]
pub struct EventAdapter {
event_queue: Arc<Mutex<EventQueue>>,
window_sender: Option<mpsc::Sender<WindowRequest>>,
}
impl EventAdapter {
pub fn new(window_sender: mpsc::Sender<WindowRequest>) -> Self {
EventAdapter {
event_queue: Arc::new(Mutex::new(EventQueue::new())),
window_sender: Some(window_sender),
}
}
pub fn push_event<E: Event + Send>(&self, entity: Entity, event: E) {
self.event_queue
.lock()
.expect("EventAdapter::push_event: Cannot lock event queue.")
.register_event(event, entity);
self.redraw();
}
pub fn push_event_direct<E: Event + Send>(&self, entity: Entity, event: E) {
self.event_queue
.lock()
.expect("EventAdapter::push_event_direct: Cannot lock event queue")
.register_event_with_strategy(event, EventStrategy::Direct, entity);
self.redraw();
}
fn redraw(&self) {
if let Some(window_sender) = &self.window_sender {
window_sender.send(WindowRequest::Redraw).unwrap();
}
}
pub fn len(&self) -> usize {
self.event_queue
.lock()
.expect("EventAdapter::len: Cannot lock event queue.")
.len()
}
pub fn is_empty(&self) -> bool {
self.event_queue
.lock()
.expect("EventAdapter::is_empty: Cannot lock event queue.")
.is_empty()
}
pub(crate) fn event_reader(&self) -> EventReader {
EventReader {
event_adapter: self.clone(),
}
}
}
pub struct EventReader {
event_adapter: EventAdapter,
}
impl Iterator for EventReader {
type Item = EventBox;
fn next(&mut self) -> Option<EventBox> {
self.event_adapter
.event_queue
.lock()
.expect("DequeueIterator::next: Cannot lock event queue.")
.dequeue()
}
}