use crate::border_symbols::{symbol_set, PlainSymbolSet};
use crate::{BorderSymbol, BorderSymbolSet, Side};
use dyn_clone::clone_box;
use ratatui::buffer::Buffer;
use ratatui::layout::{Position, Rect};
use ratatui::style::Style;
use ratatui::widgets::{BorderType, Widget};
pub struct BlockConnect {
border_style: Style,
symbol_set: Box<dyn BorderSymbolSet>,
side: Side,
symbol: BorderSymbol,
}
impl Clone for BlockConnect {
fn clone(&self) -> Self {
Self {
border_style: self.border_style,
symbol_set: clone_box(self.symbol_set.as_ref()),
side: self.side,
symbol: self.symbol,
}
}
}
impl Default for BlockConnect {
fn default() -> Self {
Self {
border_style: Default::default(),
symbol_set: Box::new(PlainSymbolSet),
side: Side::Top,
symbol: BorderSymbol::StartCornerRegular,
}
}
}
impl BlockConnect {
pub fn new() -> Self {
Self::default()
}
pub fn border_style(mut self, style: Style) -> Self {
self.border_style = style;
self
}
pub fn border_type(mut self, border: BorderType) -> Self {
self.symbol_set = symbol_set(border);
self
}
pub fn border_set(mut self, border_set: Box<dyn BorderSymbolSet>) -> Self {
self.symbol_set = border_set;
self
}
pub fn side(mut self, side: Side) -> Self {
self.side = side;
self
}
pub fn symbol(mut self, symbol: BorderSymbol) -> Self {
self.symbol = symbol;
self
}
}
impl Widget for BlockConnect {
fn render(self, area: Rect, buf: &mut Buffer)
where
Self: Sized,
{
if let Some(cell) = buf.cell_mut(Position::new(area.x, area.y)) {
cell.set_style(self.border_style);
cell.set_symbol(self.symbol_set.symbol(self.side, self.symbol));
}
}
}