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"