rqml/src/widget_builders/mod.rs

88 lines
3.0 KiB
Rust
Raw Permalink Normal View History

2020-07-06 03:45:09 +00:00
use crate::parser::Value::{QmlNumber, QmlString};
2020-07-05 21:29:44 +00:00
use crate::parser::{Value, QML};
use crate::widget_builders::button::ButtonBuilder;
use crate::widget_builders::grid::GridBuilder;
use crate::widget_builders::rectangle::RectangleBuilder;
use crate::widget_builders::textedit::TextEditBuilder;
use crate::widget_builders::textfield::TextBuilder;
use orbtk::prelude::*;
2020-08-14 22:57:31 +00:00
2020-07-05 21:29:44 +00:00
2020-07-11 21:32:43 +00:00
use crate::widget_builders::combobox::ComboBoxBuilder;
2020-07-06 03:45:19 +00:00
use crate::widget_builders::image::ImageBuilder;
2020-07-05 23:23:22 +00:00
use crate::widget_builders::import::ImportBuilder;
2020-07-05 21:29:44 +00:00
use std::collections::HashMap;
pub mod button;
2020-07-11 21:32:43 +00:00
pub mod combobox;
2020-07-05 21:29:44 +00:00
pub mod grid;
2020-07-06 03:45:19 +00:00
pub mod image;
2020-07-05 23:23:22 +00:00
pub mod import;
2020-07-05 21:29:44 +00:00
pub mod rectangle;
pub mod textedit;
pub mod textfield;
2020-07-06 03:45:09 +00:00
2020-07-06 03:45:19 +00:00
pub fn parse_color_property(properties: &HashMap<String, Value>, prop: &str) -> Color {
2020-07-06 03:45:09 +00:00
match properties.get(prop) {
Some(QmlString(col)) => match col.as_str() {
"red" => Color::rgb(0xff, 00, 00),
"blue" => Color::rgb(0x00, 00, 0xff),
_ => Color::from(col.as_str()),
},
_ => Color::rgb(0xff, 0xff, 0xff),
}
}
2020-07-05 21:29:44 +00:00
fn parse_number(val: Option<&Value>) -> f64 {
match val {
Some(QmlNumber(num)) => num.clone(),
_ => 0.0,
}
}
2020-07-06 03:45:09 +00:00
#[derive(Clone)]
2020-07-06 03:45:19 +00:00
pub struct QmlContext {
2020-07-06 03:45:09 +00:00
pub(crate) indexes: Vec<String>,
2020-07-06 03:45:19 +00:00
pub(crate) code: HashMap<(String, String), String>,
2020-07-06 03:45:09 +00:00
}
2020-07-05 21:29:44 +00:00
pub trait WidgetBuilder {
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>;
2020-07-05 21:29:44 +00:00
}
pub struct QmlWidgetBuilder {
widgets: HashMap<String, Box<dyn WidgetBuilder>>,
}
impl QmlWidgetBuilder {
pub fn new() -> QmlWidgetBuilder {
2020-07-05 22:39:10 +00:00
let mut qwb = QmlWidgetBuilder { widgets: Default::default() };
qwb.widgets.insert(String::from("Rectangle"), Box::new(RectangleBuilder {}));
qwb.widgets.insert(String::from("Grid"), Box::new(GridBuilder {}));
qwb.widgets.insert(String::from("Text"), Box::new(TextBuilder {}));
qwb.widgets.insert(String::from("TextField"), Box::new(TextEditBuilder {}));
qwb.widgets.insert(String::from("Button"), Box::new(ButtonBuilder {}));
2020-07-06 03:45:09 +00:00
qwb.widgets.insert(String::from("Image"), Box::new(ImageBuilder {}));
2020-07-11 21:32:43 +00:00
qwb.widgets.insert(String::from("ComboBox"), Box::new(ComboBoxBuilder {}));
2020-07-05 21:29:44 +00:00
qwb
}
2020-07-06 03:45:09 +00:00
pub fn build(&self, id: Entity, row: usize, col: usize, widget_type: String, qml: QML, ctx: &mut BuildContext, qmlctx: &mut QmlContext) -> Entity {
2020-07-05 21:29:44 +00:00
match self.widgets.get(&widget_type) {
Some(builder) => {
let wfn = builder.build(qml.properties, qml.children);
2020-07-06 03:45:09 +00:00
let widget = wfn(id, ctx, row, col, qmlctx);
2020-07-05 21:29:44 +00:00
return widget;
}
2020-07-05 23:23:22 +00:00
_ => {
let builder = ImportBuilder { source: widget_type };
let wfn = builder.build(qml.properties, qml.children);
2020-07-06 03:45:09 +00:00
let widget = wfn(id, ctx, row, col, qmlctx);
2020-07-05 23:23:22 +00:00
return widget;
}
2020-07-05 21:29:44 +00:00
}
return ctx.create_entity();
}
}