diff --git a/src/ui/chat/tree/widgets.rs b/src/ui/chat/tree/widgets.rs index 286161b..9314bfa 100644 --- a/src/ui/chat/tree/widgets.rs +++ b/src/ui/chat/tree/widgets.rs @@ -23,17 +23,41 @@ pub fn style_placeholder() -> ContentStyle { ContentStyle::default().dark_grey() } +fn style_time(highlighted: bool) -> ContentStyle { + if highlighted { + ContentStyle::default().black().on_white() + } else { + ContentStyle::default().grey() + } +} + +fn style_indent(highlighted: bool) -> ContentStyle { + if highlighted { + ContentStyle::default().black().on_white() + } else { + ContentStyle::default().dark_grey() + } +} + +fn style_editor_highlight() -> ContentStyle { + ContentStyle::default().black().on_cyan() +} + +fn style_pseudo_highlight() -> ContentStyle { + ContentStyle::default().black().on_yellow() +} + pub fn msg(highlighted: bool, indent: usize, msg: &M) -> BoxedWidget { let (nick, content) = msg.styled(); HJoin::new(vec![ Segment::new( - Padding::new(time::widget(Some(msg.time()), highlighted)) + Padding::new(time::widget(Some(msg.time()), style_time(highlighted))) .stretch(true) .right(1), ), - Segment::new(Indent::new(indent, highlighted)), + Segment::new(Indent::new(indent, style_indent(highlighted))), Segment::new(Layer::new(vec![ - Indent::new(1, false).into(), + Indent::new(1, style_indent(false)).into(), Padding::new(Text::new(nick)).right(1).into(), ])), // TODO Minimum content width @@ -46,11 +70,11 @@ pub fn msg(highlighted: bool, indent: usize, msg: &M) -> Boxed pub fn msg_placeholder(highlighted: bool, indent: usize) -> BoxedWidget { HJoin::new(vec![ Segment::new( - Padding::new(time::widget(None, highlighted)) + Padding::new(time::widget(None, style_time(highlighted))) .stretch(true) .right(1), ), - Segment::new(Indent::new(indent, highlighted)), + Segment::new(Indent::new(indent, style_indent(highlighted))), Segment::new(Text::new((PLACEHOLDER, style_placeholder()))), ]) .into() @@ -68,13 +92,13 @@ pub fn editor( let widget = HJoin::new(vec![ Segment::new( - Padding::new(time::widget(None, true)) + Padding::new(time::widget(None, style_editor_highlight())) .stretch(true) .right(1), ), - Segment::new(Indent::new(indent, true)), + Segment::new(Indent::new(indent, style_editor_highlight())), Segment::new(Layer::new(vec![ - Indent::new(1, false).into(), + Indent::new(1, style_indent(false)).into(), Padding::new(Text::new(nick)).right(1).into(), ])), Segment::new(editor).priority(1).expanding(true), @@ -89,13 +113,13 @@ pub fn pseudo(indent: usize, nick: &str, editor: &EditorState) -> Bo HJoin::new(vec![ Segment::new( - Padding::new(time::widget(None, true)) + Padding::new(time::widget(None, style_pseudo_highlight())) .stretch(true) .right(1), ), - Segment::new(Indent::new(indent, true)), + Segment::new(Indent::new(indent, style_pseudo_highlight())), Segment::new(Layer::new(vec![ - Indent::new(1, false).into(), + Indent::new(1, style_indent(false)).into(), Padding::new(Text::new(nick)).right(1).into(), ])), Segment::new(Text::new(content).wrap(true)).priority(1), diff --git a/src/ui/chat/tree/widgets/indent.rs b/src/ui/chat/tree/widgets/indent.rs index b19f92a..d512102 100644 --- a/src/ui/chat/tree/widgets/indent.rs +++ b/src/ui/chat/tree/widgets/indent.rs @@ -1,5 +1,5 @@ use async_trait::async_trait; -use crossterm::style::{ContentStyle, Stylize}; +use crossterm::style::ContentStyle; use toss::frame::{Frame, Pos, Size}; use crate::ui::widgets::Widget; @@ -7,22 +7,14 @@ use crate::ui::widgets::Widget; pub const INDENT: &str = "│ "; pub const INDENT_WIDTH: usize = 2; -pub fn style() -> ContentStyle { - ContentStyle::default().dark_grey() -} - -pub fn style_inverted() -> ContentStyle { - ContentStyle::default().black().on_white() -} - pub struct Indent { level: usize, - highlighted: bool, + style: ContentStyle, } impl Indent { - pub fn new(level: usize, highlighted: bool) -> Self { - Self { level, highlighted } + pub fn new(level: usize, style: ContentStyle) -> Self { + Self { level, style } } } @@ -35,14 +27,11 @@ impl Widget for Indent { async fn render(self: Box, frame: &mut Frame) { let size = frame.size(); - let style = if self.highlighted { - style_inverted() - } else { - style() - }; - for y in 0..size.height { - frame.write(Pos::new(0, y.into()), (INDENT.repeat(self.level), style)) + frame.write( + Pos::new(0, y.into()), + (INDENT.repeat(self.level), self.style), + ) } } } diff --git a/src/ui/chat/tree/widgets/time.rs b/src/ui/chat/tree/widgets/time.rs index 30c626e..0976197 100644 --- a/src/ui/chat/tree/widgets/time.rs +++ b/src/ui/chat/tree/widgets/time.rs @@ -1,4 +1,4 @@ -use crossterm::style::{ContentStyle, Stylize}; +use crossterm::style::ContentStyle; use time::format_description::FormatItem; use time::macros::format_description; use time::OffsetDateTime; @@ -11,21 +11,7 @@ use crate::ui::widgets::BoxedWidget; const TIME_FORMAT: &[FormatItem<'_>] = format_description!("[year]-[month]-[day] [hour]:[minute]"); const TIME_WIDTH: u16 = 16; -fn style() -> ContentStyle { - ContentStyle::default().grey() -} - -fn style_inverted() -> ContentStyle { - ContentStyle::default().black().on_white() -} - -pub fn widget(time: Option, highlighted: bool) -> BoxedWidget { - let style = if highlighted { - style_inverted() - } else { - style() - }; - +pub fn widget(time: Option, style: ContentStyle) -> BoxedWidget { if let Some(time) = time { let text = time.format(TIME_FORMAT).expect("could not format time"); Background::new(Text::new((text, style)))