Add room and nick list UI mockup

This commit is contained in:
Joscha 2022-02-20 00:32:17 +01:00
parent 992e84e67e
commit fbc24a1154
4 changed files with 217 additions and 6 deletions

117
Cargo.lock generated
View file

@ -17,6 +17,15 @@ version = "1.0.53"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94a45b455c14666b85fc40a019e8ab9eb75e3a124e05494f5397122bc9eb06e0"
[[package]]
name = "approx"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6"
dependencies = [
"num-traits",
]
[[package]]
name = "atty"
version = "0.2.14"
@ -188,6 +197,7 @@ dependencies = [
"clap",
"cove-core",
"crossterm",
"palette",
"thiserror",
"tokio",
"tokio-tungstenite",
@ -269,6 +279,15 @@ dependencies = [
"termcolor",
]
[[package]]
name = "find-crate"
version = "0.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "59a98bbaacea1c0eb6a0876280051b892eb73594fd90cf3b20e9c817029c57d2"
dependencies = [
"toml",
]
[[package]]
name = "fnv"
version = "1.0.7"
@ -566,6 +585,15 @@ dependencies = [
"winapi",
]
[[package]]
name = "num-traits"
version = "0.2.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290"
dependencies = [
"autocfg",
]
[[package]]
name = "num_cpus"
version = "1.13.1"
@ -603,6 +631,30 @@ dependencies = [
"memchr",
]
[[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",
"phf",
]
[[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]]
name = "parking_lot"
version = "0.11.2"
@ -634,6 +686,50 @@ version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
[[package]]
name = "phf"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b2ac8b67553a7ca9457ce0e526948cad581819238f4a9d1ea74545851fa24f37"
dependencies = [
"phf_macros",
"phf_shared",
"proc-macro-hack",
]
[[package]]
name = "phf_generator"
version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d43f3220d96e0080cc9ea234978ccd80d904eafb17be31bb0f76daaea6493082"
dependencies = [
"phf_shared",
"rand",
]
[[package]]
name = "phf_macros"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b706f5936eb50ed880ae3009395b43ed19db5bff2ebd459c95e7bf013a89ab86"
dependencies = [
"phf_generator",
"phf_shared",
"proc-macro-hack",
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "phf_shared"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a68318426de33640f02be62b4ae8eb1261be2efbc337b60c54d845bf4484e0d9"
dependencies = [
"siphasher",
]
[[package]]
name = "pin-project-lite"
version = "0.2.8"
@ -676,6 +772,12 @@ dependencies = [
"version_check",
]
[[package]]
name = "proc-macro-hack"
version = "0.5.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5"
[[package]]
name = "proc-macro2"
version = "1.0.36"
@ -948,6 +1050,12 @@ dependencies = [
"libc",
]
[[package]]
name = "siphasher"
version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a86232ab60fa71287d7f2ddae4a7073f6b7aac33631c3015abb556f08c6d0a3e"
[[package]]
name = "slab"
version = "0.4.5"
@ -1101,6 +1209,15 @@ dependencies = [
"webpki",
]
[[package]]
name = "toml"
version = "0.5.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa"
dependencies = [
"serde",
]
[[package]]
name = "tui"
version = "0.17.0"

View file

@ -9,6 +9,7 @@ clap = { version = "3.1.0", features = ["derive"] }
cove-core = { path = "../cove-core" }
crossterm = "0.22.1"
# futures = "0.3.21"
palette = "0.6.0"
# serde_json = "1.0.78"
thiserror = "1.0.30"
tokio = { version = "1.16.1", features = ["full"] }

View file

@ -1,7 +1,7 @@
mod replies;
mod room;
mod config;
mod never;
mod replies;
mod room;
use std::io::{self, Stdout};
use std::time::Duration;
@ -10,17 +10,109 @@ use config::Config;
use crossterm::event::{DisableMouseCapture, EnableMouseCapture};
use crossterm::execute;
use crossterm::terminal::{EnterAlternateScreen, LeaveAlternateScreen};
use palette::rgb::Rgb;
use palette::{FromColor, Hsl, Hsv, Saturate, Srgb};
use tokio::time;
use tui::backend::CrosstermBackend;
use tui::widgets::{Block, Borders};
use tui::layout::{Constraint, Corner, Direction, Layout};
use tui::style::{Color, Modifier, Style};
use tui::symbols::line::VERTICAL;
use tui::text::{Span, Spans};
use tui::widgets::{Block, Borders, Cell, List, ListItem, ListState, Paragraph, Row, Table, Tabs};
use tui::Terminal;
async fn run(terminal: &mut Terminal<CrosstermBackend<Stdout>>) -> anyhow::Result<()> {
terminal.draw(|f| {
let block = Block::default().title("Block").borders(Borders::ALL);
f.render_widget(block, f.size());
let hchunks = Layout::default()
.direction(Direction::Horizontal)
.constraints([
Constraint::Length(20),
Constraint::Length(2),
Constraint::Min(0),
Constraint::Length(2),
Constraint::Length(20),
])
.split(f.size());
// Borders
f.render_widget(Block::default().borders(Borders::LEFT), hchunks[1]);
f.render_widget(Block::default().borders(Borders::LEFT), hchunks[3]);
// Room list
let room_style = Style::default().fg(Color::LightBlue);
let mut state = ListState::default();
// state.select(Some(1));
f.render_stateful_widget(
List::new(vec![
ListItem::new(Span::styled(
"Cove",
Style::default().add_modifier(Modifier::BOLD),
)),
ListItem::new(Span::styled("&dunno", room_style)),
ListItem::new(Span::styled("&test", room_style)),
ListItem::new(" "),
ListItem::new(Span::styled(
"Euphoria",
Style::default().add_modifier(Modifier::BOLD),
)),
ListItem::new(Span::styled("&xkcd", room_style)),
ListItem::new(Span::styled("&music", room_style)),
ListItem::new(Span::styled("&bots", room_style)),
ListItem::new(" "),
ListItem::new(Span::styled(
"Instant",
Style::default().add_modifier(Modifier::BOLD),
)),
ListItem::new(Span::styled("&welcome", room_style)),
]),
// .highlight_style(Style::default().add_modifier(Modifier::BOLD))
// .highlight_symbol(">"),
hchunks[0],
&mut state,
);
// f.render_widget(Paragraph::new("foo"), hchunks[0]);
// Nick list
let nchunks = Layout::default()
.direction(Direction::Vertical)
.constraints([Constraint::Length(1), Constraint::Min(0)])
.split(hchunks[4]);
f.render_widget(
Paragraph::new(Spans::from(vec![
Span::styled("Users", Style::default().add_modifier(Modifier::BOLD)),
Span::raw(" "),
Span::styled("(13)", Style::default().fg(Color::Gray)),
])),
nchunks[0],
);
fn userstyle(r: u8, g: u8, b: u8) -> Style {
let rgb = Srgb::new(r, g, b).into_format::<f32>();
let mut hsl = Hsl::from_color(rgb);
hsl.saturation = 1.0;
hsl.lightness = 0.7;
let rgb = Rgb::from_color(hsl).into_format::<u8>();
Style::default().fg(Color::Rgb(rgb.red, rgb.green, rgb.blue))
}
f.render_widget(
List::new([
ListItem::new(Span::styled("TerryTvType", userstyle(192, 242, 238))),
ListItem::new(Span::styled("r*4", userstyle(192, 211, 242))),
ListItem::new(Span::styled("Swedish", userstyle(192, 242, 207))),
ListItem::new(Span::styled("Garmy", userstyle(242, 225, 192))),
ListItem::new(Span::styled("SRP", userstyle(242, 219, 192))),
ListItem::new(Span::styled("C", userstyle(192, 218, 242))),
ListItem::new(Span::styled("fill", userstyle(192, 197, 242))),
ListItem::new(Span::styled("ohnezo", userstyle(242, 203, 192))),
ListItem::new(Span::styled("Sumärzru", userstyle(242, 223, 192))),
ListItem::new(Span::styled("SuperGeek", userstyle(192, 242, 203))),
ListItem::new(Span::styled("certainlyhominid", userstyle(192, 242, 209))),
ListItem::new(Span::styled("Plugh", userstyle(192, 242, 215))),
ListItem::new(Span::styled("🎼\u{fe0e}🎷🎷🎷🎼\u{fe0e}", userstyle(242, 192, 192))),
]),
nchunks[1],
);
})?;
time::sleep(Duration::from_secs(1)).await;
let _ = crossterm::event::read();
Ok(())
}

View file

@ -162,6 +162,7 @@ impl Room {
Rpl::Room(RoomRpl::Success) => {
*room_verified = true;
if let Some(nick) = &self.initial_nick {
// TODO Use previous nick if there is one
tokio::spawn(Self::identify(
room.clone(),
nick.clone(),