Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add a window drag resize task #2642

Merged
merged 3 commits into from
Jan 16, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions core/src/window.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ pub mod icon;
pub mod screenshot;
pub mod settings;

mod direction;
mod event;
mod id;
mod level;
Expand All @@ -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;
Expand Down
27 changes: 27 additions & 0 deletions core/src/window/direction.rs
Original file line number Diff line number Diff line change
@@ -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,
}
17 changes: 15 additions & 2 deletions runtime/src/window.rs
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -31,10 +32,17 @@ pub enum Action {
/// Move the window with the left mouse button until the button is
/// released.
///
/// Theres no guarantee that this will work unless the left mouse
/// There's no guarantee that this will work unless the left mouse
/// 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),

Expand Down Expand Up @@ -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)))
Expand Down
26 changes: 25 additions & 1 deletion winit/src/conversion.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1120,7 +1120,7 @@ pub fn native_key_code(
}
}

/// Converts some [`UserAttention`] into it's `winit` counterpart.
/// Converts some [`UserAttention`] into its `winit` counterpart.
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is technically out of scope, but I noticed this typo so I figured I'd fix it while I'm at it.

///
/// [`UserAttention`]: window::UserAttention
pub fn user_attention(
Expand All @@ -1136,6 +1136,30 @@ pub fn user_attention(
}
}

/// Converts some [`window::Direction`] into a [`winit::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.
Expand Down
7 changes: 7 additions & 0 deletions winit/src/program.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
Loading