use crate::app_state_container::AppStateContainer;
use crate::buffer::{AppMode, BufferAPI, BufferManager};
use crate::ui::state::shadow_state::ShadowStateManager;
use crate::widgets::help_widget::HelpAction;
use crate::widgets::stats_widget::StatsAction;
use anyhow::Result;
use crossterm::event::{KeyCode, KeyEvent, KeyModifiers};
use std::cell::RefCell;
pub struct DebugInputContext<'a> {
pub buffer_manager: &'a mut BufferManager,
pub debug_widget: &'a mut crate::widgets::debug_widget::DebugWidget,
pub shadow_state: &'a RefCell<ShadowStateManager>,
}
pub struct HelpInputContext<'a> {
pub buffer_manager: &'a mut BufferManager,
pub help_widget: &'a mut crate::widgets::help_widget::HelpWidget,
pub state_container: &'a AppStateContainer,
pub shadow_state: &'a RefCell<ShadowStateManager>,
}
pub struct StatsInputContext<'a> {
pub buffer_manager: &'a mut BufferManager,
pub stats_widget: &'a mut crate::widgets::stats_widget::StatsWidget,
pub shadow_state: &'a RefCell<ShadowStateManager>,
}
pub fn handle_debug_input(ctx: &mut DebugInputContext, key: KeyEvent) -> Result<bool> {
match key.code {
KeyCode::Char('c') if key.modifiers.contains(KeyModifiers::CONTROL) => {
return Ok(true);
}
KeyCode::Char('t') if key.modifiers.contains(KeyModifiers::CONTROL) => {
if let Some(buffer) = ctx.buffer_manager.current_mut() {
buffer.set_status_message(
"Test case yank not yet implemented in extracted handler".to_string(),
);
}
return Ok(false);
}
KeyCode::Char('y') if key.modifiers.contains(KeyModifiers::SHIFT) => {
if let Some(buffer) = ctx.buffer_manager.current_mut() {
buffer.set_status_message(
"Debug yank not yet implemented in extracted handler".to_string(),
);
}
return Ok(false);
}
_ => {}
}
if ctx.debug_widget.handle_key(key) {
if let Some(buffer) = ctx.buffer_manager.current_mut() {
ctx.shadow_state
.borrow_mut()
.set_mode(AppMode::Command, buffer, "debug_exit");
}
}
Ok(false)
}
pub fn handle_pretty_query_input(ctx: &mut DebugInputContext, key: KeyEvent) -> Result<bool> {
if key.code == KeyCode::Char('c') && key.modifiers.contains(KeyModifiers::CONTROL) {
return Ok(true);
}
if ctx.debug_widget.handle_key(key) {
if let Some(buffer) = ctx.buffer_manager.current_mut() {
ctx.shadow_state
.borrow_mut()
.set_mode(AppMode::Command, buffer, "pretty_query_exit");
}
}
Ok(false)
}
pub fn handle_cache_list_input(ctx: &mut DebugInputContext, key: KeyEvent) -> Result<bool> {
match key.code {
KeyCode::Char('c') if key.modifiers.contains(KeyModifiers::CONTROL) => return Ok(true),
KeyCode::Esc | KeyCode::Enter | KeyCode::Char('q') => {
if let Some(buffer) = ctx.buffer_manager.current_mut() {
ctx.shadow_state
.borrow_mut()
.set_mode(AppMode::Command, buffer, "cache_list_exit");
}
}
_ => {}
}
Ok(false)
}
pub fn handle_help_input(ctx: &mut HelpInputContext, key: KeyEvent) -> Result<bool> {
match ctx.help_widget.handle_key(key) {
HelpAction::Exit => {
exit_help(ctx);
}
HelpAction::ShowDebug => {
}
_ => {
}
}
Ok(false)
}
fn exit_help(ctx: &mut HelpInputContext) {
ctx.help_widget.on_exit();
ctx.state_container.set_help_visible(false);
let mode = if let Some(buffer) = ctx.buffer_manager.current() {
if buffer.has_dataview() {
AppMode::Results
} else {
AppMode::Command
}
} else {
AppMode::Command
};
if let Some(buffer) = ctx.buffer_manager.current_mut() {
ctx.shadow_state
.borrow_mut()
.set_mode(mode, buffer, "help_exit");
}
}
pub fn handle_column_stats_input(ctx: &mut StatsInputContext, key: KeyEvent) -> Result<bool> {
match ctx.stats_widget.handle_key(key) {
StatsAction::Quit => return Ok(true),
StatsAction::Close => {
if let Some(buffer) = ctx.buffer_manager.current_mut() {
buffer.set_column_stats(None);
ctx.shadow_state
.borrow_mut()
.set_mode(AppMode::Results, buffer, "stats_close");
}
}
StatsAction::Continue | StatsAction::PassThrough => {}
}
Ok(false)
}