geng_ui/layout_widgets/
shrink.rs

1use super::*;
2
3pub struct Shrink<T> {
4    ratio: f64,
5    child: T,
6}
7
8impl<T, R: AsRef<T>> AsRef<T> for Shrink<R> {
9    fn as_ref(&self) -> &T {
10        self.child.as_ref()
11    }
12}
13
14impl<T, R: AsMut<T>> AsMut<T> for Shrink<R> {
15    fn as_mut(&mut self) -> &mut T {
16        self.child.as_mut()
17    }
18}
19
20mod ext {
21    use super::*;
22
23    pub trait WidgetExt: Widget + Sized {
24        fn shrink(self, ratio: f64) -> Shrink<Self> {
25            Shrink { ratio, child: self }
26        }
27    }
28
29    impl<T: Widget> WidgetExt for T {}
30}
31
32pub use ext::WidgetExt as _;
33
34impl<T: Widget> Widget for Shrink<T> {
35    fn calc_constraints(&mut self, children: &ConstraintsContext) -> Constraints {
36        children.get_constraints(&self.child)
37    }
38    fn layout_children(&mut self, cx: &mut LayoutContext) {
39        let ratio = self.ratio / 2.0;
40        cx.set_position(
41            &self.child,
42            cx.position.extend_symmetric(-cx.position.size() * ratio),
43        );
44    }
45    fn walk_children_mut<'a>(&mut self, f: &mut dyn FnMut(&mut dyn Widget)) {
46        f(&mut self.child);
47    }
48}