File indexing completed on 2025-02-02 05:02:37

0001 /*
0002     SPDX-FileCopyrightText: 2021 Volker Krause <vkrause@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "transferdelegatecontroller.h"
0008 
0009 #include <QDebug>
0010 
0011 TransferDelegateController::TransferDelegateController(QObject *parent)
0012     : QObject(parent)
0013 {
0014     m_updateTrigger.setTimerType(Qt::VeryCoarseTimer);
0015     connect(&m_updateTrigger, &QTimer::timeout, this, &TransferDelegateController::updated);
0016     connect(&m_updateTrigger, &QTimer::timeout, this, &TransferDelegateController::scheduleTimer);
0017 }
0018 
0019 TransferDelegateController::~TransferDelegateController() = default;
0020 
0021 Transfer TransferDelegateController::transfer() const
0022 {
0023     return m_transfer;
0024 }
0025 
0026 void TransferDelegateController::setTransfer(const Transfer &transfer)
0027 {
0028     m_transfer = transfer;
0029     Q_EMIT transferChanged();
0030     Q_EMIT updated();
0031 
0032     if (transfer.state() != Transfer::Selected) {
0033         m_updateTrigger.stop();
0034         return;
0035     }
0036 
0037     scheduleTimer();
0038 }
0039 
0040 bool TransferDelegateController::isCurrent() const
0041 {
0042     const auto jny = m_transfer.journey();
0043     const auto now = QDateTime::currentDateTime();
0044 
0045     if ((jny.hasExpectedArrivalTime() && jny.expectedArrivalTime() < now) || jny.scheduledArrivalTime() < now) {
0046         return false;
0047     }
0048     if ((jny.departureDelay() < 0 && now < jny.expectedDepartureTime()) || now < jny.scheduledDepartureTime()) {
0049         return false;
0050     }
0051 
0052     return true;
0053 }
0054 
0055 float TransferDelegateController::progress() const
0056 {
0057     const auto jny = m_transfer.journey();
0058     const auto startTime = jny.hasExpectedDepartureTime() ? jny.expectedDepartureTime() : jny.scheduledDepartureTime();
0059     const auto endTime = jny.hasExpectedArrivalTime() ? jny.expectedArrivalTime() : jny.scheduledArrivalTime();
0060 
0061     const auto tripLength = startTime.secsTo(endTime);
0062     if (tripLength <= 0) {
0063         return 0.0f;
0064     }
0065     const auto progress = startTime.secsTo(QDateTime::currentDateTime());
0066 
0067     return std::min(std::max(0.0f, (float)progress / (float)tripLength), 1.0f);
0068 }
0069 
0070 void TransferDelegateController::scheduleTimer()
0071 {
0072     const auto jny = m_transfer.journey();
0073     const auto now = QDateTime::currentDateTime();
0074 
0075     if ((jny.hasExpectedArrivalTime() && jny.expectedArrivalTime() < now) || jny.scheduledArrivalTime() < now) { // already arrived
0076         m_updateTrigger.stop();
0077         return;
0078     }
0079     const auto depTime = jny.departureDelay() < 0 ? jny.expectedDepartureTime() : jny.scheduledDepartureTime();
0080     if (now < depTime) {
0081         m_updateTrigger.setInterval(now.secsTo(depTime) * 1000);
0082         m_updateTrigger.start();
0083         return;
0084     }
0085 
0086     m_updateTrigger.setInterval(std::chrono::minutes(1));
0087     m_updateTrigger.start();
0088 }
0089 
0090 #include "moc_transferdelegatecontroller.cpp"