diff --git a/src/ui/chat/tree.rs b/src/ui/chat/tree.rs index 41cf4a1..47cd576 100644 --- a/src/ui/chat/tree.rs +++ b/src/ui/chat/tree.rs @@ -36,6 +36,7 @@ struct InnerTreeViewState> { last_cursor: Cursor, last_cursor_line: i32, + last_visible_msgs: Vec, cursor: Cursor, @@ -53,6 +54,7 @@ impl> InnerTreeViewState { store, last_cursor: Cursor::Bottom, last_cursor_line: 0, + last_visible_msgs: vec![], cursor: Cursor::Bottom, scroll: 0, correction: None, @@ -94,24 +96,29 @@ impl> InnerTreeViewState { pub fn list_action_key_bindings(&self, bindings: &mut KeyBindingsList) { bindings.binding("s", "toggle current message's seen status"); - // bindings.binding("S", "mark all visible messages as seen"); + bindings.binding("S", "mark all visible messages as seen"); // bindings.binding("ctrl+S", "mark all messages as seen"); } async fn handle_action_key_event(&mut self, event: KeyEvent, id: Option<&M::Id>) -> bool { - if let Some(id) = id { - match event { - key!('s') => { + match event { + key!('s') => { + if let Some(id) = id { if let Some(msg) = self.store.tree(id).await.msg(id) { self.store.set_seen(id, !msg.seen()).await; } - true + return true; } - _ => false, } - } else { - false + key!('S') => { + for id in &self.last_visible_msgs { + self.store.set_seen(id, true).await; + } + return true; + } + _ => {} } + false } pub fn list_edit_initiating_key_bindings(&self, bindings: &mut KeyBindingsList) { diff --git a/src/ui/chat/tree/layout.rs b/src/ui/chat/tree/layout.rs index 6866142..6fb4911 100644 --- a/src/ui/chat/tree/layout.rs +++ b/src/ui/chat/tree/layout.rs @@ -420,6 +420,23 @@ impl> InnerTreeViewState { } } + fn visible_msgs(frame: &Frame, blocks: &TreeBlocks) -> Vec { + let height: i32 = frame.size().height.into(); + let first_line = 0; + let last_line = first_line + height - 1; + + let mut result = vec![]; + for block in blocks.blocks().iter() { + if Self::visible(block, first_line, last_line) { + if let BlockId::Msg(id) = &block.id { + result.push(id.clone()); + } + } + } + + result + } + pub async fn relayout(&mut self, nick: &str, frame: &mut Frame) -> TreeBlocks { // The basic idea is this: // @@ -472,6 +489,7 @@ impl> InnerTreeViewState { self.last_cursor = self.cursor.clone(); self.last_cursor_line = self.cursor_line(&blocks); + self.last_visible_msgs = Self::visible_msgs(frame, &blocks); self.scroll = 0; self.correction = None; @@ -488,6 +506,7 @@ impl> InnerTreeViewState { self.last_cursor = self.cursor.clone(); self.last_cursor_line = self.cursor_line(&blocks); + self.last_visible_msgs = Self::visible_msgs(frame, &blocks); self.scroll = 0; self.correction = None;