62 lines
1.7 KiB
Rust
62 lines
1.7 KiB
Rust
|
use ui_model::{ModelRect, ModelRectVec};
|
||
|
|
||
|
#[derive(Clone, Debug)]
|
||
|
pub enum RepaintMode {
|
||
|
Nothing,
|
||
|
All,
|
||
|
AreaList(ModelRectVec),
|
||
|
Area(ModelRect),
|
||
|
}
|
||
|
|
||
|
impl RepaintMode {
|
||
|
pub fn join(self, mode: RepaintMode) -> RepaintMode {
|
||
|
match (self, mode) {
|
||
|
(RepaintMode::Nothing, m) => m,
|
||
|
(m, RepaintMode::Nothing) => m,
|
||
|
(RepaintMode::All, _) => RepaintMode::All,
|
||
|
(_, RepaintMode::All) => RepaintMode::All,
|
||
|
(RepaintMode::Area(mr1), RepaintMode::Area(mr2)) => {
|
||
|
let mut vec = ModelRectVec::new(mr1);
|
||
|
vec.join(&mr2);
|
||
|
RepaintMode::AreaList(vec)
|
||
|
}
|
||
|
(RepaintMode::AreaList(mut target), RepaintMode::AreaList(source)) => {
|
||
|
for s in &source.list {
|
||
|
target.join(s);
|
||
|
}
|
||
|
RepaintMode::AreaList(target)
|
||
|
}
|
||
|
(RepaintMode::AreaList(mut list), RepaintMode::Area(l2)) => {
|
||
|
list.join(&l2);
|
||
|
RepaintMode::AreaList(list)
|
||
|
}
|
||
|
(RepaintMode::Area(l1), RepaintMode::AreaList(mut list)) => {
|
||
|
list.join(&l1);
|
||
|
RepaintMode::AreaList(list)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
#[cfg(test)]
|
||
|
mod tests {
|
||
|
use super::*;
|
||
|
|
||
|
#[test]
|
||
|
fn test_mode() {
|
||
|
let mode = RepaintMode::Area(ModelRect::point(1, 1));
|
||
|
let mode = mode.join(RepaintMode::Nothing);
|
||
|
|
||
|
match mode {
|
||
|
RepaintMode::Area(ref rect) => {
|
||
|
assert_eq!(1, rect.top);
|
||
|
assert_eq!(1, rect.bot);
|
||
|
assert_eq!(1, rect.left);
|
||
|
assert_eq!(1, rect.right);
|
||
|
}
|
||
|
_ => panic!("mode is worng"),
|
||
|
}
|
||
|
}
|
||
|
}
|