diff options
author | 2020-01-09 04:22:27 +0100 | |
---|---|---|
committer | 2020-02-07 23:50:10 -0500 | |
commit | fbc9deb424b0bfbc1ae7c7ee89ba08fecd049b2a (patch) | |
tree | 18aa49a724ce203b8772351925392271546dfdc1 /winit/src | |
parent | 1d71f78f906dc74aa3d724dd09cb6c6225686d76 (diff) | |
download | iced-fbc9deb424b0bfbc1ae7c7ee89ba08fecd049b2a.tar.gz iced-fbc9deb424b0bfbc1ae7c7ee89ba08fecd049b2a.tar.bz2 iced-fbc9deb424b0bfbc1ae7c7ee89ba08fecd049b2a.zip |
Implement an opaque `Size` type
It immutably ties physical and logical sizes to a specific scale factor.
Diffstat (limited to 'winit/src')
-rw-r--r-- | winit/src/application.rs | 55 | ||||
-rw-r--r-- | winit/src/lib.rs | 2 | ||||
-rw-r--r-- | winit/src/size.rs | 30 |
3 files changed, 55 insertions, 32 deletions
diff --git a/winit/src/application.rs b/winit/src/application.rs index 045d5872..853cbb5e 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -158,21 +158,20 @@ pub trait Application: Sized { window_builder.build(&event_loop).expect("Open window") }; - let mut scale_factor = window.scale_factor(); - let mut size = window.inner_size().to_logical::<f64>(scale_factor); + let mut size = Size::new(window.inner_size(), window.scale_factor()); let mut resized = false; let clipboard = Clipboard::new(&window); let mut renderer = Self::Renderer::new(renderer_settings); let mut target = { - let (width, height) = to_physical(size, scale_factor); + let physical_size = size.physical(); <Self::Renderer as window::Renderer>::Target::new( &window, - width, - height, - scale_factor as f32, + physical_size.width, + physical_size.height, + size.scale_factor() as f32, &renderer, ) }; @@ -181,7 +180,7 @@ pub trait Application: Sized { &mut application, Cache::default(), &mut renderer, - size, + size.logical(), &mut debug, ); @@ -213,7 +212,7 @@ pub trait Application: Sized { &mut application, cache.take().unwrap(), &mut renderer, - size, + size.logical(), &mut debug, ); @@ -285,7 +284,7 @@ pub trait Application: Sized { &mut application, temp_cache, &mut renderer, - size, + size.logical(), &mut debug, ); @@ -305,12 +304,12 @@ pub trait Application: Sized { debug.render_started(); if resized { - let (width, height) = to_physical(size, scale_factor); + let physical_size = size.physical(); target.resize( - width, - height, - scale_factor as f32, + physical_size.width, + physical_size.height, + size.scale_factor() as f32, &renderer, ); @@ -338,11 +337,11 @@ pub trait Application: Sized { .. } => match window_event { WindowEvent::Resized(new_size) => { - size = new_size.to_logical(scale_factor); + size = Size::new(new_size, size.scale_factor()); events.push(Event::Window(window::Event::Resized { - width: size.width.round() as u32, - height: size.height.round() as u32, + width: size.logical().width.round() as u32, + height: size.logical().height.round() as u32, })); resized = true; @@ -351,7 +350,8 @@ pub trait Application: Sized { *control_flow = ControlFlow::Exit; } WindowEvent::CursorMoved { position, .. } => { - let position = position.to_logical::<f64>(scale_factor); + let position = + position.to_logical::<f64>(size.scale_factor()); events.push(Event::Mouse(mouse::Event::CursorMoved { x: position.x as f32, @@ -430,11 +430,8 @@ pub trait Application: Sized { WindowEvent::HoveredFileCancelled => { events.push(Event::Window(window::Event::FilesHoveredLeft)); } - WindowEvent::ScaleFactorChanged { - scale_factor: new_scale_factor, - .. - } => { - scale_factor = new_scale_factor; + WindowEvent::ScaleFactorChanged { scale_factor, .. } => { + size = Size::new(size.physical(), scale_factor); } _ => {} }, @@ -465,7 +462,10 @@ fn build_user_interface<'a, A: Application>( debug.layout_started(); let user_interface = UserInterface::build( view, - Size::new(size.width.round() as f32, size.height.round() as f32), + iced_native::Size::new( + size.width.round() as f32, + size.height.round() as f32, + ), cache, renderer, ); @@ -474,15 +474,6 @@ fn build_user_interface<'a, A: Application>( user_interface } -fn to_physical(size: winit::dpi::LogicalSize<f64>, dpi: f64) -> (u32, u32) { - let physical_size = size.to_physical::<f64>(dpi); - - ( - physical_size.width.round() as u32, - physical_size.height.round() as u32, - ) -} - // As defined in: http://www.unicode.org/faq/private_use.html fn is_private_use_character(c: char) -> bool { match c { diff --git a/winit/src/lib.rs b/winit/src/lib.rs index b0f235ad..225907a4 100644 --- a/winit/src/lib.rs +++ b/winit/src/lib.rs @@ -32,6 +32,7 @@ mod application; mod clipboard; mod mode; mod proxy; +mod size; // We disable debug capabilities on release builds unless the `debug` feature // is explicitly enabled. @@ -49,3 +50,4 @@ pub use settings::Settings; use debug::Debug; use proxy::Proxy; +use size::Size; diff --git a/winit/src/size.rs b/winit/src/size.rs new file mode 100644 index 00000000..7e3056d4 --- /dev/null +++ b/winit/src/size.rs @@ -0,0 +1,30 @@ +pub struct Size { + physical: winit::dpi::PhysicalSize<u32>, + logical: winit::dpi::LogicalSize<f64>, + scale_factor: f64, +} + +impl Size { + pub fn new( + physical: winit::dpi::PhysicalSize<u32>, + scale_factor: f64, + ) -> Size { + Size { + logical: physical.to_logical(scale_factor), + physical, + scale_factor, + } + } + + pub fn physical(&self) -> winit::dpi::PhysicalSize<u32> { + self.physical + } + + pub fn logical(&self) -> winit::dpi::LogicalSize<f64> { + self.logical + } + + pub fn scale_factor(&self) -> f64 { + self.scale_factor + } +} |