//! Form controls three ways: plain HTML (browser look), inside `styled`
//! (Blender look), and the capitalized Blender components.
//! `cargo run --example forms` (`--screenshot out.png` renders it headless).
use blenderui::prelude::*;
struct Forms;
fn controls() -> Div {
div().flex().flex_col().gap_2().p_3()
.child(div().flex().gap_2().items_center()
.child(button().child("Button"))
.child(input().value("Text field"))
.child(input().input_type("number").value("42")))
.child(div().flex().gap_2().items_center()
.child(label().child(input().input_type("checkbox").checked(true)).child(" Checkbox"))
.child(label().child(input().input_type("radio").checked(true)).child(" Radio"))
.child(input().input_type("range").min(0.0).max(10.0).value("6")))
.child(div().flex().gap_2().items_center()
.child(select().child(optgroup().attr("label", "Mesh").child(option().child("Cube")).child(option().child("Sphere"))))
.child(progress().attr("value", "0.6"))
.child(meter().attr("value", "0.3"))
.child(input().input_type("color").value("#4772b3")))
.child(textarea().child("A textarea"))
}
impl Render for Forms {
fn render(&mut self, _: &mut Window, _: &mut Context) -> impl IntoElement {
body().m_0().flex().flex_col()
.child(h3().child("Plain HTML (browser look)").p_3().m_0())
.child(controls())
.child(div().styled().child(h3().child("Inside styled (Blender look)").p_3().m_0()).child(controls()))
.child(div().child(h3().child("Blender components").p_3().m_0())
.child(div().flex().gap_2().p_3().items_center()
.child(Button().child("Button"))
.child(TextField().value("Text"))
.child(NumberSlider().min(0.0).max(10.0).value("6"))
.child(Checkbox().checked(true))))
}
}
fn main() {
let shot = std::env::args().skip_while(|a| a != "--screenshot").nth(1);
let app = if shot.is_some() { Application::headless() } else { Application::new() };
app.run(move |cx| {
let opts = WindowOptions {
window_bounds: Some(WindowBounds::Windowed(Bounds {
origin: point(px(0.0), px(0.0)),
size: size(px(620.0), px(620.0)),
})),
..Default::default()
};
let win = cx.open_window(opts, |_, cx| cx.new(|_| Forms)).unwrap();
if let Some(path) = &shot {
let (w, h, px) = cx.draw(win.id);
let rgba: Vec = px.iter().flat_map(|p| [(p >> 16) as u8, (p >> 8) as u8, *p as u8, 255]).collect();
let file = std::fs::File::create(path).expect("create png");
let mut enc = png::Encoder::new(std::io::BufWriter::new(file), w as u32, h as u32);
enc.set_color(png::ColorType::Rgba);
enc.set_depth(png::BitDepth::Eight);
enc.write_header().expect("png").write_image_data(&rgba).expect("png");
}
});
}