diff options
author | 2019-10-09 05:36:49 +0200 | |
---|---|---|
committer | 2019-10-09 05:36:49 +0200 | |
commit | a92a0b73ed7ed935df762d06c4249894fd35b227 (patch) | |
tree | fe5f67c3b7c2cc84d29e5345e02463f0b4ef6913 /src | |
parent | 1a93f0ef4a669f37654efcf2102a9d59ada34f9e (diff) | |
download | iced-a92a0b73ed7ed935df762d06c4249894fd35b227.tar.gz iced-a92a0b73ed7ed935df762d06c4249894fd35b227.tar.bz2 iced-a92a0b73ed7ed935df762d06c4249894fd35b227.zip |
Move `winit` logic from `iced` to `iced_winit`
- Added new `renderer::Windowed` trait. This shoud allow users to easily
try different renderers by simply changing one line.
- Renamed `UserInterface` traits to `Application`, as the `run` method
takes total control of the current thread.
- Moved `MouseCursor` back to `iced_native`. The new
`renderer::Windowed` trait returns one on `draw`.
- Split `iced_native` renderer in multiple modules, for consistency.
Diffstat (limited to 'src')
-rw-r--r-- | src/lib.rs | 122 |
1 files changed, 17 insertions, 105 deletions
@@ -9,123 +9,35 @@ pub type Row<'a, Message> = iced_winit::Row<'a, Message, Renderer>; pub type Column<'a, Message> = iced_winit::Column<'a, Message, Renderer>; pub type Button<'a, Message> = iced_winit::Button<'a, Message, Renderer>; -pub trait UserInterface { +pub trait Application { type Message; fn update(&mut self, message: Self::Message); fn view(&mut self) -> Element<Self::Message>; - fn run(mut self) + fn run(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 = Renderer::new(&window); - let mut target = renderer.target(width, height); - - let user_interface = iced_winit::UserInterface::build( - document(&mut self, width, height), - iced_winit::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 = iced_winit::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 = iced_winit::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; - } - }) + iced_winit::Application::run(Instance(self)) } } -fn document<UserInterface>( - user_interface: &mut UserInterface, - width: u16, - height: u16, -) -> Element<UserInterface::Message> +struct Instance<A: Application>(A); + +impl<A> iced_winit::Application for Instance<A> where - UserInterface: self::UserInterface, - UserInterface::Message: 'static, + A: Application, { - Column::new() - .width(Length::Units(width)) - .height(Length::Units(height)) - .push(user_interface.view()) - .into() + type Renderer = Renderer; + type Message = A::Message; + + fn update(&mut self, message: Self::Message) { + self.0.update(message); + } + + fn view(&mut self) -> Element<Self::Message> { + self.0.view() + } } |