Use new highlight colors for editor and pseudo messages
This commit is contained in:
parent
3fd08fd399
commit
01ee4b4ce8
3 changed files with 45 additions and 46 deletions
|
|
@ -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),
|
||||||
|
|
|
||||||
|
|
@ -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),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)))
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue