egui-sfml 0.10.0

egui integration for rust-sfml
Documentation
use {
    egui::ViewportCommand,
    egui_sfml::SfEgui,
    sfml::{
        graphics::{Color, Rect, RenderTarget, RenderWindow, View},
        window::{ContextSettings, Event, Style},
    },
    std::time::Instant,
};

#[derive(Default)]
struct UiState {
    title: String,
    invisible_set_instant: Option<Instant>,
    focus_req_instant: Option<Instant>,
}

fn main() {
    let mut rw = RenderWindow::new(
        (640, 480),
        "ViewportCommand test",
        Style::DEFAULT,
        &ContextSettings::default(),
    )
    .unwrap();
    rw.set_vertical_sync_enabled(true);
    let mut sf_egui = SfEgui::new(&rw);
    let mut ui_state = UiState::default();
    let mut view = View::new().unwrap();

    while rw.is_open() {
        while let Some(ev) = rw.poll_event() {
            sf_egui.add_event(&ev);
            match ev {
                Event::Closed => rw.close(),
                Event::Resized { width, height } => {
                    view.reset(Rect::new(0., 0., width as f32, height as f32));
                    rw.set_view(&view);
                }
                _ => {}
            }
        }
        let di = sf_egui
            .run(&mut rw, |_rw, ctx| ui(ctx, &mut ui_state))
            .unwrap();
        rw.clear(Color::BLACK);
        sf_egui.draw(di, &mut rw, None);
        rw.display();
    }
}

fn ui(ctx: &egui::Context, state: &mut UiState) {
    egui::CentralPanel::default().show(ctx, |ui| {
        if ui.button("Close window (quit)").clicked() {
            ctx.send_viewport_cmd(ViewportCommand::Close);
        }
        ui.label("Window title");
        if ui.text_edit_singleline(&mut state.title).changed() {
            ctx.send_viewport_cmd(ViewportCommand::Title(state.title.clone()));
        }
        if ui.button("Hide for 2 seconds").clicked() {
            ctx.send_viewport_cmd(ViewportCommand::Visible(false));
            state.invisible_set_instant = Some(Instant::now());
        }
        if let Some(instant) = state.invisible_set_instant {
            if instant.elapsed().as_secs() >= 2 {
                ctx.send_viewport_cmd(ViewportCommand::Visible(true));
                state.invisible_set_instant = None;
            }
        }
        if ui.button("Focus in 2 seconds").clicked() {
            state.focus_req_instant = Some(Instant::now());
        }
        if let Some(instant) = state.focus_req_instant {
            if instant.elapsed().as_secs() >= 2 {
                ctx.send_viewport_cmd(ViewportCommand::Focus);
                state.focus_req_instant = None;
            }
        }
    });
}