From 9a48b78acd7e90238c1278895a101fa797b273dc Mon Sep 17 00:00:00 2001 From: Robin Quint Date: Thu, 29 Dec 2022 14:07:26 +0100 Subject: [PATCH] Added basic cursor support --- .../examples/basic.rs | 2 ++ .../src/lib.rs | 34 ++++++++++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/imgui-winit-glow-renderer-viewports/examples/basic.rs b/imgui-winit-glow-renderer-viewports/examples/basic.rs index e8af25f..5d0f8c4 100644 --- a/imgui-winit-glow-renderer-viewports/examples/basic.rs +++ b/imgui-winit-glow-renderer-viewports/examples/basic.rs @@ -109,6 +109,8 @@ fn main() { ui.end_frame_early(); + renderer.prepare_render(&mut imgui, &window); + imgui.update_platform_windows(); renderer.update_viewports(&mut imgui, window_target, &glow).expect("Failed to update viewports"); diff --git a/imgui-winit-glow-renderer-viewports/src/lib.rs b/imgui-winit-glow-renderer-viewports/src/lib.rs index 5194431..644ac0c 100644 --- a/imgui-winit-glow-renderer-viewports/src/lib.rs +++ b/imgui-winit-glow-renderer-viewports/src/lib.rs @@ -23,7 +23,7 @@ use winit::{ dpi::{PhysicalPosition, PhysicalSize}, event::{DeviceEvent, ElementState, KeyboardInput, TouchPhase, VirtualKeyCode}, event_loop::EventLoopWindowTarget, - window::{Window, WindowBuilder}, + window::{Window, WindowBuilder, CursorIcon}, }; const VERTEX_SHADER: &str = include_str!("vertex_shader.glsl"); @@ -67,6 +67,7 @@ pub struct Renderer { font_width: u32, font_height: u32, font_pixels: Vec, + last_cursor: CursorIcon, } #[derive(Debug)] @@ -305,6 +306,7 @@ impl Renderer { font_width: font_tex.width, font_height: font_tex.height, font_pixels: font_tex.data.to_vec(), + last_cursor: CursorIcon::Default, }) } @@ -508,6 +510,36 @@ impl Renderer { Ok(()) } + fn to_winit_cursor(cursor: imgui::MouseCursor) -> winit::window::CursorIcon { + match cursor { + imgui::MouseCursor::Arrow => winit::window::CursorIcon::Default, + imgui::MouseCursor::TextInput => winit::window::CursorIcon::Text, + imgui::MouseCursor::ResizeAll => winit::window::CursorIcon::Move, + imgui::MouseCursor::ResizeNS => winit::window::CursorIcon::NsResize, + imgui::MouseCursor::ResizeEW => winit::window::CursorIcon::EwResize, + imgui::MouseCursor::ResizeNESW => winit::window::CursorIcon::NeswResize, + imgui::MouseCursor::ResizeNWSE => winit::window::CursorIcon::NwseResize, + imgui::MouseCursor::Hand => winit::window::CursorIcon::Hand, + imgui::MouseCursor::NotAllowed => winit::window::CursorIcon::NotAllowed, + } + } + + pub fn prepare_render(&mut self, imgui: &mut imgui::Context, main_window: &Window) { + if let Some(cursor) = imgui.mouse_cursor() { + let cursor = Self::to_winit_cursor(cursor); + + if self.last_cursor != cursor { + main_window.set_cursor_icon(cursor); + + for (_, (_, _, _, wnd)) in &self.extra_windows { + wnd.set_cursor_icon(cursor); + } + + self.last_cursor = cursor; + } + } + } + fn create_extra_window( &mut self, viewport: &mut imgui::Viewport,