1pub mod component;
20pub mod event;
21pub mod image;
22pub mod layout;
23mod render;
24pub mod scroll;
25#[cfg(test)]
26mod state_tests;
27pub mod text;
28pub mod textbox;
29pub mod widget;
30
31pub use event::UiEvent;
32pub use layout::{hit_path, node_at, set_focus, Align, FlexDir, LayoutNode, Rect};
33pub use scroll::ScrollState;
34pub use textbox::{TextBoxEvent, TextBoxState};
35pub use widget::{
36 Action, Dock, FocusStyle, StateFlags, StateStyles, Stretch, StylePatch, Units, Widget,
37};
38
39use yog_gfx::GfxContext;
40
41pub struct UiRoot {
43 pub id: String,
44 pub root: Widget,
45 pub layout_root: LayoutNode,
46 pub needs_layout: bool,
47}
48
49impl UiRoot {
50 pub fn new(id: impl Into<String>, root: Widget) -> Self {
51 Self {
52 id: id.into(),
53 root,
54 layout_root: LayoutNode::default(),
55 needs_layout: true,
56 }
57 }
58
59 pub fn layout(&mut self, screen_w: f32, screen_h: f32) {
61 self.layout_root = layout::compute(&self.root, screen_w, screen_h);
62 self.needs_layout = false;
63 }
64
65 pub fn render(&self, ctx: &GfxContext) {
68 text::use_host_metrics(ctx);
69 image::use_host_images(ctx);
70 let d2d = ctx.draw2d();
71 render::render_node(&d2d, &self.root, &self.layout_root);
72 }
73
74 pub fn hit_test(&self, mx: f32, my: f32) -> Option<&LayoutNode> {
76 layout::hit_test(&self.layout_root, mx, my)
77 }
78
79 pub fn find_rect(&self, id: &str) -> Option<Rect> {
82 layout::find_by_id(&self.layout_root, id)
83 }
84
85 pub fn find_node(&self, id: &str) -> Option<&LayoutNode> {
88 layout::find_node(&self.layout_root, id)
89 }
90}