use crate::component::RenderContext;
use crate::input::Event;
use super::OverlayAction;
pub trait Overlay<M>: Send {
fn handle_event(&mut self, event: &Event) -> OverlayAction<M>;
fn view(&self, ctx: &mut RenderContext<'_, '_>);
}
#[cfg(test)]
mod tests {
use super::*;
use crate::component::RenderContext;
use crate::input::Key;
struct TestOverlay {
consumed_count: u32,
}
impl Overlay<String> for TestOverlay {
fn handle_event(&mut self, event: &Event) -> OverlayAction<String> {
if let Some(key) = event.as_key() {
match key.code {
Key::Esc => OverlayAction::Dismiss,
Key::Enter => OverlayAction::DismissWithMessage("confirmed".to_string()),
_ => {
self.consumed_count += 1;
OverlayAction::Consumed
}
}
} else {
OverlayAction::Propagate
}
}
fn view(&self, _ctx: &mut RenderContext<'_, '_>) {
}
}
#[test]
fn test_overlay_handle_event_consumed() {
let mut overlay = TestOverlay { consumed_count: 0 };
let event = Event::char('a');
let action = overlay.handle_event(&event);
assert!(matches!(action, OverlayAction::Consumed));
assert_eq!(overlay.consumed_count, 1);
}
#[test]
fn test_overlay_handle_event_dismiss() {
let mut overlay = TestOverlay { consumed_count: 0 };
let event = Event::key(Key::Esc);
let action = overlay.handle_event(&event);
assert!(matches!(action, OverlayAction::Dismiss));
}
#[test]
fn test_overlay_handle_event_dismiss_with_message() {
let mut overlay = TestOverlay { consumed_count: 0 };
let event = Event::key(Key::Enter);
let action = overlay.handle_event(&event);
assert!(matches!(action, OverlayAction::DismissWithMessage(ref s) if s == "confirmed"));
}
#[test]
fn test_overlay_handle_event_propagate() {
let mut overlay = TestOverlay { consumed_count: 0 };
let event = Event::Resize(80, 24);
let action = overlay.handle_event(&event);
assert!(matches!(action, OverlayAction::Propagate));
}
}