00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include <qlayout.h>
00013 #include <qlineedit.h>
00014 #include <qevent.h>
00015 #include "qwt_counter.h"
00016 #include "qwt_arrbtn.h"
00017
00027 QwtCounter::QwtCounter(QWidget *parent, const char *name ):
00028 QWidget(parent,name),
00029 d_blockKeys(FALSE),
00030 d_keyPressed(FALSE)
00031 {
00032 d_increment[Button1] = 1;
00033 d_increment[Button2] = 10;
00034 d_increment[Button3] = 100;
00035
00036 QHBoxLayout *layout = new QHBoxLayout(this);
00037 layout->setAutoAdd(TRUE);
00038
00039 int i;
00040 for(i = ButtonCnt - 1; i >= 0; i--)
00041 {
00042 QwtArrowButton *btn =
00043 new QwtArrowButton(i+1, Qt::DownArrow,this);
00044 btn->setFocusPolicy(QWidget::StrongFocus);
00045 btn->installEventFilter(this);
00046
00047 connect(btn, SIGNAL(released()), SLOT(btnReleased()));
00048 connect(btn, SIGNAL(clicked()), SLOT(btnClicked()));
00049
00050 d_buttonDown[i] = btn;
00051 }
00052
00053 d_valueEdit = new QLineEdit(this);
00054 d_valueEdit->setReadOnly(TRUE);
00055 d_valueEdit->setFocusPolicy(QWidget::NoFocus);
00056
00057 layout->setStretchFactor(d_valueEdit, 10);
00058
00059 for(i = 0; i < ButtonCnt; i++)
00060 {
00061 QwtArrowButton *btn =
00062 new QwtArrowButton(i+1, Qt::UpArrow, this);
00063 btn->setFocusPolicy(QWidget::StrongFocus);
00064 btn->installEventFilter(this);
00065
00066 connect(btn, SIGNAL(released()), SLOT(btnReleased()));
00067 connect(btn, SIGNAL(clicked()), SLOT(btnClicked()));
00068
00069 d_buttonUp[i] = btn;
00070 }
00071
00072 setNumButtons(2);
00073 setRange(0.0,1.0,0.001);
00074 setValue(0.0);
00075 }
00076
00078 bool QwtCounter::eventFilter(QObject *object, QEvent *e)
00079 {
00080 if ( object->inherits("QPushButton") )
00081 {
00082 if ( e->type() == QEvent::KeyPress )
00083 {
00084 if ( !((QKeyEvent *)e)->isAutoRepeat() )
00085 d_keyPressed = TRUE;
00086 }
00087
00088 if ( e->type() == QEvent::KeyRelease )
00089 {
00090 if ( !((QKeyEvent *)e)->isAutoRepeat() )
00091 {
00092 d_keyPressed = FALSE;
00093
00094
00095
00096
00097
00098 d_blockKeys = FALSE;
00099 }
00100 }
00101 }
00102
00103 return QWidget::eventFilter(object, e);
00104 }
00105
00115 void QwtCounter::setIncSteps(QwtCounter::Button btn, int nSteps)
00116 {
00117 if (( btn >= 0) && (btn < ButtonCnt))
00118 d_increment[btn] = nSteps;
00119 }
00120
00127 int QwtCounter::incSteps(QwtCounter::Button btn) const
00128 {
00129 if (( btn >= 0) && (btn < ButtonCnt))
00130 return d_increment[btn];
00131
00132 return 0;
00133 }
00134
00142 void QwtCounter::setValue(double v)
00143 {
00144 QwtDblRange::setValue(v);
00145
00146 showNum(value());
00147 updateButtons();
00148 }
00149
00153 void QwtCounter::valueChange()
00154 {
00155 if ( isValid() )
00156 showNum(value());
00157 else
00158 d_valueEdit->setText(QString::null);
00159
00160 updateButtons();
00161
00162 if ( isValid() )
00163 emit valueChanged(value());
00164 }
00165
00174 void QwtCounter::updateButtons()
00175 {
00176 if ( isValid() )
00177 {
00178
00179
00180
00181
00182 int oldEnabledDown = d_buttonDown[0]->isEnabled();
00183 int oldEnabledUp = d_buttonUp[0]->isEnabled();
00184
00185 for ( int i = 0; i < ButtonCnt; i++ )
00186 {
00187 d_buttonDown[i]->setEnabled(value() > minValue());
00188 d_buttonUp[i]->setEnabled(value() < maxValue());
00189 }
00190
00191 QPushButton *focusButton = NULL;
00192 if (oldEnabledDown && !d_buttonDown[0]->isEnabled())
00193 focusButton = d_buttonUp[0];
00194
00195 if (oldEnabledUp && !d_buttonUp[0]->isEnabled())
00196 focusButton = d_buttonDown[0];
00197
00198 if ( focusButton )
00199 {
00200 focusButton->setFocus();
00201 if ( d_keyPressed )
00202 {
00203
00204 d_blockKeys = TRUE;
00205 }
00206 }
00207 }
00208 else
00209 {
00210 for ( int i = 0; i < ButtonCnt; i++ )
00211 {
00212 d_buttonDown[i]->setEnabled(FALSE);
00213 d_buttonUp[i]->setEnabled(FALSE);
00214 }
00215 }
00216 }
00217
00222 void QwtCounter::setNumButtons(int n)
00223 {
00224 if ( n<0 || n>ButtonCnt )
00225 return;
00226
00227 for ( int i = 0; i < ButtonCnt; i++ )
00228 {
00229 if ( i < n )
00230 {
00231 d_buttonDown[i]->show();
00232 d_buttonUp[i]->show();
00233 }
00234 else
00235 {
00236 d_buttonDown[i]->hide();
00237 d_buttonUp[i]->hide();
00238 }
00239 }
00240
00241 d_nButtons = n;
00242 }
00243
00247 int QwtCounter::numButtons() const
00248 {
00249 return d_nButtons;
00250 }
00251
00253 void QwtCounter::showNum(double d)
00254 {
00255 QString v;
00256 v.setNum(d);
00257
00258 d_valueEdit->setText(v);
00259 d_valueEdit->setCursorPosition(0);
00260 }
00261
00263 void QwtCounter::btnClicked()
00264 {
00265 if (d_blockKeys)
00266 {
00267
00268
00269
00270
00271 return;
00272 }
00273
00274 for ( int i = 0; i < ButtonCnt; i++ )
00275 {
00276 if ( d_buttonUp[i] == sender() )
00277 incValue(d_increment[i]);
00278
00279 if ( d_buttonDown[i] == sender() )
00280 incValue(-d_increment[i]);
00281 }
00282 }
00283
00285 void QwtCounter::btnReleased()
00286 {
00287 emit buttonReleased(value());
00288 }
00289
00296 void QwtCounter::rangeChange()
00297 {
00298 updateButtons();
00299 }
00300
00308 void QwtCounter::fontChange(const QFont &f)
00309 {
00310 QWidget::fontChange( f );
00311 d_valueEdit->setFont(font());
00312 }
00313
00315 QSize QwtCounter::sizeHint() const
00316 {
00317 QString tmp;
00318 QFontMetrics fm(d_valueEdit->font());
00319
00320 int w = fm.width(tmp.setNum(minValue()));
00321 int w1 = fm.width(tmp.setNum(maxValue()));
00322 if ( w1 > w )
00323 w = w1;
00324 w1 = fm.width(tmp.setNum(minValue() + step()));
00325 if ( w1 > w )
00326 w = w1;
00327 w1 = fm.width(tmp.setNum(maxValue() - step()));
00328 if ( w1 > w )
00329 w = w1;
00330
00331
00332
00333
00334 #if QT_VERSION < 300
00335 w += d_valueEdit->minimumSizeHint().width() - fm.maxWidth();
00336 #else
00337 w += 2 * d_valueEdit->frameWidth() +
00338 d_valueEdit->fontMetrics().minRightBearing() + 3;
00339 #endif
00340
00341
00342
00343
00344 w += QWidget::sizeHint().width() - d_valueEdit->sizeHint().width();
00345
00346 return QSize(w, QWidget::sizeHint().height());
00347 }
00348
00350 QSizePolicy QwtCounter::sizePolicy() const
00351 {
00352 QSizePolicy sp;
00353 sp.setHorData( QSizePolicy::Preferred );
00354 sp.setVerData( QSizePolicy::Fixed );
00355 return sp;
00356 }