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() + } +}