use crate::app_state_container::AppStateContainer;
use crate::buffer::{AppMode, BufferAPI, BufferManager, EditMode};
use crate::cursor_manager::CursorManager;
use crate::ui::utils::text_operations::{self, CursorMovementResult, TextOperationResult};
pub trait InputBehavior {
fn buffer_manager(&mut self) -> &mut BufferManager;
fn cursor_manager(&mut self) -> &mut CursorManager;
fn set_input_text_with_cursor(&mut self, text: String, cursor: usize);
fn state_container(&self) -> &AppStateContainer;
fn state_container_mut(&mut self) -> &mut AppStateContainer; fn buffer_mut(&mut self) -> &mut dyn BufferAPI;
fn set_mode_with_sync(&mut self, mode: AppMode, trigger: &str);
fn get_current_input(&mut self) -> (String, usize) {
if let Some(buffer) = self.buffer_manager().current() {
(buffer.get_input_text(), buffer.get_input_cursor_position())
} else {
(String::new(), 0)
}
}
fn apply_text_result(&mut self, result: TextOperationResult) {
if let Some(buffer) = self.buffer_manager().current_mut() {
buffer.set_input_text(result.new_text.clone());
buffer.set_input_cursor_position(result.new_cursor_position);
if let Some(killed) = result.killed_text {
buffer.set_kill_ring(killed);
}
if buffer.get_edit_mode() == EditMode::SingleLine {
self.set_input_text_with_cursor(result.new_text, result.new_cursor_position);
self.cursor_manager()
.set_position(result.new_cursor_position);
}
}
}
fn apply_cursor_result(&mut self, result: CursorMovementResult) {
if let Some(buffer) = self.buffer_manager().current_mut() {
buffer.set_input_cursor_position(result.new_position);
if buffer.get_edit_mode() == EditMode::SingleLine {
let text = buffer.get_input_text();
self.set_input_text_with_cursor(text, result.new_position);
self.cursor_manager().set_position(result.new_position);
}
}
}
fn kill_line(&mut self) {
if let Some(buffer) = self.buffer_manager().current_mut() {
buffer.save_state_for_undo();
}
let (text, cursor) = self.get_current_input();
let result = text_operations::kill_line(&text, cursor);
self.apply_text_result(result);
}
fn kill_line_backward(&mut self) {
if let Some(buffer) = self.buffer_manager().current_mut() {
buffer.save_state_for_undo();
}
let (text, cursor) = self.get_current_input();
let result = text_operations::kill_line_backward(&text, cursor);
self.apply_text_result(result);
}
fn delete_word_backward(&mut self) {
if let Some(buffer) = self.buffer_manager().current_mut() {
buffer.save_state_for_undo();
}
let (text, cursor) = self.get_current_input();
let result = text_operations::delete_word_backward(&text, cursor);
self.apply_text_result(result);
}
fn delete_word_forward(&mut self) {
if let Some(buffer) = self.buffer_manager().current_mut() {
buffer.save_state_for_undo();
}
let (text, cursor) = self.get_current_input();
let result = text_operations::delete_word_forward(&text, cursor);
self.apply_text_result(result);
}
fn move_cursor_word_backward(&mut self) {
let (text, cursor) = self.get_current_input();
let result = text_operations::move_word_backward(&text, cursor);
self.apply_cursor_result(result);
}
fn move_cursor_word_forward(&mut self) {
let (text, cursor) = self.get_current_input();
let result = text_operations::move_word_forward(&text, cursor);
self.apply_cursor_result(result);
}
fn jump_to_prev_token(&mut self) {
let (text, cursor) = self.get_current_input();
let result = text_operations::jump_to_prev_token(&text, cursor);
self.apply_cursor_result(result);
}
fn jump_to_next_token(&mut self) {
let (text, cursor) = self.get_current_input();
let result = text_operations::jump_to_next_token(&text, cursor);
self.apply_cursor_result(result);
}
fn insert_char(&mut self, ch: char) {
if let Some(buffer) = self.buffer_manager().current_mut() {
buffer.save_state_for_undo();
}
let (text, cursor) = self.get_current_input();
let result = text_operations::insert_char(&text, cursor, ch);
self.apply_text_result(result);
}
fn delete_char(&mut self) {
if let Some(buffer) = self.buffer_manager().current_mut() {
buffer.save_state_for_undo();
}
let (text, cursor) = self.get_current_input();
let result = text_operations::delete_char(&text, cursor);
self.apply_text_result(result);
}
fn backspace(&mut self) {
if let Some(buffer) = self.buffer_manager().current_mut() {
buffer.save_state_for_undo();
}
let (text, cursor) = self.get_current_input();
let result = text_operations::backspace(&text, cursor);
self.apply_text_result(result);
}
fn clear_input(&mut self) {
if let Some(buffer) = self.buffer_manager().current_mut() {
buffer.save_state_for_undo();
}
let result = text_operations::clear_text();
self.apply_text_result(result);
}
fn get_jump_to_row_input(&self) -> String {
self.state_container().jump_to_row().input.clone()
}
fn set_jump_to_row_input(&mut self, input: String) {
self.state_container_mut().jump_to_row_mut().input = input;
}
fn clear_jump_to_row_input(&mut self) {
self.state_container_mut().jump_to_row_mut().input.clear();
}
fn process_jump_to_row_key(&mut self, key: crossterm::event::KeyEvent) -> bool {
use crossterm::event::KeyCode;
match key.code {
KeyCode::Esc => {
self.set_mode_with_sync(AppMode::Results, "escape_from_jump_to_row");
self.clear_jump_to_row_input();
self.state_container_mut().jump_to_row_mut().is_active = false;
true
}
KeyCode::Backspace => {
let mut input = self.get_jump_to_row_input();
input.pop();
self.set_jump_to_row_input(input);
true
}
KeyCode::Char(c) if c.is_ascii_digit() => {
let mut input = self.get_jump_to_row_input();
input.push(c);
self.set_jump_to_row_input(input);
true
}
_ => false,
}
}
}