aboutsummaryrefslogtreecommitdiffstats
path: root/src/state/threads.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/state/threads.rs')
-rw-r--r--src/state/threads.rs43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/state/threads.rs b/src/state/threads.rs
new file mode 100644
index 0000000..20b365e
--- /dev/null
+++ b/src/state/threads.rs
@@ -0,0 +1,43 @@
+use super::State;
+
+use std::io::Write;
+use termion::{color, event::Key};
+
+pub struct Threads<'d, 'q> {
+ pub threads: Vec<notmuch::Thread<'d, 'q>>,
+ pub i: isize,
+}
+
+impl<'d, 'q> Threads<'d, 'q> {
+ pub fn init<W: Write>(&mut self, out: &mut W) {
+ draw(&self, out);
+ }
+
+ pub fn tick<W: Write>(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<W: Write>(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();
+}