tui_gradient_block/structs/
border_segment.rs

1use crate::structs::border_symbols::SegmentSet;
2use ratatui::prelude::Alignment;
3use tui_rule::{
4    presets::borders::plain::*, Rule, Set, VerticalAlignment,
5};
6pub struct BorderSegment {
7    pub should_be_rendered: bool,
8    pub seg: Rule,
9}
10/// A collection of border segments representing different parts of a bordered structure.  
11///
12/// This struct holds individual `BorderSegment` instances for each section of the border
13pub struct BorderSegments {
14    /// The full top border segment.
15    pub top: BorderSegment,
16    /// The full bottom border segment.
17    pub bottom: BorderSegment,
18    /// The full left border segment.
19    pub left: BorderSegment,
20    /// The full right border segment.
21    pub right: BorderSegment,
22}
23impl Default for BorderSegments {
24    fn default() -> Self {
25        Self::new()
26    }
27}
28
29impl BorderSegments {
30    /// Creates a new set of `BorderSegments`
31    /// # Returns
32    /// A `BorderSegments` instance with all segments initialized at their respective positions.
33    pub fn new() -> Self {
34        let mut new_self = Self {
35            top: BorderSegment::new(false, TOP),
36            bottom: BorderSegment::new(false, BOTTOM),
37            left: BorderSegment::new(true, LEFT),
38            right: BorderSegment::new(true, RIGHT),
39        };
40        new_self.right.seg.horizontal_alignment = Alignment::Right;
41        new_self.left.seg.horizontal_alignment = Alignment::Left;
42        new_self.bottom.seg.vertical_alignment =
43            VerticalAlignment::Bottom;
44        new_self.top.seg.vertical_alignment = VerticalAlignment::Top;
45        new_self
46    }
47    pub fn from_segment_set(mut self, set: SegmentSet) -> Self {
48        self.right.seg = self.right.seg.with_set(set.right);
49        self.left.seg = self.left.seg.with_set(set.left);
50        self.top.seg = self.top.seg.with_set(set.top);
51        self.bottom.seg = self.bottom.seg.with_set(set.bottom);
52        self
53    }
54}
55impl BorderSegment {
56    /// The segment starts with a plain rule
57    /// x and y are 0 by default,
58    /// # Returns
59    /// A `BorderSegment` instance with default values
60    pub fn new(is_vertical: bool, set: Set) -> Self {
61        Self {
62            should_be_rendered: true,
63            seg: match is_vertical {
64                true => Rule::from_set(set).vertical(),
65                false => Rule::from_set(set).horizontal(),
66            }
67            .area_margin(ratatui::layout::Margin::new(0, 0)),
68        }
69    }
70}