use ratatui::layout::Rect;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum HitTarget {
Cards,
CardRow {
row: usize,
col: usize,
},
Stream,
StreamRow(u64),
ChatInput,
StatusSegment(SegmentId),
ModalBody,
ModalRow(usize),
ModalButton(ModalButtonId),
ModalActionButton(ModalAction),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SegmentId {
Instances,
Waiting,
Model,
Backend,
LogLevel,
WebSearch,
Handler,
Scripting,
Usage,
Help,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ModalButtonId {
Confirm,
Cancel,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ModalAction {
RoutingAdd,
RoutingEdit,
RoutingDelete,
RoutingMoveUp,
RoutingMoveDown,
RoutingSave,
RoutingCancel,
DraftSave,
DraftCancel,
DraftKind(crate::tui::modal::routing::HandlerKind),
FormApply,
FormCancel,
FormWireshark,
InterceptCompose,
InterceptSend,
InterceptDismiss,
ComposerSend,
ComposerRaw,
ComposerBack,
EditorAccept,
EditorCancel,
ConfirmYes,
ConfirmNo,
}
impl ModalAction {
pub fn label(&self) -> &'static str {
match self {
ModalAction::RoutingAdd => "[ Add ]",
ModalAction::RoutingEdit => "[ Edit ]",
ModalAction::RoutingDelete => "[ Delete ]",
ModalAction::RoutingMoveUp => "[ Move up ]",
ModalAction::RoutingMoveDown => "[ Move down ]",
ModalAction::RoutingSave => "[ Save ]",
ModalAction::RoutingCancel => "[ Cancel ]",
ModalAction::DraftSave => "[ Save response ]",
ModalAction::DraftCancel => "[ Cancel ]",
ModalAction::DraftKind(kind) => kind.label(),
ModalAction::FormApply => "[ Apply ]",
ModalAction::FormCancel => "[ Cancel ]",
ModalAction::FormWireshark => "[ View in Wireshark ]",
ModalAction::InterceptCompose => "[ Compose answer… ]",
ModalAction::InterceptSend => "[ Answer with nothing ]",
ModalAction::InterceptDismiss => "[ Fail closed ]",
ModalAction::ComposerSend => "[ Send ]",
ModalAction::ComposerRaw => "[ Raw JSON ]",
ModalAction::ComposerBack => "[ Back ]",
ModalAction::EditorAccept => "[ Accept ]",
ModalAction::EditorCancel => "[ Cancel ]",
ModalAction::ConfirmYes => "[ Yes ]",
ModalAction::ConfirmNo => "[ No ]",
}
}
}
#[derive(Default)]
pub struct HitRegistry {
regions: Vec<(Rect, HitTarget)>,
}
impl HitRegistry {
pub fn clear(&mut self) {
self.regions.clear();
}
pub fn push(&mut self, area: Rect, target: HitTarget) {
self.regions.push((area, target));
}
pub fn hit(&self, column: u16, row: u16) -> Option<&HitTarget> {
self.regions
.iter()
.rev()
.find(|(rect, _)| {
column >= rect.x
&& column < rect.x.saturating_add(rect.width)
&& row >= rect.y
&& row < rect.y.saturating_add(rect.height)
})
.map(|(_, target)| target)
}
}