From a92a0b73ed7ed935df762d06c4249894fd35b227 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Wed, 9 Oct 2019 05:36:49 +0200 Subject: 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. --- src/lib.rs | 122 +++++++++---------------------------------------------------- 1 file changed, 17 insertions(+), 105 deletions(-) (limited to 'src/lib.rs') diff --git a/src/lib.rs b/src/lib.rs index 2e65ed6c..46574285 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -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; - 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( - user_interface: &mut UserInterface, - width: u16, - height: u16, -) -> Element +struct Instance(A); + +impl iced_winit::Application for Instance 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.0.view() + } } -- cgit