From b0209ad7f742ecc22de2944cd12c2c9fed036f2f Mon Sep 17 00:00:00 2001 From: Aman Verma Date: Mon, 19 Oct 2015 08:44:06 +0000 Subject: [PATCH] Fix for #5495 : add setTrackbarMin --- modules/highgui/include/opencv2/highgui.hpp | 15 +++++++ .../include/opencv2/highgui/highgui_c.h | 1 + modules/highgui/src/window.cpp | 10 +++++ modules/highgui/src/window_QT.cpp | 17 ++++++++ modules/highgui/src/window_cocoa.mm | 35 +++++++++++++++- modules/highgui/src/window_gtk.cpp | 40 ++++++++++++++++++- modules/highgui/src/window_w32.cpp | 34 +++++++++++++++- modules/highgui/src/window_winrt.cpp | 16 ++++++++ modules/highgui/src/window_winrt_bridge.cpp | 20 +++++++++- modules/highgui/src/window_winrt_bridge.hpp | 2 + 10 files changed, 184 insertions(+), 6 deletions(-) diff --git a/modules/highgui/include/opencv2/highgui.hpp b/modules/highgui/include/opencv2/highgui.hpp index 0060595664..41bd8aff88 100644 --- a/modules/highgui/include/opencv2/highgui.hpp +++ b/modules/highgui/include/opencv2/highgui.hpp @@ -526,6 +526,21 @@ panel. */ CV_EXPORTS_W void setTrackbarMax(const String& trackbarname, const String& winname, int maxval); +/** @brief Sets the trackbar minimum position. + +The function sets the minimum position of the specified trackbar in the specified window. + +@note + +[__Qt Backend Only__] winname can be empty (or NULL) if the trackbar is attached to the control +panel. + +@param trackbarname Name of the trackbar. +@param winname Name of the window that is the parent of trackbar. +@param minval New maximum position. + */ +CV_EXPORTS_W void setTrackbarMin(const String& trackbarname, const String& winname, int minval); + //! @addtogroup highgui_opengl OpenGL support //! @{ diff --git a/modules/highgui/include/opencv2/highgui/highgui_c.h b/modules/highgui/include/opencv2/highgui/highgui_c.h index 46d4c95492..47fdb84a4e 100644 --- a/modules/highgui/include/opencv2/highgui/highgui_c.h +++ b/modules/highgui/include/opencv2/highgui/highgui_c.h @@ -166,6 +166,7 @@ CVAPI(int) cvCreateTrackbar2( const char* trackbar_name, const char* window_name CVAPI(int) cvGetTrackbarPos( const char* trackbar_name, const char* window_name ); CVAPI(void) cvSetTrackbarPos( const char* trackbar_name, const char* window_name, int pos ); CVAPI(void) cvSetTrackbarMax(const char* trackbar_name, const char* window_name, int maxval); +CVAPI(void) cvSetTrackbarMin(const char* trackbar_name, const char* window_name, int minval); enum { diff --git a/modules/highgui/src/window.cpp b/modules/highgui/src/window.cpp index 03d446dd01..c879c41305 100644 --- a/modules/highgui/src/window.cpp +++ b/modules/highgui/src/window.cpp @@ -216,6 +216,11 @@ void cv::setTrackbarMax(const String& trackbarName, const String& winName, int m cvSetTrackbarMax(trackbarName.c_str(), winName.c_str(), maxval); } +void cv::setTrackbarMin(const String& trackbarName, const String& winName, int minval) +{ + cvSetTrackbarMin(trackbarName.c_str(), winName.c_str(), minval); +} + int cv::getTrackbarPos( const String& trackbarName, const String& winName ) { return cvGetTrackbarPos(trackbarName.c_str(), winName.c_str()); @@ -589,6 +594,11 @@ CV_IMPL void cvSetTrackbarMax(const char*, const char*, int) CV_NO_GUI_ERROR( "cvSetTrackbarMax" ); } +CV_IMPL void cvSetTrackbarMin(const char*, const char*, int) +{ + CV_NO_GUI_ERROR( "cvSetTrackbarMin" ); +} + CV_IMPL void* cvGetWindowHandle( const char* ) { CV_NO_GUI_ERROR( "cvGetWindowHandle" ); diff --git a/modules/highgui/src/window_QT.cpp b/modules/highgui/src/window_QT.cpp index a01dcd3429..9d9877815e 100644 --- a/modules/highgui/src/window_QT.cpp +++ b/modules/highgui/src/window_QT.cpp @@ -664,12 +664,29 @@ CV_IMPL void cvSetTrackbarMax(const char* name_bar, const char* window_name, int QPointer t = icvFindTrackBarByName(name_bar, window_name); if (t) { + int minval = t->slider->getMinimum(); + maxval = (maxval>minval)?maxval:minval; t->slider->setMaximum(maxval); } } } +CV_IMPL void cvSetTrackbarMin(const char* name_bar, const char* window_name, int minval) +{ + if (minval >= 0) + { + QPointer t = icvFindTrackBarByName(name_bar, window_name); + if (t) + { + int maxval = t->slider->getMaximum(); + minval = (maxvalslider->setMinimum(minval); + } + } +} + + /* assign callback for mouse events */ CV_IMPL void cvSetMouseCallback(const char* window_name, CvMouseCallback on_mouse, void* param) { diff --git a/modules/highgui/src/window_cocoa.mm b/modules/highgui/src/window_cocoa.mm index 56baded392..f8c48fc4cc 100644 --- a/modules/highgui/src/window_cocoa.mm +++ b/modules/highgui/src/window_cocoa.mm @@ -62,6 +62,7 @@ CV_IMPL void cvSetMouseCallback( const char* name, CvMouseCallback function, voi CV_IMPL int cvGetTrackbarPos( const char* trackbar_name, const char* window_name ) {return 0;} CV_IMPL void cvSetTrackbarPos(const char* trackbar_name, const char* window_name, int pos) {} CV_IMPL void cvSetTrackbarMax(const char* trackbar_name, const char* window_name, int maxval) {} +CV_IMPL void cvSetTrackbarMin(const char* trackbar_name, const char* window_name, int minval) {} CV_IMPL void* cvGetWindowHandle( const char* name ) {return NULL;} CV_IMPL const char* cvGetWindowName( void* window_handle ) {return NULL;} CV_IMPL int cvNamedWindow( const char* name, int flags ) {return 0; } @@ -426,7 +427,7 @@ CV_IMPL void cvSetTrackbarPos(const char* trackbar_name, const char* window_name CV_IMPL void cvSetTrackbarMax(const char* trackbar_name, const char* window_name, int maxval) { - CV_FUNCNAME("cvSetTrackbarPos"); + CV_FUNCNAME("cvSetTrackbarMax"); CVWindow *window = nil; CVSlider *slider = nil; @@ -454,7 +455,37 @@ CV_IMPL void cvSetTrackbarMax(const char* trackbar_name, const char* window_name __END__; } -CV_IMPL void* cvGetWindowHandle( const char* name ) +CV_IMPL void cvSetTrackbarMin(const char* trackbar_name, const char* window_name, int minval) +{ + CV_FUNCNAME("cvSetTrackbarMin"); + + CVWindow *window = nil; + CVSlider *slider = nil; + NSAutoreleasePool* localpool5 = nil; + + __BEGIN__; + //cout << "cvSetTrackbarPos" << endl; + if(trackbar_name == NULL || window_name == NULL) + CV_ERROR( CV_StsNullPtr, "NULL trackbar or window name" ); + + if (localpool5 != nil) [localpool5 drain]; + localpool5 = [[NSAutoreleasePool alloc] init]; + + window = cvGetWindow(window_name); + if(window) { + slider = [[window sliders] valueForKey:[NSString stringWithFormat:@"%s", trackbar_name]]; + if(slider) { + if(minval >= 0) { + [[slider slider] setMinValue:minval]; + } + } + } + [localpool5 drain]; + + __END__; +} + +CV_IMPL void* cvGetWindowHandle( const char* name )k { //cout << "cvGetWindowHandle" << endl; return cvGetWindow(name); diff --git a/modules/highgui/src/window_gtk.cpp b/modules/highgui/src/window_gtk.cpp index deae665ffb..c722165102 100644 --- a/modules/highgui/src/window_gtk.cpp +++ b/modules/highgui/src/window_gtk.cpp @@ -508,6 +508,7 @@ typedef struct CvTrackbar int* data; int pos; int maxval; + int minval; CvTrackbarCallback notify; CvTrackbarCallback2 notify2; void* userdata; @@ -1607,7 +1608,7 @@ CV_IMPL void cvSetTrackbarMax(const char* trackbar_name, const char* window_name trackbar = icvFindTrackbarByName(window, trackbar_name); if (trackbar) { - trackbar->maxval = maxval; + trackbar->maxval = (trackbar->minval>maxval)?trackbar->minval:maxval; CV_LOCK_MUTEX(); @@ -1622,6 +1623,43 @@ CV_IMPL void cvSetTrackbarMax(const char* trackbar_name, const char* window_name } +CV_IMPL void cvSetTrackbarMin(const char* trackbar_name, const char* window_name, int minval) +{ + CV_FUNCNAME("cvSetTrackbarMin"); + + __BEGIN__; + + if (minval >= 0) + { + CvWindow* window = 0; + CvTrackbar* trackbar = 0; + + if (trackbar_name == 0 || window_name == 0) + { + CV_ERROR( CV_StsNullPtr, "NULL trackbar or window name"); + } + + window = icvFindWindowByName( window_name ); + if (window) + { + trackbar = icvFindTrackbarByName(window, trackbar_name); + if (trackbar) + { + trackbar->minval = (minvalmaxval)?minval:trackbar->maxval; + + CV_LOCK_MUTEX(); + + gtk_range_set_range(GTK_RANGE(trackbar->widget), minval, trackbar->maxval); + + CV_UNLOCK_MUTEX(); + } + } + } + + __END__; +} + + CV_IMPL void* cvGetWindowHandle( const char* window_name ) { void* widget = 0; diff --git a/modules/highgui/src/window_w32.cpp b/modules/highgui/src/window_w32.cpp index 988aedaf63..395c46dcf7 100644 --- a/modules/highgui/src/window_w32.cpp +++ b/modules/highgui/src/window_w32.cpp @@ -2325,7 +2325,7 @@ CV_IMPL void cvSetTrackbarMax(const char* trackbar_name, const char* window_name if (trackbar) { // The position will be min(pos, maxval). - trackbar->maxval = maxval; + trackbar->maxval = (trackbar->minval>maxval)?trackbar->minval:maxval; SendMessage(trackbar->hwnd, TBM_SETRANGEMAX, (WPARAM)TRUE, (LPARAM)maxval); } } @@ -2335,6 +2335,38 @@ CV_IMPL void cvSetTrackbarMax(const char* trackbar_name, const char* window_name } +CV_IMPL void cvSetTrackbarMin(const char* trackbar_name, const char* window_name, int minval) +{ + CV_FUNCNAME( "cvSetTrackbarMin" ); + + __BEGIN__; + + if (maxval >= 0) + { + CvWindow* window = 0; + CvTrackbar* trackbar = 0; + if (trackbar_name == 0 || window_name == 0) + { + CV_ERROR(CV_StsNullPtr, "NULL trackbar or window name"); + } + + window = icvFindWindowByName(window_name); + if (window) + { + trackbar = icvFindTrackbarByName(window, trackbar_name); + if (trackbar) + { + // The position will be min(pos, maxval). + trackbar->minval = (minvalmaxval)?minval:trackbar->maxval; + SendMessage(trackbar->hwnd, TBM_SETRANGEMIN, (WPARAM)TRUE, (LPARAM)minval); + } + } + } + + __END__; +} + + CV_IMPL void* cvGetWindowHandle( const char* window_name ) { void* hwnd = 0; diff --git a/modules/highgui/src/window_winrt.cpp b/modules/highgui/src/window_winrt.cpp index ba81b51c64..4bd3e1ab23 100644 --- a/modules/highgui/src/window_winrt.cpp +++ b/modules/highgui/src/window_winrt.cpp @@ -170,6 +170,22 @@ CV_IMPL void cvSetTrackbarMax(const char* trackbar_name, const char* window_name } } +CV_IMPL void cvSetTrackbarMin(const char* trackbar_name, const char* window_name, int minval) +{ + CV_FUNCNAME("cvSetTrackbarMin"); + + if (minval >= 0) + { + if (trackbar_name == 0 || window_name == 0) + CV_ERROR(CV_StsNullPtr, "NULL trackbar or window name"); + + CvTrackbar* trackbar = HighguiBridge::getInstance().findTrackbarByName(trackbar_name, window_name); + + if (trackbar) + trackbar->setMinPosition(minval); + } +} + CV_IMPL int cvGetTrackbarPos(const char* trackbar_name, const char* window_name) { int pos = -1; diff --git a/modules/highgui/src/window_winrt_bridge.cpp b/modules/highgui/src/window_winrt_bridge.cpp index 60421d681f..e0818eafbd 100644 --- a/modules/highgui/src/window_winrt_bridge.cpp +++ b/modules/highgui/src/window_winrt_bridge.cpp @@ -171,12 +171,23 @@ void CvTrackbar::setPosition(double pos) void CvTrackbar::setMaxPosition(double pos) { - if (pos < 0) - pos = 0; + //slider->Minimum is initialized with 0 + if (pos < slider->Minimum) + pos = slider->Minimum; slider->Maximum = pos; } +void CvTrackbar::setMinPosition(double pos) +{ + if (pos < 0) + pos = 0; + //Min is always less than Max. + if ((pos > slider->Maximum) + pos = slider->Maximum; + slider->Minimum = pos; +} + void CvTrackbar::setSlider(Slider^ slider) { if (slider) this->slider = slider; @@ -192,6 +203,11 @@ double CvTrackbar::getMaxPosition() return slider->Maximum; } +double CvTrackbar::getMinPosition() +{ + return slider->Minimum; +} + Slider^ CvTrackbar::getSlider() { return slider; diff --git a/modules/highgui/src/window_winrt_bridge.hpp b/modules/highgui/src/window_winrt_bridge.hpp index d19dd29c82..25f4aef8ed 100644 --- a/modules/highgui/src/window_winrt_bridge.hpp +++ b/modules/highgui/src/window_winrt_bridge.hpp @@ -151,6 +151,8 @@ public: void setPosition(double pos); double getMaxPosition(); void setMaxPosition(double pos); + double getMinPosition(); + void setMinPosition(double pos); Slider^ getSlider(); void setSlider(Slider^ pos);