📄 clock.cpp
字号:
}void Clock::resetStopWatch(){ if ( swatch_running ) { swatch_splitms[swatch_currLap] = swatch_totalms+swatch_start.elapsed(); swatch_dispLap = swatch_currLap; if ( swatch_currLap < 98 ) // allow up to 99 laps swatch_currLap++; reset->setEnabled( swatch_currLap < 98 ); updateLap(); lapTimer->start( 2000, TRUE ); } else { swatch_start.start(); swatch_totalms = 0; swatch_currLap = 0; swatch_dispLap = 0; for ( uint i = 0; i < swatch_splitms.count(); i++ ) swatch_splitms[(int)i] = 0; updateLap(); updateClock(); reset->setText( tr("Lap/Split") ); reset->setEnabled( FALSE ); } prevLapBtn->setEnabled( swatch_dispLap ); nextLapBtn->setEnabled( swatch_dispLap < swatch_currLap );}void Clock::prevLap(){ if ( swatch_dispLap > 0 ) { swatch_dispLap--; updateLap(); prevLapBtn->setEnabled( swatch_dispLap ); nextLapBtn->setEnabled( swatch_dispLap < swatch_currLap ); }}void Clock::nextLap(){ if ( swatch_dispLap < swatch_currLap ) { swatch_dispLap++; updateLap(); prevLapBtn->setEnabled( swatch_dispLap ); nextLapBtn->setEnabled( swatch_dispLap < swatch_currLap ); }}void Clock::lapTimeout(){ swatch_dispLap = swatch_currLap; updateLap(); prevLapBtn->setEnabled( swatch_dispLap ); nextLapBtn->setEnabled( swatch_dispLap < swatch_currLap );}void Clock::updateLap(){ if ( swatch_running && swatch_currLap == swatch_dispLap ) { swatch_splitms[swatch_currLap] = swatch_totalms; swatch_splitms[swatch_currLap] += swatch_start.elapsed(); } int split = swatch_splitms[swatch_dispLap]; int lap; if ( swatch_dispLap > 0 ) lap = swatch_splitms[swatch_dispLap] - swatch_splitms[swatch_dispLap-1]; else lap = swatch_splitms[swatch_dispLap]; lapNumLcd->display( swatch_dispLap+1 ); bool showMs = !swatch_running || swatch_dispLap!=swatch_currLap; setSwatchLcd( lapLcd, lap, showMs ); setSwatchLcd( splitLcd, split, showMs );}void Clock::setSwatchLcd( QLCDNumber *lcd, int ms, bool showMs ){ QTime swatch_time = QTime(0,0,0).addMSecs(ms); QString d = showMs ? QString::number(ms%1000+1000) : QString(" "); QString lcdtext = swatch_time.toString() + "." + d.right(3).left(sw_prec); lcd->display( lcdtext ); lcd->repaint( FALSE );}bool Clock::eventFilter( QObject *o, QEvent *e ){ if ( o == swFrame && e->type() == QEvent::Resize ) { QResizeEvent *re = (QResizeEvent *)e; delete swLayout; if ( re->size().height() < 80 || re->size().height()*3 < re->size().width() ) swLayout = new QHBoxLayout( swFrame ); else swLayout = new QVBoxLayout( swFrame ); swLayout->addWidget( analogStopwatch ); swLayout->addWidget( stopwatchLcd ); swLayout->activate(); } return FALSE;}void Clock::tabChanged( QWidget * ){ if ( tabs->currentPageIndex() == 0 ) { t->start(1000); } else if ( tabs->currentPageIndex() == 1 ) { if ( !swatch_running ) t->stop(); stopStart->setAccel( Key_Return ); } else if ( tabs->currentPageIndex() == 2 ) { t->start(1000); } updateClock();}void Clock::setDailyAmPm(int){ scheduleApplyDailyAlarm();}void Clock::setDailyMinute( int m ){ dailyMinute->setPrefix( m <= 9 ? "0" : "" );}void Clock::dailyEdited(){ if ( spinBoxValid(dailyMinute) && spinBoxValid(dailyHour) ) scheduleApplyDailyAlarm(); else applyAlarmTimer->stop();}void Clock::enableDaily( bool ){ scheduleApplyDailyAlarm();}void Clock::appMessage( const QCString &msg, const QByteArray &data ){ if ( msg == "alarm(QDateTime,int)" ) { QDataStream ds(data,IO_ReadOnly); QDateTime when; int t; ds >> when >> t; QTime theTime( when.time() ); if ( t == magic_daily ) { QString msg = tr("<b>Daily Alarm:</b><p>"); QString ts; if ( ampm ) { bool pm = FALSE; int h = theTime.hour(); if (h > 12) { h -= 12; pm = TRUE; } if (h == 0) h = 12; ts.sprintf( "%02d:%02d %s", h, theTime.minute(), pm?"PM":"AM" ); } else { ts.sprintf( "%02d:%02d", theTime.hour(), theTime.minute() ); } msg += ts; Sound::soundAlarm(); alarmCount = 0; alarmt->start( 5000 ); if ( !alarmDlg ) { alarmDlg = new QDialog( this, 0, TRUE ); alarmDlg->setCaption( tr("Clock") ); QVBoxLayout *vb = new QVBoxLayout( alarmDlg, 6 ); QHBoxLayout *hb = new QHBoxLayout( vb ); QLabel *l = new QLabel( alarmDlg ); l->setPixmap( Resource::loadPixmap("alarmbell") ); hb->addWidget(l); alarmDlgLabel = new QLabel( msg, alarmDlg ); alarmDlgLabel->setAlignment( AlignCenter ); hb->addWidget(alarmDlgLabel); QPushButton *cmdOk = new QPushButton( tr("OK"), alarmDlg ); vb->addWidget(cmdOk); connect( cmdOk, SIGNAL(clicked()), alarmDlg, SLOT(accept()) ); } else { alarmDlgLabel->setText(msg); } // Set for tomorrow, so user wakes up every day, even if they // don't confirm the dialog. applyDailyAlarm(); if ( !alarmDlg->isVisible() ) { QPEApplication::execDialog(alarmDlg); alarmt->stop(); } } else if ( t == magic_countdown ) { // countdown Sound::soundAlarm(); } } else if ( msg == "setDailyEnabled(int)" ) { QDataStream ds(data,IO_ReadOnly); int enableDaily; ds >> enableDaily; dailyEnabled->setChecked( enableDaily ); applyDailyAlarm(); } else if ( msg == "editDailyAlarm()" ) { tabs->setCurrentPage(2); QPEApplication::setKeepRunning(); } else if (msg == "showClock()") { tabs->setCurrentPage(0); QPEApplication::setKeepRunning(); }}void Clock::alarmTimeout(){ if ( alarmCount < 10 ) { Sound::soundAlarm(); alarmCount++; } else { alarmCount = 0; alarmt->stop(); }}QDateTime Clock::nextAlarm( int h, int m ){ QDateTime now = QDateTime::currentDateTime(); QTime at( h, m ); QDateTime when( now.date(), at ); int count = 0; int dow = when.date().dayOfWeek(); while ( when < now || !dayBtn[dayBtnIdx(dow)]->isOn() ) { when = when.addDays( 1 ); dow = when.date().dayOfWeek(); if ( ++count > 7 ) return QDateTime(); } return when;}int Clock::dayBtnIdx( int d ) const{ if ( onMonday ) return d-1; else if ( d == 7 ) return 0; else return d;}void Clock::scheduleApplyDailyAlarm(){ applyAlarmTimer->start( 5000, TRUE );}void Clock::applyDailyAlarm(){ if ( !init ) return; applyAlarmTimer->stop(); int minute = dailyMinute->value(); int hour = dailyHour->value(); if ( ampm ) { if (hour == 12) hour = 0; if (dailyAmPm->currentItem() == 1 ) hour += 12; } Config config( "Clock" ); config.setGroup( "Daily Alarm" ); config.writeEntry( "Hour", hour ); config.writeEntry( "Minute", minute ); bool enableDaily = dailyEnabled->isChecked(); config.writeEntry( "Enabled", enableDaily ); QString exclDays; int exclCount = 0; for ( int i = 1; i <= 7; i++ ) { if ( !dayBtn[dayBtnIdx(i)]->isOn() ) { if ( !exclDays.isEmpty() ) exclDays += ","; exclDays += QString::number( i ); exclCount++; } } config.writeEntry( "ExcludeDays", exclDays ); AlarmServer::deleteAlarm(QDateTime(), "QPE/Application/clock", "alarm(QDateTime,int)", magic_daily); if ( dailyEnabled->isChecked() && exclCount < 7 ) { QDateTime when = nextAlarm( hour, minute ); AlarmServer::addAlarm(when, "QPE/Application/clock", "alarm(QDateTime,int)", magic_daily); }}bool Clock::validDaysSelected(void){ for ( int i = 1; i <= 7; i++ ) { if ( dayBtn[dayBtnIdx(i)]->isOn() ) { return TRUE; } } return FALSE;}void Clock::closeEvent( QCloseEvent *e ){ if (dailyEnabled->isChecked()) { if (!validDaysSelected()) { QMessageBox::warning(this, tr("Select Day"), tr("Daily alarm requires at least\none day to be selected.")); return; } } applyDailyAlarm(); ClockBase::closeEvent(e);}bool Clock::spinBoxValid( QSpinBox *sb ){ bool valid = TRUE; QString tv = sb->text(); for ( uint i = 0; i < tv.length(); i++ ) { if ( !tv[0].isDigit() ) valid = FALSE; } bool ok = FALSE; int v = tv.toInt( &ok ); if ( !ok ) valid = FALSE; if ( v < sb->minValue() || v > sb->maxValue() ) valid = FALSE; return valid;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -