📄 clock.cpp
字号:
/************************************************************************ Copyright (C) 2000-2002 Trolltech AS. All rights reserved.**** This file is part of the Qtopia Environment.**** This file may be distributed and/or modified under the terms of the** GNU General Public License version 2 as published by the Free Software** Foundation and appearing in the file LICENSE.GPL included in the** packaging of this file.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.**** See http://www.trolltech.com/gpl/ for GPL licensing information.**** Contact info@trolltech.com if any conditions of this licensing are** not clear to you.************************************************************************/#include "clock.h"#include "analogclock.h"#include <qtopia/qpeapplication.h>#ifdef QWS#include <qtopia/qcopenvelope_qws.h>#endif#include <qtopia/config.h>#include <qtopia/timestring.h>#include <qtopia/alarmserver.h>#include <qtopia/sound.h>#include <qtopia/resource.h>#include <qlcdnumber.h>#include <qlabel.h>#include <qtimer.h>#include <qpushbutton.h>#include <qtoolbutton.h>#include <qpainter.h>#include <qtabwidget.h>#include <qspinbox.h>#include <qcombobox.h>#include <qcheckbox.h>#include <qgroupbox.h>#include <qmessagebox.h>#include <qtimer.h>#include <qlayout.h>#include <qhbox.h>#include <qlineedit.h>static const int sw_prec = 2;static const int magic_daily = 2292922;static const int magic_countdown = 2292923;static void toggleScreenSaver( bool on ){ QPEApplication::setTempScreenSaverMode(on ? QPEApplication::Enable : QPEApplication::DisableSuspend); }class MySpinBox : public QSpinBox{public: QLineEdit *lineEdit() const { return editor(); }};Clock::Clock( QWidget * parent, const char *, WFlags f ) : ClockBase( parent, "clock", f ), swatch_splitms(99), init(FALSE) // No tr{ alarmDlg = 0; alarmDlgLabel = 0; swLayout = 0; dayBtn = new QToolButton * [7]; Config config( "qpe" ); config.setGroup("Time"); ampm = config.readBoolEntry( "AMPM", TRUE ); onMonday = config.readBoolEntry( "MONDAY" ); connect( tabs, SIGNAL(currentChanged(QWidget*)), this, SLOT(tabChanged(QWidget*)) ); analogStopwatch = new AnalogClock( swFrame ); stopwatchLcd = new QLCDNumber( swFrame ); stopwatchLcd->setFrameStyle( QFrame::NoFrame ); stopwatchLcd->setSegmentStyle( QLCDNumber::Flat ); stopwatchLcd->setSizePolicy( QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred) ); analogClock->display( QTime::currentTime() ); clockLcd->setNumDigits( 5 ); clockLcd->setFixedWidth( clockLcd->sizeHint().width() ); date->setText( TimeString::localYMD( QDate::currentDate(), TimeString::Long ) ); if ( qApp->desktop()->width() < 200 ) date->setFont( QFont(date->font().family(), 14, QFont::Bold) ); if ( qApp->desktop()->height() > 240 ) { clockLcd->setFixedHeight( 30 ); stopwatchLcd->setFixedHeight( 30 ); } connect( stopStart, SIGNAL(pressed()), SLOT(stopStartStopWatch()) ); connect( reset, SIGNAL(pressed()), SLOT(resetStopWatch()) ); t = new QTimer( this ); connect( t, SIGNAL(timeout()), SLOT(updateClock()) ); t->start( 1000 ); applyAlarmTimer = new QTimer( this ); connect( applyAlarmTimer, SIGNAL(timeout()), this, SLOT(applyDailyAlarm()) ); alarmt = new QTimer( this ); connect( alarmt, SIGNAL(timeout()), SLOT(alarmTimeout()) ); connect( qApp, SIGNAL(timeChanged()), SLOT(updateClock()) ); connect( qApp, SIGNAL(timeChanged()), SLOT(applyDailyAlarm()) ); swatch_running = FALSE; swatch_totalms = 0; swatch_currLap = 0; swatch_dispLap = 0; stopwatchLcd->setNumDigits( 8+1+sw_prec ); stopwatchLcd->display( "00:00:00.00" ); QVBoxLayout *lvb = new QVBoxLayout( lapFrame ); nextLapBtn = new QToolButton( UpArrow, lapFrame ); connect( nextLapBtn, SIGNAL(clicked()), this, SLOT(nextLap()) ); nextLapBtn->setAccel( Key_Up ); lvb->addWidget( nextLapBtn ); prevLapBtn = new QToolButton( DownArrow, lapFrame ); connect( prevLapBtn, SIGNAL(clicked()), this, SLOT(prevLap()) ); prevLapBtn->setAccel( Key_Down ); prevLapBtn->setMinimumWidth( 15 ); lvb->addWidget( prevLapBtn ); prevLapBtn->setEnabled( FALSE ); nextLapBtn->setEnabled( FALSE ); reset->setEnabled( FALSE ); lapLcd->setNumDigits( 8+1+sw_prec ); lapLcd->display( "00:00:00.00" ); splitLcd->setNumDigits( 8+1+sw_prec ); splitLcd->display( "00:00:00.00" ); lapNumLcd->display( 1 ); lapTimer = new QTimer( this ); connect( lapTimer, SIGNAL(timeout()), this, SLOT(lapTimeout()) ); for (uint s = 0; s < swatch_splitms.count(); s++ ) swatch_splitms[(int)s] = 0; connect( qApp, SIGNAL(clockChanged(bool)), this, SLOT(changeClock(bool)) ); cdGroup->hide(); // XXX implement countdown timer. connect( dailyHour, SIGNAL(valueChanged(int)), this, SLOT(scheduleApplyDailyAlarm()) ); connect( dailyMinute, SIGNAL(valueChanged(int)), this, SLOT(setDailyMinute(int)) ); connect( dailyAmPm, SIGNAL(activated(int)), this, SLOT(setDailyAmPm(int)) ); connect( dailyEnabled, SIGNAL(toggled(bool)), this, SLOT(enableDaily(bool)) ); cdLcd->display( "00:00" ); dailyMinute->setValidator(0); Config cConfig( "Clock" ); // No tr cConfig.setGroup( "Daily Alarm" ); QStringList days; days.append( tr("Mon", "Monday") ); days.append( tr("Tue", "Tuesday") ); days.append( tr("Wed", "Wednesday") ); days.append( tr("Thu", "Thursday") ); days.append( tr("Fri", "Friday") ); days.append( tr("Sat", "Saturday") ); days.append( tr("Sun", "Sunday") ); int i; QHBoxLayout *hb = new QHBoxLayout( daysFrame ); for ( i = 0; i < 7; i++ ) { dayBtn[i] = new QToolButton( daysFrame ); hb->addWidget( dayBtn[i] ); dayBtn[i]->setToggleButton( TRUE ); dayBtn[i]->setOn( TRUE ); dayBtn[i]->setFocusPolicy( StrongFocus ); connect( dayBtn[i], SIGNAL(toggled(bool)), this, SLOT(scheduleApplyDailyAlarm()) ); } for ( i = 0; i < 7; i++ ) dayBtn[dayBtnIdx(i+1)]->setText( days[i] ); QStringList exclDays = cConfig.readListEntry( "ExcludeDays", ',' ); QStringList::Iterator it; for ( it = exclDays.begin(); it != exclDays.end(); ++it ) { int d = (*it).toInt(); if ( d >= 1 && d <= 7 ) dayBtn[dayBtnIdx(d)]->setOn( FALSE ); } bool alarm = cConfig.readBoolEntry("Enabled", FALSE); dailyEnabled->setChecked( alarm ); int m = cConfig.readNumEntry( "Minute", 0 ); dailyMinute->setValue( m );// dailyMinute->setPrefix( m <= 9 ? "0" : "" ); int h = cConfig.readNumEntry( "Hour", 7 ); if ( ampm ) { if (h > 12) { h -= 12; dailyAmPm->setCurrentItem( 1 ); } if (h == 0) h = 12; dailyHour->setMinValue( 1 ); dailyHour->setMaxValue( 12 ); } else { dailyAmPm->hide(); } dailyHour->setValue( h ); connect( ((MySpinBox*)dailyHour)->lineEdit(), SIGNAL(textChanged(const QString&)), this, SLOT(dailyEdited()) ); connect( ((MySpinBox*)dailyMinute)->lineEdit(), SIGNAL(textChanged(const QString&)), this, SLOT(dailyEdited()) );#if defined(Q_WS_QWS) && !defined(QT_NO_COP) connect( qApp, SIGNAL(appMessage(const QCString&, const QByteArray&)), this, SLOT(appMessage(const QCString&, const QByteArray&)) );#endif QTimer::singleShot( 0, this, SLOT(updateClock()) ); swFrame->installEventFilter( this ); init = TRUE;}Clock::~Clock(){ toggleScreenSaver( true ); delete [] dayBtn;}void Clock::updateClock(){ if ( tabs->currentPageIndex() == 0 ) { QTime tm = QDateTime::currentDateTime().time(); QString s; if ( ampm ) { int hour = tm.hour(); if (hour == 0) hour = 12; if (hour > 12) hour -= 12; s.sprintf( "%2d%c%02d", hour, ':', tm.minute() ); clockAmPm->setText( (tm.hour() >= 12) ? "PM" : "AM" ); clockAmPm->show(); } else { s.sprintf( "%2d%c%02d", tm.hour(), ':', tm.minute() ); clockAmPm->hide(); } clockLcd->display( s ); clockLcd->repaint( FALSE ); analogClock->display( QTime::currentTime() ); date->setText( TimeString::localYMD( QDate::currentDate(), TimeString::Long ) ); } else if ( tabs->currentPageIndex() == 1 ) { int totalms = swatch_totalms; if ( swatch_running ) totalms += swatch_start.elapsed(); setSwatchLcd( stopwatchLcd, totalms, !swatch_running ); QTime swatch_time = QTime(0,0,0).addMSecs(totalms); analogStopwatch->display( swatch_time ); if ( swatch_dispLap == swatch_currLap ) { swatch_splitms[swatch_currLap] = swatch_totalms; if ( swatch_running ) swatch_splitms[swatch_currLap] += swatch_start.elapsed(); updateLap(); } } else if ( tabs->currentPageIndex() == 2 ) { // nothing. }}void Clock::changeClock( bool a ){ if ( ampm != a ) { int minute = dailyMinute->value(); int hour = dailyHour->value(); if ( ampm ) { if (hour == 12) hour = 0; if (dailyAmPm->currentItem() == 1 ) hour += 12; dailyHour->setMinValue( 0 ); dailyHour->setMaxValue( 23 ); dailyAmPm->hide(); } else { if (hour > 12) { hour -= 12; dailyAmPm->setCurrentItem( 1 ); } if (hour == 0) hour = 12; dailyHour->setMinValue( 1 ); dailyHour->setMaxValue( 12 ); dailyAmPm->show(); } dailyMinute->setValue( minute ); dailyHour->setValue( hour ); } ampm = a; updateClock();}void Clock::stopStartStopWatch(){ if ( swatch_running ) { swatch_totalms += swatch_start.elapsed(); swatch_splitms[swatch_currLap] = swatch_totalms; stopStart->setText( tr("Start") ); reset->setText( tr("Reset") ); reset->setEnabled( TRUE ); t->stop(); swatch_running = FALSE; toggleScreenSaver( TRUE ); updateClock(); } else { swatch_start.start(); stopStart->setText( tr("Stop") ); reset->setText( tr("Lap/Split") ); reset->setEnabled( swatch_currLap < 98 ); t->start( 1000 ); swatch_running = TRUE; // disable screensaver while stop watch is running toggleScreenSaver( FALSE ); } swatch_dispLap = swatch_currLap; updateLap(); prevLapBtn->setEnabled( swatch_dispLap ); nextLapBtn->setEnabled( swatch_dispLap < swatch_currLap ); stopStart->setAccel( Key_Return );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -