dagger 0.1.0

A rust UI library.
Documentation
pub mod element;
pub mod window;

use dagger_layout::{
	geometry::Geometry, Layout, SizeCalculationContext
};
use element::*;

use vek::*;

use winit::{
	dpi::PhysicalSize,
	error::EventLoopError,
	event::{
		Event,
		WindowEvent
	},
	event_loop::EventLoop,
	window::WindowBuilder as WinitWindowBuilder,
};

use glium::Surface;

#[derive(Debug)]
pub struct UI {
	pub event_loop: EventLoop<()>,
	pub windows: Vec<window::Window>,
}

impl UI {
	pub fn new() -> Self {
		Self {
			event_loop: EventLoop::new().expect("Failed to create event loop!"),
			windows: vec![],
		}
	}

	pub fn add_window_from_builder(&mut self, window_builder: WinitWindowBuilder) {
		let window = window::Window::from_builder_and_loop(window_builder, &self.event_loop);

		self.windows.push(window);
	}

	pub fn run(mut self) -> Result<(), EventLoopError> {		
		self.event_loop.run(move |event, window_target| {
			match event {
				Event::WindowEvent { window_id, event } => match event {
					WindowEvent::CloseRequested => {
						self.windows.retain(|p| p.winit_window.id() != window_id);
						if self.windows.len() == 0 {
							window_target.exit();
						}
					},
					WindowEvent::RedrawRequested => {
						let window = self.windows.iter_mut().find(|p| p.winit_window.id() == window_id).unwrap();

						let geometries = Layout::calculate(&window.elements[0], SizeCalculationContext {
							parent_size: Vec2::new(window.winit_window.inner_size().width, window.winit_window.inner_size().height).as_(),
							remaining_space: Vec2::new(window.winit_window.inner_size().width, window.winit_window.inner_size().height).as_(),
							remaining_children: Vec2::one(),
						}, Vec2::zero());
						let vertex_buffer = Geometry::create_vertex_buffer(&window.glium_display, Vec2::new(window.winit_window.inner_size().width, window.winit_window.inner_size().height).as_(), &geometries);

						let mut frame = window.glium_display.draw();
						frame.clear_color(1.0, 0.0, 1.0, 1.0);
						frame.draw(&vertex_buffer, &window.opengl_indices, &window.opengl_program, &glium::uniform!(), &Default::default()).expect("Failed to draw frame!");
						frame.finish().expect("Failed to draw frame!");
					}
					_ => {},
				},
				_ => {},
			}
		})
	}
}

impl Default for UI {
	fn default() -> Self {
		let mut res = Self::new();
		res.add_window_from_builder(
			WinitWindowBuilder::new()
				.with_title("Dagger Window")
				.with_inner_size(PhysicalSize::new(1156, 768))
		);
		res
	}
}