rqml/src/widget_builders/grid.rs

46 lines
1.7 KiB
Rust
Raw Permalink Normal View History

2020-07-05 21:29:44 +00:00
use crate::parser::{Value, QML};
2020-07-06 03:45:19 +00:00
use crate::widget_builders::{parse_number, QmlContext, QmlWidgetBuilder, WidgetBuilder};
2020-07-05 21:29:44 +00:00
use orbtk::prelude::HashMap;
use orbtk::prelude::*;
2020-08-14 22:57:31 +00:00
2020-07-05 21:29:44 +00:00
pub struct GridBuilder {}
impl WidgetBuilder for GridBuilder {
2020-07-06 03:45:09 +00:00
fn build(&self, properties: HashMap<String, Value>, children: Vec<(String, QML)>) -> Box<dyn Fn(Entity, &mut BuildContext, usize, usize, &mut QmlContext) -> Entity> {
return Box::new(move |id, ctx, row, col, qmlctx| -> Entity {
2020-07-05 21:29:44 +00:00
let mut grid = Grid::new();
grid = grid.attach(Grid::row(row as usize));
grid = grid.attach(Grid::column(col as usize));
let rows = parse_number(properties.get("rows")) as u32;
2020-07-11 21:32:43 +00:00
let cols = parse_number(properties.get("columns")) as u32;
2020-07-05 21:29:44 +00:00
2020-08-14 22:57:31 +00:00
let mut grid_rows = Rows::create();
2020-07-05 21:29:44 +00:00
for _i in 0..rows {
2020-08-14 22:57:31 +00:00
grid_rows = grid_rows.push("stretch");
2020-07-05 21:29:44 +00:00
}
grid = grid.rows(grid_rows.build());
2020-08-14 22:57:31 +00:00
let mut grid_cols = Columns::create();
2020-07-05 21:29:44 +00:00
for _i in 0..rows {
2020-08-14 22:57:31 +00:00
grid_cols = grid_cols.push("stretch");
2020-07-05 21:29:44 +00:00
}
grid = grid.columns(grid_cols.build());
let mut grow = 0u32;
let mut gcol = 0u32;
2020-07-11 21:32:43 +00:00
2020-07-05 21:29:44 +00:00
let qwb = QmlWidgetBuilder::new();
for (child_type, child_qml) in children.iter() {
2020-07-06 03:45:09 +00:00
grid = grid.child(qwb.build(id, grow as usize, gcol as usize, child_type.clone(), child_qml.clone(), ctx, qmlctx));
2020-07-05 21:29:44 +00:00
grow += 1;
if grow as u32 == rows {
grow = 0;
2020-07-11 21:32:43 +00:00
gcol = (gcol + 1) % cols;
2020-07-05 21:29:44 +00:00
}
}
return grid.build(ctx);
});
}
}