1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#![deny(rust_2018_idioms)]
use furnace::{component::RenderQueue, prelude::*};
use iui::{controls::Control, prelude::*};
#[derive(Clone)]
pub struct UiContext {
ui: UI,
}
impl UiContext {
pub fn init() -> Result<Self, iui::UIError> {
let ui = UI::init()?;
Ok(UiContext { ui })
}
}
impl RenderContext for UiContext {
type Widget = Control;
type Queue = UiQueue;
fn show(&mut self, widget: Self::Widget) {
self.ui.set_shown(widget, true)
}
fn main_loop<'a>(&'a mut self, mut f: impl FnMut(&Self) -> () + 'a) {
let mut event_loop = self.ui.event_loop();
event_loop.on_tick(&self.ui, || f(&*self));
event_loop.run_delay(&self.ui, 1000);
}
fn queue(&mut self) -> Self::Queue {
UiQueue { _opaque: () }
}
fn quit(&self) {
self.ui.quit()
}
}
impl std::ops::Deref for UiContext {
type Target = UI;
fn deref(&self) -> &Self::Target {
&self.ui
}
}
pub struct UiQueue {
_opaque: (),
}
impl RenderQueue for UiQueue {
fn execute(&self, f: Box<dyn FnOnce()>) {
f();
}
}