qwt_wheel.cpp
Go to the documentation of this file.
1 /******************************************************************************
2  * Qwt Widget Library
3  * Copyright (C) 1997 Josef Wilgen
4  * Copyright (C) 2002 Uwe Rathmann
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the Qwt License, Version 1.0
8  *****************************************************************************/
9 
10 #include "qwt_wheel.h"
11 #include "qwt_math.h"
12 #include "qwt_painter.h"
13 #include "qwt.h"
14 
15 #include <qevent.h>
16 #include <qdrawutil.h>
17 #include <qpainter.h>
18 #include <qstyle.h>
19 #include <qstyleoption.h>
20 #include <qelapsedtimer.h>
21 #include <qmath.h>
22 
24 {
25  public:
26  PrivateData()
27  : orientation( Qt::Horizontal )
28  , viewAngle( 175.0 )
29  , totalAngle( 360.0 )
30  , tickCount( 10 )
31  , wheelBorderWidth( 2 )
32  , borderWidth( 2 )
33  , wheelWidth( 20 )
34  , mouseOffset( 0.0 )
35  , updateInterval( 50 )
36  , mass( 0.0 )
37  , timerId( 0 )
38  , speed( 0.0 )
39  , mouseValue( 0.0 )
40  , flyingValue( 0.0 )
41  , minimum( 0.0 )
42  , maximum( 100.0 )
43  , singleStep( 1.0 )
44  , pageStepCount( 1 )
45  , value( 0.0 )
46  , isScrolling( false )
47  , tracking( true )
48  , stepAlignment( true )
49  , pendingValueChanged( false )
50  , inverted( false )
51  , wrapping( false )
52  {
53  }
54 
55  Qt::Orientation orientation;
56  double viewAngle;
57  double totalAngle;
58  int tickCount;
59  int wheelBorderWidth;
60  int borderWidth;
61  int wheelWidth;
62 
63  double mouseOffset;
64 
66  double mass;
67 
68  // for the flying wheel effect
69  int timerId;
70  QElapsedTimer timer;
71  double speed;
72  double mouseValue;
73  double flyingValue;
74 
75  double minimum;
76  double maximum;
77 
78  double singleStep;
80 
81  double value;
82 
84  bool tracking;
86  bool pendingValueChanged; // when not tracking
87  bool inverted;
88  bool wrapping;
89 };
90 
92 QwtWheel::QwtWheel( QWidget* parent ):
93  QWidget( parent )
94 {
95  m_data = new PrivateData;
96 
97  setFocusPolicy( Qt::StrongFocus );
98  setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Fixed );
99  setAttribute( Qt::WA_WState_OwnSizePolicy, false );
100 }
101 
104 {
105  delete m_data;
106 }
107 
121 {
123 }
124 
130 {
131  return m_data->tracking;
132 }
133 
142 void QwtWheel::setUpdateInterval( int interval )
143 {
144  m_data->updateInterval = qMax( interval, 50 );
145 }
146 
151 int QwtWheel::updateInterval() const
152 {
153  return m_data->updateInterval;
154 }
155 
163 void QwtWheel::mousePressEvent( QMouseEvent* event )
164 {
165  stopFlying();
166 
167  m_data->isScrolling = wheelRect().contains( event->pos() );
168 
169  if ( m_data->isScrolling )
170  {
171  m_data->timer.start();
172  m_data->speed = 0.0;
173  m_data->mouseValue = valueAt( event->pos() );
175  m_data->pendingValueChanged = false;
176 
177  Q_EMIT wheelPressed();
178  }
179 }
180 
188 void QwtWheel::mouseMoveEvent( QMouseEvent* event )
189 {
190  if ( !m_data->isScrolling )
191  return;
192 
193  double mouseValue = valueAt( event->pos() );
194 
195  if ( m_data->mass > 0.0 )
196  {
197  double ms = m_data->timer.restart();
198 
199  // the interval when mouse move events are posted are somehow
200  // random. To avoid unrealistic speed values we limit ms
201 
202  ms = qMax( ms, 5.0 );
203 
204  m_data->speed = ( mouseValue - m_data->mouseValue ) / ms;
205  }
206 
207  m_data->mouseValue = mouseValue;
208 
209  double value = boundedValue( mouseValue - m_data->mouseOffset );
210  if ( m_data->stepAlignment )
211  value = alignedValue( value );
212 
213  if ( value != m_data->value )
214  {
215  m_data->value = value;
216 
217  update();
218 
219  Q_EMIT wheelMoved( m_data->value );
220 
221  if ( m_data->tracking )
222  Q_EMIT valueChanged( m_data->value );
223  else
224  m_data->pendingValueChanged = true;
225  }
226 }
227 
237 void QwtWheel::mouseReleaseEvent( QMouseEvent* event )
238 {
239  Q_UNUSED( event );
240 
241  if ( !m_data->isScrolling )
242  return;
243 
244  m_data->isScrolling = false;
245 
246  bool startFlying = false;
247 
248  if ( m_data->mass > 0.0 )
249  {
250  const qint64 ms = m_data->timer.elapsed();
251  if ( ( std::fabs( m_data->speed ) > 0.0 ) && ( ms < 50 ) )
252  startFlying = true;
253  }
254 
255  if ( startFlying )
256  {
259 
260  m_data->timerId = startTimer( m_data->updateInterval );
261  }
262  else
263  {
265  Q_EMIT valueChanged( m_data->value );
266  }
267 
268  m_data->pendingValueChanged = false;
269  m_data->mouseOffset = 0.0;
270 
271  Q_EMIT wheelReleased();
272 }
273 
283 void QwtWheel::timerEvent( QTimerEvent* event )
284 {
285  if ( event->timerId() != m_data->timerId )
286  {
287  QWidget::timerEvent( event );
288  return;
289  }
290 
291  m_data->speed *= std::exp( -m_data->updateInterval * 0.001 / m_data->mass );
292 
295 
296  double value = m_data->flyingValue;
297  if ( m_data->stepAlignment )
298  value = alignedValue( value );
299 
300  if ( std::fabs( m_data->speed ) < 0.001 * m_data->singleStep )
301  {
302  // stop if m_data->speed < one step per second
303  stopFlying();
304  }
305 
306  if ( value != m_data->value )
307  {
308  m_data->value = value;
309  update();
310 
311  if ( m_data->tracking || m_data->timerId == 0 )
312  Q_EMIT valueChanged( m_data->value );
313  }
314 }
315 
316 
324 void QwtWheel::wheelEvent( QWheelEvent* event )
325 {
326 #if QT_VERSION < 0x050e00
327  const QPoint wheelPos = event->pos();
328  const int wheelDelta = event->delta();
329 #else
330  const QPoint wheelPos = event->position().toPoint();
331 
332  const QPoint delta = event->angleDelta();
333  const int wheelDelta = ( qAbs( delta.x() ) > qAbs( delta.y() ) )
334  ? delta.x() : delta.y();
335 #endif
336 
337  if ( !wheelRect().contains( wheelPos ) )
338  {
339  event->ignore();
340  return;
341  }
342 
343  if ( m_data->isScrolling )
344  return;
345 
346  stopFlying();
347 
348  double increment = 0.0;
349 
350  if ( ( event->modifiers() & Qt::ControlModifier ) ||
351  ( event->modifiers() & Qt::ShiftModifier ) )
352  {
353  // one page regardless of delta
354  increment = m_data->singleStep * m_data->pageStepCount;
355  if ( wheelDelta < 0 )
356  increment = -increment;
357  }
358  else
359  {
360  const int numSteps = wheelDelta / 120;
361  increment = m_data->singleStep * numSteps;
362  }
363 
364  if ( m_data->orientation == Qt::Vertical && m_data->inverted )
365  increment = -increment;
366 
367  double value = boundedValue( m_data->value + increment );
368 
369  if ( m_data->stepAlignment )
370  value = alignedValue( value );
371 
372  if ( value != m_data->value )
373  {
374  m_data->value = value;
375  update();
376 
377  Q_EMIT valueChanged( m_data->value );
378  Q_EMIT wheelMoved( m_data->value );
379  }
380 }
381 
409 void QwtWheel::keyPressEvent( QKeyEvent* event )
410 {
411  if ( m_data->isScrolling )
412  {
413  // don't interfere mouse scrolling
414  return;
415  }
416 
417  double value = m_data->value;
418  double increment = 0.0;
419 
420  switch ( event->key() )
421  {
422  case Qt::Key_Down:
423  {
424  if ( m_data->orientation == Qt::Vertical && m_data->inverted )
425  increment = m_data->singleStep;
426  else
427  increment = -m_data->singleStep;
428 
429  break;
430  }
431  case Qt::Key_Up:
432  {
433  if ( m_data->orientation == Qt::Vertical && m_data->inverted )
434  increment = -m_data->singleStep;
435  else
436  increment = m_data->singleStep;
437 
438  break;
439  }
440  case Qt::Key_Left:
441  {
442  if ( m_data->orientation == Qt::Horizontal )
443  {
444  if ( m_data->inverted )
445  increment = m_data->singleStep;
446  else
447  increment = -m_data->singleStep;
448  }
449  break;
450  }
451  case Qt::Key_Right:
452  {
453  if ( m_data->orientation == Qt::Horizontal )
454  {
455  if ( m_data->inverted )
456  increment = -m_data->singleStep;
457  else
458  increment = m_data->singleStep;
459  }
460  break;
461  }
462  case Qt::Key_PageUp:
463  {
464  increment = m_data->pageStepCount * m_data->singleStep;
465  break;
466  }
467  case Qt::Key_PageDown:
468  {
469  increment = -m_data->pageStepCount * m_data->singleStep;
470  break;
471  }
472  case Qt::Key_Home:
473  {
474  value = m_data->minimum;
475  break;
476  }
477  case Qt::Key_End:
478  {
479  value = m_data->maximum;
480  break;
481  }
482  default:;
483  {
484  event->ignore();
485  }
486  }
487 
488  if ( event->isAccepted() )
489  stopFlying();
490 
491  if ( increment != 0.0 )
492  {
493  value = boundedValue( m_data->value + increment );
494 
495  if ( m_data->stepAlignment )
496  value = alignedValue( value );
497  }
498 
499  if ( value != m_data->value )
500  {
501  m_data->value = value;
502  update();
503 
504  Q_EMIT valueChanged( m_data->value );
505  Q_EMIT wheelMoved( m_data->value );
506  }
507 }
508 
520 {
521  count = qBound( 6, count, 50 );
522 
523  if ( count != m_data->tickCount )
524  {
525  m_data->tickCount = qBound( 6, count, 50 );
526  update();
527  }
528 }
529 
534 int QwtWheel::tickCount() const
535 {
536  return m_data->tickCount;
537 }
538 
551 void QwtWheel::setWheelBorderWidth( int borderWidth )
552 {
553  const int d = qMin( width(), height() ) / 3;
554  borderWidth = qMin( borderWidth, d );
555  m_data->wheelBorderWidth = qMax( borderWidth, 1 );
556  update();
557 }
558 
563 int QwtWheel::wheelBorderWidth() const
564 {
565  return m_data->wheelBorderWidth;
566 }
567 
576 void QwtWheel::setBorderWidth( int width )
577 {
578  m_data->borderWidth = qMax( width, 0 );
579  update();
580 }
581 
586 int QwtWheel::borderWidth() const
587 {
588  return m_data->borderWidth;
589 }
590 
594 QRect QwtWheel::wheelRect() const
595 {
596  const int bw = m_data->borderWidth;
597  return contentsRect().adjusted( bw, bw, -bw, -bw );
598 }
599 
613 void QwtWheel::setTotalAngle( double angle )
614 {
615  if ( angle < 0.0 )
616  angle = 0.0;
617 
618  m_data->totalAngle = angle;
619  update();
620 }
621 
626 double QwtWheel::totalAngle() const
627 {
628  return m_data->totalAngle;
629 }
630 
639 void QwtWheel::setOrientation( Qt::Orientation orientation )
640 {
641  if ( m_data->orientation == orientation )
642  return;
643 
644  if ( !testAttribute( Qt::WA_WState_OwnSizePolicy ) )
645  {
646  QSizePolicy sp = sizePolicy();
647  sp.transpose();
648  setSizePolicy( sp );
649 
650  setAttribute( Qt::WA_WState_OwnSizePolicy, false );
651  }
652 
654  update();
655 }
656 
661 Qt::Orientation QwtWheel::orientation() const
662 {
663  return m_data->orientation;
664 }
665 
676 void QwtWheel::setViewAngle( double angle )
677 {
678  m_data->viewAngle = qBound( 10.0, angle, 175.0 );
679  update();
680 }
681 
686 double QwtWheel::viewAngle() const
687 {
688  return m_data->viewAngle;
689 }
690 
697 double QwtWheel::valueAt( const QPoint& pos ) const
698 {
699  const QRectF rect = wheelRect();
700 
701  double w, dx;
702  if ( m_data->orientation == Qt::Vertical )
703  {
704  w = rect.height();
705  dx = rect.top() - pos.y();
706  }
707  else
708  {
709  w = rect.width();
710  dx = pos.x() - rect.left();
711  }
712 
713  if ( w == 0.0 )
714  return 0.0;
715 
716  if ( m_data->inverted )
717  {
718  dx = w - dx;
719  }
720 
721  // w pixels is an arc of viewAngle degrees,
722  // so we convert change in pixels to change in angle
723  const double ang = dx * m_data->viewAngle / w;
724 
725  // value range maps to totalAngle degrees,
726  // so convert the change in angle to a change in value
727  const double val = ang * ( maximum() - minimum() ) / m_data->totalAngle;
728 
729  return val;
730 }
731 
736 void QwtWheel::paintEvent( QPaintEvent* event )
737 {
738  QPainter painter( this );
739  painter.setClipRegion( event->region() );
740 
741  QStyleOption opt;
742  opt.initFrom(this);
743  style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this);
744 
745  qDrawShadePanel( &painter,
746  contentsRect(), palette(), true, m_data->borderWidth );
747 
748  drawWheelBackground( &painter, wheelRect() );
749  drawTicks( &painter, wheelRect() );
750 
751  if ( hasFocus() )
752  QwtPainter::drawFocusRect( &painter, this );
753 }
754 
762  QPainter* painter, const QRectF& rect )
763 {
764  painter->save();
765 
766  QPalette pal = palette();
767 
768  // draw shaded background
769  QLinearGradient gradient( rect.topLeft(),
770  ( m_data->orientation == Qt::Horizontal ) ? rect.topRight() : rect.bottomLeft() );
771  gradient.setColorAt( 0.0, pal.color( QPalette::Button ) );
772  gradient.setColorAt( 0.2, pal.color( QPalette::Midlight ) );
773  gradient.setColorAt( 0.7, pal.color( QPalette::Mid ) );
774  gradient.setColorAt( 1.0, pal.color( QPalette::Dark ) );
775 
776  painter->fillRect( rect, gradient );
777 
778  // draw internal border
779 
780  const QPen lightPen( palette().color( QPalette::Light ),
781  m_data->wheelBorderWidth, Qt::SolidLine, Qt::FlatCap );
782  const QPen darkPen( pal.color( QPalette::Dark ),
783  m_data->wheelBorderWidth, Qt::SolidLine, Qt::FlatCap );
784 
785  const double bw2 = 0.5 * m_data->wheelBorderWidth;
786 
787  if ( m_data->orientation == Qt::Horizontal )
788  {
789  painter->setPen( lightPen );
790  painter->drawLine( QPointF( rect.left(), rect.top() + bw2 ),
791  QPointF( rect.right(), rect.top() + bw2 ) );
792 
793  painter->setPen( darkPen );
794  painter->drawLine( QPointF( rect.left(), rect.bottom() - bw2 ),
795  QPointF( rect.right(), rect.bottom() - bw2 ) );
796  }
797  else // Qt::Vertical
798  {
799  painter->setPen( lightPen );
800  painter->drawLine( QPointF( rect.left() + bw2, rect.top() ),
801  QPointF( rect.left() + bw2, rect.bottom() ) );
802 
803  painter->setPen( darkPen );
804  painter->drawLine( QPointF( rect.right() - bw2, rect.top() ),
805  QPointF( rect.right() - bw2, rect.bottom() ) );
806  }
807 
808  painter->restore();
809 }
810 
817 void QwtWheel::drawTicks( QPainter* painter, const QRectF& rect )
818 {
819  const double range = m_data->maximum - m_data->minimum;
820 
821  if ( range == 0.0 || m_data->totalAngle == 0.0 )
822  {
823  return;
824  }
825 
826  const QPen lightPen( palette().color( QPalette::Light ),
827  0, Qt::SolidLine, Qt::FlatCap );
828  const QPen darkPen( palette().color( QPalette::Dark ),
829  0, Qt::SolidLine, Qt::FlatCap );
830 
831  const double cnvFactor = qAbs( m_data->totalAngle / range );
832  const double halfIntv = 0.5 * m_data->viewAngle / cnvFactor;
833  const double loValue = value() - halfIntv;
834  const double hiValue = value() + halfIntv;
835  const double tickWidth = 360.0 / double( m_data->tickCount ) / cnvFactor;
836  const double sinArc = qFastSin( m_data->viewAngle * M_PI / 360.0 );
837 
838  if ( m_data->orientation == Qt::Horizontal )
839  {
840  const double radius = rect.width() * 0.5;
841 
842  double l1 = rect.top() + m_data->wheelBorderWidth;
843  double l2 = rect.bottom() - m_data->wheelBorderWidth - 1;
844 
845  // draw one point over the border if border > 1
846  if ( m_data->wheelBorderWidth > 1 )
847  {
848  l1--;
849  l2++;
850  }
851 
852  const double maxpos = rect.right() - 2;
853  const double minpos = rect.left() + 2;
854 
855  // draw tick marks
856  for ( double tickValue = std::ceil( loValue / tickWidth ) * tickWidth;
857  tickValue < hiValue; tickValue += tickWidth )
858  {
859  const double angle = qwtRadians( tickValue - value() );
860  const double s = qFastSin( angle * cnvFactor );
861 
862  const double off = radius * ( sinArc + s ) / sinArc;
863 
864  double tickPos;
865  if ( m_data->inverted )
866  tickPos = rect.left() + off;
867  else
868  tickPos = rect.right() - off;
869 
870  if ( ( tickPos <= maxpos ) && ( tickPos > minpos ) )
871  {
872  painter->setPen( darkPen );
873  painter->drawLine( QPointF( tickPos - 1, l1 ),
874  QPointF( tickPos - 1, l2 ) );
875  painter->setPen( lightPen );
876  painter->drawLine( QPointF( tickPos, l1 ),
877  QPointF( tickPos, l2 ) );
878  }
879  }
880  }
881  else // Qt::Vertical
882  {
883  const double radius = rect.height() * 0.5;
884 
885  double l1 = rect.left() + m_data->wheelBorderWidth;
886  double l2 = rect.right() - m_data->wheelBorderWidth - 1;
887 
888  if ( m_data->wheelBorderWidth > 1 )
889  {
890  l1--;
891  l2++;
892  }
893 
894  const double maxpos = rect.bottom() - 2;
895  const double minpos = rect.top() + 2;
896 
897  for ( double tickValue = std::ceil( loValue / tickWidth ) * tickWidth;
898  tickValue < hiValue; tickValue += tickWidth )
899  {
900  const double angle = qwtRadians( tickValue - value() );
901  const double s = qFastSin( angle * cnvFactor );
902 
903  const double off = radius * ( sinArc + s ) / sinArc;
904 
905  double tickPos;
906 
907  if ( m_data->inverted )
908  tickPos = rect.bottom() - off;
909  else
910  tickPos = rect.top() + off;
911 
912  if ( ( tickPos <= maxpos ) && ( tickPos > minpos ) )
913  {
914  painter->setPen( darkPen );
915  painter->drawLine( QPointF( l1, tickPos - 1 ),
916  QPointF( l2, tickPos - 1 ) );
917  painter->setPen( lightPen );
918  painter->drawLine( QPointF( l1, tickPos ),
919  QPointF( l2, tickPos ) );
920  }
921  }
922  }
923 }
924 
934 void QwtWheel::setWheelWidth( int width )
935 {
936  m_data->wheelWidth = width;
937  update();
938 }
939 
944 int QwtWheel::wheelWidth() const
945 {
946  return m_data->wheelWidth;
947 }
948 
952 QSize QwtWheel::sizeHint() const
953 {
954  const QSize hint = minimumSizeHint();
955  return qwtExpandedToGlobalStrut( hint );
956 }
957 
963 {
964  QSize sz( 3 * m_data->wheelWidth + 2 * m_data->borderWidth,
966  if ( m_data->orientation != Qt::Horizontal )
967  sz.transpose();
968 
969  return sz;
970 }
971 
980 void QwtWheel::setSingleStep( double stepSize )
981 {
982  m_data->singleStep = qwtMaxF( stepSize, 0.0 );
983 }
984 
989 double QwtWheel::singleStep() const
990 {
991  return m_data->singleStep;
992 }
993 
1005 {
1006  if ( on != m_data->stepAlignment )
1007  {
1008  m_data->stepAlignment = on;
1009  }
1010 }
1011 
1016 bool QwtWheel::stepAlignment() const
1017 {
1018  return m_data->stepAlignment;
1019 }
1020 
1035 {
1036  m_data->pageStepCount = qMax( 0, count );
1037 }
1038 
1043 int QwtWheel::pageStepCount() const
1044 {
1045  return m_data->pageStepCount;
1046 }
1047 
1059 void QwtWheel::setRange( double min, double max )
1060 {
1061  max = qwtMaxF( min, max );
1062 
1063  if ( m_data->minimum == min && m_data->maximum == max )
1064  return;
1065 
1066  m_data->minimum = min;
1067  m_data->maximum = max;
1068 
1069  if ( m_data->value < min || m_data->value > max )
1070  {
1071  m_data->value = qBound( min, m_data->value, max );
1072 
1073  update();
1074  Q_EMIT valueChanged( m_data->value );
1075  }
1076 }
1085 void QwtWheel::setMinimum( double value )
1086 {
1087  setRange( value, maximum() );
1088 }
1089 
1094 double QwtWheel::minimum() const
1095 {
1096  return m_data->minimum;
1097 }
1098 
1105 void QwtWheel::setMaximum( double value )
1106 {
1107  setRange( minimum(), value );
1108 }
1109 
1114 double QwtWheel::maximum() const
1115 {
1116  return m_data->maximum;
1117 }
1118 
1127 void QwtWheel::setValue( double value )
1128 {
1129  stopFlying();
1130  m_data->isScrolling = false;
1131 
1132  value = qBound( m_data->minimum, value, m_data->maximum );
1133 
1134  if ( m_data->value != value )
1135  {
1136  m_data->value = value;
1137 
1138  update();
1139  Q_EMIT valueChanged( m_data->value );
1140  }
1141 }
1142 
1147 double QwtWheel::value() const
1148 {
1149  return m_data->value;
1150 }
1151 
1163 void QwtWheel::setInverted( bool on )
1164 {
1165  if ( m_data->inverted != on )
1166  {
1167  m_data->inverted = on;
1168  update();
1169  }
1170 }
1171 
1177 {
1178  return m_data->inverted;
1179 }
1180 
1190 void QwtWheel::setWrapping( bool on )
1191 {
1192  m_data->wrapping = on;
1193 }
1194 
1199 bool QwtWheel::wrapping() const
1200 {
1201  return m_data->wrapping;
1202 }
1203 
1221 void QwtWheel::setMass( double mass )
1222 {
1223  if ( mass < 0.001 )
1224  {
1225  m_data->mass = 0.0;
1226  }
1227  else
1228  {
1229  m_data->mass = qwtMinF( 100.0, mass );
1230  }
1231 
1232  if ( m_data->mass <= 0.0 )
1233  stopFlying();
1234 }
1235 
1240 double QwtWheel::mass() const
1241 {
1242  return m_data->mass;
1243 }
1244 
1247 {
1248  if ( m_data->timerId != 0 )
1249  {
1250  killTimer( m_data->timerId );
1251  m_data->timerId = 0;
1252  m_data->speed = 0.0;
1253  }
1254 }
1255 
1256 double QwtWheel::boundedValue( double value ) const
1257 {
1258  const double range = m_data->maximum - m_data->minimum;
1259 
1260  if ( m_data->wrapping && range >= 0.0 )
1261  {
1262  if ( value < m_data->minimum )
1263  {
1264  value += std::ceil( ( m_data->minimum - value ) / range ) * range;
1265  }
1266  else if ( value > m_data->maximum )
1267  {
1268  value -= std::ceil( ( value - m_data->maximum ) / range ) * range;
1269  }
1270  }
1271  else
1272  {
1273  value = qBound( m_data->minimum, value, m_data->maximum );
1274  }
1275 
1276  return value;
1277 }
1278 
1279 double QwtWheel::alignedValue( double value ) const
1280 {
1281  const double stepSize = m_data->singleStep;
1282 
1283  if ( stepSize > 0.0 )
1284  {
1285  value = m_data->minimum +
1286  qRound( ( value - m_data->minimum ) / stepSize ) * stepSize;
1287 
1288  if ( stepSize > 1e-12 )
1289  {
1290  if ( qFuzzyCompare( value + 1.0, 1.0 ) )
1291  {
1292  // correct rounding error if value = 0
1293  value = 0.0;
1294  }
1295  else if ( qFuzzyCompare( value, m_data->maximum ) )
1296  {
1297  // correct rounding error at the border
1298  value = m_data->maximum;
1299  }
1300  }
1301  }
1302 
1303  return value;
1304 }
1305 
1306 #if QWT_MOC_INCLUDE
1307 #include "moc_qwt_wheel.cpp"
1308 #endif
color
color
Definition: color.h:16
QwtWheel::mouseMoveEvent
virtual void mouseMoveEvent(QMouseEvent *) QWT_OVERRIDE
Mouse Move Event handler.
Definition: qwt_wheel.cpp:188
QwtWheel::drawTicks
virtual void drawTicks(QPainter *, const QRectF &)
Definition: qwt_wheel.cpp:817
QwtWheel::PrivateData::totalAngle
double totalAngle
Definition: qwt_wheel.cpp:64
QwtWheel::setTickCount
void setTickCount(int)
Adjust the number of grooves in the wheel's surface.
Definition: qwt_wheel.cpp:519
QwtWheel::PrivateData::mouseOffset
double mouseOffset
Definition: qwt_wheel.cpp:70
QwtWheel::wheelWidth
int wheelWidth
Definition: qwt_wheel.h:60
QwtWheel::PrivateData::isScrolling
bool isScrolling
Definition: qwt_wheel.cpp:90
QwtWheel::sizeHint
virtual QSize sizeHint() const QWT_OVERRIDE
Definition: qwt_wheel.cpp:952
QwtWheel::setMinimum
void setMinimum(double)
Definition: qwt_wheel.cpp:1085
QwtWheel::orientation
Qt::Orientation orientation
Definition: qwt_wheel.h:39
qwtExpandedToGlobalStrut
QSize qwtExpandedToGlobalStrut(const QSize &size)
Definition: qwt.cpp:21
s
XmlRpcServer s
QwtWheel::setStepAlignment
void setStepAlignment(bool on)
En/Disable step alignment.
Definition: qwt_wheel.cpp:1004
QwtWheel::PrivateData::PrivateData
PrivateData()
Definition: qwt_wheel.cpp:33
QwtWheel::QwtWheel
QwtWheel(QWidget *parent=NULL)
Constructor.
Definition: qwt_wheel.cpp:92
qwt_wheel.h
QwtWheel::isTracking
bool isTracking() const
Definition: qwt_wheel.cpp:129
QwtWheel::PrivateData::stepAlignment
bool stepAlignment
Definition: qwt_wheel.cpp:92
QwtWheel::drawWheelBackground
virtual void drawWheelBackground(QPainter *, const QRectF &)
Definition: qwt_wheel.cpp:761
QwtWheel::setUpdateInterval
void setUpdateInterval(int)
Specify the update interval when the wheel is flying.
Definition: qwt_wheel.cpp:142
QwtWheel::PrivateData::wrapping
bool wrapping
Definition: qwt_wheel.cpp:95
QwtWheel::singleStep
double singleStep
Definition: qwt_wheel.h:46
QwtWheel::setViewAngle
void setViewAngle(double)
Specify the visible portion of the wheel.
Definition: qwt_wheel.cpp:676
QwtWheel::PrivateData::viewAngle
double viewAngle
Definition: qwt_wheel.cpp:63
QwtWheel::viewAngle
double viewAngle
Definition: qwt_wheel.h:58
QwtWheel::PrivateData::minimum
double minimum
Definition: qwt_wheel.cpp:82
qwt_math.h
QwtWheel::PrivateData::speed
double speed
Definition: qwt_wheel.cpp:78
QwtWheel::setWheelWidth
void setWheelWidth(int)
Set the width of the wheel.
Definition: qwt_wheel.cpp:934
QwtWheel::PrivateData::mouseValue
double mouseValue
Definition: qwt_wheel.cpp:79
QwtWheel::tickCount
int tickCount
Definition: qwt_wheel.h:59
QwtWheel::isInverted
bool isInverted() const
Definition: qwt_wheel.cpp:1176
M_PI
#define M_PI
Definition: qwt_math.h:56
QwtWheel::wheelReleased
void wheelReleased()
qwtMinF
QWT_CONSTEXPR float qwtMinF(float a, float b)
Definition: qwt_math.h:103
QwtWheel::valueAt
virtual double valueAt(const QPoint &) const
Definition: qwt_wheel.cpp:697
QwtWheel::wheelPressed
void wheelPressed()
QwtWheel::PrivateData::mass
double mass
Definition: qwt_wheel.cpp:73
QwtWheel::setBorderWidth
void setBorderWidth(int)
Set the border width.
Definition: qwt_wheel.cpp:576
QwtWheel::setSingleStep
void setSingleStep(double)
Set the step size of the counter.
Definition: qwt_wheel.cpp:980
QwtWheel::PrivateData::flyingValue
double flyingValue
Definition: qwt_wheel.cpp:80
detail::count
constexpr auto count() -> size_t
Definition: core.h:1222
QwtWheel::setOrientation
void setOrientation(Qt::Orientation)
Set the wheel's orientation.
Definition: qwt_wheel.cpp:639
QwtWheel::PrivateData::orientation
Qt::Orientation orientation
Definition: qwt_wheel.cpp:62
update
void update(const std::string &key, const XmlRpc::XmlRpcValue &v)
QwtWheel::setTotalAngle
void setTotalAngle(double)
Set the total angle which the wheel can be turned.
Definition: qwt_wheel.cpp:613
QwtWheel::PrivateData::pageStepCount
int pageStepCount
Definition: qwt_wheel.cpp:86
QwtWheel::setTracking
void setTracking(bool)
En/Disable tracking.
Definition: qwt_wheel.cpp:120
QwtWheel::setValue
void setValue(double)
Set a new value without adjusting to the step raster.
Definition: qwt_wheel.cpp:1127
QwtWheel::PrivateData::tickCount
int tickCount
Definition: qwt_wheel.cpp:65
QwtWheel::PrivateData::updateInterval
int updateInterval
Definition: qwt_wheel.cpp:72
QwtWheel::PrivateData::pendingValueChanged
bool pendingValueChanged
Definition: qwt_wheel.cpp:93
QwtWheel::paintEvent
virtual void paintEvent(QPaintEvent *) QWT_OVERRIDE
Qt Paint Event.
Definition: qwt_wheel.cpp:736
qwtMaxF
QWT_CONSTEXPR float qwtMaxF(float a, float b)
Definition: qwt_math.h:127
QwtWheel::wheelBorderWidth
int wheelBorderWidth
Definition: qwt_wheel.h:62
QwtWheel::PrivateData::inverted
bool inverted
Definition: qwt_wheel.cpp:94
QwtWheel::value
double value
Definition: qwt_wheel.h:41
QwtWheel::PrivateData::maximum
double maximum
Definition: qwt_wheel.cpp:83
d
d
QwtWheel::PrivateData::value
double value
Definition: qwt_wheel.cpp:88
sol::meta::enable
std::enable_if_t< all< Args... >::value, enable_t > enable
Definition: sol.hpp:2244
QwtWheel::stopFlying
void stopFlying()
Stop the flying movement of the wheel.
Definition: qwt_wheel.cpp:1246
QwtWheel::m_data
PrivateData * m_data
Definition: qwt_wheel.h:182
qwtRadians
double qwtRadians(double degrees)
Translate degrees into radians.
Definition: qwt_math.h:251
QwtWheel::PrivateData::borderWidth
int borderWidth
Definition: qwt_wheel.cpp:67
QwtWheel::setRange
void setRange(double min, double max)
Set the minimum and maximum values.
Definition: qwt_wheel.cpp:1059
QwtWheel::PrivateData::timer
QElapsedTimer timer
Definition: qwt_wheel.cpp:77
QwtWheel::timerEvent
virtual void timerEvent(QTimerEvent *) QWT_OVERRIDE
Qt timer event.
Definition: qwt_wheel.cpp:283
qwt.h
QwtWheel::alignedValue
double alignedValue(double) const
Definition: qwt_wheel.cpp:1279
QwtWheel::borderWidth
int borderWidth
Definition: qwt_wheel.h:61
qwt_painter.h
QwtWheel::wheelRect
QRect wheelRect() const
Definition: qwt_wheel.cpp:594
QwtPainter::drawFocusRect
static void drawFocusRect(QPainter *, const QWidget *)
Draw a focus rectangle on a widget using its style.
Definition: qwt_painter.cpp:815
QwtWheel::keyPressEvent
virtual void keyPressEvent(QKeyEvent *) QWT_OVERRIDE
Definition: qwt_wheel.cpp:409
QwtWheel::PrivateData::timerId
int timerId
Definition: qwt_wheel.cpp:76
QwtWheel::maximum
double maximum
Definition: qwt_wheel.h:44
QwtWheel::setMass
void setMass(double)
Set the slider's mass for flywheel effect.
Definition: qwt_wheel.cpp:1221
QwtWheel::PrivateData
Definition: qwt_wheel.cpp:23
QwtWheel::PrivateData::wheelWidth
int wheelWidth
Definition: qwt_wheel.cpp:68
QwtWheel::mousePressEvent
virtual void mousePressEvent(QMouseEvent *) QWT_OVERRIDE
Mouse press event handler.
Definition: qwt_wheel.cpp:163
QwtWheel::~QwtWheel
virtual ~QwtWheel()
Destructor.
Definition: qwt_wheel.cpp:103
QwtWheel::mass
double mass
Definition: qwt_wheel.h:54
QwtWheel::setMaximum
void setMaximum(double)
Definition: qwt_wheel.cpp:1105
QwtWheel::totalAngle
double totalAngle
Definition: qwt_wheel.h:57
QwtWheel::PrivateData::wheelBorderWidth
int wheelBorderWidth
Definition: qwt_wheel.cpp:66
QwtWheel::updateInterval
int updateInterval
Definition: qwt_wheel.h:55
QwtWheel::pageStepCount
int pageStepCount
Definition: qwt_wheel.h:47
QwtWheel::minimumSizeHint
virtual QSize minimumSizeHint() const QWT_OVERRIDE
Definition: qwt_wheel.cpp:962
QwtWheel::mouseReleaseEvent
virtual void mouseReleaseEvent(QMouseEvent *) QWT_OVERRIDE
Mouse Release Event handler.
Definition: qwt_wheel.cpp:237
QwtWheel::setPageStepCount
void setPageStepCount(int)
Set the page step count.
Definition: qwt_wheel.cpp:1034
QwtWheel::boundedValue
double boundedValue(double) const
Definition: qwt_wheel.cpp:1256
QwtWheel::setInverted
void setInverted(bool)
En/Disable inverted appearance.
Definition: qwt_wheel.cpp:1163
QwtWheel::setWheelBorderWidth
void setWheelBorderWidth(int)
Set the wheel border width of the wheel.
Definition: qwt_wheel.cpp:551
QwtWheel::wheelMoved
void wheelMoved(double value)
QwtWheel::minimum
double minimum
Definition: qwt_wheel.h:43
QwtWheel::valueChanged
void valueChanged(double value)
Notify a change of value.
QwtWheel::wheelEvent
virtual void wheelEvent(QWheelEvent *) QWT_OVERRIDE
Handle wheel events.
Definition: qwt_wheel.cpp:324
QwtWheel::stepAlignment
bool stepAlignment
Definition: qwt_wheel.h:48
QwtWheel::wrapping
bool wrapping
Definition: qwt_wheel.h:51
QwtWheel::PrivateData::singleStep
double singleStep
Definition: qwt_wheel.cpp:85
QwtWheel::PrivateData::tracking
bool tracking
Definition: qwt_wheel.cpp:91
QwtWheel::setWrapping
void setWrapping(bool)
En/Disable wrapping.
Definition: qwt_wheel.cpp:1190


plotjuggler
Author(s): Davide Faconti
autogenerated on Mon Nov 11 2024 03:23:46