rustty_oxide/core/
alignable.rs

1use rustty::{HasSize, HasPosition};
2use core::attributes::{HorizontalAlign, VerticalAlign};
3
4pub trait Alignable: HasSize + HasPosition {
5    fn halign(&mut self, parent: &HasSize, halign: HorizontalAlign, margin: usize) {
6        let (cols, _) = self.size();
7        let (_, y) = self.origin();
8        let (parent_cols, _) = parent.size();
9        let newx = match halign {
10            HorizontalAlign::Left => margin,
11            HorizontalAlign::Right => parent_cols - cols - margin,
12            HorizontalAlign::Middle => (parent_cols - cols) / 2,
13        };
14        self.set_origin((newx, y));
15    }
16
17    fn valign(&mut self, parent: &HasSize, valign: VerticalAlign, margin: usize) {
18        let (_, rows) = self.size();
19        let (x, _) = self.origin();
20        let (_, parent_rows) = parent.size();
21        let newy = match valign {
22            VerticalAlign::Top => margin,
23            VerticalAlign::Bottom => parent_rows - rows - margin,
24            VerticalAlign::Middle => (parent_rows - rows) / 2,
25        };
26        self.set_origin((x, newy));
27    }
28    
29    fn align(&mut self, parent: &HasSize, halign: HorizontalAlign, valign: VerticalAlign, 
30             margin: (usize, usize)) {
31        self.halign(parent, halign, margin.0);
32        self.valign(parent, valign, margin.1);
33    }
34}
35