diff options
Diffstat (limited to 'native/src/window')
-rw-r--r-- | native/src/window/action.rs | 11 | ||||
-rw-r--r-- | native/src/window/icon.rs | 12 | ||||
-rw-r--r-- | native/src/window/id.rs | 28 | ||||
-rw-r--r-- | native/src/window/position.rs | 22 | ||||
-rw-r--r-- | native/src/window/settings.rs | 52 |
5 files changed, 124 insertions, 1 deletions
diff --git a/native/src/window/action.rs b/native/src/window/action.rs index ce36d129..5751bf97 100644 --- a/native/src/window/action.rs +++ b/native/src/window/action.rs @@ -1,4 +1,4 @@ -use crate::window::{Mode, UserAttention}; +use crate::window::{Mode, UserAttention, Settings}; use iced_futures::MaybeSend; use std::fmt; @@ -13,6 +13,11 @@ pub enum Action<T> { /// There’s no guarantee that this will work unless the left mouse /// button was pressed immediately before this function is called. Drag, + /// Spawns a new window with the provided [`window::Settings`]. + Spawn { + /// The settings of the [`Window`]. + settings: Settings, + }, /// Resize the window. Resize { /// The new logical width of the window @@ -90,6 +95,7 @@ impl<T> Action<T> { T: 'static, { match self { + Self::Spawn { settings } => Action::Spawn { settings }, Self::Close => Action::Close, Self::Drag => Action::Drag, Self::Resize { width, height } => Action::Resize { width, height }, @@ -117,6 +123,9 @@ impl<T> fmt::Debug for Action<T> { match self { Self::Close => write!(f, "Action::Close"), Self::Drag => write!(f, "Action::Drag"), + Self::Spawn { settings } => { + write!(f, "Action::Spawn {{ settings: {:?} }}", settings) + } Self::Resize { width, height } => write!( f, "Action::Resize {{ widget: {width}, height: {height} }}" diff --git a/native/src/window/icon.rs b/native/src/window/icon.rs new file mode 100644 index 00000000..08a6acfd --- /dev/null +++ b/native/src/window/icon.rs @@ -0,0 +1,12 @@ +//! Attach an icon to the window of your application. + +/// The icon of a window. +#[derive(Debug, Clone)] +pub struct Icon { + /// The __rgba__ color data of the window [`Icon`]. + pub rgba: Vec<u8>, + /// The width of the window [`Icon`]. + pub width: u32, + /// The height of the window [`Icon`]. + pub height: u32, +} diff --git a/native/src/window/id.rs b/native/src/window/id.rs new file mode 100644 index 00000000..fa9761f5 --- /dev/null +++ b/native/src/window/id.rs @@ -0,0 +1,28 @@ +use std::collections::hash_map::DefaultHasher; +use std::fmt::{Display, Formatter}; +use std::hash::{Hash, Hasher}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +/// The ID of the window. +/// +/// This is not necessarily the same as the window ID fetched from `winit::window::Window`. +pub struct Id(u64); + +impl Id { + /// TODO(derezzedex): maybe change `u64` to an enum `Type::{Single, Multi(u64)}` + pub const MAIN: Self = Id(0); + + /// Creates a new unique window ID. + pub fn new(id: impl Hash) -> Id { + let mut hasher = DefaultHasher::new(); + id.hash(&mut hasher); + + Id(hasher.finish()) + } +} + +impl Display for Id { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!(f, "Id({})", self.0) + } +} diff --git a/native/src/window/position.rs b/native/src/window/position.rs new file mode 100644 index 00000000..c260c29e --- /dev/null +++ b/native/src/window/position.rs @@ -0,0 +1,22 @@ +/// The position of a window in a given screen. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Position { + /// The platform-specific default position for a new window. + Default, + /// The window is completely centered on the screen. + Centered, + /// The window is positioned with specific coordinates: `(X, Y)`. + /// + /// When the decorations of the window are enabled, Windows 10 will add some + /// invisible padding to the window. This padding gets included in the + /// position. So if you have decorations enabled and want the window to be + /// at (0, 0) you would have to set the position to + /// `(PADDING_X, PADDING_Y)`. + Specific(i32, i32), +} + +impl Default for Position { + fn default() -> Self { + Self::Default + } +} diff --git a/native/src/window/settings.rs b/native/src/window/settings.rs new file mode 100644 index 00000000..67798fbe --- /dev/null +++ b/native/src/window/settings.rs @@ -0,0 +1,52 @@ +use crate::window::{Icon, Position}; + +/// The window settings of an application. +#[derive(Debug, Clone)] +pub struct Settings { + /// The initial size of the window. + pub size: (u32, u32), + + /// The initial position of the window. + pub position: Position, + + /// The minimum size of the window. + pub min_size: Option<(u32, u32)>, + + /// The maximum size of the window. + pub max_size: Option<(u32, u32)>, + + /// Whether the window should be visible or not. + pub visible: bool, + + /// Whether the window should be resizable or not. + pub resizable: bool, + + /// Whether the window should have a border, a title bar, etc. or not. + pub decorations: bool, + + /// Whether the window should be transparent. + pub transparent: bool, + + /// Whether the window will always be on top of other windows. + pub always_on_top: bool, + + /// The icon of the window. + pub icon: Option<Icon>, +} + +impl Default for Settings { + fn default() -> Settings { + Settings { + size: (1024, 768), + position: Position::default(), + min_size: None, + max_size: None, + visible: true, + resizable: true, + decorations: true, + transparent: false, + always_on_top: false, + icon: None, + } + } +} |