xca/widgets/validity.cpp
Christian Hohnstaedt 68b14617cc Add tests for the DateTime input for validity times.
Test the correct behavior of the "Midnight" and setDiff methods.
Especially to keep the time when switching from hidden time (midnoght)
back to shown time.
2024-04-22 19:13:02 +02:00

150 lines
2.6 KiB
C++

/* vi: set sw=4 ts=4:
*
* Copyright (C) 2003 - 2012 Christian Hohnstaedt.
*
* All rights reserved.
*/
#include "validity.h"
#include <QDateTime>
#include "lib/asn1time.h"
#include "lib/func.h"
Validity::Validity(QWidget *parent) : QDateTimeEdit(parent)
{
setTimeSpec(Qt::UTC);
setNow();
hideTime(false);
connect(this, SIGNAL(timeChanged(const QTime &)),
this, SLOT(setMyTime(const QTime &)));
updateFormatString();
}
Validity::~Validity()
{
}
a1time Validity::getDate() const
{
a1time date(dateTime());
QTime time;
if (midnight) {
time = endDate ? QTime(23,59,59) : QTime(0,0,0);
date.setTimeSpec(Qt::UTC);
} else {
time = date.time();
time.setHMS(time.hour(), time.minute(), 0);
}
date.setTime(time);
return date;
}
void Validity::localTime(int state)
{
if (midnight)
return;
switch (state) {
case Qt::Checked:
setTimeSpec(Qt::LocalTime);
setDateTime(dateTime().toLocalTime());
break;
case Qt::Unchecked:
setTimeSpec(Qt::UTC);
setDateTime(dateTime().toUTC());
break;
}
updateFormatString();
}
void Validity::hideTimeCheck(int state)
{
switch (state) {
case Qt::Checked:
hideTime(true);
break;
case Qt::Unchecked:
hideTime(false);
break;
}
}
void Validity::hideTime(bool hide)
{
if (hide) {
if (!midnight && endDate)
setDateTime(dateTime().addDays(-1));
midnight = true;
} else {
if (midnight && endDate)
setDateTime(dateTime().addDays(1));
midnight = false;
setTime(mytime);
}
updateFormatString();
}
void Validity::updateFormatString()
{
QString formatDate = tr("yyyy-MM-dd hh:mm");
QString format;
if (midnight) {
if (!endDate)
format = QTime(0,0,0).toString(formatDate);
else
format = QTime(23,59,59).toString(formatDate);
} else {
format = formatDate;
}
if (timeSpec() == Qt::UTC || midnight) {
format += " 'GMT'";
} else {
format += QString(" '%1'")
.arg(QTime::currentTime().toString("t"));
}
setDisplayFormat(format);
}
void Validity::setDate(const a1time &a)
{
setDateTime(a);
setMyTime(a.time());
}
void Validity::setDiff(const Validity *start, int number, int range)
{
QDateTime dt = start->dateTime();
switch (range) {
case 0: dt = dt.addDays(number); break;
case 1: dt = dt.addMonths(number); break;
case 2: dt = dt.addYears(number); break;
}
// one day less if we go from 0:00:00 to 23:59:59
if (midnight)
dt = dt.addDays(-1);
setDateTime(dt);
setMyTime(start->mytime);
}
void Validity::setNow()
{
setDate(a1time());
}
void Validity::setMyTime(const QTime &time)
{
mytime = time;
}
void Validity::setEndDate(bool ed)
{
endDate = ed;
hideTime(midnight);
}