This commit is contained in:
Sarah Jamie Lewis 2020-07-05 16:23:22 -07:00
parent afa2eef273
commit 4ca323300f
9 changed files with 65 additions and 21 deletions

View File

@ -20,7 +20,7 @@ digit = { '0'..'9' }
ident = { (alpha | digit | ".")+} ident = { (alpha | digit | ".")+}
version = {digit* ~ "." ~ digit*} version = {digit* ~ "." ~ digit*}
import = {"import" ~ WHITE_SPACE ~ ident ~ WHITE_SPACE ~ version ~ NEWLINE*} import = {"import" ~ WHITE_SPACE ~ ident ~ WHITE_SPACE ~ NEWLINE*}
function_code = { function_code = {
!( // if the following text is not !( // if the following text is not

16
res/RedRectangle.qml Normal file
View File

@ -0,0 +1,16 @@
Grid {
rows:2
cols:2
Rectangle {
color: "blue"
}
Rectangle {
color: "red"
}
Rectangle {
color: "red"
}
Rectangle {
color: "blue"
}
}

View File

@ -2,13 +2,10 @@ Grid {
rows: 2 rows: 2
columns: 2 columns: 2
Rectangle { RedRectangle {
color: "red" null:null
Text {
anchors.centerIn: parent
text: "Hello, World!"
}
} }
Rectangle { Rectangle {
color: "blue" color: "blue"
Text { Text {

View File

@ -1,9 +0,0 @@
Rectangle {
color: "blue"
Rectangle {
color: "blue"
}
Rectangle {
color: "red"
}
}

View File

@ -6,8 +6,8 @@ use std::sync::mpsc::{Receiver, Sender};
use std::time::Duration; use std::time::Duration;
pub mod parser; pub mod parser;
pub mod widget_builders; pub mod widget_builders;
use crate::parser::Value;
use crate::parser::QML; use crate::parser::QML;
use crate::parser::{parse_qml, Value};
use crate::widget_builders::QmlWidgetBuilder; use crate::widget_builders::QmlWidgetBuilder;
use evmap::{ReadHandle, WriteHandle}; use evmap::{ReadHandle, WriteHandle};
@ -20,6 +20,7 @@ extern crate pest_derive;
#[derive(AsAny)] #[derive(AsAny)]
pub struct MainViewState { pub struct MainViewState {
pub imports: Vec<String>,
pub qml: Vec<(String, QML)>, pub qml: Vec<(String, QML)>,
pub rx: Option<Receiver<String>>, pub rx: Option<Receiver<String>>,
} }

View File

@ -6,7 +6,6 @@ use rqml::MainViewState;
fn main() { fn main() {
Application::new() Application::new()
.window(|ctx| { .window(|ctx| {
let _app_context: HashMap<String, Entity> = HashMap::new();
let qml_doc = parse_qml("./res/example.qml"); let qml_doc = parse_qml("./res/example.qml");
let top_level = qml_doc.children.clone(); let top_level = qml_doc.children.clone();
println!("{:?}", qml_doc); println!("{:?}", qml_doc);
@ -16,7 +15,14 @@ fn main() {
.position((100.0, 100.0)) .position((100.0, 100.0))
.resizeable(true) .resizeable(true)
.size(600.0, 600.0) .size(600.0, 600.0)
.child(MainViewState { qml: top_level.clone(), rx: None }.build(ctx)) .child(
MainViewState {
imports: qml_doc.imports,
qml: top_level.clone(),
rx: None,
}
.build(ctx),
)
.build(ctx); .build(ctx);
w w
}) })

View File

@ -19,6 +19,7 @@ pub enum Value {
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct QML { pub struct QML {
pub imports: Vec<String>,
pub properties: HashMap<String, Value>, pub properties: HashMap<String, Value>,
pub children: Vec<(String, QML)>, pub children: Vec<(String, QML)>,
} }
@ -31,6 +32,7 @@ pub fn parse_qml(path: &str) -> QML {
fn parse(qml: Pairs<Rule>) -> QML { fn parse(qml: Pairs<Rule>) -> QML {
let mut qmldoc = QML { let mut qmldoc = QML {
imports: vec![],
properties: Default::default(), properties: Default::default(),
children: vec![], children: vec![],
}; };
@ -40,7 +42,9 @@ fn parse(qml: Pairs<Rule>) -> QML {
match pair.as_rule() { match pair.as_rule() {
Rule::import => { Rule::import => {
let mut tokens = pair.into_inner(); let mut tokens = pair.into_inner();
println!("Found new Import {} ", tokens.next().unwrap().as_str()); let import = tokens.next().unwrap().as_str();
println!("Found new Import {} ", import);
qmldoc.imports.push(String::from(import));
} }
Rule::body => { Rule::body => {
let mut tokens = pair.into_inner(); let mut tokens = pair.into_inner();

View File

@ -0,0 +1,22 @@
use crate::parser::Value::QmlString;
use crate::parser::{parse_qml, Value, QML};
use crate::widget_builders::{parse_number, QmlWidgetBuilder, WidgetBuilder};
use orbtk::prelude::HashMap;
use orbtk::prelude::*;
use orbtk::Entity;
use std::borrow::BorrowMut;
pub struct ImportBuilder {
pub(crate) source: String,
}
impl WidgetBuilder for ImportBuilder {
fn build(&self, properties: HashMap<String, Value>, children: Vec<(String, QML)>) -> Box<dyn Fn(Entity, &mut BuildContext, usize, usize, &mut Vec<String>) -> Entity> {
let import_source = self.source.clone();
return Box::new(move |id, ctx, row, col, ids| -> Entity {
let qml_doc = parse_qml(format!("./res/{}.qml", import_source).as_str());
let top_level = qml_doc.children.clone();
QmlWidgetBuilder::new().build(id, 0, 0, top_level[0].0.clone(), top_level[0].1.clone(), ctx, ids.borrow_mut())
});
}
}

View File

@ -8,10 +8,12 @@ use crate::widget_builders::textfield::TextBuilder;
use orbtk::prelude::*; use orbtk::prelude::*;
use orbtk::Entity; use orbtk::Entity;
use crate::widget_builders::import::ImportBuilder;
use std::collections::HashMap; use std::collections::HashMap;
pub mod button; pub mod button;
pub mod grid; pub mod grid;
pub mod import;
pub mod rectangle; pub mod rectangle;
pub mod textedit; pub mod textedit;
pub mod textfield; pub mod textfield;
@ -50,7 +52,12 @@ impl QmlWidgetBuilder {
return widget; return widget;
} }
_ => {} _ => {
let builder = ImportBuilder { source: widget_type };
let wfn = builder.build(qml.properties, qml.children);
let widget = wfn(id, ctx, row, col, ids);
return widget;
}
} }
return ctx.create_entity(); return ctx.create_entity();
} }