Skip to main content

lv_tui/
geom.rs

1/// 终端字符格大小
2#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
3pub struct Size {
4    pub width: u16,
5    pub height: u16,
6}
7
8/// 字符格坐标
9#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
10pub struct Pos {
11    pub x: u16,
12    pub y: u16,
13}
14
15/// 字符格矩形区域
16#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
17pub struct Rect {
18    pub x: u16,
19    pub y: u16,
20    pub width: u16,
21    pub height: u16,
22}
23
24/// 四周边距
25#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
26pub struct Insets {
27    pub top: u16,
28    pub right: u16,
29    pub bottom: u16,
30    pub left: u16,
31}
32
33impl Insets {
34    pub const ZERO: Insets = Insets {
35        top: 0,
36        right: 0,
37        bottom: 0,
38        left: 0,
39    };
40
41    pub fn all(value: u16) -> Self {
42        Self {
43            top: value,
44            right: value,
45            bottom: value,
46            left: value,
47        }
48    }
49}
50
51impl Rect {
52    /// 判断坐标是否在矩形内
53    pub fn contains(&self, pos: Pos) -> bool {
54        pos.x >= self.x
55            && pos.x < self.x.saturating_add(self.width)
56            && pos.y >= self.y
57            && pos.y < self.y.saturating_add(self.height)
58    }
59
60    /// 扣除 insets 后的内部区域
61    pub fn inner(&self, insets: Insets) -> Rect {
62        let x = self.x.saturating_add(insets.left);
63        let y = self.y.saturating_add(insets.top);
64        let width = self
65            .width
66            .saturating_sub(insets.left.saturating_add(insets.right));
67        let height = self
68            .height
69            .saturating_sub(insets.top.saturating_add(insets.bottom));
70
71        Rect { x, y, width, height }
72    }
73}