sql_cli/ui/traits/
buffer_ops.rs

1use crate::buffer::{BufferAPI, BufferManager, EditMode};
2use crate::buffer_handler::BufferHandler;
3use crate::config::config::Config;
4use crate::cursor_manager::CursorManager;
5use tracing::info;
6
7/// Trait that provides buffer management behavior for TUI components
8/// This extracts buffer operations from `EnhancedTui` to reduce coupling
9pub trait BufferManagementBehavior {
10    // Required methods - these provide access to TUI internals
11    fn buffer_manager(&mut self) -> &mut BufferManager;
12    fn buffer_handler(&mut self) -> &mut BufferHandler;
13    fn buffer(&self) -> &dyn BufferAPI;
14    fn buffer_mut(&mut self) -> &mut dyn BufferAPI;
15    fn config(&self) -> &Config;
16    fn cursor_manager(&mut self) -> &mut CursorManager;
17    fn set_input_text_with_cursor(&mut self, text: String, cursor: usize);
18
19    // ========== Buffer Management Operations ==========
20
21    /// Create a new buffer with current config settings
22    fn new_buffer(&mut self) {
23        let buffer_count = self.buffer_manager().all_buffers().len();
24        let mut new_buffer = crate::buffer::Buffer::new(buffer_count + 1);
25
26        // Apply config settings to the new buffer
27        let config = self.config();
28        new_buffer.set_compact_mode(config.display.compact_mode);
29        new_buffer.set_case_insensitive(config.behavior.case_insensitive_default);
30        new_buffer.set_show_row_numbers(config.display.show_row_numbers);
31
32        info!(target: "buffer", 
33              "Creating new buffer with config: compact_mode={}, case_insensitive={}, show_row_numbers={}",
34              config.display.compact_mode,
35              config.behavior.case_insensitive_default,
36              config.display.show_row_numbers);
37
38        let index = self.buffer_manager().add_buffer(new_buffer);
39        self.buffer_mut()
40            .set_status_message(format!("Created new buffer #{}", index + 1));
41    }
42
43    /// Switch to the next buffer
44    fn next_buffer(&mut self) -> String;
45
46    /// Switch to the previous buffer
47    fn previous_buffer(&mut self) -> String;
48
49    /// Quick switch to the last used buffer
50    fn quick_switch_buffer(&mut self) -> String;
51
52    /// Close the current buffer
53    fn close_buffer(&mut self) -> (bool, String);
54
55    /// Switch to a specific buffer by index
56    fn switch_to_buffer(&mut self, index: usize) -> String;
57
58    /// Yank (copy) from the current buffer
59    fn yank(&mut self) {
60        if let Some(buffer) = self.buffer_manager().current_mut() {
61            buffer.yank();
62
63            // Sync for rendering if single-line mode
64            if buffer.get_edit_mode() == EditMode::SingleLine {
65                let text = buffer.get_input_text();
66                let cursor = buffer.get_input_cursor_position();
67                self.set_input_text_with_cursor(text, cursor);
68                self.cursor_manager().set_position(cursor);
69            }
70        }
71    }
72
73    /// Get the total number of buffers
74    fn buffer_count(&self) -> usize;
75
76    /// Get the current buffer index
77    fn current_buffer_index(&self) -> usize;
78}