Display nicks with hashed color
This commit is contained in:
parent
37d10821a4
commit
11422801b0
8 changed files with 92 additions and 6 deletions
51
Cargo.lock
generated
51
Cargo.lock
generated
|
|
@ -28,6 +28,15 @@ version = "1.0.58"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "bb07d2053ccdbe10e2af2995a2f116c1330396493dc1269f6a91d0ae82e19704"
|
checksum = "bb07d2053ccdbe10e2af2995a2f116c1330396493dc1269f6a91d0ae82e19704"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "approx"
|
||||||
|
version = "0.5.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6"
|
||||||
|
dependencies = [
|
||||||
|
"num-traits",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "async-trait"
|
name = "async-trait"
|
||||||
version = "0.1.56"
|
version = "0.1.56"
|
||||||
|
|
@ -138,6 +147,7 @@ dependencies = [
|
||||||
"edit",
|
"edit",
|
||||||
"futures",
|
"futures",
|
||||||
"log",
|
"log",
|
||||||
|
"palette",
|
||||||
"parking_lot",
|
"parking_lot",
|
||||||
"rand",
|
"rand",
|
||||||
"rusqlite",
|
"rusqlite",
|
||||||
|
|
@ -260,6 +270,15 @@ dependencies = [
|
||||||
"instant",
|
"instant",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "find-crate"
|
||||||
|
version = "0.6.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "59a98bbaacea1c0eb6a0876280051b892eb73594fd90cf3b20e9c817029c57d2"
|
||||||
|
dependencies = [
|
||||||
|
"toml",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "fnv"
|
name = "fnv"
|
||||||
version = "1.0.7"
|
version = "1.0.7"
|
||||||
|
|
@ -571,6 +590,29 @@ version = "0.1.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
|
checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "palette"
|
||||||
|
version = "0.6.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f9735f7e1e51a3f740bacd5dc2724b61a7806f23597a8736e679f38ee3435d18"
|
||||||
|
dependencies = [
|
||||||
|
"approx",
|
||||||
|
"num-traits",
|
||||||
|
"palette_derive",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "palette_derive"
|
||||||
|
version = "0.6.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7799c3053ea8a6d8a1193c7ba42f534e7863cf52e378a7f90406f4a645d33bad"
|
||||||
|
dependencies = [
|
||||||
|
"find-crate",
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "parking_lot"
|
name = "parking_lot"
|
||||||
version = "0.12.1"
|
version = "0.12.1"
|
||||||
|
|
@ -1066,6 +1108,15 @@ dependencies = [
|
||||||
"webpki",
|
"webpki",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "toml"
|
||||||
|
version = "0.5.9"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7"
|
||||||
|
dependencies = [
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "toss"
|
name = "toss"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@ directories = "4.0.1"
|
||||||
edit = "0.1.4"
|
edit = "0.1.4"
|
||||||
futures = "0.3.21"
|
futures = "0.3.21"
|
||||||
log = { version = "0.4.17", features = ["std"] }
|
log = { version = "0.4.17", features = ["std"] }
|
||||||
|
palette = { version = "0.6.0", default-features = false, features = ["std"] }
|
||||||
parking_lot = "0.12.1"
|
parking_lot = "0.12.1"
|
||||||
rand = "0.8.5"
|
rand = "0.8.5"
|
||||||
rusqlite = { version = "0.27.0", features = ["chrono"] }
|
rusqlite = { version = "0.27.0", features = ["chrono"] }
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
use std::collections::VecDeque;
|
use std::collections::VecDeque;
|
||||||
|
|
||||||
use chrono::{DateTime, Utc};
|
use chrono::{DateTime, Utc};
|
||||||
|
use crossterm::style::ContentStyle;
|
||||||
|
|
||||||
use crate::chat::Cursor;
|
use crate::chat::Cursor;
|
||||||
|
|
||||||
|
|
@ -24,6 +25,7 @@ impl<I> Block<I> {
|
||||||
indent: usize,
|
indent: usize,
|
||||||
time: DateTime<Utc>,
|
time: DateTime<Utc>,
|
||||||
nick: String,
|
nick: String,
|
||||||
|
nick_style: ContentStyle,
|
||||||
lines: Vec<String>,
|
lines: Vec<String>,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
Self {
|
Self {
|
||||||
|
|
@ -33,7 +35,11 @@ impl<I> Block<I> {
|
||||||
indent,
|
indent,
|
||||||
time: Some(time),
|
time: Some(time),
|
||||||
cursor: false,
|
cursor: false,
|
||||||
body: BlockBody::Msg(MsgBlock { nick, lines }),
|
body: BlockBody::Msg(MsgBlock {
|
||||||
|
nick,
|
||||||
|
nick_style,
|
||||||
|
lines,
|
||||||
|
}),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -61,6 +67,7 @@ pub enum BlockBody {
|
||||||
|
|
||||||
pub struct MsgBlock {
|
pub struct MsgBlock {
|
||||||
pub nick: String,
|
pub nick: String,
|
||||||
|
pub nick_style: ContentStyle,
|
||||||
pub lines: Vec<String>,
|
pub lines: Vec<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ fn msg_to_block<M: Msg>(frame: &mut Frame, size: Size, msg: &M, indent: usize) -
|
||||||
let content_width = content_width as usize;
|
let content_width = content_width as usize;
|
||||||
let lines = toss::split_at_indices(&content, &frame.wrap(&content, content_width));
|
let lines = toss::split_at_indices(&content, &frame.wrap(&content, content_width));
|
||||||
let lines = lines.into_iter().map(|s| s.to_string()).collect::<Vec<_>>();
|
let lines = lines.into_iter().map(|s| s.to_string()).collect::<Vec<_>>();
|
||||||
Block::msg(msg.id(), indent, msg.time(), nick, lines)
|
Block::msg(msg.id(), indent, msg.time(), nick, msg.nick_style(), lines)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -44,10 +44,18 @@ fn render_indent(frame: &mut Frame, x: i32, y: i32, cursor: bool, indent: usize)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn render_nick(frame: &mut Frame, x: i32, y: i32, indent: usize, nick: &str) {
|
fn render_nick(
|
||||||
|
frame: &mut Frame,
|
||||||
|
x: i32,
|
||||||
|
y: i32,
|
||||||
|
indent: usize,
|
||||||
|
nick: &str,
|
||||||
|
nick_style: ContentStyle,
|
||||||
|
) {
|
||||||
let nick_pos = Pos::new(x + util::after_indent(indent), y);
|
let nick_pos = Pos::new(x + util::after_indent(indent), y);
|
||||||
let nick = format!("[{}]", nick);
|
let inner_nick_pos = Pos::new(nick_pos.x + 1, nick_pos.y);
|
||||||
frame.write(nick_pos, &nick, ContentStyle::default());
|
frame.write(nick_pos, &format!("[{nick}]"), ContentStyle::default());
|
||||||
|
frame.write(inner_nick_pos, nick, nick_style);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn render_block<M: Msg>(frame: &mut Frame, pos: Pos, size: Size, block: &Block<M::Id>) {
|
fn render_block<M: Msg>(frame: &mut Frame, pos: Pos, size: Size, block: &Block<M::Id>) {
|
||||||
|
|
@ -64,7 +72,7 @@ fn render_block<M: Msg>(frame: &mut Frame, pos: Pos, size: Size, block: &Block<M
|
||||||
if i == 0 {
|
if i == 0 {
|
||||||
render_indent(frame, pos.x, y, block.cursor, block.indent);
|
render_indent(frame, pos.x, y, block.cursor, block.indent);
|
||||||
render_time(frame, pos.x, y, block.cursor, block.time);
|
render_time(frame, pos.x, y, block.cursor, block.time);
|
||||||
render_nick(frame, pos.x, y, block.indent, &msg.nick);
|
render_nick(frame, pos.x, y, block.indent, &msg.nick, msg.nick_style);
|
||||||
} else {
|
} else {
|
||||||
render_indent(frame, pos.x, y, false, block.indent + 1);
|
render_indent(frame, pos.x, y, false, block.indent + 1);
|
||||||
render_indent(frame, pos.x, y, block.cursor, block.indent);
|
render_indent(frame, pos.x, y, block.cursor, block.indent);
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ use std::vec;
|
||||||
|
|
||||||
use async_trait::async_trait;
|
use async_trait::async_trait;
|
||||||
use chrono::{DateTime, Utc};
|
use chrono::{DateTime, Utc};
|
||||||
|
use crossterm::style::{ContentStyle, Stylize};
|
||||||
use log::{Level, Log};
|
use log::{Level, Log};
|
||||||
use parking_lot::Mutex;
|
use parking_lot::Mutex;
|
||||||
use tokio::sync::mpsc;
|
use tokio::sync::mpsc;
|
||||||
|
|
@ -36,6 +37,16 @@ impl Msg for LogMsg {
|
||||||
format!("{}", self.level)
|
format!("{}", self.level)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn nick_style(&self) -> ContentStyle {
|
||||||
|
match self.level {
|
||||||
|
Level::Error => ContentStyle::default().bold().red(),
|
||||||
|
Level::Warn => ContentStyle::default().bold().yellow(),
|
||||||
|
Level::Info => ContentStyle::default().bold().green(),
|
||||||
|
Level::Debug => ContentStyle::default().bold().blue(),
|
||||||
|
Level::Trace => ContentStyle::default().bold().magenta(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn content(&self) -> String {
|
fn content(&self) -> String {
|
||||||
self.content.clone()
|
self.content.clone()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ use std::hash::Hash;
|
||||||
|
|
||||||
use async_trait::async_trait;
|
use async_trait::async_trait;
|
||||||
use chrono::{DateTime, Utc};
|
use chrono::{DateTime, Utc};
|
||||||
|
use crossterm::style::ContentStyle;
|
||||||
|
|
||||||
pub trait Msg {
|
pub trait Msg {
|
||||||
type Id: Clone + Debug + Hash + Eq + Ord;
|
type Id: Clone + Debug + Hash + Eq + Ord;
|
||||||
|
|
@ -12,6 +13,7 @@ pub trait Msg {
|
||||||
|
|
||||||
fn time(&self) -> DateTime<Utc>;
|
fn time(&self) -> DateTime<Utc>;
|
||||||
fn nick(&self) -> String;
|
fn nick(&self) -> String;
|
||||||
|
fn nick_style(&self) -> ContentStyle;
|
||||||
fn content(&self) -> String;
|
fn content(&self) -> String;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,10 +2,12 @@ use std::mem;
|
||||||
|
|
||||||
use async_trait::async_trait;
|
use async_trait::async_trait;
|
||||||
use chrono::{DateTime, TimeZone, Utc};
|
use chrono::{DateTime, TimeZone, Utc};
|
||||||
|
use crossterm::style::ContentStyle;
|
||||||
use rusqlite::types::{FromSql, FromSqlError, ToSqlOutput, Value, ValueRef};
|
use rusqlite::types::{FromSql, FromSqlError, ToSqlOutput, Value, ValueRef};
|
||||||
use rusqlite::{named_params, params, Connection, OptionalExtension, ToSql, Transaction};
|
use rusqlite::{named_params, params, Connection, OptionalExtension, ToSql, Transaction};
|
||||||
use tokio::sync::{mpsc, oneshot};
|
use tokio::sync::{mpsc, oneshot};
|
||||||
|
|
||||||
|
use crate::euph;
|
||||||
use crate::euph::api::{Message, Snowflake, Time};
|
use crate::euph::api::{Message, Snowflake, Time};
|
||||||
use crate::store::{Msg, MsgStore, Path, Tree};
|
use crate::store::{Msg, MsgStore, Path, Tree};
|
||||||
|
|
||||||
|
|
@ -65,6 +67,10 @@ impl Msg for EuphMsg {
|
||||||
self.nick.clone()
|
self.nick.clone()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn nick_style(&self) -> ContentStyle {
|
||||||
|
euph::nick_style(&self.nick)
|
||||||
|
}
|
||||||
|
|
||||||
fn content(&self) -> String {
|
fn content(&self) -> String {
|
||||||
self.content.trim().to_string()
|
self.content.trim().to_string()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue