rustty_oxide/core/
alignable.rs1use 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