1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
use crate::{api::prelude::*, proc_macros::*};

widget!(
    /// The `Grid` defines a flexible grid area that consists of columns and rows.
    ///
    /// **style:** `grid`
    Grid {
        /// Sets or shares the background property.
        background: Brush,

        /// Sets or shares the columns property.
        columns: Columns,

        /// Sets or shares the rows property.
        rows: Rows,

        /// Sets or shares the border radius property.
        border_radius: f64

        attached_properties: {
            /// Attach a column position to a widget.
            column: usize,

            /// Attach a column span to a widget.
            column_span: usize,

            /// Attach a row position to a widget.
            row: usize,

            /// Attach a row span to a widget.
            row_span: usize
        }
    }
);

impl Grid {
    /// Sets column and row to the given widget and add it as child.
    pub fn place<W>(self, ctx: &mut BuildContext, child: W, column: usize, row: usize) -> Self
    where
        W: Widget,
    {
        self.child(
            child
                .attach(Grid::column(column))
                .attach(Grid::row(row))
                .build(ctx),
        )
    }
}

impl Template for Grid {
    fn template(self, _: Entity, _: &mut BuildContext) -> Self {
        self.name("Grid")
            .style("grid")
            .border_radius(0.0)
            .background("transparent")
            .rows(Rows::default())
            .columns(Columns::default())
    }

    fn render_object(&self) -> Box<dyn RenderObject> {
        Box::new(RectangleRenderObject)
    }

    fn layout(&self) -> Box<dyn Layout> {
        Box::new(GridLayout::new())
    }
}