diff options
author | 2024-10-16 18:17:10 +0200 | |
---|---|---|
committer | 2025-01-16 11:17:00 +0000 | |
commit | e3f149d9323742183e239e0958bc0d85212acf0f (patch) | |
tree | b67a7184ac8eb0bb89e5410025a7d83d6985abf7 | |
parent | a00f564deed291765a35311784096193dc3988b3 (diff) | |
download | iced-e3f149d9323742183e239e0958bc0d85212acf0f.tar.gz iced-e3f149d9323742183e239e0958bc0d85212acf0f.tar.bz2 iced-e3f149d9323742183e239e0958bc0d85212acf0f.zip |
feat: add a window drag resize task
-rw-r--r-- | core/src/window.rs | 2 | ||||
-rw-r--r-- | core/src/window/direction.rs | 27 | ||||
-rw-r--r-- | runtime/src/window.rs | 15 | ||||
-rw-r--r-- | winit/src/conversion.rs | 28 | ||||
-rw-r--r-- | winit/src/program.rs | 7 |
5 files changed, 77 insertions, 2 deletions
diff --git a/core/src/window.rs b/core/src/window.rs index a3389998..d0e741d8 100644 --- a/core/src/window.rs +++ b/core/src/window.rs @@ -3,6 +3,7 @@ pub mod icon; pub mod screenshot; pub mod settings; +mod direction; mod event; mod id; mod level; @@ -11,6 +12,7 @@ mod position; mod redraw_request; mod user_attention; +pub use direction::Direction; pub use event::Event; pub use icon::Icon; pub use id::Id; diff --git a/core/src/window/direction.rs b/core/src/window/direction.rs new file mode 100644 index 00000000..b757961e --- /dev/null +++ b/core/src/window/direction.rs @@ -0,0 +1,27 @@ +/// The cardinal directions relative to the center of a window. +#[derive(Debug, Clone, Copy)] +pub enum Direction { + /// Points to the top edge of a window. + North, + + /// Points to the bottom edge of a window. + South, + + /// Points to the right edge of a window. + East, + + /// Points to the left edge of a window. + West, + + /// Points to the top-right corner of a window. + NorthEast, + + /// Points to the top-left corner of a window. + NorthWest, + + /// Points to the bottom-right corner of a window. + SouthEast, + + /// Points to the bottom-left corner of a window. + SouthWest, +} diff --git a/runtime/src/window.rs b/runtime/src/window.rs index 94ee0ae5..64395993 100644 --- a/runtime/src/window.rs +++ b/runtime/src/window.rs @@ -1,7 +1,8 @@ //! Build window-based GUI applications. use crate::core::time::Instant; use crate::core::window::{ - Event, Icon, Id, Level, Mode, Screenshot, Settings, UserAttention, + Direction, Event, Icon, Id, Level, Mode, Screenshot, Settings, + UserAttention, }; use crate::core::{Point, Size}; use crate::futures::event; @@ -35,6 +36,13 @@ pub enum Action { /// button was pressed immediately before this function is called. Drag(Id), + /// Resize the window with the left mouse button until the button is + /// released. + /// + /// There’s no guarantee that this will work unless the left mouse + /// button was pressed immediately before this function is called. + DragResize(Id, Direction), + /// Resize the window to the given logical dimensions. Resize(Id, Size), @@ -272,6 +280,11 @@ pub fn drag<T>(id: Id) -> Task<T> { task::effect(crate::Action::Window(Action::Drag(id))) } +/// Begins resizing the window while the left mouse button is held. +pub fn drag_resize<T>(id: Id, direction: Direction) -> Task<T> { + task::effect(crate::Action::Window(Action::DragResize(id, direction))) +} + /// Resizes the window to the given logical dimensions. pub fn resize<T>(id: Id, new_size: Size) -> Task<T> { task::effect(crate::Action::Window(Action::Resize(id, new_size))) diff --git a/winit/src/conversion.rs b/winit/src/conversion.rs index 01c6abc8..538ac4d2 100644 --- a/winit/src/conversion.rs +++ b/winit/src/conversion.rs @@ -1120,7 +1120,7 @@ pub fn native_key_code( } } -/// Converts some [`UserAttention`] into it's `winit` counterpart. +/// Converts some [`UserAttention`] into its `winit` counterpart. /// /// [`UserAttention`]: window::UserAttention pub fn user_attention( @@ -1136,6 +1136,32 @@ pub fn user_attention( } } +/// Converts some [`ResizeDirection`] into its `winit` counterpart. +/// +/// [`ResizeDirection`]: window::ResizeDirection +pub fn resize_direction( + resize_direction: window::Direction, +) -> winit::window::ResizeDirection { + match resize_direction { + window::Direction::North => winit::window::ResizeDirection::North, + window::Direction::South => winit::window::ResizeDirection::South, + window::Direction::East => winit::window::ResizeDirection::East, + window::Direction::West => winit::window::ResizeDirection::West, + window::Direction::NorthEast => { + winit::window::ResizeDirection::NorthEast + } + window::Direction::NorthWest => { + winit::window::ResizeDirection::NorthWest + } + window::Direction::SouthEast => { + winit::window::ResizeDirection::SouthEast + } + window::Direction::SouthWest => { + winit::window::ResizeDirection::SouthWest + } + } +} + /// Converts some [`window::Icon`] into it's `winit` counterpart. /// /// Returns `None` if there is an error during the conversion. diff --git a/winit/src/program.rs b/winit/src/program.rs index dddaf33d..5387e5e5 100644 --- a/winit/src/program.rs +++ b/winit/src/program.rs @@ -1265,6 +1265,13 @@ fn run_action<P, C>( let _ = window.raw.drag_window(); } } + window::Action::DragResize(id, direction) => { + if let Some(window) = window_manager.get_mut(id) { + let _ = window.raw.drag_resize_window( + conversion::resize_direction(direction), + ); + } + } window::Action::Resize(id, size) => { if let Some(window) = window_manager.get_mut(id) { let _ = window.raw.request_inner_size( |