unen_event 0.0.3

Event crate for UnnamedEngine
Documentation
use std::sync::mpsc::{channel, Receiver, Sender};

use crate::{
    event::Event,
    prelude::{EventBox, EventHandler},
};

type EventReceiver = Receiver<EventBox>;

#[derive(Debug, Clone)]
pub struct EventEmitter {
    sender: Sender<EventBox>,
}

impl EventEmitter {
    pub fn emit<E: Event>(&self, event: E) {
        let _ = self.sender.send(EventBox::new(event));
    }
}

pub struct EventManager {
    handlers: Vec<Box<dyn EventHandler>>,
    receiver: EventReceiver,
    emitter: EventEmitter,
}

impl EventManager {
    pub fn add_handler<H: EventHandler + 'static>(&mut self, handler: H) {
        self.handlers.push(Box::new(handler));
    }

    pub fn step(&mut self) {
        while let Ok(event) = self.receiver.try_recv() {
            for handler in &mut self.handlers {
                if handler.handle(&event) {
                    break;
                }
            }
        }
    }

    pub fn get_emitter(&self) -> EventEmitter {
        self.emitter.clone()
    }
}

impl Default for EventManager {
    fn default() -> Self {
        let (sender, receiver) = channel();
        let emitter = EventEmitter { sender };

        Self {
            handlers: Vec::new(),
            receiver,
            emitter,
        }
    }
}