kdelibs/kdecore/date/kdayperiod.cpp

203 lines
5.8 KiB
C++
Raw Normal View History

2014-11-13 01:04:59 +02:00
/*
Copyright (c) 2010 John Layt <john@layt.net>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#include "kdayperiod_p.h"
#include <QtCore/QSharedData>
#include <QtCore/QString>
#include <QtCore/qdatetime.h>
2014-11-13 01:04:59 +02:00
class KDayPeriodPrivate : public QSharedData
{
public:
KDayPeriodPrivate(const QString &periodCode,
const QString &longName,
const QString &shortName,
const QString &narrowName,
const QTime &periodStart,
const QTime &periodEnd,
int offsetFromStart,
int offsetIfZero);
KDayPeriodPrivate(const KDayPeriodPrivate &other);
~KDayPeriodPrivate();
QString m_periodCode, m_longName, m_shortName, m_narrowName;
QTime m_periodStart, m_periodEnd;
int m_offsetFromStart, m_offsetIfZero;
};
KDayPeriodPrivate::KDayPeriodPrivate(const QString &periodCode,
const QString &longName,
const QString &shortName,
const QString &narrowName,
const QTime &periodStart,
const QTime &periodEnd,
int offsetFromStart,
int offsetIfZero)
: QSharedData(),
m_periodCode(periodCode),
m_longName(longName),
m_shortName(shortName),
m_narrowName(narrowName),
m_periodStart(periodStart),
m_periodEnd(periodEnd),
m_offsetFromStart(offsetFromStart),
m_offsetIfZero(offsetIfZero)
2014-11-13 01:04:59 +02:00
{
}
KDayPeriodPrivate::KDayPeriodPrivate(const KDayPeriodPrivate &other)
: QSharedData(other),
m_periodCode(other.m_periodCode),
m_longName(other.m_longName),
m_shortName(other.m_shortName),
m_narrowName(other.m_narrowName),
m_periodStart(other.m_periodStart),
m_periodEnd(other.m_periodEnd),
m_offsetFromStart(other.m_offsetFromStart),
m_offsetIfZero(other.m_offsetIfZero)
2014-11-13 01:04:59 +02:00
{
}
KDayPeriodPrivate::~KDayPeriodPrivate()
{
}
KDayPeriod::KDayPeriod(const QString &periodCode,
const QString &longName,
const QString &shortName,
const QString &narrowName,
const QTime &periodStart,
const QTime &periodEnd,
int offsetFromStart,
int offsetIfZero)
: d(new KDayPeriodPrivate(periodCode,
longName,
shortName,
narrowName,
periodStart,
periodEnd,
offsetFromStart,
offsetIfZero))
2014-11-13 01:04:59 +02:00
{
}
KDayPeriod::KDayPeriod()
: d(new KDayPeriodPrivate(QString(), QString(), QString(), QString(), QTime(), QTime(), -1, -1))
2014-11-13 01:04:59 +02:00
{
}
KDayPeriod::KDayPeriod(const KDayPeriod &rhs)
: d(rhs.d)
2014-11-13 01:04:59 +02:00
{
}
KDayPeriod::~KDayPeriod()
{
}
KDayPeriod& KDayPeriod::operator=(const KDayPeriod &rhs)
{
if (&rhs != this) {
d = rhs.d;
}
return *this;
}
QString KDayPeriod::periodCode() const
{
return d->m_periodCode;
}
QTime KDayPeriod::periodStart() const
{
return d->m_periodStart;
}
QTime KDayPeriod::periodEnd() const
{
return d->m_periodEnd;
}
QString KDayPeriod::periodName(KLocale::DateTimeComponentFormat format) const
{
if (format == KLocale::LongName) {
return d->m_longName;
} else if (format == KLocale::NarrowName) {
return d->m_narrowName;
}
return d->m_shortName;
2014-11-13 01:04:59 +02:00
}
int KDayPeriod::hourInPeriod(const QTime &time) const
{
int hourInPeriod = -1;
if (time.isValid() && isValid(time)) {
hourInPeriod = time.hour() - periodStart().hour() + d->m_offsetFromStart;
while (d->m_offsetIfZero > 0 && hourInPeriod <= 0) {
hourInPeriod = hourInPeriod + d->m_offsetIfZero;
}
}
return hourInPeriod;
}
QTime KDayPeriod::time(int hip, int minute, int second, int millisecond) const
{
QTime time;
if (isValid()) {
if (hip == d->m_offsetIfZero) {
hip = 0;
}
int hour;
if (periodStart() <= periodEnd() ||
(hip >= hourInPeriod(periodStart()) &&
hip <= hourInPeriod(QTime(23, 59, 59, 999)))) {
hour = hip + periodStart().hour() - d->m_offsetFromStart;
} else {
hour = hip;
}
time = QTime(hour, minute, second, millisecond);
2014-11-13 01:04:59 +02:00
if (time.isValid() && isValid(time)) {
return time;
}
return QTime();
2014-11-13 01:04:59 +02:00
}
return time;
}
bool KDayPeriod::isValid() const
{
return !d->m_periodCode.isEmpty() &&
d->m_periodStart.isValid() &&
d->m_periodEnd.isValid();
}
bool KDayPeriod::isValid(const QTime &time) const
{
if (isValid()) {
if (periodStart() <= periodEnd()) {
return time >= periodStart() && time <= periodEnd();
}
return ((time >= periodStart() && time <= QTime(23, 59, 59, 999)) ||
(time >= QTime(0, 0, 0) && time <= periodEnd()));
2014-11-13 01:04:59 +02:00
}
return false;
2014-11-13 01:04:59 +02:00
}