diff options
author | 2021-07-21 18:59:24 +0700 | |
---|---|---|
committer | 2021-07-21 18:59:24 +0700 | |
commit | 72b3bf95de3f11812b1541fe2ffea76a515aee79 (patch) | |
tree | 12e353e37b9a1313872edadd64207fe2c1e4ce9f /winit/src/conversion.rs | |
parent | 6793a7e00dc96425ae720309182ec8b03c076111 (diff) | |
download | iced-72b3bf95de3f11812b1541fe2ffea76a515aee79.tar.gz iced-72b3bf95de3f11812b1541fe2ffea76a515aee79.tar.bz2 iced-72b3bf95de3f11812b1541fe2ffea76a515aee79.zip |
Improve `window::Position` API
Diffstat (limited to '')
-rw-r--r-- | winit/src/conversion.rs | 45 |
1 files changed, 44 insertions, 1 deletions
diff --git a/winit/src/conversion.rs b/winit/src/conversion.rs index b850a805..f785fce6 100644 --- a/winit/src/conversion.rs +++ b/winit/src/conversion.rs @@ -6,7 +6,7 @@ use crate::keyboard; use crate::mouse; use crate::touch; use crate::window; -use crate::{Event, Mode, Point}; +use crate::{Event, Mode, Point, Position}; /// Converts a winit window event into an iced event. pub fn window_event( @@ -133,6 +133,49 @@ pub fn window_event( } } +/// Converts a [`Position`] to a [`winit`] logical position for a given monitor. +/// +/// [`winit`]: https://github.com/rust-windowing/winit +pub fn position( + monitor: Option<&winit::monitor::MonitorHandle>, + (width, height): (u32, u32), + position: Position, +) -> Option<winit::dpi::Position> { + match position { + Position::Default => None, + Position::Specific(x, y) => { + Some(winit::dpi::Position::Logical(winit::dpi::LogicalPosition { + x: f64::from(x), + y: f64::from(y), + })) + } + Position::Centered => { + if let Some(monitor) = monitor { + let start = monitor.position(); + + let resolution: winit::dpi::LogicalSize<f64> = + monitor.size().to_logical(monitor.scale_factor()); + + let centered: winit::dpi::PhysicalPosition<i32> = + winit::dpi::LogicalPosition { + x: (resolution.width - f64::from(width)) / 2.0, + y: (resolution.height - f64::from(height)) / 2.0, + } + .to_physical(monitor.scale_factor()); + + Some(winit::dpi::Position::Physical( + winit::dpi::PhysicalPosition { + x: start.x + centered.x, + y: start.y + centered.y, + }, + )) + } else { + None + } + } + } +} + /// Converts a [`Mode`] to a [`winit`] fullscreen mode. /// /// [`winit`]: https://github.com/rust-windowing/winit |