Use new highlight colors for editor and pseudo messages

This commit is contained in:
Joscha 2022-08-03 01:12:31 +02:00
parent 3fd08fd399
commit 01ee4b4ce8
3 changed files with 45 additions and 46 deletions

View file

@ -23,17 +23,41 @@ pub fn style_placeholder() -> ContentStyle {
ContentStyle::default().dark_grey() 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<M: Msg + ChatMsg>(highlighted: bool, indent: usize, msg: &M) -> BoxedWidget { pub fn msg<M: Msg + ChatMsg>(highlighted: bool, indent: usize, msg: &M) -> BoxedWidget {
let (nick, content) = msg.styled(); let (nick, content) = msg.styled();
HJoin::new(vec![ HJoin::new(vec![
Segment::new( Segment::new(
Padding::new(time::widget(Some(msg.time()), highlighted)) Padding::new(time::widget(Some(msg.time()), style_time(highlighted)))
.stretch(true) .stretch(true)
.right(1), .right(1),
), ),
Segment::new(Indent::new(indent, highlighted)), Segment::new(Indent::new(indent, style_indent(highlighted))),
Segment::new(Layer::new(vec![ 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(), Padding::new(Text::new(nick)).right(1).into(),
])), ])),
// TODO Minimum content width // TODO Minimum content width
@ -46,11 +70,11 @@ pub fn msg<M: Msg + ChatMsg>(highlighted: bool, indent: usize, msg: &M) -> Boxed
pub fn msg_placeholder(highlighted: bool, indent: usize) -> BoxedWidget { pub fn msg_placeholder(highlighted: bool, indent: usize) -> BoxedWidget {
HJoin::new(vec![ HJoin::new(vec![
Segment::new( Segment::new(
Padding::new(time::widget(None, highlighted)) Padding::new(time::widget(None, style_time(highlighted)))
.stretch(true) .stretch(true)
.right(1), .right(1),
), ),
Segment::new(Indent::new(indent, highlighted)), Segment::new(Indent::new(indent, style_indent(highlighted))),
Segment::new(Text::new((PLACEHOLDER, style_placeholder()))), Segment::new(Text::new((PLACEHOLDER, style_placeholder()))),
]) ])
.into() .into()
@ -68,13 +92,13 @@ pub fn editor<M: ChatMsg>(
let widget = HJoin::new(vec![ let widget = HJoin::new(vec![
Segment::new( Segment::new(
Padding::new(time::widget(None, true)) Padding::new(time::widget(None, style_editor_highlight()))
.stretch(true) .stretch(true)
.right(1), .right(1),
), ),
Segment::new(Indent::new(indent, true)), Segment::new(Indent::new(indent, style_editor_highlight())),
Segment::new(Layer::new(vec![ 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(), Padding::new(Text::new(nick)).right(1).into(),
])), ])),
Segment::new(editor).priority(1).expanding(true), Segment::new(editor).priority(1).expanding(true),
@ -89,13 +113,13 @@ pub fn pseudo<M: ChatMsg>(indent: usize, nick: &str, editor: &EditorState) -> Bo
HJoin::new(vec![ HJoin::new(vec![
Segment::new( Segment::new(
Padding::new(time::widget(None, true)) Padding::new(time::widget(None, style_pseudo_highlight()))
.stretch(true) .stretch(true)
.right(1), .right(1),
), ),
Segment::new(Indent::new(indent, true)), Segment::new(Indent::new(indent, style_pseudo_highlight())),
Segment::new(Layer::new(vec![ 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(), Padding::new(Text::new(nick)).right(1).into(),
])), ])),
Segment::new(Text::new(content).wrap(true)).priority(1), Segment::new(Text::new(content).wrap(true)).priority(1),

View file

@ -1,5 +1,5 @@
use async_trait::async_trait; use async_trait::async_trait;
use crossterm::style::{ContentStyle, Stylize}; use crossterm::style::ContentStyle;
use toss::frame::{Frame, Pos, Size}; use toss::frame::{Frame, Pos, Size};
use crate::ui::widgets::Widget; use crate::ui::widgets::Widget;
@ -7,22 +7,14 @@ use crate::ui::widgets::Widget;
pub const INDENT: &str = ""; pub const INDENT: &str = "";
pub const INDENT_WIDTH: usize = 2; 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 { pub struct Indent {
level: usize, level: usize,
highlighted: bool, style: ContentStyle,
} }
impl Indent { impl Indent {
pub fn new(level: usize, highlighted: bool) -> Self { pub fn new(level: usize, style: ContentStyle) -> Self {
Self { level, highlighted } Self { level, style }
} }
} }
@ -35,14 +27,11 @@ impl Widget for Indent {
async fn render(self: Box<Self>, frame: &mut Frame) { async fn render(self: Box<Self>, frame: &mut Frame) {
let size = frame.size(); let size = frame.size();
let style = if self.highlighted {
style_inverted()
} else {
style()
};
for y in 0..size.height { 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),
)
} }
} }
} }

View file

@ -1,4 +1,4 @@
use crossterm::style::{ContentStyle, Stylize}; use crossterm::style::ContentStyle;
use time::format_description::FormatItem; use time::format_description::FormatItem;
use time::macros::format_description; use time::macros::format_description;
use time::OffsetDateTime; 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_FORMAT: &[FormatItem<'_>] = format_description!("[year]-[month]-[day] [hour]:[minute]");
const TIME_WIDTH: u16 = 16; const TIME_WIDTH: u16 = 16;
fn style() -> ContentStyle { pub fn widget(time: Option<OffsetDateTime>, style: ContentStyle) -> BoxedWidget {
ContentStyle::default().grey()
}
fn style_inverted() -> ContentStyle {
ContentStyle::default().black().on_white()
}
pub fn widget(time: Option<OffsetDateTime>, highlighted: bool) -> BoxedWidget {
let style = if highlighted {
style_inverted()
} else {
style()
};
if let Some(time) = time { if let Some(time) = time {
let text = time.format(TIME_FORMAT).expect("could not format time"); let text = time.format(TIME_FORMAT).expect("could not format time");
Background::new(Text::new((text, style))) Background::new(Text::new((text, style)))