diff options
author | 2022-08-18 14:39:15 +0200 | |
---|---|---|
committer | 2022-08-18 14:39:15 +0200 | |
commit | 11f5527d7645619f49b030e30485f24ac637efbd (patch) | |
tree | 489f7cfbb134b8736290f30010fe680a31c90423 | |
parent | 277b848ad8df1e8d038e33707548a45d63a601db (diff) | |
download | iced-11f5527d7645619f49b030e30485f24ac637efbd.tar.gz iced-11f5527d7645619f49b030e30485f24ac637efbd.tar.bz2 iced-11f5527d7645619f49b030e30485f24ac637efbd.zip |
Implement `SetMode` and `FetchMode` window actions
-rw-r--r-- | native/src/command/action.rs | 4 | ||||
-rw-r--r-- | native/src/window.rs | 2 | ||||
-rw-r--r-- | native/src/window/action.rs | 47 | ||||
-rw-r--r-- | native/src/window/mode.rs | 12 | ||||
-rw-r--r-- | winit/src/application.rs | 14 | ||||
-rw-r--r-- | winit/src/conversion.rs | 33 | ||||
-rw-r--r-- | winit/src/window.rs | 16 |
7 files changed, 123 insertions, 5 deletions
diff --git a/native/src/command/action.rs b/native/src/command/action.rs index 3fb02899..a6954f8f 100644 --- a/native/src/command/action.rs +++ b/native/src/command/action.rs @@ -20,7 +20,7 @@ pub enum Action<T> { Clipboard(clipboard::Action<T>), /// Run a window action. - Window(window::Action), + Window(window::Action<T>), /// Run a system action. System(system::Action<T>), @@ -46,7 +46,7 @@ impl<T> Action<T> { match self { Self::Future(future) => Action::Future(Box::pin(future.map(f))), Self::Clipboard(action) => Action::Clipboard(action.map(f)), - Self::Window(window) => Action::Window(window), + Self::Window(window) => Action::Window(window.map(f)), Self::System(system) => Action::System(system.map(f)), Self::Widget(widget) => Action::Widget(widget.map(f)), } diff --git a/native/src/window.rs b/native/src/window.rs index 62487fb9..f910b8f2 100644 --- a/native/src/window.rs +++ b/native/src/window.rs @@ -1,6 +1,8 @@ //! Build window-based GUI applications. mod action; mod event; +mod mode; pub use action::Action; pub use event::Event; +pub use mode::Mode; diff --git a/native/src/window/action.rs b/native/src/window/action.rs index 01294e83..d891c6ac 100644 --- a/native/src/window/action.rs +++ b/native/src/window/action.rs @@ -1,6 +1,10 @@ +use crate::window::Mode; + +use iced_futures::MaybeSend; +use std::fmt; + /// An operation to be performed on some window. -#[derive(Debug)] -pub enum Action { +pub enum Action<T> { /// Resize the window. Resize { /// The new logical width of the window @@ -15,4 +19,43 @@ pub enum Action { /// The new logical y location of the window y: i32, }, + /// Set the [`Mode`] of the window. + SetMode(Mode), + /// Fetch the current [`Mode`] of the window. + FetchMode(Box<dyn FnOnce(Mode) -> T + 'static>), +} + +impl<T> Action<T> { + /// Maps the output of a window [`Action`] using the provided closure. + pub fn map<A>( + self, + f: impl Fn(T) -> A + 'static + MaybeSend + Sync, + ) -> Action<A> + where + T: 'static, + { + match self { + Self::Resize { width, height } => Action::Resize { width, height }, + Self::Move { x, y } => Action::Move { x, y }, + Self::SetMode(mode) => Action::SetMode(mode), + Self::FetchMode(o) => Action::FetchMode(Box::new(move |s| f(o(s)))), + } + } +} + +impl<T> fmt::Debug for Action<T> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::Resize { width, height } => write!( + f, + "Action::Resize {{ widget: {}, height: {} }}", + width, height + ), + Self::Move { x, y } => { + write!(f, "Action::Move {{ x: {}, y: {} }}", x, y) + } + Self::SetMode(mode) => write!(f, "Action::SetMode({:?})", mode), + Self::FetchMode(_) => write!(f, "Action::FetchMode"), + } + } } diff --git a/native/src/window/mode.rs b/native/src/window/mode.rs new file mode 100644 index 00000000..fdce8e23 --- /dev/null +++ b/native/src/window/mode.rs @@ -0,0 +1,12 @@ +/// The mode of a window-based application. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Mode { + /// The application appears in its own window. + Windowed, + + /// The application takes the whole screen of its current monitor. + Fullscreen, + + /// The application is hidden + Hidden, +} diff --git a/winit/src/application.rs b/winit/src/application.rs index 23364209..ecec6043 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -640,6 +640,20 @@ pub fn run_command<A, E>( y, }); } + window::Action::SetMode(mode) => { + window.set_visible(conversion::visible(mode)); + window.set_fullscreen(conversion::fullscreen( + window.primary_monitor(), + mode, + )); + } + window::Action::FetchMode(tag) => { + let mode = conversion::mode(window.fullscreen()); + + proxy + .send_event(tag(mode)) + .expect("Send message to event loop"); + } }, command::Action::System(action) => match action { system::Action::QueryInformation(_tag) => { diff --git a/winit/src/conversion.rs b/winit/src/conversion.rs index 05c9746e..ba5b0002 100644 --- a/winit/src/conversion.rs +++ b/winit/src/conversion.rs @@ -182,6 +182,39 @@ pub fn position( } } +/// Converts a [`window::Mode`] to a [`winit`] fullscreen mode. +/// +/// [`winit`]: https://github.com/rust-windowing/winit +pub fn fullscreen( + monitor: Option<winit::monitor::MonitorHandle>, + mode: window::Mode, +) -> Option<winit::window::Fullscreen> { + match mode { + window::Mode::Windowed | window::Mode::Hidden => None, + window::Mode::Fullscreen => { + Some(winit::window::Fullscreen::Borderless(monitor)) + } + } +} + +/// Converts a [`window::Mode`] to a visibility flag. +pub fn visible(mode: window::Mode) -> bool { + match mode { + window::Mode::Windowed | window::Mode::Fullscreen => true, + window::Mode::Hidden => false, + } +} + +/// Converts a [`winit`] fullscreen mode to a [`window::Mode`]. +/// +/// [`winit`]: https://github.com/rust-windowing/winit +pub fn mode(mode: Option<winit::window::Fullscreen>) -> window::Mode { + match mode { + None => window::Mode::Windowed, + Some(_) => window::Mode::Fullscreen, + } +} + /// Converts a `MouseCursor` from [`iced_native`] to a [`winit`] cursor icon. /// /// [`winit`]: https://github.com/rust-windowing/winit diff --git a/winit/src/window.rs b/winit/src/window.rs index f3207e68..265139f7 100644 --- a/winit/src/window.rs +++ b/winit/src/window.rs @@ -2,7 +2,7 @@ use crate::command::{self, Command}; use iced_native::window; -pub use window::Event; +pub use window::{Event, Mode}; /// Resizes the window to the given logical dimensions. pub fn resize<Message>(width: u32, height: u32) -> Command<Message> { @@ -16,3 +16,17 @@ pub fn resize<Message>(width: u32, height: u32) -> Command<Message> { pub fn move_to<Message>(x: i32, y: i32) -> Command<Message> { Command::single(command::Action::Window(window::Action::Move { x, y })) } + +/// Sets the [`Mode`] of the window. +pub fn set_mode<Message>(mode: Mode) -> Command<Message> { + Command::single(command::Action::Window(window::Action::SetMode(mode))) +} + +/// Fetches the current [`Mode`] of the window. +pub fn fetch_mode<Message>( + f: impl FnOnce(Mode) -> Message + 'static, +) -> Command<Message> { + Command::single(command::Action::Window(window::Action::FetchMode( + Box::new(f), + ))) +} |