imgui-winit-support 0.3.0

winit support code for the imgui crate
Documentation

This crate provides a winit-based backend platform for imgui-rs.

A backend platform handles window/input device events and manages their state.

Using the library

There are five things you need to do to use this library correctly:

  1. Initialize a WinitPlatform instance
  2. Attach it to a winit Window
  3. Pass events to the platform (every frame)
  4. Call frame preparation callback (every frame)
  5. Call render preparation callback (every frame)

Complete example for winit 0.20+ (without a renderer)

# // TODO: Remove ignore when only one winit version is used
use imgui::Context;
use imgui_winit_support::{HiDpiMode, WinitPlatform};
use std::time::Instant;
use winit::event::{Event, WindowEvent};
use winit::event_loop::{ControlFlow, EventLoop};
use winit::window::{Window};

let mut event_loop = EventLoop::new();
let mut window = Window::new(&event_loop).unwrap();

let mut imgui = Context::create();
// configure imgui-rs Context if necessary

let mut platform = WinitPlatform::init(&mut imgui); // step 1
platform.attach_window(imgui.io_mut(), &window, HiDpiMode::Default); // step 2

let mut last_frame = Instant::now();
let mut run = true;
event_loop.run(move |event, _, control_flow| {
match event {
Event::NewEvents(_) => {
// other application-specific logic
last_frame = imgui.io_mut().update_delta_time(last_frame);
},
Event::MainEventsCleared => {
// other application-specific logic
platform.prepare_frame(imgui.io_mut(), &window) // step 4
.expect("Failed to prepare frame");
window.request_redraw();
}
Event::RedrawRequested(_) => {
let ui = imgui.frame();
// application-specific rendering *under the UI*

// construct the UI

platform.prepare_render(&ui, &window); // step 5
// render the UI with a renderer
let draw_data = ui.render();
// renderer.render(..., draw_data).expect("UI rendering failed");

// application-specific rendering *over the UI*
},
Event::WindowEvent { event: WindowEvent::CloseRequested, .. } => {
*control_flow = ControlFlow::Exit;
}
// other application-specific event handling
event => {
platform.handle_event(imgui.io_mut(), &window, &event); // step 3
// other application-specific event handling
}
}
})