From d987225ac80144d4788ea5e1960ea9a245bbfad1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Girault?= Date: Mon, 17 Feb 2020 22:21:30 +0000 Subject: [PATCH] Add thick lines and line::Set struct Add a new style of line and use a struct to avoid duplication of matching --- src/symbols.rs | 75 ++++++++++++++++++++++++++++++++++++++++++++ src/widgets/block.rs | 69 +++++++++++++--------------------------- 2 files changed, 96 insertions(+), 48 deletions(-) diff --git a/src/symbols.rs b/src/symbols.rs index ccd72d6c..75834962 100644 --- a/src/symbols.rs +++ b/src/symbols.rs @@ -23,40 +23,115 @@ pub mod bar { pub mod line { pub const VERTICAL: &str = "│"; pub const DOUBLE_VERTICAL: &str = "║"; + pub const THICK_VERTICAL: &str = "┃"; pub const HORIZONTAL: &str = "─"; pub const DOUBLE_HORIZONTAL: &str = "═"; + pub const THICK_HORIZONTAL: &str = "━"; pub const TOP_RIGHT: &str = "┐"; pub const ROUNDED_TOP_RIGHT: &str = "╮"; pub const DOUBLE_TOP_RIGHT: &str = "╗"; + pub const THICK_TOP_RIGHT: &str = "┓"; pub const TOP_LEFT: &str = "┌"; pub const ROUNDED_TOP_LEFT: &str = "╭"; pub const DOUBLE_TOP_LEFT: &str = "╔"; + pub const THICK_TOP_LEFT: &str = "┏"; pub const BOTTOM_RIGHT: &str = "┘"; pub const ROUNDED_BOTTOM_RIGHT: &str = "╯"; pub const DOUBLE_BOTTOM_RIGHT: &str = "╝"; + pub const THICK_BOTTOM_RIGHT: &str = "┛"; pub const BOTTOM_LEFT: &str = "└"; pub const ROUNDED_BOTTOM_LEFT: &str = "╰"; pub const DOUBLE_BOTTOM_LEFT: &str = "╚"; + pub const THICK_BOTTOM_LEFT: &str = "┗"; pub const VERTICAL_LEFT: &str = "┤"; pub const DOUBLE_VERTICAL_LEFT: &str = "╣"; + pub const THICK_VERTICAL_LEFT: &str = "┫"; pub const VERTICAL_RIGHT: &str = "├"; pub const DOUBLE_VERTICAL_RIGHT: &str = "╠"; + pub const THICK_VERTICAL_RIGHT: &str = "┣"; pub const HORIZONTAL_DOWN: &str = "┬"; pub const DOUBLE_HORIZONTAL_DOWN: &str = "╦"; + pub const THICK_HORIZONTAL_DOWN: &str = "┳"; pub const HORIZONTAL_UP: &str = "┴"; pub const DOUBLE_HORIZONTAL_UP: &str = "╩"; + pub const THICK_HORIZONTAL_UP: &str = "┻"; pub const CROSS: &str = "┼"; pub const DOUBLE_CROSS: &str = "╬"; + pub const THICK_CROSS: &str = "╋"; + + pub struct Set { + pub vertical: &'static str, + pub horizontal: &'static str, + pub top_right: &'static str, + pub top_left: &'static str, + pub bottom_right: &'static str, + pub bottom_left: &'static str, + pub vertical_left: &'static str, + pub vertical_right: &'static str, + pub horizontal_down: &'static str, + pub horizontal_up: &'static str, + pub cross: &'static str, + } + + pub const NORMAL: Set = Set { + vertical: VERTICAL, + horizontal: HORIZONTAL, + top_right: TOP_RIGHT, + top_left: TOP_LEFT, + bottom_right: BOTTOM_RIGHT, + bottom_left: BOTTOM_LEFT, + vertical_left: VERTICAL_LEFT, + vertical_right: VERTICAL_RIGHT, + horizontal_down: HORIZONTAL_DOWN, + horizontal_up: HORIZONTAL_UP, + cross: CROSS, + }; + + pub const ROUNDED: Set = Set { + top_right: ROUNDED_TOP_RIGHT, + top_left: ROUNDED_TOP_LEFT, + bottom_right: ROUNDED_BOTTOM_RIGHT, + bottom_left: ROUNDED_BOTTOM_LEFT, + ..NORMAL + }; + + pub const DOUBLE: Set = Set { + vertical: DOUBLE_VERTICAL, + horizontal: DOUBLE_HORIZONTAL, + top_right: DOUBLE_TOP_RIGHT, + top_left: DOUBLE_TOP_LEFT, + bottom_right: DOUBLE_BOTTOM_RIGHT, + bottom_left: DOUBLE_BOTTOM_LEFT, + vertical_left: DOUBLE_VERTICAL_LEFT, + vertical_right: DOUBLE_VERTICAL_RIGHT, + horizontal_down: DOUBLE_HORIZONTAL_DOWN, + horizontal_up: DOUBLE_HORIZONTAL_UP, + cross: DOUBLE_CROSS, + }; + + pub const THICK: Set = Set { + vertical: THICK_VERTICAL, + horizontal: THICK_HORIZONTAL, + top_right: THICK_TOP_RIGHT, + top_left: THICK_TOP_LEFT, + bottom_right: THICK_BOTTOM_RIGHT, + bottom_left: THICK_BOTTOM_LEFT, + vertical_left: THICK_VERTICAL_LEFT, + vertical_right: THICK_VERTICAL_RIGHT, + horizontal_down: THICK_HORIZONTAL_DOWN, + horizontal_up: THICK_HORIZONTAL_UP, + cross: THICK_CROSS, + }; } pub const DOT: &str = "•"; diff --git a/src/widgets/block.rs b/src/widgets/block.rs index 69591270..f65f77ab 100644 --- a/src/widgets/block.rs +++ b/src/widgets/block.rs @@ -9,6 +9,18 @@ pub enum BorderType { Plain, Rounded, Double, + Thick, +} + +impl BorderType { + pub fn line_symbols(border_type: BorderType) -> line::Set { + match border_type { + BorderType::Plain => line::NORMAL, + BorderType::Rounded => line::ROUNDED, + BorderType::Double => line::DOUBLE, + BorderType::Thick => line::THICK, + } + } } /// Base widget to be used with all upper level ones. It may be used to display a box border around @@ -120,50 +132,35 @@ impl<'a> Widget for Block<'a> { buf.set_background(area, self.style.bg); + let symbols = BorderType::line_symbols(self.border_type); // Sides if self.borders.intersects(Borders::LEFT) { - let symbol = match self.border_type { - BorderType::Double => line::DOUBLE_VERTICAL, - _ => line::VERTICAL, - }; for y in area.top()..area.bottom() { buf.get_mut(area.left(), y) - .set_symbol(symbol) + .set_symbol(symbols.vertical) .set_style(self.border_style); } } if self.borders.intersects(Borders::TOP) { - let symbol = match self.border_type { - BorderType::Double => line::DOUBLE_HORIZONTAL, - _ => line::HORIZONTAL, - }; for x in area.left()..area.right() { buf.get_mut(x, area.top()) - .set_symbol(symbol) + .set_symbol(symbols.horizontal) .set_style(self.border_style); } } if self.borders.intersects(Borders::RIGHT) { let x = area.right() - 1; - let symbol = match self.border_type { - BorderType::Double => line::DOUBLE_VERTICAL, - _ => line::VERTICAL, - }; for y in area.top()..area.bottom() { buf.get_mut(x, y) - .set_symbol(symbol) + .set_symbol(symbols.vertical) .set_style(self.border_style); } } if self.borders.intersects(Borders::BOTTOM) { let y = area.bottom() - 1; - let symbol = match self.border_type { - BorderType::Double => line::DOUBLE_HORIZONTAL, - _ => line::HORIZONTAL, - }; for x in area.left()..area.right() { buf.get_mut(x, y) - .set_symbol(symbol) + .set_symbol(symbols.horizontal) .set_style(self.border_style); } } @@ -171,46 +168,22 @@ impl<'a> Widget for Block<'a> { // Corners if self.borders.contains(Borders::LEFT | Borders::TOP) { buf.get_mut(area.left(), area.top()) - .set_symbol({ - match self.border_type { - BorderType::Double => line::DOUBLE_TOP_LEFT, - BorderType::Rounded => line::ROUNDED_TOP_LEFT, - _ => line::TOP_LEFT, - } - }) + .set_symbol(symbols.top_left) .set_style(self.border_style); } if self.borders.contains(Borders::RIGHT | Borders::TOP) { buf.get_mut(area.right() - 1, area.top()) - .set_symbol({ - match self.border_type { - BorderType::Double => line::DOUBLE_TOP_RIGHT, - BorderType::Rounded => line::ROUNDED_TOP_RIGHT, - _ => line::TOP_RIGHT, - } - }) + .set_symbol(symbols.top_right) .set_style(self.border_style); } if self.borders.contains(Borders::LEFT | Borders::BOTTOM) { buf.get_mut(area.left(), area.bottom() - 1) - .set_symbol({ - match self.border_type { - BorderType::Double => line::DOUBLE_BOTTOM_LEFT, - BorderType::Rounded => line::ROUNDED_BOTTOM_LEFT, - _ => line::BOTTOM_LEFT, - } - }) + .set_symbol(symbols.bottom_left) .set_style(self.border_style); } if self.borders.contains(Borders::RIGHT | Borders::BOTTOM) { buf.get_mut(area.right() - 1, area.bottom() - 1) - .set_symbol({ - match self.border_type { - BorderType::Double => line::DOUBLE_BOTTOM_RIGHT, - BorderType::Rounded => line::ROUNDED_BOTTOM_RIGHT, - _ => line::BOTTOM_RIGHT, - } - }) + .set_symbol(symbols.bottom_right) .set_style(self.border_style); }