refactor: device abstraction, layout components

This commit is contained in:
🪞👃🪞 2024-06-12 16:55:57 +03:00
parent d330d31ce4
commit 788dc1ccde
21 changed files with 1144 additions and 1166 deletions

View file

@ -61,61 +61,61 @@ pub fn draw_focus_corners (buffer: &mut Buffer, area: Rect) {
buffer.set_string(area.x + area.width - 1, area.y + area.height - 1, "", focus);
}
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_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(())
}
//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(())
//}