From de569211f69ed10641942f71ff5c15c4d515c09c Mon Sep 17 00:00:00 2001 From: Joscha Date: Mon, 8 Aug 2022 15:13:55 +0200 Subject: [PATCH] Display seen status of messages --- src/ui/chat/tree/widgets.rs | 5 +++++ src/ui/chat/tree/widgets/seen.rs | 24 ++++++++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 src/ui/chat/tree/widgets/seen.rs diff --git a/src/ui/chat/tree/widgets.rs b/src/ui/chat/tree/widgets.rs index 9314bfa..b39bd5c 100644 --- a/src/ui/chat/tree/widgets.rs +++ b/src/ui/chat/tree/widgets.rs @@ -1,6 +1,7 @@ // TODO Remove mut in &mut Frame wherever applicable in this entire module mod indent; +mod seen; mod time; use crossterm::style::{ContentStyle, Stylize}; @@ -50,6 +51,7 @@ fn style_pseudo_highlight() -> ContentStyle { pub fn msg(highlighted: bool, indent: usize, msg: &M) -> BoxedWidget { let (nick, content) = msg.styled(); HJoin::new(vec![ + Segment::new(seen::widget(msg.seen())), Segment::new( Padding::new(time::widget(Some(msg.time()), style_time(highlighted))) .stretch(true) @@ -69,6 +71,7 @@ pub fn msg(highlighted: bool, indent: usize, msg: &M) -> Boxed pub fn msg_placeholder(highlighted: bool, indent: usize) -> BoxedWidget { HJoin::new(vec![ + Segment::new(seen::widget(true)), Segment::new( Padding::new(time::widget(None, style_time(highlighted))) .stretch(true) @@ -91,6 +94,7 @@ pub fn editor( let cursor_row = editor.cursor_row(frame); let widget = HJoin::new(vec![ + Segment::new(seen::widget(true)), Segment::new( Padding::new(time::widget(None, style_editor_highlight())) .stretch(true) @@ -112,6 +116,7 @@ pub fn pseudo(indent: usize, nick: &str, editor: &EditorState) -> Bo let (nick, content) = M::edit(nick, &editor.text()); HJoin::new(vec![ + Segment::new(seen::widget(true)), Segment::new( Padding::new(time::widget(None, style_pseudo_highlight())) .stretch(true) diff --git a/src/ui/chat/tree/widgets/seen.rs b/src/ui/chat/tree/widgets/seen.rs new file mode 100644 index 0000000..8197afd --- /dev/null +++ b/src/ui/chat/tree/widgets/seen.rs @@ -0,0 +1,24 @@ +use crossterm::style::{ContentStyle, Stylize}; + +use crate::ui::widgets::background::Background; +use crate::ui::widgets::empty::Empty; +use crate::ui::widgets::text::Text; +use crate::ui::widgets::BoxedWidget; + +const UNSEEN: &str = "*"; +const WIDTH: u16 = 1; + +fn seen_style() -> ContentStyle { + ContentStyle::default().black().on_green() +} + +pub fn widget(seen: bool) -> BoxedWidget { + if seen { + Empty::new().width(WIDTH).into() + } else { + let style = seen_style(); + Background::new(Text::new((UNSEEN, style))) + .style(style) + .into() + } +}