A simple CPU rendered GUI IDE experience.
Diffstat (limited to 'src/act.rs')
-rw-r--r--src/act.rs74
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);
+}