use crossterm::event::KeyCode;
use a2ui_base::catalog::Catalog;
use a2ui_base::event::{EventResult, InputEvent, InputKey};
use a2ui_base::message_processor::MessageProcessor;
use a2ui_base::model::component_context::ComponentContext;
use crate::component_impl::ComponentRegistry;
use crate::focus_manager::FocusManager;
pub fn map_key_code(code: KeyCode) -> Option<InputKey> {
let key = match code {
KeyCode::Enter => InputKey::Enter,
KeyCode::Tab => InputKey::Tab,
KeyCode::BackTab => InputKey::BackTab,
KeyCode::Up => InputKey::Up,
KeyCode::Down => InputKey::Down,
KeyCode::Left => InputKey::Left,
KeyCode::Right => InputKey::Right,
KeyCode::Backspace => InputKey::Backspace,
KeyCode::Delete => InputKey::Delete,
KeyCode::Esc => InputKey::Escape,
KeyCode::Char(' ') => InputKey::Space,
KeyCode::Char(c) => InputKey::Char(c),
_ => return None,
};
Some(key)
}
pub fn dispatch_to_focused(
processor: &MessageProcessor,
registry: &ComponentRegistry,
catalog: &Catalog,
focus: &FocusManager,
event: &InputEvent,
) -> Option<EventResult> {
let focused_id = focus.focused_id()?.to_string();
let surface = processor.model.surfaces().next()?;
let surface_id = surface.id.clone();
let (comp_type, has_component) = {
let components = surface.components.borrow();
match components.get(&focused_id) {
Some(m) => (m.component_type.clone(), true),
None => (String::new(), false),
}
};
if !has_component {
return None;
}
let tui_comp = registry.get(&comp_type)?;
let data_model = surface.data_model.borrow();
let components = surface.components.borrow();
let catalog_functions = &catalog.functions;
let ctx = ComponentContext::new(
focused_id.clone(),
surface_id,
&data_model,
&components,
catalog_functions,
"",
Some(focused_id.clone()),
);
let result = tui_comp.handle_event(&ctx, event);
drop(components);
drop(data_model);
result
}
pub use a2ui_base::interaction::apply_event_result;
pub fn handle_key(
processor: &mut MessageProcessor,
registry: &ComponentRegistry,
catalog: &Catalog,
focus: &FocusManager,
code: KeyCode,
) -> Option<String> {
let key = map_key_code(code)?;
let event = InputEvent::KeyPress { key };
let result = dispatch_to_focused(processor, registry, catalog, focus, &event)?;
apply_event_result(processor, result)
}