mod component_button; mod component_checkbox; mod component_radio_group; mod component_slider; mod style; mod widget_div; mod widget_image; mod widget_label; mod widget_rectangle; mod widget_sprite; use crate::{ assets::{AssetPath, AssetPathOwned, normalize_path}, components::{Component, ComponentWeak}, drawing::{self}, globals::WguiGlobals, i18n::Translation, layout::{Layout, LayoutParams, LayoutState, Widget, WidgetID, WidgetMap, WidgetPair}, log::LogErr, parser::{ component_button::parse_component_button, component_checkbox::{CheckboxKind, parse_component_checkbox}, component_radio_group::parse_component_radio_group, component_slider::parse_component_slider, widget_div::parse_widget_div, widget_image::parse_widget_image, widget_label::parse_widget_label, widget_rectangle::parse_widget_rectangle, widget_sprite::parse_widget_sprite, }, widget::ConstructEssentials, windowing::context_menu, }; use anyhow::Context; use glam::Vec2; 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