use crossterm::event::KeyEvent;
use ratatui::{layout::Rect, Frame};
use std::any::Any;
use crate::controller::{AskUserQuestionsResponse, PermissionPanelResponse};
use crate::permissions::BatchPermissionResponse;
use crate::keys::NavigationHelper;
use crate::themes::Theme;
pub mod batch_permission_panel;
pub mod chat;
pub mod chat_helpers;
pub mod conversation;
pub mod input;
pub mod permission_panel;
pub mod question_panel;
pub mod session_picker;
pub mod slash_popup;
pub mod status_bar;
pub use batch_permission_panel::{
BatchKeyAction, BatchPermissionOption, BatchPermissionPanel, BatchPermissionPanelConfig,
};
pub use chat::{ChatView, ChatViewConfig, MessageRole, ToolMessageData, ToolStatus};
pub use chat_helpers::RenderFn;
pub use conversation::{ConversationView, ConversationViewFactory};
pub use input::TextInput;
pub use permission_panel::{
KeyAction as PermissionKeyAction, PermissionOption, PermissionPanel, PermissionPanelConfig,
};
pub use question_panel::{
AnswerState, EnterAction, FocusItem, KeyAction as QuestionKeyAction, QuestionPanel,
QuestionPanelConfig,
};
pub use session_picker::{render_session_picker, SessionInfo, SessionPickerConfig, SessionPickerState};
pub use slash_popup::{
render_slash_popup, SimpleCommand, SlashCommandDisplay, SlashPopupConfig,
SlashPopupState,
};
pub use status_bar::{StatusBar, StatusBarConfig, StatusBarData};
pub mod widget_ids {
pub const CHAT_VIEW: &str = "chat_view";
pub const TEXT_INPUT: &str = "text_input";
pub const BATCH_PERMISSION_PANEL: &str = "batch_permission_panel";
pub const PERMISSION_PANEL: &str = "permission_panel";
pub const QUESTION_PANEL: &str = "question_panel";
pub const SESSION_PICKER: &str = "session_picker";
pub const SLASH_POPUP: &str = "slash_popup";
pub const THEME_PICKER: &str = "theme_picker";
pub const STATUS_BAR: &str = "status_bar";
}
pub struct WidgetKeyContext<'a> {
pub theme: &'a Theme,
pub nav: NavigationHelper<'a>,
}
#[derive(Debug, Clone)]
pub enum WidgetKeyResult {
NotHandled,
Handled,
Action(WidgetAction),
}
#[derive(Debug, Clone)]
pub enum WidgetAction {
SubmitQuestion {
tool_use_id: String,
response: AskUserQuestionsResponse,
},
CancelQuestion { tool_use_id: String },
SubmitPermission {
tool_use_id: String,
response: PermissionPanelResponse,
},
CancelPermission { tool_use_id: String },
SubmitBatchPermission {
batch_id: String,
response: BatchPermissionResponse,
},
CancelBatchPermission { batch_id: String },
SwitchSession { session_id: i64 },
ExecuteCommand { command: String },
Close,
}
pub trait Widget: Send + 'static {
fn id(&self) -> &'static str;
fn priority(&self) -> u8 {
100
}
fn is_active(&self) -> bool;
fn handle_key(&mut self, key: KeyEvent, ctx: &WidgetKeyContext) -> WidgetKeyResult;
fn render(&mut self, frame: &mut Frame, area: Rect, theme: &Theme);
fn required_height(&self, available: u16) -> u16 {
let _ = available;
0
}
fn blocks_input(&self) -> bool {
false
}
fn is_overlay(&self) -> bool {
false
}
fn as_any(&self) -> &dyn Any;
fn as_any_mut(&mut self) -> &mut dyn Any;
fn into_any(self: Box<Self>) -> Box<dyn Any>;
}