summaryrefslogtreecommitdiffstats
path: root/src/lib.rs
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2019-10-03 01:59:16 +0200
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2019-10-03 01:59:16 +0200
commitebb8dbb065c2cb5390e35237eda122cbe9ef5f42 (patch)
tree209d6cbf86002fef980a399ebc6cbfde4e186bcf /src/lib.rs
parentfc38119be3ffccc35c90971e956e8866e8b97e85 (diff)
downloadiced-ebb8dbb065c2cb5390e35237eda122cbe9ef5f42.tar.gz
iced-ebb8dbb065c2cb5390e35237eda122cbe9ef5f42.tar.bz2
iced-ebb8dbb065c2cb5390e35237eda122cbe9ef5f42.zip
Draft UI event loop
Diffstat (limited to 'src/lib.rs')
-rw-r--r--src/lib.rs41
1 files changed, 39 insertions, 2 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 74048fd8..3a7825bc 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -15,9 +15,9 @@ pub trait UserInterface {
fn view(&mut self) -> Element<Self::Message>;
- fn run(self)
+ fn run(mut self)
where
- Self: Sized,
+ Self: 'static + Sized,
{
use winit::{
event::{Event, WindowEvent},
@@ -37,10 +37,47 @@ pub trait UserInterface {
let mut renderer =
Renderer::new(&window, size.width as u32, size.height as u32);
+ let mut cache = Some(iced_winit::Cache::default());
+ let mut events = Vec::new();
+
window.request_redraw();
event_loop.run(move |event, _, control_flow| match event {
Event::EventsCleared => {
+ // TODO: Once we remove lifetimes from widgets, we will be able
+ // to keep user interfaces alive between events.
+ //
+ // This will allow us to only rebuild when a message is handled.
+ let mut user_interface = iced_winit::UserInterface::build(
+ self.view(),
+ cache.take().unwrap(),
+ &mut renderer,
+ );
+
+ let messages = user_interface.update(events.drain(..));
+
+ if messages.is_empty() {
+ let _ = user_interface.draw(&mut renderer);
+
+ cache = Some(user_interface.into_cache());
+ } else {
+ let temp_cache = user_interface.into_cache();
+
+ for message in messages {
+ self.update(message);
+ }
+
+ let user_interface = iced_winit::UserInterface::build(
+ self.view(),
+ temp_cache,
+ &mut renderer,
+ );
+
+ let _ = user_interface.draw(&mut renderer);
+
+ cache = Some(user_interface.into_cache());
+ };
+
window.request_redraw();
}
Event::WindowEvent {