libui 0.4.0

A native, cross-platform and lightweight UI toolkit.
Documentation
extern crate libui;

use libui::controls::{Area, AreaDrawParams, AreaHandler, HorizontalBox, LayoutStrategy};
use libui::draw::{Brush, FillMode, Path, SolidBrush};
use libui::prelude::*;
use std::f64::consts::PI;

struct HandleCanvas {}
impl AreaHandler for HandleCanvas {
    fn draw(&mut self, _area: &Area, draw_params: &AreaDrawParams) {
        let ctx = &draw_params.context;

        let path = Path::new(ctx, FillMode::Winding);
        path.add_rectangle(ctx, 0., 0., draw_params.area_width, draw_params.area_height);
        path.end(ctx);

        let brush = Brush::Solid(SolidBrush {
            r: 0.2,
            g: 0.6,
            b: 0.8,
            a: 1.,
        });

        draw_params.context.fill(&path, &brush);

        let path = Path::new(ctx, FillMode::Winding);
        for i in 0..100 {
            let x = i as f64 / 100.;
            let y = ((x * PI * 2.).sin() + 1.) / 2.;
            path.add_rectangle(
                ctx,
                x * draw_params.area_width,
                0.,
                draw_params.area_width / 100.,
                y * draw_params.area_height,
            );
        }
        path.end(ctx);

        let brush = Brush::Solid(SolidBrush {
            r: 0.2,
            g: 0.,
            b: 0.3,
            a: 1.,
        });

        draw_params.context.fill(&path, &brush);
    }
}

fn main() {
    let ui = UI::init().expect("Couldn't initialize UI library");
    let mut win = Window::new(&ui, "Area Canvas Example", 200, 200, WindowType::NoMenubar);

    let mut hbox = HorizontalBox::new();
    let area = Area::new(Box::new(HandleCanvas {}));
    hbox.append(area, LayoutStrategy::Stretchy);

    win.set_child(hbox);
    win.show();
    ui.main();
}