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 | ".")+}
version = {digit* ~ "." ~ digit*}
import = {"import" ~ WHITE_SPACE ~ ident ~ WHITE_SPACE ~ version ~ NEWLINE*}
import = {"import" ~ WHITE_SPACE ~ ident ~ WHITE_SPACE ~ NEWLINE*}
function_code = {
!( // 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
columns: 2
Rectangle {
color: "red"
Text {
anchors.centerIn: parent
text: "Hello, World!"
}
RedRectangle {
null:null
}
Rectangle {
color: "blue"
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;
pub mod parser;
pub mod widget_builders;
use crate::parser::Value;
use crate::parser::QML;
use crate::parser::{parse_qml, Value};
use crate::widget_builders::QmlWidgetBuilder;
use evmap::{ReadHandle, WriteHandle};
@ -20,6 +20,7 @@ extern crate pest_derive;
#[derive(AsAny)]
pub struct MainViewState {
pub imports: Vec<String>,
pub qml: Vec<(String, QML)>,
pub rx: Option<Receiver<String>>,
}

View File

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

View File

@ -19,6 +19,7 @@ pub enum Value {
#[derive(Debug, Clone)]
pub struct QML {
pub imports: Vec<String>,
pub properties: HashMap<String, Value>,
pub children: Vec<(String, QML)>,
}
@ -31,6 +32,7 @@ pub fn parse_qml(path: &str) -> QML {
fn parse(qml: Pairs<Rule>) -> QML {
let mut qmldoc = QML {
imports: vec![],
properties: Default::default(),
children: vec![],
};
@ -40,7 +42,9 @@ fn parse(qml: Pairs<Rule>) -> QML {
match pair.as_rule() {
Rule::import => {
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 => {
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::Entity;
use crate::widget_builders::import::ImportBuilder;
use std::collections::HashMap;
pub mod button;
pub mod grid;
pub mod import;
pub mod rectangle;
pub mod textedit;
pub mod textfield;
@ -50,7 +52,12 @@ impl QmlWidgetBuilder {
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();
}