use crate::env::{Clipboard, InteractionStateMap, ScrollStateMap, TextEditStateMap};
use crate::event::InputEvent;
use crate::{ActionEnvelope, ActionInput};
use fission_ir::{CoreIR, NodeId};
use fission_layout::{LayoutSnapshot, TextMeasurer};
use std::sync::Arc;
pub mod text;
pub mod slider;
pub mod gesture;
pub struct ControllerContext<'a> {
pub ir: &'a CoreIR,
pub layout: &'a LayoutSnapshot,
pub text_edit: &'a mut TextEditStateMap,
pub interaction: &'a mut InteractionStateMap,
pub scroll: &'a mut ScrollStateMap,
pub ime_preedit: &'a mut Option<(NodeId, String)>,
pub gesture: &'a mut crate::env::GestureState,
pub clipboard: Option<&'a Arc<dyn Clipboard>>,
pub measurer: Option<&'a Arc<dyn TextMeasurer>>,
pub dispatched_actions: Vec<(NodeId, ActionEnvelope, ActionInput)>,
}
pub trait InputController {
fn handle_event(&mut self, ctx: &mut ControllerContext, event: &InputEvent) -> bool;
}