From 98178e9d691b2db2bf957be5ea9b7a3d417256a5 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Mon, 20 Apr 2020 10:01:13 +0200 Subject: [PATCH] Show resize mouse cursor when resizing windows --- emigui/src/context.rs | 18 ++++++++++++++++++ emigui/src/lib.rs | 2 +- emigui/src/window.rs | 4 ++++ example_glium/src/main.rs | 9 ++++++++- 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/emigui/src/context.rs b/emigui/src/context.rs index 94e0ee93..9c122c8e 100644 --- a/emigui/src/context.rs +++ b/emigui/src/context.rs @@ -4,6 +4,18 @@ use parking_lot::Mutex; use crate::{layout::align_rect, *}; +#[derive(Clone, Copy)] +pub enum CursorIcon { + Default, + ResizeNorthWestSouthEast, +} + +impl Default for CursorIcon { + fn default() -> Self { + CursorIcon::Default + } +} + /// Contains the input, style and output of all GUI commands. pub struct Context { /// The default style for new regions @@ -13,6 +25,9 @@ pub struct Context { pub(crate) memory: Mutex, pub(crate) graphics: Mutex, + /// Set each frame to what the mouse cursor should look like. + pub cursor_icon: Mutex, + /// Used to debug name clashes of e.g. windows used_ids: Mutex>, } @@ -26,6 +41,7 @@ impl Clone for Context { input: self.input, memory: Mutex::new(self.memory.lock().clone()), graphics: Mutex::new(self.graphics.lock().clone()), + cursor_icon: Mutex::new(self.cursor_icon.lock().clone()), used_ids: Mutex::new(self.used_ids.lock().clone()), } } @@ -39,6 +55,7 @@ impl Context { input: Default::default(), memory: Default::default(), graphics: Default::default(), + cursor_icon: Default::default(), used_ids: Default::default(), } } @@ -59,6 +76,7 @@ impl Context { pub fn new_frame(&mut self, gui_input: GuiInput) { self.used_ids.lock().clear(); self.input = gui_input; + *self.cursor_icon.lock() = CursorIcon::Default; if !gui_input.mouse_down || gui_input.mouse_pos.is_none() { self.memory.lock().active_id = None; } diff --git a/emigui/src/lib.rs b/emigui/src/lib.rs index 2ba8580b..3ca8d878 100644 --- a/emigui/src/lib.rs +++ b/emigui/src/lib.rs @@ -28,7 +28,7 @@ mod window; pub use { crate::emigui::Emigui, color::Color, - context::Context, + context::{Context, CursorIcon}, fonts::{FontDefinitions, Fonts, TextStyle}, id::Id, layers::*, diff --git a/emigui/src/window.rs b/emigui/src/window.rs index 4a37384f..2458dab2 100644 --- a/emigui/src/window.rs +++ b/emigui/src/window.rs @@ -170,6 +170,10 @@ impl Window { state.rect = state.rect.translate(ctx.input().mouse_move); } + if corner_interact.hovered || corner_interact.active { + *ctx.cursor_icon.lock() = CursorIcon::ResizeNorthWestSouthEast; + } + let mut memory = ctx.memory.lock(); if win_interact.active || corner_interact.active { memory.move_window_to_top(id); diff --git a/example_glium/src/main.rs b/example_glium/src/main.rs index 771fd184..b6d46477 100644 --- a/example_glium/src/main.rs +++ b/example_glium/src/main.rs @@ -8,7 +8,7 @@ use { label, math::*, widgets::{Button, Label}, - Align, Emigui, Window, + Align, CursorIcon, Emigui, Window, }, emigui_glium::Painter, glium::glutin, @@ -110,5 +110,12 @@ fn main() { let mesh = emigui.paint(); painter.paint(&display, mesh, emigui.texture()); + + let cursor = *emigui.ctx.cursor_icon.lock(); + let cursor = match cursor { + CursorIcon::Default => glutin::MouseCursor::Default, + CursorIcon::ResizeNorthWestSouthEast => glutin::MouseCursor::NwseResize, + }; + display.gl_window().set_cursor(cursor); } }