Skip to main content

stynx_code_tui/widgets/
autocomplete.rs

1use ratatui::{
2    buffer::Buffer,
3    layout::Rect,
4    style::{Modifier, Style},
5    text::{Line, Span},
6    widgets::{Block, Borders, List, ListItem, Widget},
7};
8
9use crate::theme;
10
11pub struct AutocompleteDropdown<'a> {
12    pub options: &'a [String],
13    pub selected: usize,
14}
15
16impl<'a> AutocompleteDropdown<'a> {
17    pub fn new(options: &'a [String], selected: usize) -> Self {
18        Self { options, selected }
19    }
20}
21
22impl<'a> Widget for AutocompleteDropdown<'a> {
23    fn render(self, area: Rect, buf: &mut Buffer) {
24        let items: Vec<ListItem<'_>> = self.options.iter().enumerate().map(|(i, opt)| {
25            let style = if i == self.selected {
26                Style::default().fg(theme::BASE()).bg(theme::PINE()).add_modifier(Modifier::BOLD)
27            } else {
28                Style::default().fg(theme::TEXT())
29            };
30            ListItem::new(Line::from(Span::styled(opt.as_str(), style)))
31        }).collect();
32
33        let block = Block::default()
34            .borders(Borders::ALL)
35            .border_style(Style::default().fg(theme::OVERLAY()))
36            .style(Style::default().bg(theme::SURFACE()));
37
38        List::new(items).block(block).render(area, buf);
39    }
40}