use super::State; use std::io::Write; use termion::{color, event::Key}; pub struct Threads<'d, 'q> { pub threads: Vec>, pub i: isize, } impl<'d, 'q> Threads<'d, 'q> { pub fn init(&mut self, out: &mut W) { draw(&self, out); } pub fn tick(mut self, out: &mut W, key: Key) -> State<'d, 'q> { match key { Key::Char('j') => self.i += 1, Key::Char('k') => self.i -= 1, _ => (), } self.i = self.i.rem_euclid(self.threads.len() as isize); draw(&self, out); State::Threads(self) } } fn draw(state: &Threads, out: &mut W) { write!(out, "{}", termion::clear::All).unwrap(); for (i, thread) in state.threads.iter().enumerate() { write!(out, "{}", termion::cursor::Goto(1, (i + 1) as u16)).unwrap(); let highlight = i == state.i as usize; if highlight { write!(out, "{}", color::Fg(color::Red)).unwrap(); } write!(out, "thread {:?}, {:?}", thread.subject(), thread.authors()).unwrap(); if highlight { write!(out, "{}", color::Fg(color::Reset)).unwrap(); } } out.flush().unwrap(); }