Merge pull request #161 from hecrj/feature/window-mode

Window modes
This commit is contained in:
Héctor Ramón 2020-01-16 18:34:20 +01:00 committed by GitHub
commit 11495b48ee
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 127 additions and 35 deletions

View File

@ -1,4 +1,4 @@
use crate::{Command, Element, Settings, Subscription}; use crate::{window, Command, Element, Settings, Subscription};
/// An interactive cross-platform application. /// An interactive cross-platform application.
/// ///
@ -138,6 +138,20 @@ pub trait Application: Sized {
/// [`Application`]: trait.Application.html /// [`Application`]: trait.Application.html
fn view(&mut self) -> Element<'_, Self::Message>; fn view(&mut self) -> Element<'_, Self::Message>;
/// Returns the current [`Application`] mode.
///
/// The runtime will automatically transition your application if a new mode
/// is returned.
///
/// Currently, the mode only has an effect in native platforms.
///
/// By default, an application will run in windowed mode.
///
/// [`Application`]: trait.Application.html
fn mode(&self) -> window::Mode {
window::Mode::Windowed
}
/// Runs the [`Application`]. /// Runs the [`Application`].
/// ///
/// This method will take control of the current thread and __will NOT /// This method will take control of the current thread and __will NOT
@ -183,6 +197,13 @@ where
self.0.title() self.0.title()
} }
fn mode(&self) -> iced_winit::Mode {
match self.0.mode() {
window::Mode::Windowed => iced_winit::Mode::Windowed,
window::Mode::Fullscreen => iced_winit::Mode::Fullscreen,
}
}
fn update(&mut self, message: Self::Message) -> Command<Self::Message> { fn update(&mut self, message: Self::Message) -> Command<Self::Message> {
self.0.update(message) self.0.update(message)
} }

View File

@ -189,6 +189,7 @@ mod platform;
mod sandbox; mod sandbox;
pub mod settings; pub mod settings;
pub mod window;
pub use application::Application; pub use application::Application;
pub use platform::*; pub use platform::*;

View File

@ -1,14 +1,15 @@
//! Configure your application. //! Configure your application.
use crate::window;
/// The settings of an application. /// The settings of an application.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] #[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub struct Settings { pub struct Settings {
/// The [`Window`] settings. /// The window settings.
/// ///
/// They will be ignored on the Web. /// They will be ignored on the Web.
/// ///
/// [`Window`]: struct.Window.html /// [`Window`]: struct.Window.html
pub window: Window, pub window: window::Settings,
/// The bytes of the font that will be used by default. /// The bytes of the font that will be used by default.
/// ///
@ -17,29 +18,6 @@ pub struct Settings {
pub default_font: Option<&'static [u8]>, pub default_font: Option<&'static [u8]>,
} }
/// The window settings of an application.
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Window {
/// The size of the window.
pub size: (u32, u32),
/// 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,
}
impl Default for Window {
fn default() -> Window {
Window {
size: (1024, 768),
resizable: true,
decorations: true,
}
}
}
#[cfg(not(target_arch = "wasm32"))] #[cfg(not(target_arch = "wasm32"))]
impl From<Settings> for iced_winit::Settings { impl From<Settings> for iced_winit::Settings {
fn from(settings: Settings) -> iced_winit::Settings { fn from(settings: Settings) -> iced_winit::Settings {

6
src/window.rs Normal file
View File

@ -0,0 +1,6 @@
//! Configure the window of your application in native platforms.
mod mode;
mod settings;
pub use mode::Mode;
pub use settings::Settings;

9
src/window/mode.rs Normal file
View File

@ -0,0 +1,9 @@
/// 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,
}

22
src/window/settings.rs Normal file
View File

@ -0,0 +1,22 @@
/// The window settings of an application.
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Settings {
/// The size of the window.
pub size: (u32, u32),
/// 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,
}
impl Default for Settings {
fn default() -> Settings {
Settings {
size: (1024, 768),
resizable: true,
decorations: true,
}
}
}

View File

@ -2,7 +2,7 @@ use crate::{
conversion, conversion,
input::{keyboard, mouse}, input::{keyboard, mouse},
subscription, window, Cache, Clipboard, Command, Debug, Element, Event, subscription, window, Cache, Clipboard, Command, Debug, Element, Event,
MouseCursor, Settings, Size, Subscription, UserInterface, Mode, MouseCursor, Settings, Size, Subscription, UserInterface,
}; };
/// An interactive, native cross-platform application. /// An interactive, native cross-platform application.
@ -72,6 +72,18 @@ pub trait Application: Sized {
/// [`Application`]: trait.Application.html /// [`Application`]: trait.Application.html
fn view(&mut self) -> Element<'_, Self::Message, Self::Renderer>; fn view(&mut self) -> Element<'_, Self::Message, Self::Renderer>;
/// Returns the current [`Application`] mode.
///
/// The runtime will automatically transition your application if a new mode
/// is returned.
///
/// By default, an application will run in windowed mode.
///
/// [`Application`]: trait.Application.html
fn mode(&self) -> Mode {
Mode::Windowed
}
/// Runs the [`Application`]. /// Runs the [`Application`].
/// ///
/// This method will take control of the current thread and __will NOT /// This method will take control of the current thread and __will NOT
@ -110,6 +122,7 @@ pub trait Application: Sized {
subscription_pool.update(subscription, &mut thread_pool, &proxy); subscription_pool.update(subscription, &mut thread_pool, &proxy);
let mut title = application.title(); let mut title = application.title();
let mut mode = application.mode();
let window = { let window = {
let mut window_builder = WindowBuilder::new(); let mut window_builder = WindowBuilder::new();
@ -123,7 +136,11 @@ pub trait Application: Sized {
height: f64::from(height), height: f64::from(height),
}) })
.with_resizable(settings.window.resizable) .with_resizable(settings.window.resizable)
.with_decorations(settings.window.decorations); .with_decorations(settings.window.decorations)
.with_fullscreen(conversion::fullscreen(
event_loop.primary_monitor(),
mode,
));
#[cfg(target_os = "windows")] #[cfg(target_os = "windows")]
{ {
@ -244,6 +261,18 @@ pub trait Application: Sized {
title = new_title; title = new_title;
} }
// Update window mode
let new_mode = application.mode();
if mode != new_mode {
window.set_fullscreen(conversion::fullscreen(
window.current_monitor(),
new_mode,
));
mode = new_mode;
}
let user_interface = build_user_interface( let user_interface = build_user_interface(
&mut application, &mut application,
temp_cache, temp_cache,

View File

@ -7,10 +7,25 @@ use crate::{
keyboard::{KeyCode, ModifiersState}, keyboard::{KeyCode, ModifiersState},
mouse, ButtonState, mouse, ButtonState,
}, },
MouseCursor, Mode, MouseCursor,
}; };
/// Convert a `MouseCursor` from [`iced_native`] to a [`winit`] cursor icon. /// Converts a [`Mode`] to a [`winit`] fullscreen mode.
///
/// [`Mode`]:
pub fn fullscreen(
monitor: winit::monitor::MonitorHandle,
mode: Mode,
) -> Option<winit::window::Fullscreen> {
match mode {
Mode::Windowed => None,
Mode::Fullscreen => {
Some(winit::window::Fullscreen::Borderless(monitor))
}
}
}
/// Converts a `MouseCursor` from [`iced_native`] to a [`winit`] cursor icon.
/// ///
/// [`winit`]: https://github.com/rust-windowing/winit /// [`winit`]: https://github.com/rust-windowing/winit
/// [`iced_native`]: https://github.com/hecrj/iced/tree/master/native /// [`iced_native`]: https://github.com/hecrj/iced/tree/master/native
@ -26,7 +41,7 @@ pub fn mouse_cursor(mouse_cursor: MouseCursor) -> winit::window::CursorIcon {
} }
} }
/// Convert a `MouseButton` from [`winit`] to an [`iced_native`] mouse button. /// Converts a `MouseButton` from [`winit`] to an [`iced_native`] mouse button.
/// ///
/// [`winit`]: https://github.com/rust-windowing/winit /// [`winit`]: https://github.com/rust-windowing/winit
/// [`iced_native`]: https://github.com/hecrj/iced/tree/master/native /// [`iced_native`]: https://github.com/hecrj/iced/tree/master/native
@ -39,7 +54,7 @@ pub fn mouse_button(mouse_button: winit::event::MouseButton) -> mouse::Button {
} }
} }
/// Convert an `ElementState` from [`winit`] to an [`iced_native`] button state. /// Converts an `ElementState` from [`winit`] to an [`iced_native`] button state.
/// ///
/// [`winit`]: https://github.com/rust-windowing/winit /// [`winit`]: https://github.com/rust-windowing/winit
/// [`iced_native`]: https://github.com/hecrj/iced/tree/master/native /// [`iced_native`]: https://github.com/hecrj/iced/tree/master/native
@ -50,8 +65,8 @@ pub fn button_state(element_state: winit::event::ElementState) -> ButtonState {
} }
} }
/// Convert some `ModifiersState` from [`winit`] to an [`iced_native`] modifiers /// Converts some `ModifiersState` from [`winit`] to an [`iced_native`]
/// state. /// modifiers state.
/// ///
/// [`winit`]: https://github.com/rust-windowing/winit /// [`winit`]: https://github.com/rust-windowing/winit
/// [`iced_native`]: https://github.com/hecrj/iced/tree/master/native /// [`iced_native`]: https://github.com/hecrj/iced/tree/master/native
@ -66,7 +81,7 @@ pub fn modifiers_state(
} }
} }
/// Convert a `VirtualKeyCode` from [`winit`] to an [`iced_native`] key code. /// Converts a `VirtualKeyCode` from [`winit`] to an [`iced_native`] key code.
/// ///
/// [`winit`]: https://github.com/rust-windowing/winit /// [`winit`]: https://github.com/rust-windowing/winit
/// [`iced_native`]: https://github.com/hecrj/iced/tree/master/native /// [`iced_native`]: https://github.com/hecrj/iced/tree/master/native

View File

@ -30,6 +30,7 @@ pub mod settings;
mod application; mod application;
mod clipboard; mod clipboard;
mod mode;
mod subscription; mod subscription;
// We disable debug capabilities on release builds unless the `debug` feature // We disable debug capabilities on release builds unless the `debug` feature
@ -42,6 +43,7 @@ mod debug;
mod debug; mod debug;
pub use application::Application; pub use application::Application;
pub use mode::Mode;
pub use settings::Settings; pub use settings::Settings;
use clipboard::Clipboard; use clipboard::Clipboard;

9
winit/src/mode.rs Normal file
View File

@ -0,0 +1,9 @@
/// 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,
}