Introduce window::Level enum

... and add `level` field to `window::Settings`
This commit is contained in:
Héctor Ramón Jiménez 2023-05-25 23:14:07 +02:00
parent b924e86630
commit a7fa7e4005
No known key found for this signature in database
GPG key ID: 140CC052C94F138E
5 changed files with 46 additions and 16 deletions

View file

@ -2,12 +2,14 @@
pub mod icon; pub mod icon;
mod event; mod event;
mod level;
mod mode; mod mode;
mod redraw_request; mod redraw_request;
mod user_attention; mod user_attention;
pub use event::Event; pub use event::Event;
pub use icon::Icon; pub use icon::Icon;
pub use level::Level;
pub use mode::Mode; pub use mode::Mode;
pub use redraw_request::RedrawRequest; pub use redraw_request::RedrawRequest;
pub use user_attention::UserAttention; pub use user_attention::UserAttention;

19
core/src/window/level.rs Normal file
View file

@ -0,0 +1,19 @@
/// A window level groups windows with respect to their z-position.
///
/// The relative ordering between windows in different window levels is fixed.
/// The z-order of a window within the same window level may change dynamically
/// on user interaction.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum Level {
/// The default behavior.
#[default]
Normal,
/// The window will always be below normal windows.
///
/// This is useful for a widget-based app.
AlwaysOnBottom,
/// The window will always be on top of normal windows.
AlwaysOnTop,
}

View file

@ -1,4 +1,4 @@
use crate::window::{Icon, Position}; use crate::window::{Icon, Level, Position};
pub use iced_winit::settings::PlatformSpecific; pub use iced_winit::settings::PlatformSpecific;
@ -29,8 +29,8 @@ pub struct Settings {
/// Whether the window should be transparent. /// Whether the window should be transparent.
pub transparent: bool, pub transparent: bool,
/// Whether the window will always be on top of other windows. /// The window [`Level`].
pub always_on_top: bool, pub level: Level,
/// The icon of the window. /// The icon of the window.
pub icon: Option<Icon>, pub icon: Option<Icon>,
@ -50,7 +50,7 @@ impl Default for Settings {
resizable: true, resizable: true,
decorations: true, decorations: true,
transparent: false, transparent: false,
always_on_top: false, level: Level::default(),
icon: None, icon: None,
platform_specific: Default::default(), platform_specific: Default::default(),
} }
@ -68,7 +68,7 @@ impl From<Settings> for iced_winit::settings::Window {
resizable: settings.resizable, resizable: settings.resizable,
decorations: settings.decorations, decorations: settings.decorations,
transparent: settings.transparent, transparent: settings.transparent,
always_on_top: settings.always_on_top, level: settings.level,
icon: settings.icon.map(Icon::into), icon: settings.icon.map(Icon::into),
platform_specific: settings.platform_specific, platform_specific: settings.platform_specific,
} }

View file

@ -140,6 +140,19 @@ pub fn window_event(
} }
} }
/// Converts a [`window::Level`] to a [`winit`] window level.
///
/// [`winit`]: https://github.com/rust-windowing/winit
pub fn window_level(level: window::Level) -> winit::window::WindowLevel {
match level {
window::Level::Normal => winit::window::WindowLevel::Normal,
window::Level::AlwaysOnBottom => {
winit::window::WindowLevel::AlwaysOnBottom
}
window::Level::AlwaysOnTop => winit::window::WindowLevel::AlwaysOnTop,
}
}
/// Converts a [`Position`] to a [`winit`] logical position for a given monitor. /// Converts a [`Position`] to a [`winit`] logical position for a given monitor.
/// ///
/// [`winit`]: https://github.com/rust-windowing/winit /// [`winit`]: https://github.com/rust-windowing/winit

View file

@ -22,11 +22,11 @@ mod platform;
pub use platform::PlatformSpecific; pub use platform::PlatformSpecific;
use crate::conversion; use crate::conversion;
use crate::core::window::Icon; use crate::core::window::{Icon, Level};
use crate::Position; use crate::Position;
use winit::monitor::MonitorHandle; use winit::monitor::MonitorHandle;
use winit::window::{WindowBuilder, WindowLevel}; use winit::window::WindowBuilder;
use std::fmt; use std::fmt;
@ -81,8 +81,8 @@ pub struct Window {
/// Whether the window should be transparent. /// Whether the window should be transparent.
pub transparent: bool, pub transparent: bool,
/// Whether the window will always be on top of other windows. /// The window [`Level`].
pub always_on_top: bool, pub level: Level,
/// The window icon, which is also usually used in the taskbar /// The window icon, which is also usually used in the taskbar
pub icon: Option<Icon>, pub icon: Option<Icon>,
@ -102,7 +102,7 @@ impl fmt::Debug for Window {
.field("resizable", &self.resizable) .field("resizable", &self.resizable)
.field("decorations", &self.decorations) .field("decorations", &self.decorations)
.field("transparent", &self.transparent) .field("transparent", &self.transparent)
.field("always_on_top", &self.always_on_top) .field("level", &self.level)
.field("icon", &self.icon.is_some()) .field("icon", &self.icon.is_some())
.field("platform_specific", &self.platform_specific) .field("platform_specific", &self.platform_specific)
.finish() .finish()
@ -121,10 +121,6 @@ impl Window {
let (width, height) = self.size; let (width, height) = self.size;
let window_level = match self.always_on_top {
true => WindowLevel::AlwaysOnTop,
false => WindowLevel::Normal,
};
window_builder = window_builder window_builder = window_builder
.with_title(title) .with_title(title)
.with_inner_size(winit::dpi::LogicalSize { width, height }) .with_inner_size(winit::dpi::LogicalSize { width, height })
@ -132,7 +128,7 @@ impl Window {
.with_decorations(self.decorations) .with_decorations(self.decorations)
.with_transparent(self.transparent) .with_transparent(self.transparent)
.with_window_icon(self.icon.and_then(conversion::icon)) .with_window_icon(self.icon.and_then(conversion::icon))
.with_window_level(window_level) .with_window_level(conversion::window_level(self.level))
.with_visible(self.visible); .with_visible(self.visible);
if let Some(position) = conversion::position( if let Some(position) = conversion::position(
@ -211,7 +207,7 @@ impl Default for Window {
resizable: true, resizable: true,
decorations: true, decorations: true,
transparent: false, transparent: false,
always_on_top: false, level: Level::default(),
icon: None, icon: None,
platform_specific: Default::default(), platform_specific: Default::default(),
} }