1use crossterm::{
2 event::{
3 self, DisableMouseCapture, EnableMouseCapture,
4 Event, KeyCode
5 },
6 execute,
7 terminal::{
8 EnterAlternateScreen, LeaveAlternateScreen,
9 disable_raw_mode, enable_raw_mode
10 },
11};
12use ratatui::{Terminal, backend::CrosstermBackend};
13use ratatui::layout::{Layout, Constraint, Direction, Position};
14use ratatui::widgets::{Block, Borders};
15use std::io::stdout;
16use ratatui_code_editor::editor::Editor;
17use ratatui_code_editor::theme::vesper;
18
19fn main() -> anyhow::Result<()> {
20 let filename = "src/code.rs";
21 let language = "rust";
22 let content = std::fs::read_to_string(filename)?;
23
24 enable_raw_mode()?;
25 execute!(stdout(), EnterAlternateScreen)?;
26 execute!(stdout(), EnableMouseCapture)?;
27
28 let backend = CrosstermBackend::new(stdout());
29 let mut terminal = Terminal::new(backend)?;
30
31 let theme = vesper();
32
33 let mut editor = Editor::new(&language, &content, theme)?;
34
35 let mut editor_area = ratatui::layout::Rect::default();
36
37 let layout = Layout::default()
38 .direction(Direction::Vertical)
39 .constraints([
40 Constraint::Percentage(50),
41 Constraint::Percentage(50)
42 ].as_ref());
43
44 loop {
45 terminal.draw(|f| {
46 let block = Block::default()
47 .title(" Editor ")
48 .borders(Borders::ALL);
49 let chunks = layout.split(f.area());
50 let inner = block.inner(chunks[0]);
51 editor_area = inner;
52 f.render_widget(block, chunks[0]);
53 f.render_widget(&editor, editor_area);
54
55 let cursor = editor.get_visible_cursor(&editor_area);
56 if let Some((x,y)) = cursor {
57 f.set_cursor_position(Position::new(x, y));
58 }
59 })?;
60
61 if event::poll(std::time::Duration::from_millis(100))? {
62 match event::read()? {
63 Event::Key(key) => {
64 if key.code == KeyCode::Esc {
65 break;
66 } else {
67 editor.input(key, &editor_area)?;
68 }
69 }
70 Event::Mouse(mouse) => {
71 editor.mouse(mouse, &editor_area)?;
72 },
73 Event::Resize(_, _) => { }
74 _ => {}
75 }
76 }
77 }
78
79 disable_raw_mode()?;
80 execute!(
81 terminal.backend_mut(),
82 LeaveAlternateScreen,
83 DisableMouseCapture
84 )?;
85 Ok(())
86}