Skip to content

Commit

Permalink
Merge pull request #2642 from tsuza/master
Browse files Browse the repository at this point in the history
feat: add a window drag resize task
  • Loading branch information
hecrj authored Jan 16, 2025
2 parents a00f564 + 8a45390 commit 24297c5
Show file tree
Hide file tree
Showing 5 changed files with 76 additions and 3 deletions.
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.
///
/// [`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

0 comments on commit 24297c5

Please sign in to comment.