Skip to main content

half/
half.rs

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}