void SpeedDial::slotTapClicked() { if (m_tapTime == NULL) { m_tapTime = new QTime(QTime::currentTime()); if (m_tapTickTimer == NULL) { m_tapTickTimer = new QTimer(); connect(m_tapTickTimer, SIGNAL(timeout()), this, SLOT(slotTapTimeout())); } m_tapTime->start(); return; } // Round the elapsed time to the nearest full 10th ms. int remainder = m_tapTime->elapsed() % MS_DIV; m_value = m_tapTime->elapsed() - remainder; if (remainder >= (MS_DIV / 2)) m_value += MS_DIV; setSpinValues(m_value); m_tapTime->restart(); if (m_tapTickTimer) { m_tapTickTimer->setInterval(m_value); m_tapTickTimer->start(); } emit tapped(); }
void SpeedDial::updateTapTimer() { // Synchronize timer ticks if (m_tapTickTimer) m_tapTickTimer->stop(); if (m_value != (int) Function::infiniteSpeed() && m_tapTickTimer == NULL) { m_tapTickTimer = new QTimer(); #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) m_tapTickTimer->setTimerType(Qt::PreciseTimer); #endif connect(m_tapTickTimer, SIGNAL(timeout()), this, SLOT(slotTapTimeout())); } if (m_tapTickTimer) { m_tapTickTimer->setInterval(m_value); // Limit m_tapTickElapseTimer's interval to 20/200ms for nice effect if (m_value > 1000) m_tapTickElapseTimer->setInterval(200); else m_tapTickElapseTimer->setInterval(m_value / 3); m_tapTickTimer->start(); } }
SpeedDial::SpeedDial(QWidget* parent) : QGroupBox(parent) , m_timer(new QTimer(this)) , m_dial(NULL) , m_hrs(NULL) , m_min(NULL) , m_sec(NULL) , m_ms(NULL) , m_focus(NULL) , m_previousDialValue(0) , m_preventSignals(false) , m_value(0) , m_tapTick(false) , m_tapTime(NULL) , m_tapTickTimer(NULL) , m_tapTickElapseTimer(NULL) , m_visibilityMask(DEFAULT_VISIBILITY_MASK) { new QVBoxLayout(this); layout()->setSpacing(0); layout()->setMargin(2); QHBoxLayout* topHBox = new QHBoxLayout(); QVBoxLayout* pmVBox1 = new QVBoxLayout(); QVBoxLayout* taVBox3 = new QVBoxLayout(); layout()->addItem(topHBox); m_plus = new QToolButton(this); m_plus->setIconSize(QSize(32, 32)); m_plus->setIcon(QIcon(":/edit_add.png")); pmVBox1->addWidget(m_plus, Qt::AlignVCenter | Qt::AlignLeft); connect(m_plus, SIGNAL(pressed()), this, SLOT(slotPlusMinus())); connect(m_plus, SIGNAL(released()), this, SLOT(slotPlusMinus())); m_minus = new QToolButton(this); m_minus->setIconSize(QSize(32, 32)); m_minus->setIcon(QIcon(":/edit_remove.png")); pmVBox1->addWidget(m_minus, Qt::AlignVCenter | Qt::AlignLeft); connect(m_minus, SIGNAL(pressed()), this, SLOT(slotPlusMinus())); connect(m_minus, SIGNAL(released()), this, SLOT(slotPlusMinus())); topHBox->addItem(pmVBox1); m_dial = new QDial(this); m_dial->setWrapping(true); m_dial->setNotchesVisible(true); m_dial->setNotchTarget(15); m_dial->setTracking(true); topHBox->addWidget(m_dial); connect(m_dial, SIGNAL(valueChanged(int)), this, SLOT(slotDialChanged(int))); m_tap = new QPushButton(tr("Tap"), this); m_tap->setStyleSheet(tapDefaultSS); m_tap->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding); taVBox3->addWidget(m_tap); connect(m_tap, SIGNAL(clicked()), this, SLOT(slotTapClicked())); topHBox->addItem (taVBox3); QHBoxLayout* timeHBox = new QHBoxLayout(); layout()->addItem(timeHBox); m_hrs = new FocusSpinBox(this); m_hrs->setRange(0, HRS_MAX); m_hrs->setSuffix("h"); m_hrs->setButtonSymbols(QSpinBox::NoButtons); m_hrs->setToolTip(tr("Hours")); timeHBox->addWidget(m_hrs); connect(m_hrs, SIGNAL(valueChanged(int)), this, SLOT(slotHoursChanged())); connect(m_hrs, SIGNAL(focusGained()), this, SLOT(slotSpinFocusGained())); m_min = new FocusSpinBox(this); m_min->setRange(0, MIN_MAX); m_min->setSuffix("m"); m_min->setButtonSymbols(QSpinBox::NoButtons); m_min->setToolTip(tr("Minutes")); timeHBox->addWidget(m_min); connect(m_min, SIGNAL(valueChanged(int)), this, SLOT(slotMinutesChanged())); connect(m_min, SIGNAL(focusGained()), this, SLOT(slotSpinFocusGained())); m_sec = new FocusSpinBox(this); m_sec->setRange(0, SEC_MAX); m_sec->setSuffix("s"); m_sec->setButtonSymbols(QSpinBox::NoButtons); m_sec->setToolTip(tr("Seconds")); timeHBox->addWidget(m_sec); connect(m_sec, SIGNAL(valueChanged(int)), this, SLOT(slotSecondsChanged())); connect(m_sec, SIGNAL(focusGained()), this, SLOT(slotSpinFocusGained())); m_ms = new FocusSpinBox(this); m_ms->setRange(0, MS_MAX); m_ms->setSuffix("ms"); m_ms->setButtonSymbols(QSpinBox::NoButtons); m_ms->setToolTip(tr("Milliseconds")); timeHBox->addWidget(m_ms); connect(m_ms, SIGNAL(valueChanged(int)), this, SLOT(slotMSChanged())); connect(m_ms, SIGNAL(focusGained()), this, SLOT(slotSpinFocusGained())); m_infiniteCheck = new QCheckBox(this); m_infiniteCheck->setText(tr("Infinite")); layout()->addWidget(m_infiniteCheck); connect(m_infiniteCheck, SIGNAL(toggled(bool)), this, SLOT(slotInfiniteChecked(bool))); m_focus = m_ms; m_dial->setRange(m_focus->minimum(), m_focus->maximum()); m_dial->setSingleStep(m_focus->singleStep()); m_timer->setInterval(TIMER_HOLD); connect(m_timer, SIGNAL(timeout()), this, SLOT(slotPlusMinusTimeout())); m_tapTickElapseTimer = new QTimer(); #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) m_tapTickElapseTimer->setTimerType(Qt::PreciseTimer); #endif m_tapTickElapseTimer->setSingleShot(true); connect(m_tapTickElapseTimer, SIGNAL(timeout()), this, SLOT(slotTapTimeout())); //Hide elements according to current visibility mask setVisibilityMask(m_visibilityMask); }