You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tui-rs/src/widgets/block.rs

96 lines
2.7 KiB
Rust

use buffer::Buffer;
use layout::Rect;
use style::Color;
use widgets::{Widget, WidgetType, border, Line, vline, hline};
#[derive(Hash, Clone, Copy)]
pub struct Block<'a> {
title: Option<&'a str>,
borders: border::Flags,
border_fg: Color,
border_bg: Color,
}
impl<'a> Default for Block<'a> {
fn default() -> Block<'a> {
Block {
title: None,
borders: border::NONE,
border_fg: Color::White,
border_bg: Color::Black,
}
}
}
impl<'a> Block<'a> {
pub fn title(&mut self, title: &'a str) -> &mut Block<'a> {
self.title = Some(title);
self
}
pub fn borders(&mut self, flag: border::Flags) -> &mut Block<'a> {
self.borders = flag;
self
}
}
impl<'a> Widget for Block<'a> {
fn _buffer(&self, area: &Rect) -> Buffer {
let mut buf = Buffer::empty(*area);
if self.borders == border::NONE {
return buf;
}
// Sides
if self.borders.intersects(border::LEFT) {
let line = vline(area.x, area.y, area.height, self.border_fg, self.border_bg);
buf.merge(&line);
}
if self.borders.intersects(border::TOP) {
let line = hline(area.x, area.y, area.width, self.border_fg, self.border_bg);
buf.merge(&line);
}
if self.borders.intersects(border::RIGHT) {
let line = vline(area.x + area.width - 1,
area.y,
area.height,
self.border_fg,
self.border_bg);
buf.merge(&line);
}
if self.borders.intersects(border::BOTTOM) {
let line = hline(area.x,
area.y + area.height - 1,
area.width,
self.border_fg,
self.border_bg);
buf.merge(&line);
}
// Corners
if self.borders.contains(border::LEFT | border::TOP) {
buf.set_symbol(0, 0, Line::TopLeft.get());
}
if self.borders.contains(border::RIGHT | border::TOP) {
buf.set_symbol(area.width - 1, 0, Line::TopRight.get());
}
if self.borders.contains(border::BOTTOM | border::LEFT) {
buf.set_symbol(0, area.height - 1, Line::BottomLeft.get());
}
if self.borders.contains(border::BOTTOM | border::RIGHT) {
buf.set_symbol(area.width - 1, area.height - 1, Line::BottomRight.get());
}
if let Some(ref title) = self.title {
buf.set_string(1, 0, &format!(" {} ", title));
}
buf
}
fn widget_type(&self) -> WidgetType {
WidgetType::Block
}
}