summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/src/window.rs2
-rw-r--r--core/src/window/direction.rs27
-rw-r--r--runtime/src/window.rs15
-rw-r--r--winit/src/conversion.rs28
-rw-r--r--winit/src/program.rs7
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(