pub mod framework;
pub mod icons;
pub mod renderer;
pub mod signal;
pub mod theme;
pub mod tree;
pub mod widgets;
pub use framework::{DrawContext, EventContext, Widget};
pub use renderer::{QuadCommand, Renderer, TextCommand};
pub use signal::{Signal, SetSignal, IntoSignal, create_signal};
pub use theme::Theme;
pub use tree::{
build_taffy, clear_active_widgets, collect_focus_paths, dispatch_event, dispatch_scroll,
draw_widgets, handle_scrollbar_event, release_scrollbar_drag, scroll_root, sync_styles,
try_start_scrollbar_drag, update_widget_measures, widget_mut_at_path, WidgetNode,
};
pub use widgets::{Button, Checkbox, Container, Flex, Icon, Label, RadioButton, radio_group, Select, TextInput};
#[cfg(feature = "terminal")]
pub use widgets::Terminal;
pub use glyphon::Metrics;
pub use glyphon::cosmic_text::Align;
use std::sync::{Arc, Mutex};
pub struct WindowRequest {
pub title: String,
pub width: u32,
pub height: u32,
pub root: WidgetNode,
pub theme: Theme,
}
pub type WindowRequests = Arc<Mutex<Vec<WindowRequest>>>;
pub fn create_window_requests() -> WindowRequests {
Arc::new(Mutex::new(Vec::new()))
}
#[macro_export]
macro_rules! ui {
( $widget:expr => { $( $child:tt )* } ) => {
$crate::WidgetNode::new($widget, $crate::ui_items![ $( $child )* ])
};
( $widget:expr ) => {
$crate::WidgetNode::new($widget, vec![])
};
}
#[macro_export]
#[doc(hidden)]
macro_rules! ui_items {
() => { vec![] };
( $widget:expr => { $( $inner:tt )* } , $( $rest:tt )* ) => {{
let mut v = vec![ $crate::ui!( $widget => { $( $inner )* } ) ];
v.extend( $crate::ui_items![ $( $rest )* ] );
v
}};
( $widget:expr => { $( $inner:tt )* } ) => {
vec![ $crate::ui!( $widget => { $( $inner )* } ) ]
};
( $widget:expr , $( $rest:tt )* ) => {{
let mut v = vec![ $crate::ui!( $widget ) ];
v.extend( $crate::ui_items![ $( $rest )* ] );
v
}};
( $widget:expr ) => {
vec![ $crate::ui!( $widget ) ]
};
}