A simple CPU rendered GUI IDE experience.
Diffstat (limited to 'src/act.rs')
| -rw-r--r-- | src/act.rs | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/src/act.rs b/src/act.rs new file mode 100644 index 0000000..e6b216b --- /dev/null +++ b/src/act.rs @@ -0,0 +1,74 @@ +use dsb::Cell; +use dsb::cell::Style; +use lsp_types::CodeAction; + +#[derive(Debug, Clone)] +pub struct CodeActions { + pub inner: Vec<CodeAction>, + pub selection: usize, + pub vo: usize, +} +use crate::FG; +use crate::text::col; + +const N: usize = 13; +impl CodeActions { + pub fn next(&mut self) { + let n = self.inner.len(); + self.selection += 1; + if self.selection == n { + self.vo = 0; + self.selection = 0; + } + if self.selection >= self.vo + 13 { + self.vo += 1; + } + } + + pub fn sel(&self) -> &CodeAction { + &self.inner[self.selection] + } + + #[lower::apply(saturating)] + pub fn back(&mut self) { + let n = self.inner.len(); + if self.selection == 0 { + self.vo = n - N; + self.selection = n - 1; + } else { + self.selection -= 1; + if self.selection < self.vo { + self.vo -= 1; + } + } + } + pub fn maxc(&self) -> usize { + self.inner + .iter() + .map(|x| x.title.chars().count()) + .max() + .unwrap_or(0) + } + pub fn write(&self, c: usize) -> Vec<Cell> { + let mut into = vec![]; + for (el, i) in self.inner.iter().zip(0..) { + write(el, c, self.selection == i, &mut into); + } + into + } +} +fn write(x: &CodeAction, c: usize, selected: bool, to: &mut Vec<Cell>) { + let bg = if selected { col!("#262d3b") } else { col!("#1c212b") }; + + let mut into = vec![ + Cell { + style: Style { bg, color: FG, flags: 0 }, + ..Default::default() + }; + c + ]; + into.iter_mut() + .zip(x.title.chars()) + .for_each(|(a, b)| a.letter = Some(b)); + to.extend(into); +} |