/* *openPilotLog - A FOSS Pilot Logbook Application *Copyright (C) 2020-2021 Felix Turowsky * *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 3 of the License, or *(at your option) any later version. * *This program 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 General Public License for more details. * *You should have received a copy of the GNU General Public License *along with this program. If not, see . */ #ifndef ATIME_H #define ATIME_H #include #include #include "src/opl.h" #include "src/functions/alog.h" namespace ATime { /*! * \brief Converts a QTime to a String to be used in the UI */ inline const QString toString(const QTime &time, Opl::Time::FlightTimeFormat format = Opl::Time::Default) { switch (format) { case Opl::Time::Default: return time.toString(QStringLiteral("hh:mm")); break; case Opl::Time::Decimal: return QString::number(((time.hour() * 60 + time.minute() )/60.0), 'f', 2); break; default: return QString(); } } /*! * \brief Converts an integer of minutes as received from the Datbase to a String */ inline const QString toString(int minutes_in, Opl::Time::FlightTimeFormat format = Opl::Time::Default) { switch (format) { case Opl::Time::Default: { QString hour = QString::number(minutes_in / 60); if (hour.size() < 2) { hour.prepend(QStringLiteral("0")); } QString minute = QString::number(minutes_in % 60); if (minute.size() < 2) { minute.prepend(QStringLiteral("0")); } return hour + ':' + minute; } case Opl::Time::Decimal: { int hour = minutes_in / 60; double minute = (minutes_in % 60) / 60.0; return QString::number((hour + minute), 'f', 2); } default: return QString(); } } inline double toDecimalHours(const QTime &time){ return (time.hour() * 60 + time.minute()) / 60.0; } inline int toMinutes(const QTime &time) {return time.hour() * 60 + time.minute();} inline QTime fromMinutes(int total_minutes) { int minute = total_minutes % 60; int hour = total_minutes / 60; return QTime(hour, minute, 0); } inline const QTime fromString(QString time_string, Opl::Time::FlightTimeFormat format = Opl::Time::Default) { switch (format) { case Opl::Time::Default: return QTime::fromString(time_string, QStringLiteral("hh:mm")); break; case Opl::Time::Decimal: { double decimal_time = time_string.toDouble(); int hour = decimal_time; int minute = round((decimal_time - hour) * 60); return QTime(hour, minute, 0); break; } default: return QTime(); } } inline const QTime fromString(const char* time_string, Opl::Time::FlightTimeFormat format = Opl::Time::Default) { switch (format) { case Opl::Time::Default: return QTime::fromString(time_string, QStringLiteral("hh:mm")); break; case Opl::Time::Decimal: { double decimal_time = QString(time_string).toDouble(); int hour = decimal_time; int minute = round((decimal_time - hour) * 60); return QTime(hour, minute, 0); break; } default: return QTime(); } } inline QTime blocktime(const QTime &tofb, const QTime &tonb) { QTime blocktime_out(0, 0); // initialise return value at midnight if (tonb > tofb) { // landing same day int block_seconds = tofb.secsTo(tonb); blocktime_out = blocktime_out.addSecs(block_seconds); } else { // landing next day QTime midnight(0, 0); int seconds = tofb.secsTo(midnight); blocktime_out = blocktime_out.addSecs(seconds); seconds = midnight.secsTo(tonb); blocktime_out = blocktime_out.addSecs(seconds); } return blocktime_out; } inline QTime blocktime(const QString& tofb, const QString& tonb) { QTime t_tofb = ATime::fromString(tofb); QTime t_tonb = ATime::fromString(tonb); return blocktime(t_tofb, t_tonb); } /*! * \brief blockMinutes calculates the total amount of minutes elapsed between * tofb and tonb */ inline int blockMinutes(const QString& tofb, const QString& tonb) { const QTime t_tofb = ATime::fromString(tofb); const QTime t_tonb = ATime::fromString(tonb); if (t_tofb.isValid() && t_tonb.isValid()) { const auto tblk = ATime::blocktime(t_tofb, t_tonb); return ATime::toMinutes(tblk); } else return 0; } /*! * \brief blockMinutes calculates the total amount of minutes elapsed between * tofb and tonb */ inline int blockMinutes(const QTime& tofb, const QTime& tonb) { if (tofb.isValid() && tonb.isValid()) { const auto tblk = ATime::blocktime(tofb, tonb); return ATime::toMinutes(tblk); } else return 0; } /*! * \brief verifies user input and formats to hh:mm * if the output is not a valid time, an empty string is returned. Accepts * input as hh:mm, h:mm, hhmm or hmm. * \param userinput from a QLineEdit * \return formatted QString "hh:mm" or Empty String */ inline const QString formatTimeInput(QString user_input) { QTime temp_time; //empty time object is invalid by default bool contains_seperator = user_input.contains(':'); if (user_input.length() == 4 && !contains_seperator) { temp_time = QTime::fromString(user_input, QStringLiteral("hhmm")); } else if (user_input.length() == 3 && !contains_seperator) { if (user_input.toInt() < 240) { //Qtime is invalid if time is between 000 and 240 for this case QString tempstring = user_input.prepend(QStringLiteral("0")); temp_time = QTime::fromString(tempstring, QStringLiteral("hhmm")); } else { temp_time = QTime::fromString(user_input, QStringLiteral("Hmm")); } } else if (user_input.length() == 4 && contains_seperator) { temp_time = QTime::fromString(user_input, QStringLiteral("h:mm")); } else if (user_input.length() == 5 && contains_seperator) { temp_time = QTime::fromString(user_input, QStringLiteral("hh:mm")); } auto output = temp_time.toString(QStringLiteral("hh:mm")); if (output.isEmpty()) { DEB << "Time input is invalid."; } return output; } } // namespace ATime #endif // ATIME_H