first re-commit.
This commit is contained in:
231
swalarmcontrol.cpp
Normal file
231
swalarmcontrol.cpp
Normal file
@@ -0,0 +1,231 @@
|
||||
/***************************************************************************
|
||||
|
||||
source::worx raDIYo
|
||||
Copyright © 2020-2022 c.holzheuer
|
||||
chris@sourceworx.org
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
#include <QDebug>
|
||||
#include <QPainter>
|
||||
#include <QKeyEvent>
|
||||
#include <QDateTime>
|
||||
#include <QTime>
|
||||
#include <QAction>
|
||||
#include <QtMath>
|
||||
#include <QDir>
|
||||
#include <QStandardPaths>
|
||||
|
||||
#include <swalarmcontrol.h>
|
||||
|
||||
#include <raDIYo.h>
|
||||
|
||||
|
||||
/**
|
||||
* @brief Das AlarmControl steuert den Wecker.
|
||||
* @param parent
|
||||
* @param psettings
|
||||
*/
|
||||
|
||||
SWAlarmControl::SWAlarmControl( QWidget* parent, QSettings* psettings )
|
||||
: SWDialControl( parent, psettings )
|
||||
{
|
||||
|
||||
Ui_SWAlarmControl::setupUi( this );
|
||||
setHeaderText( "Alarm" );
|
||||
|
||||
connect( &_alarmTimer, SIGNAL( timeout() ), this, SLOT( onWakeUp() ) );
|
||||
// die Minuten beobachten, um die Stunden anzupassen
|
||||
connect( _digitMinute, SIGNAL( valueOverflow(int) ), this, SLOT( onMinuteOverflow(int) ) );
|
||||
connect( _digitHour, SIGNAL( valueOverflow(int) ), this, SLOT( onHourOverflow(int) ) );
|
||||
|
||||
connect( _switchAlarm, SIGNAL( widgetClicked(SWDialWidget*) ), this, SLOT( onWidgetClicked(SWDialWidget*) ) );
|
||||
connect( _switchRepeat, SIGNAL( widgetClicked(SWDialWidget*) ), this, SLOT( onWidgetClicked(SWDialWidget*) ) );
|
||||
connect( _switchWeekdays, SIGNAL( widgetClicked(SWDialWidget*) ), this, SLOT( onWidgetClicked(SWDialWidget*) ) );
|
||||
|
||||
connect( _digitMinute, &SWAdjustableDigit::valueChanged, this, [=]{ if( _alarmEnabled ) setAlarm(); } );
|
||||
connect( _digitHour, &SWAdjustableDigit::valueChanged, this, [=]{ if( _alarmEnabled ) setAlarm(); } );
|
||||
|
||||
_digitHour->setRange( 0, 23 );
|
||||
_digitMinute->setRange( 0, 59 );
|
||||
|
||||
collectDialWidgets();
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SWAlarmControl::onMinuteOverflow( int value )
|
||||
{
|
||||
|
||||
int hour = _digitHour->value();
|
||||
if( value < 0 )
|
||||
{
|
||||
_digitMinute->setValue( 59 );
|
||||
_digitHour->setValue( hour-1 );
|
||||
}
|
||||
else if( value > 59 )
|
||||
{
|
||||
_digitMinute->setValue( 0 );
|
||||
_digitHour->setValue( hour+1 );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void SWAlarmControl::onHourOverflow( int value )
|
||||
{
|
||||
// Stunde < 0: Stunde zurück
|
||||
if( value < 0 )
|
||||
_digitHour->setValue( 23 );
|
||||
else if( value > 23 )
|
||||
_digitHour->setValue( 0 );
|
||||
|
||||
}
|
||||
|
||||
|
||||
void SWAlarmControl::onShow()
|
||||
{
|
||||
|
||||
current().setHightlighted( true );
|
||||
|
||||
// sync sttings -> screen
|
||||
_alarmEnabled = settings().value( raDIYo::KeyAlarmEnabled, raDIYo::AlarmEnabled ).toBool();
|
||||
_switchAlarm->setChecked( _alarmEnabled );
|
||||
|
||||
_alarmRepeat = settings().value( raDIYo::KeyAlarmRepeat, raDIYo::AlarmRepeat ).toBool();
|
||||
_switchRepeat->setChecked( _alarmWeekdays );
|
||||
|
||||
_alarmWeekdays = settings().value( raDIYo::KeyWeekdaysOnly, raDIYo::WeekdaysOnly ).toBool();
|
||||
_switchWeekdays->setChecked( _alarmWeekdays );
|
||||
|
||||
// die Uhrzeit setzen
|
||||
int alarmHour = settings().value( raDIYo::KeyAlarmHour, raDIYo::KeyAlarmHour ).toInt();
|
||||
int alarmMinute = settings().value( raDIYo::KeyAlarmMinute, raDIYo::KeyAlarmMinute ).toInt();
|
||||
_digitHour->setValue( alarmHour );
|
||||
_digitMinute->setValue( alarmMinute );
|
||||
|
||||
setAlarm();
|
||||
|
||||
}
|
||||
|
||||
|
||||
void SWAlarmControl::onHide()
|
||||
{
|
||||
|
||||
// sync screen to settings
|
||||
settings().setValue( raDIYo::KeyAlarmEnabled, _switchAlarm->isChecked() );
|
||||
settings().setValue( raDIYo::KeyAlarmRepeat, _switchRepeat->isChecked() );
|
||||
settings().setValue( raDIYo::KeyWeekdaysOnly, _switchWeekdays->isChecked() );
|
||||
|
||||
settings().setValue( raDIYo::KeyAlarmHour, _digitHour->value() );
|
||||
settings().setValue( raDIYo::KeyAlarmMinute, _digitMinute->value() );
|
||||
|
||||
setAlarm();
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SWAlarmControl::onWidgetClicked( SWDialWidget* child )
|
||||
{
|
||||
if( _switchAlarm == child )
|
||||
{
|
||||
_alarmEnabled = !_alarmEnabled;
|
||||
_switchAlarm->setChecked( _alarmEnabled );
|
||||
_labelAlarm->setText( _alarmEnabled ? SWAlarmOn : SWAlarmOff );
|
||||
_switchRepeat->setEnabled( _alarmEnabled );
|
||||
_switchWeekdays->setEnabled( _alarmEnabled );
|
||||
goto end;
|
||||
}
|
||||
|
||||
if( _switchRepeat == child )
|
||||
{
|
||||
_alarmRepeat = !_alarmRepeat;
|
||||
_switchRepeat->setChecked( _alarmRepeat );
|
||||
_labelRepeat->setText( _alarmRepeat ? SWAlarmRepeat : SWAlarmOnce );
|
||||
goto end;
|
||||
}
|
||||
|
||||
if( _switchWeekdays == child )
|
||||
{
|
||||
_alarmWeekdays = !_alarmWeekdays;
|
||||
_switchWeekdays->setChecked( _alarmWeekdays );
|
||||
_labelWeekdays->setText( _alarmWeekdays ? SWAlarmWeekdays : SWAlarmAlldays );
|
||||
goto end;
|
||||
}
|
||||
|
||||
//if( _digitHour == child || _digitMinute == child )
|
||||
// onTimeChanged( 42 );
|
||||
|
||||
end:
|
||||
|
||||
setAlarm();
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Berechnet den nächsten Alarmzeitpunkt aus den Vorgaben der Benutzeroberfläche
|
||||
* und startet den Alarmtimer.
|
||||
*/
|
||||
|
||||
void SWAlarmControl::setAlarm()
|
||||
{
|
||||
|
||||
_alarmTimer.stop();
|
||||
if( !_alarmEnabled )
|
||||
return;
|
||||
|
||||
/*
|
||||
if( !_alarmEnabled )
|
||||
{
|
||||
_labelAlarm->setText( SWAlarmOff );
|
||||
return;
|
||||
}
|
||||
*/
|
||||
|
||||
// ab hier: alarm gewüschnt
|
||||
|
||||
int hour = _digitHour->value();
|
||||
int minute = _digitMinute->value();
|
||||
|
||||
// timer basteln
|
||||
QTime alarmTime( hour, minute );
|
||||
QDateTime now = QDateTime::currentDateTime();
|
||||
|
||||
int millisToAlarm = 1000 * now.time().secsTo( alarmTime );
|
||||
int shiftDays = 0;
|
||||
// ist der Alarm nicht mehr heute?
|
||||
if( millisToAlarm < 0 )
|
||||
shiftDays = 1;
|
||||
|
||||
// Gnade am Wochenende?
|
||||
if( _alarmWeekdays )
|
||||
{
|
||||
int today = now.date().dayOfWeek();
|
||||
// samstag?
|
||||
shiftDays += today >= 6 ? (today == 7) ? 1 : 2 : 0 ;
|
||||
}
|
||||
|
||||
millisToAlarm += shiftDays * SecsPerDay * 1000;
|
||||
_labelAlarm->setText( SWAlarmOn + now.addMSecs( millisToAlarm ).toString( " dd.MM, hh:mm" ) );
|
||||
_alarmTimer.start( millisToAlarm );
|
||||
}
|
||||
|
||||
|
||||
void SWAlarmControl::onWakeUp()
|
||||
{
|
||||
_alarmTimer.stop();
|
||||
emit playCurrentUrl();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user