generated from PlexSheep/rs-base
46 lines
1.2 KiB
Rust
46 lines
1.2 KiB
Rust
use tui::{style::Style, widgets::Widget};
|
|
|
|
use self::chars::{BrickChar, Point};
|
|
|
|
mod chars;
|
|
|
|
pub struct BricksText {
|
|
text: String,
|
|
size: u16,
|
|
space: u16,
|
|
style: Style,
|
|
}
|
|
|
|
impl BricksText {
|
|
pub fn new(text: &str, size: u16, space: u16, style: Style) -> BricksText {
|
|
BricksText {
|
|
text: text.to_string(),
|
|
size,
|
|
space,
|
|
style,
|
|
}
|
|
}
|
|
|
|
pub fn size(&self) -> (u16, u16) {
|
|
let Point(w, h) = BrickChar::size(self.size);
|
|
let n_chars = self.text.chars().count() as u16;
|
|
(w * n_chars + self.space * (n_chars - 1), h)
|
|
}
|
|
}
|
|
|
|
impl Widget for &BricksText {
|
|
fn render(self, area: tui::layout::Rect, buf: &mut tui::buffer::Buffer) {
|
|
let mut area = area.clone();
|
|
for char in self.text.chars() {
|
|
let Point(w, _) = BrickChar::size(self.size);
|
|
let char = BrickChar::from(char);
|
|
char.render(self.size, self.style, area, buf);
|
|
let l = w + self.space;
|
|
area.x += l;
|
|
area.width = area.width.saturating_sub(l);
|
|
if area.area() == 0 {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|