wgui: parser: ParseDocumentParams struct
This commit is contained in:
@@ -1,7 +1,10 @@
|
|||||||
use crate::{assets, testbed::Testbed};
|
use crate::{assets, testbed::Testbed};
|
||||||
use glam::Vec2;
|
use glam::Vec2;
|
||||||
use wgui::{
|
use wgui::{
|
||||||
event::EventListenerCollection, globals::WguiGlobals, layout::Layout, parser::ParserState,
|
event::EventListenerCollection,
|
||||||
|
globals::WguiGlobals,
|
||||||
|
layout::Layout,
|
||||||
|
parser::{ParseDocumentParams, ParserState},
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct TestbedAny {
|
pub struct TestbedAny {
|
||||||
@@ -20,8 +23,14 @@ impl TestbedAny {
|
|||||||
|
|
||||||
let globals = WguiGlobals::new(Box::new(assets::Asset {}))?;
|
let globals = WguiGlobals::new(Box::new(assets::Asset {}))?;
|
||||||
|
|
||||||
let (layout, state) =
|
let (layout, state) = wgui::parser::new_layout_from_assets(
|
||||||
wgui::parser::new_layout_from_assets(globals, listeners, &path, false)?;
|
listeners,
|
||||||
|
&ParseDocumentParams {
|
||||||
|
globals,
|
||||||
|
path: &path,
|
||||||
|
extra: Default::default(),
|
||||||
|
},
|
||||||
|
)?;
|
||||||
Ok(Self { layout, state })
|
Ok(Self { layout, state })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ use wgui::{
|
|||||||
globals::WguiGlobals,
|
globals::WguiGlobals,
|
||||||
i18n::Translation,
|
i18n::Translation,
|
||||||
layout::{Layout, Widget},
|
layout::{Layout, Widget},
|
||||||
parser::ParserState,
|
parser::{ParseDocumentParams, ParserState},
|
||||||
widget::label::WidgetLabel,
|
widget::label::WidgetLabel,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -58,8 +58,14 @@ impl TestbedGeneric {
|
|||||||
|
|
||||||
let globals = WguiGlobals::new(Box::new(assets::Asset {}))?;
|
let globals = WguiGlobals::new(Box::new(assets::Asset {}))?;
|
||||||
|
|
||||||
let (layout, state) =
|
let (layout, state) = wgui::parser::new_layout_from_assets(
|
||||||
wgui::parser::new_layout_from_assets(globals, listeners, XML_PATH, false)?;
|
listeners,
|
||||||
|
&ParseDocumentParams {
|
||||||
|
globals,
|
||||||
|
path: XML_PATH,
|
||||||
|
extra: Default::default(),
|
||||||
|
},
|
||||||
|
)?;
|
||||||
|
|
||||||
let label_cur_option = state.fetch_widget(&layout.state, "label_current_option")?;
|
let label_cur_option = state.fetch_widget(&layout.state, "label_current_option")?;
|
||||||
|
|
||||||
|
|||||||
@@ -105,12 +105,12 @@ impl ParserState {
|
|||||||
|
|
||||||
pub fn process_template<U1, U2>(
|
pub fn process_template<U1, U2>(
|
||||||
&mut self,
|
&mut self,
|
||||||
|
doc_params: &ParseDocumentParams,
|
||||||
template_name: &str,
|
template_name: &str,
|
||||||
layout: &mut Layout,
|
layout: &mut Layout,
|
||||||
listeners: &mut EventListenerCollection<U1, U2>,
|
listeners: &mut EventListenerCollection<U1, U2>,
|
||||||
widget_id: WidgetID,
|
widget_id: WidgetID,
|
||||||
template_parameters: HashMap<Rc<str>, Rc<str>>,
|
template_parameters: HashMap<Rc<str>, Rc<str>>,
|
||||||
dev_mode: bool,
|
|
||||||
) -> anyhow::Result<()> {
|
) -> anyhow::Result<()> {
|
||||||
let Some(template) = self.templates.get(template_name) else {
|
let Some(template) = self.templates.get(template_name) else {
|
||||||
anyhow::bail!("no template named \"{}\" found", template_name);
|
anyhow::bail!("no template named \"{}\" found", template_name);
|
||||||
@@ -125,7 +125,7 @@ impl ParserState {
|
|||||||
components: self.components.clone(), // FIXME: prevent copying
|
components: self.components.clone(), // FIXME: prevent copying
|
||||||
components_id_map: self.components_id_map.clone(), // FIXME: prevent copying
|
components_id_map: self.components_id_map.clone(), // FIXME: prevent copying
|
||||||
templates: Default::default(),
|
templates: Default::default(),
|
||||||
dev_mode,
|
doc_params,
|
||||||
};
|
};
|
||||||
|
|
||||||
let file = ParserFile {
|
let file = ParserFile {
|
||||||
@@ -157,6 +157,7 @@ struct MacroAttribs {
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct ParserContext<'a, U1, U2> {
|
struct ParserContext<'a, U1, U2> {
|
||||||
|
doc_params: &'a ParseDocumentParams<'a>,
|
||||||
layout: &'a mut Layout,
|
layout: &'a mut Layout,
|
||||||
listeners: &'a mut EventListenerCollection<U1, U2>,
|
listeners: &'a mut EventListenerCollection<U1, U2>,
|
||||||
var_map: HashMap<Rc<str>, Rc<str>>,
|
var_map: HashMap<Rc<str>, Rc<str>>,
|
||||||
@@ -165,7 +166,6 @@ struct ParserContext<'a, U1, U2> {
|
|||||||
templates: HashMap<Rc<str>, Rc<Template>>,
|
templates: HashMap<Rc<str>, Rc<Template>>,
|
||||||
components: Vec<Component>,
|
components: Vec<Component>,
|
||||||
components_id_map: HashMap<Rc<str>, ComponentWeak>,
|
components_id_map: HashMap<Rc<str>, ComponentWeak>,
|
||||||
dev_mode: bool,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parses a color from a HTML hex string
|
// Parses a color from a HTML hex string
|
||||||
@@ -641,12 +641,12 @@ fn parse_children<'a, U1, U2>(
|
|||||||
for child_node in node.children() {
|
for child_node in node.children() {
|
||||||
match node.attribute("ignore_in_mode") {
|
match node.attribute("ignore_in_mode") {
|
||||||
Some("dev") => {
|
Some("dev") => {
|
||||||
if !ctx.dev_mode {
|
if !ctx.doc_params.extra.dev_mode {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Some("live") => {
|
Some("live") => {
|
||||||
if ctx.dev_mode {
|
if ctx.doc_params.extra.dev_mode {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -689,11 +689,12 @@ fn parse_children<'a, U1, U2>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn create_default_context<'a, U1, U2>(
|
fn create_default_context<'a, U1, U2>(
|
||||||
|
doc_params: &'a ParseDocumentParams,
|
||||||
layout: &'a mut Layout,
|
layout: &'a mut Layout,
|
||||||
listeners: &'a mut EventListenerCollection<U1, U2>,
|
listeners: &'a mut EventListenerCollection<U1, U2>,
|
||||||
dev_mode: bool,
|
|
||||||
) -> ParserContext<'a, U1, U2> {
|
) -> ParserContext<'a, U1, U2> {
|
||||||
ParserContext {
|
ParserContext {
|
||||||
|
doc_params,
|
||||||
layout,
|
layout,
|
||||||
listeners,
|
listeners,
|
||||||
ids: Default::default(),
|
ids: Default::default(),
|
||||||
@@ -702,20 +703,33 @@ fn create_default_context<'a, U1, U2>(
|
|||||||
macro_attribs: Default::default(),
|
macro_attribs: Default::default(),
|
||||||
components: Default::default(),
|
components: Default::default(),
|
||||||
components_id_map: Default::default(),
|
components_id_map: Default::default(),
|
||||||
dev_mode,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub struct UnusedAttribInfo {}
|
||||||
|
|
||||||
|
#[derive(Default)]
|
||||||
|
pub struct ParseDocumentExtra {
|
||||||
|
//pub on_unused_attrib: Option<Box<dyn Fn(UnusedAttribInfo)>>,
|
||||||
|
pub dev_mode: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
// filled-in by you in `new_layout_from_assets` function
|
||||||
|
pub struct ParseDocumentParams<'a> {
|
||||||
|
pub globals: WguiGlobals, // mandatory field
|
||||||
|
pub path: &'a str, // mandatory field
|
||||||
|
pub extra: ParseDocumentExtra, // optional field, can be Default-ed
|
||||||
|
}
|
||||||
|
|
||||||
pub fn parse_from_assets<U1, U2>(
|
pub fn parse_from_assets<U1, U2>(
|
||||||
|
doc_params: &ParseDocumentParams,
|
||||||
layout: &mut Layout,
|
layout: &mut Layout,
|
||||||
listeners: &mut EventListenerCollection<U1, U2>,
|
listeners: &mut EventListenerCollection<U1, U2>,
|
||||||
parent_id: WidgetID,
|
parent_id: WidgetID,
|
||||||
path: &str,
|
|
||||||
dev_mode: bool,
|
|
||||||
) -> anyhow::Result<ParserState> {
|
) -> anyhow::Result<ParserState> {
|
||||||
let path = PathBuf::from(path);
|
let path = PathBuf::from(doc_params.path);
|
||||||
|
|
||||||
let mut ctx = create_default_context(layout, listeners, dev_mode);
|
let mut ctx = create_default_context(doc_params, layout, listeners);
|
||||||
|
|
||||||
let (file, node_layout) = get_doc_from_path(&mut ctx, &path)?;
|
let (file, node_layout) = get_doc_from_path(&mut ctx, &path)?;
|
||||||
parse_document_root(file, &mut ctx, parent_id, node_layout)?;
|
parse_document_root(file, &mut ctx, parent_id, node_layout)?;
|
||||||
@@ -737,14 +751,12 @@ pub fn parse_from_assets<U1, U2>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn new_layout_from_assets<U1, U2>(
|
pub fn new_layout_from_assets<U1, U2>(
|
||||||
globals: WguiGlobals,
|
|
||||||
listeners: &mut EventListenerCollection<U1, U2>,
|
listeners: &mut EventListenerCollection<U1, U2>,
|
||||||
path: &str,
|
doc_params: &ParseDocumentParams,
|
||||||
dev_mode: bool,
|
|
||||||
) -> anyhow::Result<(Layout, ParserState)> {
|
) -> anyhow::Result<(Layout, ParserState)> {
|
||||||
let mut layout = Layout::new(globals)?;
|
let mut layout = Layout::new(doc_params.globals.clone())?;
|
||||||
let widget = layout.root_widget;
|
let widget = layout.root_widget;
|
||||||
let state = parse_from_assets(&mut layout, listeners, widget, path, dev_mode)?;
|
let state = parse_from_assets(doc_params, &mut layout, listeners, widget)?;
|
||||||
Ok((layout, state))
|
Ok((layout, state))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -44,10 +44,12 @@ impl<S> GuiPanel<S> {
|
|||||||
let mut listeners = EventListenerCollection::<AppState, S>::default();
|
let mut listeners = EventListenerCollection::<AppState, S>::default();
|
||||||
|
|
||||||
let (layout, parser_state) = wgui::parser::new_layout_from_assets(
|
let (layout, parser_state) = wgui::parser::new_layout_from_assets(
|
||||||
app.wgui_globals.clone(),
|
|
||||||
&mut listeners,
|
&mut listeners,
|
||||||
path,
|
&wgui::parser::ParseDocumentParams {
|
||||||
false,
|
globals: app.wgui_globals.clone(),
|
||||||
|
path,
|
||||||
|
extra: Default::default(),
|
||||||
|
},
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
let context = WguiContext::new(&mut app.wgui_shared, 1.0)?;
|
let context = WguiContext::new(&mut app.wgui_shared, 1.0)?;
|
||||||
|
|||||||
@@ -75,12 +75,14 @@ where
|
|||||||
keymap = None;
|
keymap = None;
|
||||||
}
|
}
|
||||||
|
|
||||||
let (_, mut gui_state_key) = wgui::parser::new_layout_from_assets(
|
let parse_doc_params = wgui::parser::ParseDocumentParams {
|
||||||
app.wgui_globals.clone(),
|
globals: app.wgui_globals.clone(),
|
||||||
&mut panel.listeners,
|
path: "gui/keyboard.xml",
|
||||||
"gui/keyboard.xml",
|
extra: Default::default(),
|
||||||
false,
|
};
|
||||||
)?;
|
|
||||||
|
let (_, mut gui_state_key) =
|
||||||
|
wgui::parser::new_layout_from_assets(&mut panel.listeners, &parse_doc_params)?;
|
||||||
|
|
||||||
for row in 0..layout.key_sizes.len() {
|
for row in 0..layout.key_sizes.len() {
|
||||||
let (div, _) = panel.layout.add_child(
|
let (div, _) = panel.layout.add_child(
|
||||||
@@ -159,12 +161,12 @@ where
|
|||||||
|
|
||||||
let template_key = format!("Key{:?}", key.cap_type);
|
let template_key = format!("Key{:?}", key.cap_type);
|
||||||
gui_state_key.process_template(
|
gui_state_key.process_template(
|
||||||
|
&parse_doc_params,
|
||||||
&template_key,
|
&template_key,
|
||||||
&mut panel.layout,
|
&mut panel.layout,
|
||||||
&mut panel.listeners,
|
&mut panel.listeners,
|
||||||
div,
|
div,
|
||||||
params,
|
params,
|
||||||
false,
|
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
if let Some(widget_id) = gui_state_key.ids.get(&*my_id) {
|
if let Some(widget_id) = gui_state_key.ids.get(&*my_id) {
|
||||||
|
|||||||
Reference in New Issue
Block a user