#[cfg(all(feature="winit", feature="glium"))] #[macro_use] extern crate conrod;
#[cfg(all(feature="winit", feature="glium"))] mod support;
fn main() {
feature::main();
}
#[cfg(all(feature="winit", feature="glium"))]
mod feature {
extern crate find_folder;
extern crate image;
use conrod;
use conrod::backend::glium::glium;
use conrod::backend::glium::glium::Surface;
use support;
use std;
const WIN_W: u32 = support::WIN_W;
const WIN_H: u32 = support::WIN_H;
pub fn main() {
let mut events_loop = glium::glutin::EventsLoop::new();
let window = glium::glutin::WindowBuilder::new()
.with_title("Conrod with glium!")
.with_dimensions((WIN_W, WIN_H).into());
let context = glium::glutin::ContextBuilder::new()
.with_vsync(true)
.with_multisampling(4);
let display = glium::Display::new(window, context, &events_loop).unwrap();
let mut renderer = conrod::backend::glium::Renderer::new(&display).unwrap();
fn load_rust_logo(display: &glium::Display) -> glium::texture::Texture2d {
let assets = find_folder::Search::ParentsThenKids(3, 3).for_folder("assets").unwrap();
let path = assets.join("images/rust.png");
let rgba_image = image::open(&std::path::Path::new(&path)).unwrap().to_rgba();
let image_dimensions = rgba_image.dimensions();
let raw_image = glium::texture::RawImage2d::from_raw_rgba_reversed(&rgba_image.into_raw(), image_dimensions);
let texture = glium::texture::Texture2d::new(display, raw_image).unwrap();
texture
}
let mut image_map = conrod::image::Map::new();
let rust_logo = image_map.insert(load_rust_logo(&display));
let (event_tx, event_rx) = std::sync::mpsc::channel();
let (render_tx, render_rx) = std::sync::mpsc::channel();
let events_loop_proxy = events_loop.create_proxy();
fn run_conrod(rust_logo: conrod::image::Id,
event_rx: std::sync::mpsc::Receiver<conrod::event::Input>,
render_tx: std::sync::mpsc::Sender<conrod::render::OwnedPrimitives>,
events_loop_proxy: glium::glutin::EventsLoopProxy)
{
let mut ui = conrod::UiBuilder::new([WIN_W as f64, WIN_H as f64]).theme(support::theme()).build();
let assets = find_folder::Search::KidsThenParents(3, 5).for_folder("assets").unwrap();
let font_path = assets.join("fonts/NotoSans/NotoSans-Regular.ttf");
ui.fonts.insert_from_file(font_path).unwrap();
let mut app = support::DemoApp::new(rust_logo);
let ids = support::Ids::new(ui.widget_id_generator());
let mut needs_update = true;
'conrod: loop {
let mut events = Vec::new();
while let Ok(event) = event_rx.try_recv() {
events.push(event);
}
if events.is_empty() || !needs_update {
match event_rx.recv() {
Ok(event) => events.push(event),
Err(_) => break 'conrod,
};
}
needs_update = false;
for event in events {
ui.handle_event(event);
needs_update = true;
}
support::gui(&mut ui.set_widgets(), &ids, &mut app);
if let Some(primitives) = ui.draw_if_changed() {
if render_tx.send(primitives.owned()).is_err()
|| events_loop_proxy.wakeup().is_err() {
break 'conrod;
}
}
}
}
fn draw(display: &glium::Display,
renderer: &mut conrod::backend::glium::Renderer,
image_map: &conrod::image::Map<glium::Texture2d>,
primitives: &conrod::render::OwnedPrimitives)
{
renderer.fill(display, primitives.walk(), &image_map);
let mut target = display.draw();
target.clear_color(0.0, 0.0, 0.0, 1.0);
renderer.draw(display, &mut target, &image_map).unwrap();
target.finish().unwrap();
}
std::thread::spawn(move || run_conrod(rust_logo, event_rx, render_tx, events_loop_proxy));
let mut last_update = std::time::Instant::now();
let mut closed = false;
while !closed {
let sixteen_ms = std::time::Duration::from_millis(16);
let now = std::time::Instant::now();
let duration_since_last_update = now.duration_since(last_update);
if duration_since_last_update < sixteen_ms {
std::thread::sleep(sixteen_ms - duration_since_last_update);
}
events_loop.run_forever(|event| {
if let Some(event) = conrod::backend::winit::convert_event(event.clone(), &display) {
event_tx.send(event).unwrap();
}
match event {
glium::glutin::Event::WindowEvent { event, .. } => match event {
glium::glutin::WindowEvent::CloseRequested |
glium::glutin::WindowEvent::KeyboardInput {
input: glium::glutin::KeyboardInput {
virtual_keycode: Some(glium::glutin::VirtualKeyCode::Escape),
..
},
..
} => {
closed = true;
return glium::glutin::ControlFlow::Break;
},
glium::glutin::WindowEvent::Resized(..) => {
if let Some(primitives) = render_rx.iter().next() {
draw(&display, &mut renderer, &image_map, &primitives);
}
},
_ => {},
},
glium::glutin::Event::Awakened => return glium::glutin::ControlFlow::Break,
_ => (),
}
glium::glutin::ControlFlow::Continue
});
if let Some(primitives) = render_rx.try_iter().last() {
draw(&display, &mut renderer, &image_map, &primitives);
}
last_update = std::time::Instant::now();
}
}
}
#[cfg(not(all(feature="winit", feature="glium")))]
mod feature {
pub fn main() {
println!("This example requires the `winit` and `glium` features. \
Try running `cargo run --release --features=\"winit glium\" --example <example_name>`");
}
}