mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-07 04:06:45 +01:00
60 lines
2.4 KiB
Rust
60 lines
2.4 KiB
Rust
use crate::prelude::*;
|
|
|
|
pub fn render_toolbar_vertical (
|
|
stdout: &mut std::io::Stdout,
|
|
offset: (u16, u16),
|
|
actions: &[(&str, &str)],
|
|
) -> Result<(u16, u16), Box<dyn Error>> {
|
|
let move_to = |col, row| MoveTo(offset.0 + col, offset.1 + row);
|
|
let mut x: u16 = 1;
|
|
let mut y: u16 = 0;
|
|
for (name, description) in actions.iter() {
|
|
stdout.queue(move_to(1, y))?.queue(
|
|
PrintStyledContent(name.yellow().bold())
|
|
)?.queue(move_to(1, y + 1))?.queue(
|
|
PrintStyledContent(description.yellow())
|
|
)?;
|
|
y = y + 3;
|
|
x = u16::max(x, usize::max(name.len(), description.len()) as u16);
|
|
}
|
|
Ok((x, y))
|
|
}
|
|
|
|
pub fn render_box (
|
|
stdout: &mut std::io::Stdout,
|
|
title: Option<&str>,
|
|
x: u16,
|
|
y: u16,
|
|
mut w: u16,
|
|
h: u16,
|
|
active: bool
|
|
) -> Result<(), Box<dyn Error>> {
|
|
if let Some(title) = title {
|
|
w = u16::max(w, title.len() as u16 + 4);
|
|
}
|
|
let back: String = std::iter::repeat(" ").take(w.saturating_sub(2) as usize).collect();
|
|
if active {
|
|
let edge: String = std::iter::repeat("━").take(w.saturating_sub(2) as usize).collect();
|
|
stdout.queue(MoveTo(x, y))?.queue(PrintStyledContent(format!("┏{edge}┓").bold().yellow()))?;
|
|
if let Some(title) = title {
|
|
stdout.queue(MoveTo(x+1, y))?.queue(PrintStyledContent(format!(" {title} ").yellow()))?;
|
|
}
|
|
for row in y+1..y+h {
|
|
stdout.queue(MoveTo(x, row))?.queue(PrintStyledContent("┃".bold().yellow()))?;
|
|
stdout.queue(MoveTo(x+w-1, row))?.queue(PrintStyledContent("┃".bold().yellow()))?;
|
|
}
|
|
stdout.queue(MoveTo(x, y+h))?.queue(PrintStyledContent(format!("┗{edge}┛").bold().yellow()))?;
|
|
} else {
|
|
let edge: String = std::iter::repeat("─").take(w.saturating_sub(2) as usize).collect();
|
|
stdout.queue(MoveTo(x, y))?.queue(PrintStyledContent(format!("┌{edge}┐").grey().dim()))?;
|
|
if let Some(title) = title {
|
|
stdout.queue(MoveTo(x+1, y))?.queue(Print(format!(" {title} ")))?;
|
|
}
|
|
for row in y+1..y+h {
|
|
stdout.queue(MoveTo(x, row))?.queue(PrintStyledContent("│".grey().dim()))?;
|
|
stdout.queue(MoveTo(x+w-1, row))?.queue(PrintStyledContent("│".grey().dim()))?;
|
|
}
|
|
stdout.queue(MoveTo(x, y+h))?.queue(PrintStyledContent(format!("└{edge}┘").grey().dim()))?;
|
|
}
|
|
Ok(())
|
|
}
|