use std::sync::mpsc::Sender;
use crate::event::GlimEvent;
use crate::input::InputProcessor;
use crate::input::processor::{ConfigProcessor, PipelineActionsProcessor, ProjectDetailsProcessor};
use crate::ui::StatefulWidgets;
pub struct InputMultiplexer {
sender: Sender<GlimEvent>,
processors: Vec<Box<dyn InputProcessor>>,
}
impl InputMultiplexer {
pub fn new(sender: Sender<GlimEvent>) -> Self {
Self {
sender,
processors: Vec::new(),
}
}
pub fn push(&mut self, processor: Box<dyn InputProcessor>) {
self.processors.push(processor);
if let Some(processor) = self.processors.last() { processor.on_push() }
}
pub fn pop_processor(&mut self) {
if let Some(processor) = self.processors.last() {
processor.on_pop();
}
self.processors.pop();
}
pub fn apply(
&mut self,
event: &GlimEvent,
ui: &mut StatefulWidgets,
) {
match event {
GlimEvent::OpenProjectDetails(id) => {
self.push(Box::new(ProjectDetailsProcessor::new(self.sender.clone(), *id)));
},
GlimEvent::CloseProjectDetails => self.pop_processor(),
GlimEvent::OpenPipelineActions(_, _) => {
self.push(Box::new(PipelineActionsProcessor::new(self.sender.clone())));
},
GlimEvent::ClosePipelineActions => self.pop_processor(),
GlimEvent::DisplayConfig => {
self.push(Box::new(ConfigProcessor::new(self.sender.clone())));
},
GlimEvent::CloseConfig => self.pop_processor(),
_ => ()
}
if let Some(processor) = self.processors.last_mut() {
processor.apply(event, ui)
}
}
}