-rw-r--r-- | noncore/tools/clock/analogclock.cpp | 2 | ||||
-rw-r--r-- | noncore/tools/clock/clock.cpp | 1156 | ||||
-rw-r--r-- | noncore/tools/clock/clock.h | 112 | ||||
-rw-r--r-- | noncore/tools/clock/clock.pro | 9 | ||||
-rw-r--r-- | noncore/tools/clock/clockbase.ui | 111 | ||||
-rw-r--r-- | noncore/tools/clock/main.cpp | 8 |
6 files changed, 823 insertions, 575 deletions
diff --git a/noncore/tools/clock/analogclock.cpp b/noncore/tools/clock/analogclock.cpp index bf358e2..c5f0155 100644 --- a/noncore/tools/clock/analogclock.cpp +++ b/noncore/tools/clock/analogclock.cpp @@ -1,175 +1,175 @@ /********************************************************************** ** 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 "analogclock.h" #include <qlayout.h> #include <qpainter.h> #include <qtopia/global.h> #include <math.h> const double deg2rad = 0.017453292519943295769; // pi/180 AnalogClock::AnalogClock( QWidget *parent, const char *name ) : QFrame( parent, name ), clear(false) { setMinimumSize(50,50); } QSizePolicy AnalogClock::sizePolicy() const { return QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ); } void AnalogClock::drawContents( QPainter *p ) { #if !defined(NO_DEBUG) static bool first = true; if ( first ) { - QTOPIA_PROFILE("first paint event"); +// QTOPIA_PROFILE("first paint event"); first = false; } #endif QRect r = contentsRect(); if ( r.width() < r.height() ) { r.setY( (r.height() - r.width())/2 ); r.setHeight( r.width() ); } QPoint center( r.x() + r.width() / 2, r.y() + r.height() / 2 ); const int w_tick = r.width()/300+1; const int w_sec = r.width()/400+1; const int w_hour = r.width()/80+1; QPoint l1( r.x() + r.width() / 2, r.y() + 2 ); QPoint l2( r.x() + r.width() / 2, r.y() + 8 ); QPoint h1( r.x() + r.width() / 2, r.y() + r.height() / 4 ); QPoint h2( r.x() + r.width() / 2, r.y() + r.height() / 2 ); QPoint m1( r.x() + r.width() / 2, r.y() + r.height() / 9 ); QPoint m2( r.x() + r.width() / 2, r.y() + r.height() / 2 ); QPoint s1( r.x() + r.width() / 2, r.y() + 8 ); QPoint s2( r.x() + r.width() / 2, r.y() + r.height() / 2 ); QColor color( clear ? backgroundColor() : black ); QTime time = clear ? prevTime : currTime; if ( clear && prevTime.secsTo(currTime) > 1 ) { p->eraseRect( rect() ); return; } if ( !clear ) { // draw ticks p->setPen( QPen( color, w_tick ) ); for ( int i = 0; i < 12; i++ ) p->drawLine( rotate( center, l1, i * 30 ), rotate( center, l2, i * 30 ) ); } if ( !clear || prevTime.minute() != currTime.minute() || prevTime.hour() != currTime.hour() ) { // draw hour pointer h1 = rotate( center, h1, 30 * ( time.hour() % 12 ) + time.minute() / 2 ); h2 = rotate( center, h2, 30 * ( time.hour() % 12 ) + time.minute() / 2 ); p->setPen( color ); p->setBrush( color ); drawHand( p, h1, h2 ); } if ( !clear || prevTime.minute() != currTime.minute() ) { // draw minute pointer m1 = rotate( center, m1, time.minute() * 6 ); m2 = rotate( center, m2, time.minute() * 6 ); p->setPen( color ); p->setBrush( color ); drawHand( p, m1, m2 ); } // draw second pointer s1 = rotate( center, s1, time.second() * 6 ); s2 = rotate( center, s2, time.second() * 6 ); p->setPen( QPen( color, w_sec ) ); p->drawLine( s1, s2 ); // cap p->setBrush(color); p->drawEllipse( center.x()-w_hour/2, center.y()-w_hour/2, w_hour, w_hour ); if ( !clear ) prevTime = currTime; } // Dijkstra's bisection algorithm to find the square root as an integer. static uint int_sqrt(uint n) { if ( n >= UINT_MAX>>2 ) // n must be in the range 0...UINT_MAX/2-1 return 2*int_sqrt( n/4 ); uint h, p= 0, q= 1, r= n; while ( q <= n ) q <<= 2; while ( q != 1 ) { q >>= 2; h= p + q; p >>= 1; if ( r >= h ) { p += q; r -= h; } } return p; } void AnalogClock::drawHand( QPainter *p, QPoint p1, QPoint p2 ) { int hw = 7; if ( contentsRect().height() < 100 ) hw = 5; int dx = p2.x() - p1.x(); int dy = p2.y() - p1.y(); int w = dx*dx+dy*dy; int ix,iy; w = int_sqrt(w*256); iy = w ? (hw * dy * 16)/ w : dy ? 0 : hw; ix = w ? (hw * dx * 16)/ w : dx ? 0 : hw; // rounding dependent on sign int nix, niy; if ( ix < 0 ) { nix = ix/2; ix = (ix-1)/2; } else { nix = (ix+1)/2; ix = ix/2; } if ( iy < 0 ) { niy = iy/2; iy = (iy-1)/2; } else { niy = (iy+1)/2; iy = iy/2; } diff --git a/noncore/tools/clock/clock.cpp b/noncore/tools/clock/clock.cpp index 485354b..ad422a6 100644 --- a/noncore/tools/clock/clock.cpp +++ b/noncore/tools/clock/clock.cpp @@ -1,664 +1,806 @@ /********************************************************************** -** Copyright (C) 2000 Trolltech AS. All rights reserved. +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. ** -** This file is part of Qtopia Environment. +** 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. ** **********************************************************************/ // changes added and Copyright (C) by L. J. Potter <ljp@llornkcor.com> 2002 +// changes added and Copyright (C) by Holger Freyther 2004 #include "clock.h" -#include "setAlarm.h" + +#include "analogclock.h" + +#include <qtabwidget.h> + +#include <opie2/ofiledialog.h> #include <qpe/qpeapplication.h> #include <qpe/qcopenvelope_qws.h> #include <qpe/config.h> #include <qpe/timestring.h> #include <qpe/alarmserver.h> #include <qpe/sound.h> #include <qpe/resource.h> #include <qsound.h> #include <qtimer.h> -#include <opie2/oclickablelabel.h> + #include <qlcdnumber.h> #include <qslider.h> #include <qlabel.h> -#include <qlayout.h> #include <qtimer.h> #include <qpushbutton.h> -#include <qradiobutton.h> -#include <qbuttongroup.h> +#include <qtoolbutton.h> #include <qpainter.h> #include <qmessagebox.h> #include <qdatetime.h> +#include <qspinbox.h> +#include <qcombobox.h> +#include <qcheckbox.h> +#include <qgroupbox.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 const int magic_snooze = 2292924; +static const int magic_playmp = 2292925; #include <math.h> #include <unistd.h> #include <sys/types.h> #include <pthread.h> -const double deg2rad = 0.017453292519943295769; // pi/180 -const int sw_prec = 2; - -using namespace Opie::Ui; -void startPlayer() +static void toggleScreenSaver( bool on ) { - Config config( "qpe" ); - config.setGroup( "Time" ); - sleep(15); - QCopEnvelope e( "QPE/Application/opieplayer", "setDocument(QString)" ); - e << config.readEntry( "mp3File", "" ); + QCopEnvelope e( "QPE/System", "setScreenSaverMode(int)" ); + e << ( on ? QPEApplication::Enable : QPEApplication::DisableSuspend ); } - -static void toggleScreenSaver( bool on ) +static void startPlayer() { - QCopEnvelope e( "QPE/System", "setScreenSaverMode(int)" ); - e << ( on ? QPEApplication::Enable : QPEApplication::DisableSuspend ); + Config config( "qpe" ); + config.setGroup( "Time" ); + sleep(15); + QCopEnvelope e( "QPE/Application/opieplayer", "setDocument(QString)" ); + e << config.readEntry( "mp3File", "" ); } -Clock::Clock( QWidget * parent, const char * name, WFlags f ) - : QVBox( parent, name , f ) +class MySpinBox : public QSpinBox { - setSpacing( 4 ); - setMargin( 1 ); - - - snoozeBtn = new QPushButton ( this ); - snoozeBtn->setText( tr( "Snooze" ) ); - - aclock = new AnalogClock( this ); - aclock->display( QTime::currentTime() ); - aclock->setLineWidth( 2 ); - - QHBox *hb = new QHBox( this ); - hb->setMargin( 0 ); - QWidget *space = new QWidget( hb ); - lcd = new QLCDNumber( hb ); - lcd->setSegmentStyle( QLCDNumber::Flat ); - lcd->setFrameStyle( QFrame::NoFrame ); - lcd->setSizePolicy( QSizePolicy( QSizePolicy::Minimum, QSizePolicy::Minimum ) ); - lcd->setFixedHeight( 23 ); - - ampmLabel = new QLabel( tr( "PM" ), hb ); - ampmLabel->setFont( QFont( "Helvetica", 14, QFont::Bold ) ); - ampmLabel->setSizePolicy( QSizePolicy( QSizePolicy::Minimum, QSizePolicy::Preferred ) ); - ampmLabel->setAlignment( AlignLeft | AlignBottom ); - space = new QWidget( hb ); - - date = new QLabel( this ); - date->setAlignment( AlignHCenter | AlignVCenter ); - date->setFont( QFont( "Helvetica", 14, QFont::Bold ) ); - date->setText( TimeString::longDateString( QDate::currentDate() ) ); - - QWidget *controls = new QWidget( this ); - QGridLayout *gl = new QGridLayout( controls, 3, 2, 6, 4 ); +public: + QLineEdit *lineEdit() const { + return editor(); + } +}; + +// +// +// +AlarmDlg::AlarmDlg(QWidget *parent, const char *name, bool modal, + const QString &txt) : + AlarmDlgBase(parent, name, modal) +{ + setCaption( tr("Clock") ); + pixmap->setPixmap( Resource::loadPixmap("alarmbell") ); + alarmDlgLabel->setText(txt); - QButtonGroup *grp = new QButtonGroup( controls ); - grp->setRadioButtonExclusive( true ); - grp->hide(); + connect(snoozeTime, SIGNAL(valueChanged(int)), this, + SLOT(changePrompt(int))); + connect(cmdOk, SIGNAL(clicked()), this, SLOT(checkSnooze())); +} - clockRB = new QRadioButton ( tr( "Clock" ), controls ); - gl->addWidget( clockRB, 0, 0 ); - grp->insert( clockRB ); +// +// +// +void +AlarmDlg::setText(const QString &txt) +{ + alarmDlgLabel->setText(txt); +} - swatchRB = new QRadioButton ( tr( "Stopwatch" ), controls ); - gl->addWidget( swatchRB, 1, 0 ); - grp->insert( swatchRB ); +// +// +// +void +AlarmDlg::checkSnooze(void) +{ + // + // Ensure we have only one snooze alarm. + // + AlarmServer::deleteAlarm(QDateTime(), "QPE/Application/clock", + "alarm(QDateTime,int)", magic_snooze); + + if (snoozeTime->value() > 0) { + QDateTime wake = QDateTime::currentDateTime(); + wake = wake.addSecs(snoozeTime->value() * 60); // snoozeTime in minutes + + AlarmServer::addAlarm(wake, "QPE/Application/clock", + "alarm(QDateTime,int)", magic_snooze); + } + accept(); +} - connect( grp, SIGNAL( clicked(int) ), this, SLOT( modeSelect(int) ) ); - grp->setButton( 0 ); - set = new QPushButton ( controls ); - set->setMaximumSize( 50, 30 ); - gl->addWidget( set , 0, 1 ); - set->setText( tr( "Start" ) ); - set->setEnabled( FALSE ); - grp->insert( set ); - reset = new QPushButton ( controls ); - gl->addWidget( reset, 1, 1 ); - reset->setText( tr( "Reset" ) ); - reset->setEnabled( FALSE ); - grp->insert( reset ); +void +AlarmDlg::changePrompt(int mins) +{ + cmdOk->setText(mins > 0 ? tr("Snooze") : tr("Close") ); +} - alarmOffBtn = new QPushButton ( controls ); - gl->addWidget( alarmOffBtn, 0, 2 ); - alarmBtn = new QPushButton ( controls ); - gl->addWidget( alarmBtn, 1, 2 ); - alarmBtn->setText( tr( "Set Alarm" ) ); +Clock::Clock( QWidget * parent, const char *, WFlags f ) + : ClockBase( parent, "clock", f ), swatch_splitms(99), init(FALSE) // No tr +{ + alarmDlg = 0; + swLayout = 0; + dayBtn = new QToolButton * [7]; - OClickableLabel *click = new Opie::Ui::OClickableLabel( controls, "label" ); - click->setText( tr( "Set date and time." ) ); - gl->addMultiCellWidget( click, 3, 3, 0, 2, AlignHCenter ); - connect( click, SIGNAL( clicked() ), this, SLOT( slotAdjustTime() ) ); + 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::dateString( QDate::currentDate(), TimeString::currentDateFormat() ) ); + 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( set , SIGNAL( pressed() ), SLOT( slotSet() ) ); - connect( reset, SIGNAL( clicked() ), SLOT( slotReset() ) ); + connect( stopStart, SIGNAL(pressed()), SLOT(stopStartStopWatch()) ); + connect( reset, SIGNAL(pressed()), SLOT(resetStopWatch()) ); - connect( alarmBtn, SIGNAL( clicked() ), SLOT( slotSetAlarm() ) ); - connect( snoozeBtn, SIGNAL( clicked() ), SLOT( slotSnooze() ) ); - connect( alarmOffBtn, SIGNAL( clicked() ), SLOT( slotToggleAlarm() ) ); + t = new QTimer( this ); + connect( t, SIGNAL(timeout()), SLOT(updateClock()) ); + t->start( 1000 ); - connect( qApp, SIGNAL( appMessage(const QCString&,const QByteArray&) ), - this, SLOT( appMessage(const QCString&,const QByteArray&) ) ); + applyAlarmTimer = new QTimer( this ); + connect( applyAlarmTimer, SIGNAL(timeout()), + this, SLOT(applyDailyAlarm()) ); - t = new QTimer( this ); - connect( t, SIGNAL( timeout() ), SLOT( updateClock() ) ); - t->start( 1000 ); + alarmt = new QTimer( this ); + connect( alarmt, SIGNAL(timeout()), SLOT(alarmTimeout()) ); - connect( qApp, SIGNAL( timeChanged() ), SLOT( updateClock() ) ); + connect( qApp, SIGNAL(timeChanged()), SLOT(updateClock()) ); + connect( qApp, SIGNAL(timeChanged()), SLOT(applyDailyAlarm()) ); - swatch_running = FALSE; - swatch_totalms = 0; + 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()) ); + } - connect( qApp, SIGNAL( clockChanged(bool) ), this, SLOT( changeClock(bool) ) ); + 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 ); + } - Config config( "qpe" ); - config.setGroup( "Time" ); - ampm = config.readBoolEntry( "AMPM", TRUE ); + bool alarm = cConfig.readBoolEntry("Enabled", FALSE); + bool sound = cConfig.readBoolEntry("SoundEnabled", FALSE ); + dailyEnabled->setChecked( alarm ); + sndGroup->setEnabled( alarm ); + sndCheck->setChecked( sound ); + sndChoose->setEnabled( sound ); + sndFileName->setEnabled( sound ); + + // FIXME ODP migrate to own config class.. merge config options + Config cfg_qpe( "qpe" ); + cfg_qpe.setGroup( "Time" ); + sndFileName->setText( cfg_qpe.readEntry( "mp3File" ) ); + // + + 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 ); - QString tmp = config.readEntry( "clockAlarmHour", "" ); - bool ok; - hour = tmp.toInt( &ok, 10 ); - tmp = config.readEntry( "clockAlarmMinute", "" ); - minute = tmp.toInt( &ok, 10 ); + connect( ((MySpinBox*)dailyHour)->lineEdit(), SIGNAL(textChanged(const QString&)), + this, SLOT(dailyEdited()) ); + connect( ((MySpinBox*)dailyMinute)->lineEdit(), SIGNAL(textChanged(const QString&)), + this, SLOT(dailyEdited()) ); - if ( config.readEntry( "clockAlarmSet", "FALSE" ) == "TRUE" ) - { - alarmOffBtn->setText( tr( "Alarm Is On" ) ); - alarmBool = TRUE; - snoozeBtn->show(); - } - else - { - alarmOffBtn->setText( tr( "Alarm Is Off" ) ); - alarmBool = FALSE; - snoozeBtn->hide(); - } +#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() ) ); + QTimer::singleShot( 0, this, SLOT(updateClock()) ); + swFrame->installEventFilter( this ); - Config cfg( "Clock" ); - cfg.setGroup( "Mode" ); - int mode = cfg.readBoolEntry( "clockMode"); - setSwatchMode( mode); - modeSelect( mode); + init = TRUE; } Clock::~Clock() { - toggleScreenSaver( true ); + toggleScreenSaver( true ); + delete [] dayBtn; } void Clock::updateClock() { - if ( clockRB->isChecked() ) - { - 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() ); - ampmLabel->setText( ( tm.hour() >= 12 ) ? "PM" : "AM" ); - ampmLabel->show(); - } - else - { - s.sprintf( "%2d%c%02d", tm.hour(), ':', tm.minute() ); - ampmLabel->hide(); - } - lcd->display( s ); - lcd->repaint( FALSE ); - aclock->display( QTime::currentTime() ); - date->setText( TimeString::longDateString( QDate::currentDate() ) ); - } - else - { - QTime swatch_time; - QString lcdtext; - int totalms = swatch_totalms; - if ( swatch_running ) - totalms += swatch_start.elapsed(); - swatch_time = QTime( 0, 0, 0 ).addMSecs( totalms ); - QString d = swatch_running ? QString( " " ) - : QString::number( totalms % 1000 + 1000 ); - lcdtext = swatch_time.toString() + "." + d.right( 3 ).left( sw_prec ); - lcd->display( lcdtext ); - lcd->repaint( FALSE ); - aclock->display( swatch_time ); - date->setText( TimeString::longDateString( QDate::currentDate() ) ); + 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::dateString( QDate::currentDate(), TimeString::currentDateFormat() ) ); + } 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 ) { - ampm = a; - updateClock(); + 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::clearClock( void ) +void Clock::stopStartStopWatch() { - lcd->display( QTime( 0, 0, 0 ).toString() ); - aclock->display( QTime( 0, 0, 0 ) ); + 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 ); } -void Clock::startSWatch() +void Clock::resetStopWatch() { - if(swatch_running) { - stopSWatch(); - return; - } - qDebug("startSWatch()"); - swatch_start.start(); - set->setText( tr( "Stop" ) ); - t->start( 1000 ); - swatch_running = TRUE; - // disable screensaver while stop watch is running - toggleScreenSaver( FALSE ); + 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::stopSWatch() +void Clock::prevLap() { - qDebug("stopSWatch()"); - swatch_totalms += swatch_start.elapsed(); - set->setText( tr( "Start" ) ); - t->stop(); - swatch_running = FALSE; - toggleScreenSaver( TRUE ); - updateClock(); + if ( swatch_dispLap > 0 ) { + swatch_dispLap--; + updateLap(); + prevLapBtn->setEnabled( swatch_dispLap ); + nextLapBtn->setEnabled( swatch_dispLap < swatch_currLap ); + } } - -void Clock::slotSet() +void Clock::nextLap() { - if ( t->isActive() ) - { - startSWatch(); - } - else - { - stopSWatch(); + if ( swatch_dispLap < swatch_currLap ) { + swatch_dispLap++; + updateLap(); + prevLapBtn->setEnabled( swatch_dispLap ); + nextLapBtn->setEnabled( swatch_dispLap < swatch_currLap ); } } -void Clock::slotReset() +void Clock::lapTimeout() { - t->stop(); - swatch_start.start(); - swatch_totalms = 0; - - if ( swatch_running ) - t->start( 1000 ); - - updateClock(); -} - -void Clock::modeSelect( int m ) -{ - qDebug("Clock::modeSelect( %d) ", m); - if ( m != 0 ) - { - lcd->setNumDigits( 8 + 1 + sw_prec ); - lcd->setMinimumWidth( lcd->sizeHint().width() ); - set->setEnabled( TRUE ); - reset->setEnabled( TRUE ); - ampmLabel->hide(); - -// if(m == 2) { - if ( !swatch_running ) { - t->start( 1000 ); - } -// else -// { -// stopSWatch(); -// } -// } - } - else //clock mode - { - lcd->setNumDigits( 5 ); - lcd->setMinimumWidth( lcd->sizeHint().width() ); - set->setEnabled( FALSE ); - reset->setEnabled( FALSE ); - t->start( 1000 ); - } - - Config config( "Clock" ); - config.setGroup( "Mode" ); - config.writeEntry( "clockMode", m ); - updateClock(); + swatch_dispLap = swatch_currLap; + updateLap(); + prevLapBtn->setEnabled( swatch_dispLap ); + nextLapBtn->setEnabled( swatch_dispLap < swatch_currLap ); } -//this sets the alarm time -void Clock::slotSetAlarm() +void Clock::updateLap() { - if ( !snoozeBtn->isHidden() ) - slotToggleAlarm(); - Set_Alarm *setAlarmDlg; - setAlarmDlg = new Set_Alarm( this, "SetAlarm", TRUE ); - int result = setAlarmDlg->exec(); - if ( result == 1 ) { - Config config( "qpe" ); - config.setGroup( "Time" ); - QString tmp; - hour = setAlarmDlg->Hour_Slider->value(); - minute = setAlarmDlg->Minute_Slider->value(); - snoozeTime = setAlarmDlg->SnoozeSlider->value(); - if ( ampm ) { - if ( hour == 12 ) - hour = 0; - - if ( setAlarmDlg->Pm_RadioButton->isChecked() && hour < 12 ) - hour += 12; + if ( swatch_running && swatch_currLap == swatch_dispLap ) { + swatch_splitms[swatch_currLap] = swatch_totalms; + swatch_splitms[swatch_currLap] += swatch_start.elapsed(); } - config.writeEntry( "clockAlarmHour", tmp.setNum( hour ), 10 ); - config.writeEntry( "clockAlarmMinute", tmp.setNum( minute ), 10 ); - config.writeEntry( "clockAlarmSnooze", tmp.setNum( snoozeTime ), 10 ); - config.write(); - } -} - -void Clock::slotSnooze() -{ - bSound = FALSE; - int warn = 0; - QTime t = QTime::currentTime(); - QDateTime whenl( when.date(), t.addSecs( snoozeTime * 60 ) ); - when = whenl; - AlarmServer::addAlarm( when, - "QPE/Application/clock", - "alarm(QDateTime,int)", warn ); - -} - -//toggles alarm on/off -void Clock::slotToggleAlarm() -{ - Config config( "qpe" ); - config.setGroup( "Time" ); - if ( alarmBool ) - { - config.writeEntry( "clockAlarmSet", "FALSE" ); - alarmOffBtn->setText( tr( "Alarm Is Off" ) ); - snoozeBtn->hide(); - alarmBool = FALSE; - alarmOff(); - } - else - { - config.writeEntry( "clockAlarmSet", "TRUE" ); - alarmOffBtn->setText( tr( "Alarm Is On" ) ); - snoozeBtn->show(); - alarmBool = TRUE; - alarmOn(); - } - config.write(); -} - -void Clock::alarmOn() -{ - QDate d = QDate::currentDate(); - QTime tm( ( int ) hour, ( int ) minute, 0 ); - qDebug( "Time set " + tm.toString() ); - QTime t = QTime::currentTime(); - if ( t > tm ) - d = d.addDays( 1 ); - int warn = 0; - QDateTime whenl( d, tm ); - when = whenl; - AlarmServer::addAlarm( when, - "QPE/Application/clock", - "alarm(QDateTime,int)", warn ); -// setCaption( "Alarm set: " + whenl.toString() ); - setCaption( tr("Alarm set: %1" ).arg(whenl.toString()) ); -} - -void Clock::alarmOff() -{ - int warn = 0; - bSound = FALSE; - AlarmServer::deleteAlarm( when, - "QPE/Application/clock", - "alarm(QDateTime,int)", warn ); - qDebug( "Alarm Off " + when.toString() ); - setCaption( tr("Clock") ); -} - -void Clock::clearTimer() -{ - alarmOffBtn->setText( tr( "Alarm Is Off" ) ); - alarmBool = FALSE; - snoozeBtn->hide(); - setCaption( tr("Clock") ); -} - -void Clock::appMessage( const QCString& msg, const QByteArray& /*data*/ ) -{ - int stopTimer = 0; - int timerStay = 5000; - bSound = TRUE; - qDebug( "Message received in clock" ); - if ( msg == "alarm(QDateTime,int)" ) - { - Config config( "qpe" ); - config.setGroup( "Time" ); - if ( config.readBoolEntry( "mp3Alarm", 0 ) ) - { - clearTimer(); - pthread_t thread; - pthread_create(&thread, NULL, (void * (*) (void *))startPlayer, NULL/* &*/); - - } - else - { + 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 ); +} - Sound::soundAlarm(); - stopTimer = startTimer( timerStay ); - } - } +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 ); +} - if ( msg == "timerStart()" ) - { - slotStartTimer(); - } - if ( msg == "timerStop()" ) - { - slotStopTimer(); - } - if ( msg == "timerReset()" ) - { - slotResetTimer(); +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(); } - show(); - raise(); - QPEApplication::setKeepRunning(); - setActiveWindow(); + return FALSE; } -void Clock::timerEvent( QTimerEvent *e ) +void Clock::tabChanged( QWidget * ) { - static int stop = 0; - if ( stop < 120 && bSound ) - { - Sound::soundAlarm(); - stop++; - } - else - { - stop = 0; - killTimer( e->timerId() ); - clearTimer(); - setCaption( tr( "Clock: Alarm was missed." ) ); + 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(); } -AnalogClock::AnalogClock(QWidget * parent, const char * name) : QFrame( parent, name ), clear(true) +void Clock::setDailyAmPm(int) { - QWidget *d = QApplication::desktop(); - if(d->width() <= 240) - bg = Resource::loadPixmap("clock/bg"); + scheduleApplyDailyAlarm(); } -QSizePolicy AnalogClock::sizePolicy() const +void Clock::setDailyMinute( int m ) { - return QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ); + dailyMinute->setPrefix( m <= 9 ? "0" : "" ); } -void AnalogClock::drawContents( QPainter *p ) +void Clock::dailyEdited() { - QRect r = contentsRect(); - QRect fr; - - p->drawPixmap(QPoint(0, 0), bg, r); - - if ( r. width ( ) > r. height ( )) - fr. setRect (( r. width ( ) - r. height ( )) / 2, r. y ( ), r. height ( ), r. height ( )); - else - fr. setRect ( r. x ( ), ( r. height ( ) - r. width ( )) / 2, r. width ( ), r. width ( )); - - QPoint center = fr. center ( ); // ( fr.x() + fr.width() / 2, fr.y() + fr.height() / 2 ); - QPoint l1 ( center. x ( ), fr. y ( ) + 2 ); - QPoint l2 ( center. x ( ), fr. y ( ) + 8 ); - - + if ( spinBoxValid(dailyMinute) && spinBoxValid(dailyHour) ) + scheduleApplyDailyAlarm(); + else + applyAlarmTimer->stop(); +} - if ( clear ) - { - erase ( r ); - p-> setPen ( NoPen ); - p-> setBrush ( colorGroup ( ). color ( QColorGroup::Base )); - p-> drawEllipse ( fr ); - p-> setBrush ( NoBrush ); +void Clock::enableDaily( bool ) +{ + scheduleApplyDailyAlarm(); +} - // draw ticks - p->setPen( QPen( colorGroup ( ). color ( QColorGroup::Text ), 1 ) ); - for ( int i = 0; i < 12; i++ ) - p->drawLine( rotate( center, l1, i * 30 ), rotate( center, l2, i * 30 ) ); - } - else - { - drawPointers ( p, fr, colorGroup ( ). color ( QColorGroup::Base ), prevTime, &currTime ); +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 || t == magic_snooze || + t == magic_playmp ) { + 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; + + if (t == magic_playmp ) { + pthread_t thread; + pthread_create(&thread,NULL, (void * (*) (void *))startPlayer, NULL/* &*/ ); + }else { + Sound::soundAlarm(); + alarmCount = 0; + alarmt->start( 5000 ); + } + if ( !alarmDlg ) { + alarmDlg = new AlarmDlg(this); + } + alarmDlg->setText(msg); + + // Set for tomorrow, so user wakes up every day, even if they + // don't confirm the dialog. Don't set it again when snoozing. + if (t != magic_snooze) { + 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(); + } else if (msg == "timerStart()" ) { + if ( !swatch_running ) + stopStartStopWatch(); + tabs->setCurrentPage(1); + QPEApplication::setKeepRunning(); + } else if (msg == "timerStop()" ) { + if ( swatch_running ) + stopStartStopWatch(); + tabs->setCurrentPage(1); + QPEApplication::setKeepRunning(); + } else if (msg == "timerReset()" ) { + resetStopWatch(); + tabs->setCurrentPage(1); + QPEApplication::setKeepRunning(); } - - drawPointers ( p, fr, colorGroup ( ). color ( QColorGroup::Text ), currTime ); - - prevTime = currTime; } -void AnalogClock::drawPointers ( QPainter *p, const QRect &r, const QColor &c, const QTime &t, const QTime *t2 ) +void Clock::alarmTimeout() { - QPoint center = r. center ( ); - - QPoint h1( center. x ( ), r. y ( ) + r. height ( ) / 4 ); - QPoint h2( center. x ( ), center. y ( ) ); - - QPoint m1( center. x ( ), r.y() + r.height() / 8 ); - QPoint m2( center. x ( ), center. y ( ) ); - - QPoint s1( center. x ( ), r. y ( ) + 8 ); - QPoint s2( center. x ( ), center. y ( ) ); - - - if ( !t2 || ( t. minute ( ) != t2-> minute ( ) || t. hour ( ) != t2-> hour ( ))) { - // draw hour pointer - h1 = rotate( center, h1, 30 * ( t.hour() % 12 ) + t.minute() / 2 ); - h2 = rotate( center, h2, 30 * ( t.hour() % 12 ) + t.minute() / 2 ); - p-> setPen ( QPen ( c, 3 )); - p-> drawLine ( h1, h2 ); - } + if ( alarmCount < 10 ) { + Sound::soundAlarm(); + alarmCount++; + } else { + alarmCount = 0; + alarmt->stop(); + } +} - if ( !t2 || ( t. minute ( ) != t2-> minute ( ))) { - // draw minute pointer - m1 = rotate( center, m1, t.minute() * 6 ); - m2 = rotate( center, m2, t.minute() * 6 ); - p-> setPen ( QPen ( c, 2 )); - p-> drawLine ( m1, m2 ); - } +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(); + } - if ( !t2 || ( t. second ( ) != t2-> second ( ))) { - // draw second pointer - s1 = rotate( center, s1, t.second() * 6 ); - s2 = rotate( center, s2, t.second() * 6 ); - p-> setPen ( QPen ( c, 1 )); - p-> drawLine ( s1, s2 ); - } + return when; } -void AnalogClock::display( const QTime& t ) +int Clock::dayBtnIdx( int d ) const { - currTime = t; - clear = false; - repaint( false ); - clear = true; + if ( onMonday ) + return d-1; + else if ( d == 7 ) + return 0; + else + return d; } -QPoint AnalogClock::rotate( QPoint c, QPoint p, int a ) +void Clock::scheduleApplyDailyAlarm() { - double angle = deg2rad * ( - a + 180 ); - double nx = c.x() - ( p.x() - c.x() ) * cos( angle ) - - ( p.y() - c.y() ) * sin( angle ); - double ny = c.y() - ( p.y() - c.y() ) * cos( angle ) + - ( p.x() - c.x() ) * sin( angle ); - return QPoint( nx, ny ); + applyAlarmTimer->start( 5000, TRUE ); } -void Clock::slotAdjustTime() +void Clock::applyDailyAlarm() { - QCopEnvelope e( "QPE/System", "execute(QString)" ); - e << QString( "systemtime" ); + 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(); + bool wasSound = config.readEntry( "SoundEnabled" ); + bool isSound = sndCheck->isChecked(); + int oldMagic = wasSound ? magic_playmp : magic_daily; + int isMagic = isSound ? magic_playmp : magic_daily; + config.writeEntry( "Enabled", enableDaily ); + config.writeEntry( "SoundEnabled", isSound ); + + 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 ); + + /* try to delete both */ + AlarmServer::deleteAlarm(QDateTime(), "QPE/Application/clock", + "alarm(QDateTime,int)", oldMagic); + if ( enableDaily && exclCount < 7 ) { + QDateTime when = nextAlarm( hour, minute ); + AlarmServer::addAlarm(when, "QPE/Application/clock", + "alarm(QDateTime,int)", isMagic); + } } -void Clock::slotStartTimer() +bool Clock::validDaysSelected(void) { - if ( clockRB->isChecked() ) - setSwatchMode( 1); - startSWatch(); + for ( int i = 1; i <= 7; i++ ) { + if ( dayBtn[dayBtnIdx(i)]->isOn() ) { + return TRUE; + } + } + return FALSE; } -void Clock::slotStopTimer() +void Clock::closeEvent( QCloseEvent *e ) { - if ( clockRB->isChecked() ) - setSwatchMode( 1); - stopSWatch(); + 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); } -void Clock::slotResetTimer() +bool Clock::spinBoxValid( QSpinBox *sb ) { - if ( clockRB->isChecked() ) - setSwatchMode( 1); -slotReset(); + 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; } -void Clock::setSwatchMode(int mode) -{ - qDebug("Clock::setSwatchMode( %d)", mode); - swatchRB->setChecked( mode); - clearClock( ); - modeSelect( mode ); +void Clock::slotBrowseMp3File() { + Config config( "qpe" ); + config.setGroup("Time"); + + QMap<QString, QStringList> map; + map.insert(tr("All"), QStringList() ); + QStringList text; + text << "audio/*"; + map.insert(tr("Audio"), text ); + QString str = Opie::Ui::OFileDialog::getOpenFileName( 2,"/", QString::null, map); + if(!str.isEmpty() ) { + config.writeEntry("mp3Alarm",1); + config.writeEntry("mp3File",str); + sndFileName->setText( str ); + scheduleApplyDailyAlarm(); + } } diff --git a/noncore/tools/clock/clock.h b/noncore/tools/clock/clock.h index 00d097d..c063a9b 100644 --- a/noncore/tools/clock/clock.h +++ b/noncore/tools/clock/clock.h @@ -1,112 +1,116 @@ /********************************************************************** -** Copyright (C) 2000 Trolltech AS. All rights reserved. +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. ** -** This file is part of Qtopia Environment. +** 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. ** **********************************************************************/ #ifndef CLOCK_H #define CLOCK_H +#include "clockbase.h" +#include "alarmdlgbase.h" #include <qdatetime.h> -#include <qvbox.h> -#include <qpixmap.h> -class QLCDNumber; -class QLabel; class QTimer; -class QRadioButton; -class QPushButton; -class QDateTime; +class QLabel; +class QDialog; +class AnalogClock; +class QBoxLayout; +class QToolButton; -class AnalogClock : public QFrame +class AlarmDlg: public AlarmDlgBase { Q_OBJECT public: - AnalogClock( QWidget * parent = 0, const char * name = 0 ); - - QSizePolicy sizePolicy() const; - - void display( const QTime& time ); - - -protected: - void drawContents( QPainter *p ); - -private: + AlarmDlg(QWidget *parent = 0, const char *name = 0, bool modal = TRUE, + const QString &txt = "Alarm"); - QPixmap bg; - QTime currTime; - QTime prevTime; - bool clear; + void setText(const QString &txt); - QPoint rotate( QPoint center, QPoint p, int angle ); - void drawPointers ( QPainter *, const QRect &r, const QColor &c, const QTime &t, const QTime *t2 = 0 ); +private slots: + void checkSnooze(void); + void changePrompt(int minutes); }; -class Clock : public QVBox +class Clock : public ClockBase { Q_OBJECT public: - Clock( QWidget * parent = 0, const char * name = 0, WFlags f=0 ); + Clock( QWidget *parent=0, const char *name=0, WFlags fl=0 ); ~Clock(); QDateTime when; bool bSound; int hour, minute, snoozeTime; static QString appName() { return QString::fromLatin1("clock"); } private slots: - void slotSet(); - void slotReset(); - void modeSelect(int); + void stopStartStopWatch(); + void resetStopWatch(); + void prevLap(); + void nextLap(); + void lapTimeout(); + void tabChanged(QWidget*); void updateClock(); void changeClock( bool ); - void slotSetAlarm(); - void slotSnooze(); - void slotToggleAlarm(); - void alarmOn(); - void alarmOff(); + void setDailyAmPm( int ); + void setDailyMinute( int ); + void dailyEdited(); + void enableDaily( bool ); void appMessage(const QCString& msg, const QByteArray& data); - void timerEvent( QTimerEvent *e ); - void slotAdjustTime(); + void alarmTimeout(); + void applyDailyAlarm(); + void scheduleApplyDailyAlarm(); + void slotBrowseMp3File(); + +protected: + QDateTime nextAlarm( int h, int m ); + int dayBtnIdx( int ) const; + void closeEvent( QCloseEvent *e ); + void updateLap(); + void setSwatchLcd( QLCDNumber *lcd, int ms, bool showMs ); + bool eventFilter( QObject *, QEvent * ); + bool spinBoxValid( QSpinBox *sb ); + bool validDaysSelected(void); - void slotStartTimer(); - void slotStopTimer(); - void slotResetTimer(); - void setSwatchMode( int ); private: - bool alarmBool; QTimer *t; - QLCDNumber *lcd; - QLabel *date; - QLabel *ampmLabel; - QPushButton *set, *reset, *alarmBtn, *snoozeBtn, *alarmOffBtn; - QRadioButton *clockRB, *swatchRB; - AnalogClock *aclock; + QTimer *alarmt; QTime swatch_start; int swatch_totalms; + QArray<int> swatch_splitms; bool swatch_running; + int swatch_currLap; + int swatch_dispLap; + QToolButton *prevLapBtn; + QToolButton *nextLapBtn; + QTimer *lapTimer; + AnalogClock* analogStopwatch; + QLCDNumber* stopwatchLcd; + QBoxLayout *swLayout; bool ampm; - void clearClock(); - void clearTimer(); - void startSWatch(); - void stopSWatch(); + bool onMonday; + int alarmCount; + AlarmDlg* alarmDlg; + QToolButton **dayBtn; + bool init; + QTimer *applyAlarmTimer; }; #endif diff --git a/noncore/tools/clock/clock.pro b/noncore/tools/clock/clock.pro index ad5c205..90a8d29 100644 --- a/noncore/tools/clock/clock.pro +++ b/noncore/tools/clock/clock.pro @@ -1,10 +1,15 @@ CONFIG = qt warn_on quick-app -HEADERS = clock.h setAlarm.h -SOURCES = clock.cpp setAlarm.cpp \ +HEADERS = clock.h analogclock.h +SOURCES = clock.cpp analogclock.cpp \ main.cpp + INCLUDEPATH += $(OPIEDIR)/include DEPENDPATH += $(OPIEDIR)/include LIBS += -lqpe -lopiecore2 -lopieui2 -lpthread TARGET = clock + +INTERFACES = clockbase.ui \ + alarmdlgbase.ui + include ( $(OPIEDIR)/include.pro ) diff --git a/noncore/tools/clock/clockbase.ui b/noncore/tools/clock/clockbase.ui index 91d0da0..0e1a90e 100644 --- a/noncore/tools/clock/clockbase.ui +++ b/noncore/tools/clock/clockbase.ui @@ -1,143 +1,143 @@ <!DOCTYPE UI><UI> <class>ClockBase</class> <widget> <class>QWidget</class> <property stdset="1"> <name>name</name> <cstring>ClockBase</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>0</x> <y>0</y> - <width>220</width> - <height>337</height> + <width>287</width> + <height>389</height> </rect> </property> <property stdset="1"> <name>caption</name> <string>Clock</string> </property> <property> <name>layoutMargin</name> </property> <vbox> <property stdset="1"> <name>margin</name> <number>6</number> </property> <property stdset="1"> <name>spacing</name> <number>6</number> </property> <widget> <class>QTabWidget</class> <property stdset="1"> <name>name</name> <cstring>tabs</cstring> </property> <property> <name>layoutMargin</name> </property> <property> <name>layoutSpacing</name> </property> <widget> <class>QWidget</class> <property stdset="1"> <name>name</name> <cstring>tab</cstring> </property> <attribute> <name>title</name> <string>Clock</string> </attribute> <vbox> <property stdset="1"> <name>margin</name> <number>4</number> </property> <property stdset="1"> <name>spacing</name> <number>4</number> </property> <widget> <class>AnalogClock</class> <property stdset="1"> <name>name</name> <cstring>analogClock</cstring> </property> </widget> <widget> <class>QLayoutWidget</class> <property stdset="1"> <name>name</name> <cstring>Layout3</cstring> </property> <hbox> <property stdset="1"> <name>margin</name> <number>0</number> </property> <property stdset="1"> <name>spacing</name> <number>6</number> </property> <widget> <class>QFrame</class> <property stdset="1"> <name>name</name> <cstring>Frame3</cstring> </property> <property stdset="1"> <name>sizePolicy</name> <sizepolicy> <hsizetype>7</hsizetype> <vsizetype>5</vsizetype> </sizepolicy> </property> <property stdset="1"> <name>frameShape</name> <enum>NoFrame</enum> </property> <property stdset="1"> <name>frameShadow</name> <enum>Plain</enum> </property> <property stdset="1"> <name>lineWidth</name> <number>0</number> </property> </widget> <widget> <class>QLCDNumber</class> <property stdset="1"> <name>name</name> <cstring>clockLcd</cstring> </property> <property stdset="1"> <name>sizePolicy</name> <sizepolicy> <hsizetype>1</hsizetype> <vsizetype>1</vsizetype> </sizepolicy> </property> <property stdset="1"> <name>minimumSize</name> <size> <width>0</width> <height>23</height> </size> </property> <property stdset="1"> <name>frameShape</name> <enum>NoFrame</enum> </property> <property stdset="1"> <name>frameShadow</name> <enum>Plain</enum> </property> <property stdset="1"> <name>segmentStyle</name> <enum>Flat</enum> @@ -391,261 +391,261 @@ <cstring>splitLcd</cstring> </property> <property stdset="1"> <name>sizePolicy</name> <sizepolicy> <hsizetype>7</hsizetype> <vsizetype>1</vsizetype> </sizepolicy> </property> <property stdset="1"> <name>maximumSize</name> <size> <width>32767</width> <height>20</height> </size> </property> <property stdset="1"> <name>frameShape</name> <enum>NoFrame</enum> </property> <property stdset="1"> <name>numDigits</name> <number>11</number> </property> <property stdset="1"> <name>segmentStyle</name> <enum>Flat</enum> </property> </widget> <widget row="1" column="2" > <class>QLabel</class> <property stdset="1"> <name>name</name> <cstring>TextLabel3_2</cstring> </property> <property stdset="1"> <name>text</name> <string>Lap</string> </property> <property stdset="1"> <name>alignment</name> <set>AlignTop|AlignRight</set> </property> <property> <name>hAlign</name> </property> <property> <name>vAlign</name> </property> </widget> </grid> </widget> <widget> <class>QLayoutWidget</class> <property stdset="1"> <name>name</name> <cstring>Layout5</cstring> </property> <hbox> <property stdset="1"> <name>margin</name> <number>0</number> </property> <property stdset="1"> <name>spacing</name> <number>6</number> </property> <widget> <class>QPushButton</class> <property stdset="1"> <name>name</name> <cstring>stopStart</cstring> </property> <property stdset="1"> <name>font</name> <font> <pointsize>14</pointsize> <bold>1</bold> </font> </property> <property stdset="1"> <name>text</name> <string>Start</string> </property> <property> <name>whatsThis</name> <string>Starts and stops the stopwatch.</string> </property> </widget> <widget> <class>QPushButton</class> <property stdset="1"> <name>name</name> <cstring>reset</cstring> </property> <property stdset="1"> <name>font</name> <font> <pointsize>14</pointsize> <bold>1</bold> </font> </property> <property stdset="1"> <name>text</name> <string>Lap/Split</string> </property> <property> <name>whatsThis</name> <string>Resets the stopwatch.</string> </property> </widget> </hbox> </widget> </vbox> </widget> <widget> <class>QWidget</class> <property stdset="1"> <name>name</name> <cstring>tab</cstring> </property> <attribute> <name>title</name> <string>Alarm</string> </attribute> <vbox> <property stdset="1"> <name>margin</name> - <number>6</number> + <number>-1</number> </property> <property stdset="1"> <name>spacing</name> - <number>4</number> + <number>-1</number> </property> <widget> <class>QGroupBox</class> <property stdset="1"> <name>name</name> <cstring>dailyGroup</cstring> </property> <property stdset="1"> <name>title</name> <string>Daily Alarm</string> </property> <property> <name>layoutMargin</name> </property> <vbox> <property stdset="1"> <name>margin</name> <number>6</number> </property> <property stdset="1"> <name>spacing</name> <number>6</number> </property> <widget> <class>QCheckBox</class> <property stdset="1"> <name>name</name> <cstring>dailyEnabled</cstring> </property> <property stdset="1"> <name>text</name> <string>Enabled</string> </property> <property> <name>whatsThis</name> <string>Check to enable the daily alarm</string> </property> </widget> <widget> <class>QLayoutWidget</class> <property stdset="1"> <name>name</name> <cstring>Layout4</cstring> </property> <hbox> <property stdset="1"> <name>margin</name> <number>0</number> </property> <property stdset="1"> <name>spacing</name> <number>6</number> </property> <widget> <class>QSpinBox</class> <property stdset="1"> <name>name</name> <cstring>dailyHour</cstring> </property> <property stdset="1"> <name>minimumSize</name> <size> <width>40</width> <height>0</height> </size> </property> <property stdset="1"> <name>wrapping</name> <bool>true</bool> </property> <property stdset="1"> <name>maxValue</name> <number>23</number> </property> <property> <name>whatsThis</name> <string>Set the hour the alarm will sound.</string> </property> </widget> <widget> <class>QLabel</class> <property stdset="1"> <name>name</name> <cstring>TextLabel2</cstring> </property> <property stdset="1"> <name>sizePolicy</name> <sizepolicy> <hsizetype>4</hsizetype> <vsizetype>1</vsizetype> </sizepolicy> </property> <property stdset="1"> <name>minimumSize</name> <size> <width>5</width> <height>0</height> </size> </property> <property stdset="1"> <name>text</name> <string>:</string> </property> </widget> <widget> <class>QSpinBox</class> <property stdset="1"> <name>name</name> <cstring>dailyMinute</cstring> </property> <property stdset="1"> <name>minimumSize</name> <size> <width>40</width> <height>0</height> </size> </property> <property stdset="1"> <name>wrapping</name> <bool>true</bool> </property> <property stdset="1"> <name>maxValue</name> <number>59</number> </property> <property stdset="1"> <name>lineStep</name> <number>5</number> @@ -745,177 +745,278 @@ </property> <property> <name>layoutMargin</name> </property> <grid> <property stdset="1"> <name>margin</name> <number>6</number> </property> <property stdset="1"> <name>spacing</name> <number>6</number> </property> <widget row="0" column="0" > <class>QLabel</class> <property stdset="1"> <name>name</name> <cstring>TextLabel3</cstring> </property> <property stdset="1"> <name>sizePolicy</name> <sizepolicy> <hsizetype>4</hsizetype> <vsizetype>1</vsizetype> </sizepolicy> </property> <property stdset="1"> <name>text</name> <string>:</string> </property> </widget> <widget row="0" column="0" > <class>QLayoutWidget</class> <property stdset="1"> <name>name</name> <cstring>Layout5</cstring> </property> <hbox> <property stdset="1"> <name>margin</name> <number>0</number> </property> <property stdset="1"> <name>spacing</name> <number>6</number> </property> <widget> <class>QSpinBox</class> <property stdset="1"> <name>name</name> <cstring>cdHour</cstring> </property> <property stdset="1"> <name>minimumSize</name> <size> <width>40</width> <height>0</height> </size> </property> <property stdset="1"> <name>maxValue</name> <number>999</number> </property> <property stdset="1"> <name>lineStep</name> <number>1</number> </property> </widget> <widget> <class>QSpinBox</class> <property stdset="1"> <name>name</name> <cstring>cdMinute</cstring> </property> <property stdset="1"> <name>minimumSize</name> <size> <width>40</width> <height>0</height> </size> </property> <property stdset="1"> <name>wrapping</name> <bool>true</bool> </property> <property stdset="1"> <name>maxValue</name> <number>55</number> </property> <property stdset="1"> <name>lineStep</name> <number>5</number> </property> </widget> <widget> <class>QPushButton</class> <property stdset="1"> <name>name</name> <cstring>cdStartStop</cstring> </property> <property stdset="1"> <name>text</name> <string>Start</string> </property> </widget> </hbox> </widget> <widget row="1" column="0" > <class>QLCDNumber</class> <property stdset="1"> <name>name</name> <cstring>cdLcd</cstring> </property> <property stdset="1"> <name>frameShape</name> <enum>NoFrame</enum> </property> <property stdset="1"> <name>frameShadow</name> <enum>Plain</enum> </property> <property stdset="1"> <name>segmentStyle</name> <enum>Flat</enum> </property> </widget> </grid> </widget> + <widget> + <class>QGroupBox</class> + <property stdset="1"> + <name>name</name> + <cstring>sndGroup</cstring> + </property> + <property stdset="1"> + <name>title</name> + <string>Play Sound</string> + </property> + <vbox> + <property stdset="1"> + <name>margin</name> + <number>11</number> + </property> + <property stdset="1"> + <name>spacing</name> + <number>6</number> + </property> + <widget> + <class>QCheckBox</class> + <property stdset="1"> + <name>name</name> + <cstring>sndCheck</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Play File</string> + </property> + </widget> + <widget> + <class>QLayoutWidget</class> + <property stdset="1"> + <name>name</name> + <cstring>Layout6</cstring> + </property> + <hbox> + <property stdset="1"> + <name>margin</name> + <number>0</number> + </property> + <property stdset="1"> + <name>spacing</name> + <number>6</number> + </property> + <widget> + <class>QLineEdit</class> + <property stdset="1"> + <name>name</name> + <cstring>sndFileName</cstring> + </property> + </widget> + <widget> + <class>QToolButton</class> + <property stdset="1"> + <name>name</name> + <cstring>sndChoose</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>...</string> + </property> + </widget> + </hbox> + </widget> + </vbox> + </widget> <spacer> <property> <name>name</name> - <cstring>Spacer1</cstring> + <cstring>Spacer3</cstring> </property> <property stdset="1"> <name>orientation</name> <enum>Vertical</enum> </property> <property stdset="1"> <name>sizeType</name> <enum>Expanding</enum> </property> <property> <name>sizeHint</name> <size> <width>20</width> <height>20</height> </size> </property> </spacer> </vbox> </widget> </widget> </vbox> </widget> <customwidgets> <customwidget> <class>AnalogClock</class> <header location="local">analogclock.h</header> <sizehint> <width>50</width> <height>50</height> </sizehint> <container>0</container> <sizepolicy> <hordata>3</hordata> <verdata>3</verdata> </sizepolicy> <pixmap>image0</pixmap> </customwidget> </customwidgets> <images> <image> <name>image0</name> <data format="XPM.GZ" length="646">789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758</data> </image> </images> +<connections> + <connection> + <sender>dailyEnabled</sender> + <signal>toggled(bool)</signal> + <receiver>sndGroup</receiver> + <slot>setEnabled(bool)</slot> + </connection> + <connection> + <sender>sndCheck</sender> + <signal>toggled(bool)</signal> + <receiver>sndFileName</receiver> + <slot>setEnabled(bool)</slot> + </connection> + <connection> + <sender>sndCheck</sender> + <signal>toggled(bool)</signal> + <receiver>sndChoose</receiver> + <slot>setEnabled(bool)</slot> + </connection> + <connection> + <sender>sndChoose</sender> + <signal>clicked()</signal> + <receiver>ClockBase</receiver> + <slot>slotBrowseMp3File()</slot> + </connection> + <connection> + <sender>sndCheck</sender> + <signal>stateChanged(int)</signal> + <receiver>ClockBase</receiver> + <slot>scheduleApplyDailyAlarm()</slot> + </connection> + <slot access="public">scheduleApplyDailyAlarm()</slot> + <slot access="protected">slotBrowseMp3File()</slot> +</connections> </UI> diff --git a/noncore/tools/clock/main.cpp b/noncore/tools/clock/main.cpp index 237d9f0..380bfeb 100644 --- a/noncore/tools/clock/main.cpp +++ b/noncore/tools/clock/main.cpp @@ -1,28 +1,24 @@ /********************************************************************** -** Copyright (C) 2000 Trolltech AS. All rights reserved. +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. ** -** This file is part of Qtopia Environment. +** 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 <opie2/oapplicationfactory.h> - - -using namespace Opie::Core; using namespace Opie::Core; OPIE_EXPORT_APP( OApplicationFactory<Clock> ) |