Add room and nick list UI mockup
This commit is contained in:
parent
992e84e67e
commit
fbc24a1154
4 changed files with 217 additions and 6 deletions
117
Cargo.lock
generated
117
Cargo.lock
generated
|
|
@ -17,6 +17,15 @@ version = "1.0.53"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "94a45b455c14666b85fc40a019e8ab9eb75e3a124e05494f5397122bc9eb06e0"
|
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]]
|
[[package]]
|
||||||
name = "atty"
|
name = "atty"
|
||||||
version = "0.2.14"
|
version = "0.2.14"
|
||||||
|
|
@ -188,6 +197,7 @@ dependencies = [
|
||||||
"clap",
|
"clap",
|
||||||
"cove-core",
|
"cove-core",
|
||||||
"crossterm",
|
"crossterm",
|
||||||
|
"palette",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
"tokio",
|
"tokio",
|
||||||
"tokio-tungstenite",
|
"tokio-tungstenite",
|
||||||
|
|
@ -269,6 +279,15 @@ dependencies = [
|
||||||
"termcolor",
|
"termcolor",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[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"
|
||||||
|
|
@ -566,6 +585,15 @@ dependencies = [
|
||||||
"winapi",
|
"winapi",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "num-traits"
|
||||||
|
version = "0.2.14"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290"
|
||||||
|
dependencies = [
|
||||||
|
"autocfg",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "num_cpus"
|
name = "num_cpus"
|
||||||
version = "1.13.1"
|
version = "1.13.1"
|
||||||
|
|
@ -603,6 +631,30 @@ dependencies = [
|
||||||
"memchr",
|
"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]]
|
[[package]]
|
||||||
name = "parking_lot"
|
name = "parking_lot"
|
||||||
version = "0.11.2"
|
version = "0.11.2"
|
||||||
|
|
@ -634,6 +686,50 @@ version = "2.1.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
|
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]]
|
[[package]]
|
||||||
name = "pin-project-lite"
|
name = "pin-project-lite"
|
||||||
version = "0.2.8"
|
version = "0.2.8"
|
||||||
|
|
@ -676,6 +772,12 @@ dependencies = [
|
||||||
"version_check",
|
"version_check",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "proc-macro-hack"
|
||||||
|
version = "0.5.19"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "proc-macro2"
|
name = "proc-macro2"
|
||||||
version = "1.0.36"
|
version = "1.0.36"
|
||||||
|
|
@ -948,6 +1050,12 @@ dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "siphasher"
|
||||||
|
version = "0.3.9"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "a86232ab60fa71287d7f2ddae4a7073f6b7aac33631c3015abb556f08c6d0a3e"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "slab"
|
name = "slab"
|
||||||
version = "0.4.5"
|
version = "0.4.5"
|
||||||
|
|
@ -1101,6 +1209,15 @@ dependencies = [
|
||||||
"webpki",
|
"webpki",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "toml"
|
||||||
|
version = "0.5.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa"
|
||||||
|
dependencies = [
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tui"
|
name = "tui"
|
||||||
version = "0.17.0"
|
version = "0.17.0"
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ clap = { version = "3.1.0", features = ["derive"] }
|
||||||
cove-core = { path = "../cove-core" }
|
cove-core = { path = "../cove-core" }
|
||||||
crossterm = "0.22.1"
|
crossterm = "0.22.1"
|
||||||
# futures = "0.3.21"
|
# futures = "0.3.21"
|
||||||
|
palette = "0.6.0"
|
||||||
# serde_json = "1.0.78"
|
# serde_json = "1.0.78"
|
||||||
thiserror = "1.0.30"
|
thiserror = "1.0.30"
|
||||||
tokio = { version = "1.16.1", features = ["full"] }
|
tokio = { version = "1.16.1", features = ["full"] }
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
mod replies;
|
|
||||||
mod room;
|
|
||||||
mod config;
|
mod config;
|
||||||
mod never;
|
mod never;
|
||||||
|
mod replies;
|
||||||
|
mod room;
|
||||||
|
|
||||||
use std::io::{self, Stdout};
|
use std::io::{self, Stdout};
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
@ -10,17 +10,109 @@ use config::Config;
|
||||||
use crossterm::event::{DisableMouseCapture, EnableMouseCapture};
|
use crossterm::event::{DisableMouseCapture, EnableMouseCapture};
|
||||||
use crossterm::execute;
|
use crossterm::execute;
|
||||||
use crossterm::terminal::{EnterAlternateScreen, LeaveAlternateScreen};
|
use crossterm::terminal::{EnterAlternateScreen, LeaveAlternateScreen};
|
||||||
|
use palette::rgb::Rgb;
|
||||||
|
use palette::{FromColor, Hsl, Hsv, Saturate, Srgb};
|
||||||
use tokio::time;
|
use tokio::time;
|
||||||
use tui::backend::CrosstermBackend;
|
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;
|
use tui::Terminal;
|
||||||
|
|
||||||
async fn run(terminal: &mut Terminal<CrosstermBackend<Stdout>>) -> anyhow::Result<()> {
|
async fn run(terminal: &mut Terminal<CrosstermBackend<Stdout>>) -> anyhow::Result<()> {
|
||||||
terminal.draw(|f| {
|
terminal.draw(|f| {
|
||||||
let block = Block::default().title("Block").borders(Borders::ALL);
|
let hchunks = Layout::default()
|
||||||
f.render_widget(block, f.size());
|
.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(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -162,6 +162,7 @@ impl Room {
|
||||||
Rpl::Room(RoomRpl::Success) => {
|
Rpl::Room(RoomRpl::Success) => {
|
||||||
*room_verified = true;
|
*room_verified = true;
|
||||||
if let Some(nick) = &self.initial_nick {
|
if let Some(nick) = &self.initial_nick {
|
||||||
|
// TODO Use previous nick if there is one
|
||||||
tokio::spawn(Self::identify(
|
tokio::spawn(Self::identify(
|
||||||
room.clone(),
|
room.clone(),
|
||||||
nick.clone(),
|
nick.clone(),
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue