mod component_button; mod component_checkbox; mod component_slider; mod style; mod widget_div; mod widget_label; mod widget_rectangle; mod widget_sprite; use crate::{ assets::{AssetPath, AssetPathOwned, normalize_path}, components::{Component, ComponentWeak}, drawing::{self}, globals::WguiGlobals, layout::{Layout, LayoutParams, LayoutState, Widget, WidgetID, WidgetMap, WidgetPair}, parser::{ component_button::parse_component_button, component_checkbox::parse_component_checkbox, component_slider::parse_component_slider, widget_div::parse_widget_div, widget_label::parse_widget_label, widget_rectangle::parse_widget_rectangle, widget_sprite::parse_widget_sprite, }, widget::ConstructEssentials, }; use ouroboros::self_referencing; use smallvec::SmallVec; use std::{cell::RefMut, collections::HashMap, path::Path, rc::Rc}; #[self_referencing] struct XmlDocument { xml: String, #[borrows(xml)] #[covariant] doc: roxmltree::Document<'this>, } pub struct Template { node_document: Rc, node: roxmltree::NodeId, // belongs to node_document which could be included in another file } struct ParserFile { path: AssetPathOwned, document: Rc, template_parameters: HashMap, Rc>, } /* `components` could contain connected listener handles. Do not drop them unless you don't need to handle any events, including mouse-hover animations. */ #[derive(Default, Clone)] pub struct ParserData { pub components_by_id: HashMap, ComponentWeak>, pub components_by_widget_id: HashMap, pub components: Vec, pub ids: HashMap, WidgetID>, pub templates: HashMap, Rc