word_cloud/placement/
horiz_placer.rs1use 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}