| 
					
				 | 
			
			
				@@ -0,0 +1,213 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/*========================================================================= 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  Library:   CTK 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  Copyright (c) Kitware Inc. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  Licensed under the Apache License, Version 2.0 (the "License"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  you may not use this file except in compliance with the License. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  You may obtain a copy of the License at 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      http://www.apache.org/licenses/LICENSE-2.0.txt 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  Unless required by applicable law or agreed to in writing, software 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  distributed under the License is distributed on an "AS IS" BASIS, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  See the License for the specific language governing permissions and 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  limitations under the License. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+=========================================================================*/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// Qt includes 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include <QApplication> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include <QString> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include <QStyle> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include <QStyleOptionSlider> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include <QTimer> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// CTK includes 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include "ctkRangeSlider.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include "ctkTest.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// ---------------------------------------------------------------------------- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+class ctkRangeSliderTester: public QObject 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  Q_OBJECT 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+private slots: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  void testGUIEvents(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  void testTooltips(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  void testSimpleMouseEvents(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  void testHandleMouseEvents(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  void testHandleMouseEvents_data(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  void testGrooveMouseEvents(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  void testGrooveMouseEvents_data(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// ---------------------------------------------------------------------------- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void ctkRangeSliderTester::testGUIEvents() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  ctkRangeSlider rangeSlider; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  rangeSlider.show(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  qApp->processEvents(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  rangeSlider.resize(100, 100); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  qApp->processEvents(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  rangeSlider.resize(1, 100); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  qApp->processEvents(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  rangeSlider.resize(100, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  qApp->processEvents(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  rangeSlider.hide(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  qApp->processEvents(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  rangeSlider.show(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// ---------------------------------------------------------------------------- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void ctkRangeSliderTester::testTooltips() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  ctkRangeSlider rangeSlider; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QVERIFY(rangeSlider.handleToolTip().isEmpty()); // default value 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  rangeSlider.setHandleToolTip("custom tooltip"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QCOMPARE(rangeSlider.handleToolTip(), QString("custom tooltip")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// ---------------------------------------------------------------------------- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void ctkRangeSliderTester::testSimpleMouseEvents() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  ctkRangeSlider rangeSlider; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QPoint center = rangeSlider.rect().center(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QTest::mouseMove(&rangeSlider, center); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QCOMPARE(rangeSlider.isSliderDown(), false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QTest::mousePress(&rangeSlider, Qt::LeftButton, 0, center); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QCOMPARE(rangeSlider.isSliderDown(), true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QTest::mouseRelease(&rangeSlider, Qt::LeftButton, 0, center); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QCOMPARE(rangeSlider.isSliderDown(), false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// ---------------------------------------------------------------------------- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void ctkRangeSliderTester::testGrooveMouseEvents() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  ctkRangeSlider rangeSlider(Qt::Horizontal); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  rangeSlider.setMaximum(100); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  rangeSlider.setValues(10, 90); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QStyleOptionSlider option; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // Resize to enforce a 1 to 1 mapping between pixel position and slider value. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // Size of the handle is added because of the following line in ctkRangeSlider: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  //  sliderMax = gr.right() - sliderLength + 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QRect sliderHandleSize = rangeSlider.style()->subControlRect( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    QStyle::CC_Slider, &option, QStyle::SC_SliderHandle, &rangeSlider ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  rangeSlider.resize(100 + sliderHandleSize.width(), 20); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QFETCH(int, moveInPx); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QFETCH(int, expectedMinValue); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QFETCH(int, expectedMaxValue); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QPoint currentCursorPos = rangeSlider.rect().center(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QTest::mouseMove(&rangeSlider, currentCursorPos); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QTest::mousePress(&rangeSlider, Qt::LeftButton, 0, currentCursorPos); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  currentCursorPos += QPoint(moveInPx, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  ctkTest::mouseMove(&rangeSlider, Qt::LeftButton, 0, currentCursorPos); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QTest::mouseRelease(&rangeSlider, Qt::LeftButton, 0, currentCursorPos); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QCOMPARE(rangeSlider.minimumValue(), expectedMinValue); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QCOMPARE(rangeSlider.maximumValue(), expectedMaxValue); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// ---------------------------------------------------------------------------- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void ctkRangeSliderTester::testGrooveMouseEvents_data() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QTest::addColumn<int>("moveInPx"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QTest::addColumn<int>("expectedMinValue"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QTest::addColumn<int>("expectedMaxValue"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QTest::newRow("MinMax +5") << 5 << 15 << 95; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QTest::newRow("MinMax -5") << -5 << 5 << 85; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QTest::newRow("MinMax +10") << 10 << 20 << 100; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QTest::newRow("MinMax -10") << -10 << 0 << 80; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QTest::newRow("MinMax +20 -> bound to max") << 20 << 30 << 100; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QTest::newRow("MinMax -20 -> bound to min") << -20 << 0 << 70; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// ---------------------------------------------------------------------------- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void ctkRangeSliderTester::testHandleMouseEvents() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  ctkRangeSlider rangeSlider(Qt::Horizontal); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  rangeSlider.setMaximum(100); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  rangeSlider.setValues(10, 80); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QStyleOptionSlider option; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // Resize to enforce a 1 to 1 mapping between pixel position and slider value. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // Size of the handle is added because of the following line in ctkRangeSlider: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  //  sliderMax = gr.right() - sliderLength + 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QRect sliderHandleSize = rangeSlider.style()->subControlRect( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    QStyle::CC_Slider, &option, QStyle::SC_SliderHandle, &rangeSlider ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  rangeSlider.resize(100 + sliderHandleSize.width(), 20); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QFETCH(bool, minHandle); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QFETCH(bool, symmetricMoves); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QFETCH(int, moveInPx); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QFETCH(int, expectedMinValue); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QFETCH(int, expectedMaxValue); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QPoint currentCursorPos = rangeSlider.rect().center(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (minHandle) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    currentCursorPos = QPoint(10, 10); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    currentCursorPos = QPoint(80, 10); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  rangeSlider.setSymmetricMoves(symmetricMoves); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QTest::mouseMove(&rangeSlider, currentCursorPos); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QTest::mousePress(&rangeSlider, Qt::LeftButton, 0, currentCursorPos); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  currentCursorPos += QPoint(moveInPx, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  ctkTest::mouseMove(&rangeSlider, Qt::LeftButton, 0, currentCursorPos); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QTest::mouseRelease(&rangeSlider, Qt::LeftButton, 0, currentCursorPos); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QCOMPARE(rangeSlider.minimumValue(), expectedMinValue); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QCOMPARE(rangeSlider.maximumValue(), expectedMaxValue); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// ---------------------------------------------------------------------------- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void ctkRangeSliderTester::testHandleMouseEvents_data() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QTest::addColumn<bool>("minHandle"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QTest::addColumn<bool>("symmetricMoves"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QTest::addColumn<int>("moveInPx"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QTest::addColumn<int>("expectedMinValue"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QTest::addColumn<int>("expectedMaxValue"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QTest::newRow("Min +5") << true << false << 5 << 15 << 80; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QTest::newRow("Min -5") << true << false << -5 << 5 << 80; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QTest::newRow("Min +10") << true << false << 10 << 20 << 80; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QTest::newRow("Min -10") << true << false << -10 << 0 << 80; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QTest::newRow("Min +20") << true << false << 20 << 30 << 80; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QTest::newRow("Min -20 -> bound to min") << true << false << -20 << 0 << 80; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QTest::newRow("Max +5") << false << false << 5 << 10 << 85; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QTest::newRow("Max -5") << false << false << -5 << 10 << 75; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QTest::newRow("Max +10") << false << false << 10 << 10 << 90; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QTest::newRow("Max -10") << false << false << -10 << 10 << 70; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QTest::newRow("Max +20 -> bound to max") << false << false << 20 << 10 << 100; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QTest::newRow("Max -20") << false << false << -20 << 10 << 60; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QTest::newRow("Sym Min +5") << true << true << 5 << 15 << 75; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QTest::newRow("Sym Min -5") << true << true << -5 << 5 << 85; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QTest::newRow("Sym Min +10") << true << true << 10 << 20 << 70; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QTest::newRow("Sym Min -10") << true << true << -10 << 0 << 90; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QTest::newRow("Sym Min +20") << true << true << 20 << 30 << 60; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QTest::newRow("Sym Min -20 -> bound to min") << true << true << -20 << 0 << 90; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  QTest::newRow("Sym Max +20") << false << true << 20 << 0 << 100; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// ---------------------------------------------------------------------------- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+CTK_TEST_MAIN(ctkRangeSliderTest) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include "moc_ctkRangeSliderTest.cpp" 
			 |