word_cloud/placement/
horiz_placer.rs

1use crate::geometry::{Rectangle, Vector};
2
3use super::PlacementStrategy;
4
5pub struct HorizontalPlacer {
6    viewport: Rectangle,
7    offset: u32,
8}
9
10impl HorizontalPlacer {
11    pub fn new(viewport: Rectangle, offset: u32) -> HorizontalPlacer {
12        HorizontalPlacer { viewport, offset }
13    }
14}
15
16impl PlacementStrategy for HorizontalPlacer {
17    fn find_next_place(&mut self, start_pos: Option<Vector>, r: &Rectangle) -> Option<Vector> {
18        let start_pos = match start_pos {
19            Some(pos) => pos,
20            None => return Some((0, 0)),
21        };
22
23        if start_pos.0 + self.offset + r.size().0 <= self.viewport.size().0 {
24            return Some((start_pos.0 + self.offset, start_pos.1));
25        }
26
27        if start_pos.1 + self.offset + r.size().1 < self.viewport.size().1 {
28            return Some((self.viewport.pos().0, start_pos.1 + self.offset));
29        }
30
31        None
32    }
33}
34
35#[cfg(test)]
36mod test {
37    use super::*;
38
39    #[test]
40    fn find_next_place() {
41        let expected = [(0, 0), (1, 0), (2, 0), (3, 0)];
42        let mut placer = HorizontalPlacer::new(Rectangle::new(0, 0, 5, 2), 1);
43
44        let mut pos = None;
45        for i in 0..expected.len() {
46            pos = placer.find_next_place(pos, &Rectangle::new(0, 0, 2, 2));
47
48            dbg!(pos);
49            assert_eq!(expected[i], pos.unwrap());
50        }
51
52        assert_eq!(
53            None,
54            placer.find_next_place(pos, &Rectangle::new(0, 0, 2, 2))
55        )
56    }
57}