feat: add a window drag resize task

This commit is contained in:
tsuza 2024-10-16 18:17:10 +02:00 committed by Héctor Ramón Jiménez
parent a00f564dee
commit e3f149d932
No known key found for this signature in database
GPG key ID: 140CC052C94F138E
5 changed files with 77 additions and 2 deletions

View file

@ -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;

View file

@ -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,
}

View file

@ -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.
///
/// Theres 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)))

View file

@ -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.

View file

@ -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(