wgui: parser: ParseDocumentParams struct

This commit is contained in:
Aleksander
2025-08-16 20:15:51 +02:00
parent df35dba24f
commit 1f8960033c
5 changed files with 63 additions and 32 deletions

View File

@@ -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 })
} }
} }

View File

@@ -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")?;

View File

@@ -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))
} }

View File

@@ -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)?;

View File

@@ -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) {