summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2019-10-09 05:36:49 +0200
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2019-10-09 05:36:49 +0200
commita92a0b73ed7ed935df762d06c4249894fd35b227 (patch)
treefe5f67c3b7c2cc84d29e5345e02463f0b4ef6913 /src
parent1a93f0ef4a669f37654efcf2102a9d59ada34f9e (diff)
downloadiced-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.rs122
1 files changed, 17 insertions, 105 deletions
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<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()
+ }
}