From 097891e311fae1d8354eb092a0fd0171e630d78c Mon Sep 17 00:00:00 2001 From: thewoz Date: Wed, 12 Apr 2023 09:32:46 +0200 Subject: [PATCH] Merge pull request #23394 from thewoz:Cocoa-Scroll-Wheel Add scrollWheel to Cocoa #23394 ### Pull Request Readiness Checklist See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request - [x] I agree to contribute to the project under Apache 2 License. - [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV - [ ] The PR is proposed to the proper branch - [ ] There is a reference to the original bug report and related work - [ ] There is accuracy test, performance test and test data in opencv_extra repository, if applicable Patch to opencv_extra has the same branch name. - [ ] The feature is well documented and sample code can be built with the project CMake --- modules/highgui/include/opencv2/highgui.hpp | 2 +- modules/highgui/src/window_cocoa.mm | 23 +++++++++++++++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/modules/highgui/include/opencv2/highgui.hpp b/modules/highgui/include/opencv2/highgui.hpp index 32f6dfb25d7e..71c0cf6e85bb 100644 --- a/modules/highgui/include/opencv2/highgui.hpp +++ b/modules/highgui/include/opencv2/highgui.hpp @@ -504,7 +504,7 @@ left scrolling, respectively. @note -Mouse-wheel events are currently supported only on Windows. +Mouse-wheel events are currently supported only on Windows and Cocoa @param flags The mouse callback flags parameter. */ diff --git a/modules/highgui/src/window_cocoa.mm b/modules/highgui/src/window_cocoa.mm index 3f44deb1f179..762d57943821 100644 --- a/modules/highgui/src/window_cocoa.mm +++ b/modules/highgui/src/window_cocoa.mm @@ -899,8 +899,22 @@ - (void)cvSendMouseEvent:(NSEvent *)event type:(int)type flags:(int)flags { mp.y *= (imageSize.height / std::max(viewSize.height, 1.)); mp.x *= (imageSize.width / std::max(viewSize.width, 1.)); - if( mp.x >= 0 && mp.y >= 0 && mp.x < imageSize.width && mp.y < imageSize.height ) - mouseCallback(type, mp.x, mp.y, flags, mouseParam); + if( [event type] == NSEventTypeScrollWheel ) { + if( event.hasPreciseScrollingDeltas ) { + mp.x = int(event.scrollingDeltaX); + mp.y = int(event.scrollingDeltaY); + } else { + mp.x = int(event.scrollingDeltaX / 0.100006); + mp.y = int(event.scrollingDeltaY / 0.100006); + } + if( mp.x && !mp.y && CV_EVENT_MOUSEWHEEL == type ) { + type = CV_EVENT_MOUSEHWHEEL; + } + mouseCallback(type, mp.x, mp.y, flags, mouseParam); + } else if( mp.x >= 0 && mp.y >= 0 && mp.x < imageSize.width && mp.y < imageSize.height ) { + mouseCallback(type, mp.x, mp.y, flags, mouseParam); + } + } - (void)cvMouseEvent:(NSEvent *)event { @@ -923,6 +937,11 @@ - (void)cvMouseEvent:(NSEvent *)event { if([event type] == NSLeftMouseDragged) {[self cvSendMouseEvent:event type:CV_EVENT_MOUSEMOVE flags:flags | CV_EVENT_FLAG_LBUTTON];} if([event type] == NSRightMouseDragged) {[self cvSendMouseEvent:event type:CV_EVENT_MOUSEMOVE flags:flags | CV_EVENT_FLAG_RBUTTON];} if([event type] == NSOtherMouseDragged) {[self cvSendMouseEvent:event type:CV_EVENT_MOUSEMOVE flags:flags | CV_EVENT_FLAG_MBUTTON];} + if([event type] == NSEventTypeScrollWheel) {[self cvSendMouseEvent:event type:CV_EVENT_MOUSEWHEEL flags:flags ];} +} + +-(void)scrollWheel:(NSEvent *)theEvent { + [self cvMouseEvent:theEvent]; } - (void)keyDown:(NSEvent *)theEvent { //cout << "keyDown" << endl;