nvim_gtk/nvim/
repaint_mode.rs

1use crate::ui_model::{ModelRect, ModelRectVec};
2
3#[derive(Clone, Debug)]
4pub enum RepaintMode {
5    Nothing,
6    All,
7    AreaList(ModelRectVec),
8    Area(ModelRect),
9}
10
11impl RepaintMode {
12    pub fn join(self, mode: RepaintMode) -> RepaintMode {
13        match (self, mode) {
14            (RepaintMode::Nothing, m) => m,
15            (m, RepaintMode::Nothing) => m,
16            (RepaintMode::All, _) => RepaintMode::All,
17            (_, RepaintMode::All) => RepaintMode::All,
18            (RepaintMode::Area(mr1), RepaintMode::Area(mr2)) => {
19                let mut vec = ModelRectVec::new(mr1);
20                vec.join(&mr2);
21                RepaintMode::AreaList(vec)
22            }
23            (RepaintMode::AreaList(mut target), RepaintMode::AreaList(source)) => {
24                for s in &source.list {
25                    target.join(s);
26                }
27                RepaintMode::AreaList(target)
28            }
29            (RepaintMode::AreaList(mut list), RepaintMode::Area(l2)) => {
30                list.join(&l2);
31                RepaintMode::AreaList(list)
32            }
33            (RepaintMode::Area(l1), RepaintMode::AreaList(mut list)) => {
34                list.join(&l1);
35                RepaintMode::AreaList(list)
36            }
37        }
38    }
39}
40
41#[cfg(test)]
42mod tests {
43    use super::*;
44
45    #[test]
46    fn test_mode() {
47        let mode = RepaintMode::Area(ModelRect::point(1, 1));
48        let mode = mode.join(RepaintMode::Nothing);
49
50        match mode {
51            RepaintMode::Area(ref rect) => {
52                assert_eq!(1, rect.top);
53                assert_eq!(1, rect.bot);
54                assert_eq!(1, rect.left);
55                assert_eq!(1, rect.right);
56            }
57            _ => panic!("mode is worng"),
58        }
59    }
60}