summaryrefslogtreecommitdiffstats
path: root/winit
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2019-10-10 05:50:01 +0200
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2019-10-10 05:50:01 +0200
commitab34ef45e0d9a17d6aee3eadf52b753fce73e3b6 (patch)
treeef4fd0218a8623d1c9ce1c9ce9ca473d57521aee /winit
parentfb8b50ab793bd54976bb8c5b4b890c9f97f17c54 (diff)
downloadiced-ab34ef45e0d9a17d6aee3eadf52b753fce73e3b6.tar.gz
iced-ab34ef45e0d9a17d6aee3eadf52b753fce73e3b6.tar.bz2
iced-ab34ef45e0d9a17d6aee3eadf52b753fce73e3b6.zip
Move `winit::Application` to its own module
Diffstat (limited to 'winit')
-rw-r--r--winit/src/application.rs125
-rw-r--r--winit/src/lib.rs126
2 files changed, 127 insertions, 124 deletions
diff --git a/winit/src/application.rs b/winit/src/application.rs
new file mode 100644
index 00000000..9e23cd40
--- /dev/null
+++ b/winit/src/application.rs
@@ -0,0 +1,125 @@
+use crate::renderer::Windowed;
+use crate::{Cache, Column, Element, Length, UserInterface};
+
+pub trait Application {
+ type Renderer: Windowed + iced_native::column::Renderer;
+
+ type Message;
+
+ fn update(&mut self, message: Self::Message);
+
+ fn view(&mut self) -> Element<Self::Message, Self::Renderer>;
+
+ fn run(mut self)
+ where
+ Self: 'static + Sized,
+ {
+ use winit::{
+ event::{Event, WindowEvent},
+ event_loop::{ControlFlow, EventLoop},
+ window::WindowBuilder,
+ };
+
+ let event_loop = EventLoop::new();
+
+ // TODO: Ask for window settings and configure this properly
+ let window = WindowBuilder::new()
+ .build(&event_loop)
+ .expect("Open window");
+
+ let size = window.inner_size().to_physical(window.hidpi_factor());;
+ let (width, height) = (size.width as u16, size.height as u16);
+
+ let mut renderer = Self::Renderer::new(&window);
+ let mut target = renderer.target(width, height);
+
+ let user_interface = UserInterface::build(
+ document(&mut self, width, height),
+ Cache::default(),
+ &mut renderer,
+ );
+
+ let mut primitive = user_interface.draw(&mut renderer);
+ let mut cache = Some(user_interface.into_cache());
+ let mut events = Vec::new();
+
+ window.request_redraw();
+
+ event_loop.run(move |event, _, control_flow| match event {
+ Event::EventsCleared => {
+ // TODO: We should be able to keep a user interface alive
+ // between events once we remove state references.
+ //
+ // This will allow us to rebuild it only when a message is
+ // handled.
+ let mut user_interface = UserInterface::build(
+ document(&mut self, width, height),
+ cache.take().unwrap(),
+ &mut renderer,
+ );
+
+ let messages = user_interface.update(events.drain(..));
+
+ if messages.is_empty() {
+ primitive = user_interface.draw(&mut renderer);
+
+ cache = Some(user_interface.into_cache());
+ } else {
+ // When there are messages, we are forced to rebuild twice
+ // for now :^)
+ let temp_cache = user_interface.into_cache();
+
+ for message in messages {
+ self.update(message);
+ }
+
+ let user_interface = UserInterface::build(
+ document(&mut self, width, height),
+ temp_cache,
+ &mut renderer,
+ );
+
+ primitive = user_interface.draw(&mut renderer);
+
+ cache = Some(user_interface.into_cache());
+ }
+
+ window.request_redraw();
+ }
+ Event::WindowEvent {
+ event: WindowEvent::RedrawRequested,
+ ..
+ } => {
+ renderer.draw(&mut target, &primitive);
+
+ // TODO: Handle animations!
+ // Maybe we can use `ControlFlow::WaitUntil` for this.
+ }
+ Event::WindowEvent {
+ event: WindowEvent::CloseRequested,
+ ..
+ } => {
+ *control_flow = ControlFlow::Exit;
+ }
+ _ => {
+ *control_flow = ControlFlow::Wait;
+ }
+ })
+ }
+}
+
+fn document<Application>(
+ application: &mut Application,
+ width: u16,
+ height: u16,
+) -> Element<Application::Message, Application::Renderer>
+where
+ Application: self::Application,
+ Application::Message: 'static,
+{
+ Column::new()
+ .width(Length::Units(width))
+ .height(Length::Units(height))
+ .push(application.view())
+ .into()
+}
diff --git a/winit/src/lib.rs b/winit/src/lib.rs
index 73745794..b08fcb6c 100644
--- a/winit/src/lib.rs
+++ b/winit/src/lib.rs
@@ -3,128 +3,6 @@ pub use winit;
pub mod conversion;
-pub use iced_native::renderer::Windowed;
+mod application;
-pub trait Application {
- type Renderer: iced_native::renderer::Windowed
- + iced_native::column::Renderer;
-
- type Message;
-
- fn update(&mut self, message: Self::Message);
-
- fn view(&mut self) -> Element<Self::Message, Self::Renderer>;
-
- fn run(mut self)
- where
- Self: 'static + Sized,
- {
- use winit::{
- event::{Event, WindowEvent},
- event_loop::{ControlFlow, EventLoop},
- window::WindowBuilder,
- };
-
- let event_loop = EventLoop::new();
-
- // TODO: Ask for window settings and configure this properly
- let window = WindowBuilder::new()
- .build(&event_loop)
- .expect("Open window");
-
- let size = window.inner_size().to_physical(window.hidpi_factor());;
- let (width, height) = (size.width as u16, size.height as u16);
-
- let mut renderer = Self::Renderer::new(&window);
- let mut target = renderer.target(width, height);
-
- let user_interface = UserInterface::build(
- document(&mut self, width, height),
- Cache::default(),
- &mut renderer,
- );
-
- let mut primitive = user_interface.draw(&mut renderer);
- let mut cache = Some(user_interface.into_cache());
- let mut events = Vec::new();
-
- window.request_redraw();
-
- event_loop.run(move |event, _, control_flow| match event {
- Event::EventsCleared => {
- // TODO: We should be able to keep a user interface alive
- // between events once we remove state references.
- //
- // This will allow us to rebuild it only when a message is
- // handled.
- let mut user_interface = UserInterface::build(
- document(&mut self, width, height),
- cache.take().unwrap(),
- &mut renderer,
- );
-
- let messages = user_interface.update(events.drain(..));
-
- if messages.is_empty() {
- primitive = user_interface.draw(&mut renderer);
-
- cache = Some(user_interface.into_cache());
- } else {
- // When there are messages, we are forced to rebuild twice
- // for now :^)
- let temp_cache = user_interface.into_cache();
-
- for message in messages {
- self.update(message);
- }
-
- let user_interface = UserInterface::build(
- document(&mut self, width, height),
- temp_cache,
- &mut renderer,
- );
-
- primitive = user_interface.draw(&mut renderer);
-
- cache = Some(user_interface.into_cache());
- }
-
- window.request_redraw();
- }
- Event::WindowEvent {
- event: WindowEvent::RedrawRequested,
- ..
- } => {
- renderer.draw(&mut target, &primitive);
-
- // TODO: Handle animations!
- // Maybe we can use `ControlFlow::WaitUntil` for this.
- }
- Event::WindowEvent {
- event: WindowEvent::CloseRequested,
- ..
- } => {
- *control_flow = ControlFlow::Exit;
- }
- _ => {
- *control_flow = ControlFlow::Wait;
- }
- })
- }
-}
-
-fn document<Application>(
- application: &mut Application,
- width: u16,
- height: u16,
-) -> Element<Application::Message, Application::Renderer>
-where
- Application: self::Application,
- Application::Message: 'static,
-{
- Column::new()
- .width(Length::Units(width))
- .height(Length::Units(height))
- .push(application.view())
- .into()
-}
+pub use application::Application;