diff options
Diffstat (limited to 'src/libs/installer/progresscoordinator.cpp')
-rw-r--r-- | src/libs/installer/progresscoordinator.cpp | 123 |
1 files changed, 79 insertions, 44 deletions
diff --git a/src/libs/installer/progresscoordinator.cpp b/src/libs/installer/progresscoordinator.cpp index d3fbd764f..6413efe28 100644 --- a/src/libs/installer/progresscoordinator.cpp +++ b/src/libs/installer/progresscoordinator.cpp @@ -1,6 +1,6 @@ /************************************************************************** ** -** Copyright (C) 2017 The Qt Company Ltd. +** Copyright (C) 2023 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Installer Framework. @@ -28,13 +28,19 @@ #include "progresscoordinator.h" +#include <iostream> + #include <QtCore/QCoreApplication> #include <QtCore/QDebug> +#include "globals.h" +#include "utils.h" +#include "loggingutils.h" + using namespace QInstaller; QT_BEGIN_NAMESPACE -uint qHash(QPointer<QObject> key) +hashValue qHash(QPointer<QObject> key) { return qHash(key.data()); } @@ -51,10 +57,13 @@ ProgressCoordinator::ProgressCoordinator(QObject *parent) { // it has to be in the main thread to be able refresh the ui with processEvents Q_ASSERT(thread() == qApp->thread()); + m_progressSpinner = new ProgressSpinner(); } ProgressCoordinator::~ProgressCoordinator() { + delete m_progressSpinner; + m_progressSpinner = nullptr; } ProgressCoordinator *ProgressCoordinator::instance() @@ -67,7 +76,8 @@ ProgressCoordinator *ProgressCoordinator::instance() void ProgressCoordinator::reset() { - disconnectAllSenders(); + m_senderPartProgressSizeHash.clear(); + m_senderPendingCalculatedPercentageHash.clear(); m_installationLabelText.clear(); m_currentCompletePercentage = 0; m_currentBasePercentage = 0; @@ -81,10 +91,11 @@ void ProgressCoordinator::reset() void ProgressCoordinator::registerPartProgress(QObject *sender, const char *signal, double partProgressSize) { Q_ASSERT(sender); + Q_ASSERT(!sender->objectName().isEmpty()); Q_ASSERT(QString::fromLatin1(signal).contains(QLatin1String("(double)"))); Q_ASSERT(partProgressSize <= 1); - m_senderPartProgressSizeHash.insert(sender, partProgressSize); + m_senderPartProgressSizeHash.insert(sender->objectName(), partProgressSize); bool isConnected = connect(sender, signal, this, SLOT(partProgressChanged(double))); Q_UNUSED(isConnected); Q_ASSERT(isConnected); @@ -92,7 +103,7 @@ void ProgressCoordinator::registerPartProgress(QObject *sender, const char *sign /*! - This slot gets the progress changed signals from different tasks. The values 0 and 1 are handled as + This slot gets the progress changed signals from different tasks. The \a fraction values 0 and 1 are handled as special values. 0 - is just ignored, so you can use a timer which gives the progress, e.g. like a downloader does. @@ -101,57 +112,63 @@ void ProgressCoordinator::registerPartProgress(QObject *sender, const char *sign void ProgressCoordinator::partProgressChanged(double fraction) { if (fraction < 0 || fraction > 1) { - qWarning() << "The fraction is outside from possible value:" << fraction; + qCWarning(QInstaller::lcInstallerInstallLog) << "The fraction is outside from possible value:" + << fraction; return; } // no fraction no change - if (fraction == 0) + if (fraction == 0 || !sender()) return; + QString senderObjectName = sender()->objectName(); // ignore senders sending 100% multiple times - if (fraction == 1 && m_senderPendingCalculatedPercentageHash.contains(sender()) - && m_senderPendingCalculatedPercentageHash.value(sender()) == 0) { + if (fraction == 1 && m_senderPendingCalculatedPercentageHash.contains(senderObjectName) + && m_senderPendingCalculatedPercentageHash.value(senderObjectName) == 0) { return; } - double partProgressSize = m_senderPartProgressSizeHash.value(sender(), 0); + double partProgressSize = m_senderPartProgressSizeHash.value(senderObjectName, 0); if (partProgressSize == 0) { - qWarning() << "It seems that this sender was not registered in the right way:" << sender(); + qCWarning(QInstaller::lcInstallerInstallLog) << "It seems that this sender was not registered " + "in the right way:" << sender(); return; } if (m_undoMode) { - //qDebug() << "fraction:" << fraction; double maxSize = m_reachedPercentageBeforeUndo * partProgressSize; double pendingCalculatedPartPercentage = maxSize * fraction; // allPendingCalculatedPartPercentages has negative values double newCurrentCompletePercentage = m_currentBasePercentage - pendingCalculatedPartPercentage - + allPendingCalculatedPartPercentages(sender()); + + allPendingCalculatedPartPercentages(senderObjectName); //we can't check this here, because some round issues can make it little bit under 0 or over 100 //Q_ASSERT(newCurrentCompletePercentage >= 0); //Q_ASSERT(newCurrentCompletePercentage <= 100); if (newCurrentCompletePercentage < 0) { - qDebug() << newCurrentCompletePercentage << "is smaller than 0 - this should not happen more than once"; + qCDebug(QInstaller::lcDeveloperBuild) << newCurrentCompletePercentage << "is smaller than 0 " + "- this should not happen more than once"; newCurrentCompletePercentage = 0; } if (newCurrentCompletePercentage > 100) { - qDebug() << newCurrentCompletePercentage << "is bigger than 100 - this should not happen more than once"; + qCDebug(QInstaller::lcDeveloperBuild) << newCurrentCompletePercentage << "is bigger than 100 " + "- this should not happen more than once"; newCurrentCompletePercentage = 100; } // In undo mode, the progress has to go backward, new has to be smaller than current - if (qRound(m_currentCompletePercentage) < qRound(newCurrentCompletePercentage)) - qDebug("Something is wrong with the calculation of the progress."); + if (qRound(m_currentCompletePercentage) < qRound(newCurrentCompletePercentage)) { + qCWarning(QInstaller::lcInstallerInstallLog) << "Something is wrong with the calculation " + "of the progress."; + } m_currentCompletePercentage = newCurrentCompletePercentage; if (fraction == 1) { m_currentBasePercentage = m_currentBasePercentage - pendingCalculatedPartPercentage; - m_senderPendingCalculatedPercentageHash.insert(sender(), 0); + m_senderPendingCalculatedPercentageHash.insert(senderObjectName, 0); } else { - m_senderPendingCalculatedPercentageHash.insert(sender(), pendingCalculatedPartPercentage); + m_senderPendingCalculatedPercentageHash.insert(senderObjectName, pendingCalculatedPartPercentage); } } else { //if (m_undoMode) @@ -160,34 +177,37 @@ void ProgressCoordinator::partProgressChanged(double fraction) //double checkValue = allPendingCalculatedPartPercentages(sender()); double newCurrentCompletePercentage = m_manualAddedPercentage + m_currentBasePercentage - + pendingCalculatedPartPercentage + allPendingCalculatedPartPercentages(sender()); + + pendingCalculatedPartPercentage + allPendingCalculatedPartPercentages(senderObjectName); //we can't check this here, because some round issues can make it little bit under 0 or over 100 //Q_ASSERT(newCurrentCompletePercentage >= 0); //Q_ASSERT(newCurrentCompletePercentage <= 100); if (newCurrentCompletePercentage < 0) { - qDebug() << newCurrentCompletePercentage << "is smaller than 0 - this should not happen more than once"; + qCDebug(QInstaller::lcDeveloperBuild) << newCurrentCompletePercentage << "is smaller than 0 " + "- this should not happen more than once"; newCurrentCompletePercentage = 0; } if (newCurrentCompletePercentage > 100) { - qDebug() << newCurrentCompletePercentage << "is bigger than 100 - this should not happen more than once"; + qCDebug(QInstaller::lcDeveloperBuild) << newCurrentCompletePercentage << "is bigger than 100 " + "- this should not happen more than once"; newCurrentCompletePercentage = 100; } // In normal mode, the progress has to go forward, new has to be larger than current if (qRound(m_currentCompletePercentage) > qRound(newCurrentCompletePercentage)) - qDebug("Something is wrong with the calculation of the progress."); + qCWarning(QInstaller::lcInstallerInstallLog) << "Something is wrong with the calculation of the progress."; m_currentCompletePercentage = newCurrentCompletePercentage; if (fraction == 1) { m_currentBasePercentage = m_currentBasePercentage + pendingCalculatedPartPercentage; - m_senderPendingCalculatedPercentageHash.insert(sender(), 0); + m_senderPendingCalculatedPercentageHash.insert(senderObjectName, 0); } else { - m_senderPendingCalculatedPercentageHash.insert(sender(), pendingCalculatedPartPercentage); + m_senderPendingCalculatedPercentageHash.insert(senderObjectName, pendingCalculatedPartPercentage); } } //if (m_undoMode) + printProgressPercentage(progressInPercentage()); } @@ -202,25 +222,13 @@ int ProgressCoordinator::progressInPercentage() const return currentValue; } -void ProgressCoordinator::disconnectAllSenders() -{ - foreach (QPointer<QObject> sender, m_senderPartProgressSizeHash.keys()) { - if (!sender.isNull()) { - bool isDisconnected = sender->disconnect(this); - Q_UNUSED(isDisconnected); - Q_ASSERT(isDisconnected); - } - } - m_senderPartProgressSizeHash.clear(); - m_senderPendingCalculatedPercentageHash.clear(); -} - void ProgressCoordinator::setUndoMode() { Q_ASSERT(!m_undoMode); m_undoMode = true; - disconnectAllSenders(); + m_senderPartProgressSizeHash.clear(); + m_senderPendingCalculatedPercentageHash.clear(); m_reachedPercentageBeforeUndo = progressInPercentage(); m_currentBasePercentage = m_reachedPercentageBeforeUndo; } @@ -250,6 +258,11 @@ void ProgressCoordinator::setLabelText(const QString &text) if (m_installationLabelText == text) return; m_installationLabelText = text; + + // Refresh both message & progress percentage on console + // when the label text is changed + printProgressMessage(text); + printProgressPercentage(progressInPercentage()); } /*! @@ -268,14 +281,14 @@ void ProgressCoordinator::emitDetailTextChanged(const QString &text) void ProgressCoordinator::emitLabelAndDetailTextChanged(const QString &text) { emit detailTextChanged(text); - m_installationLabelText = QString(text).remove(QLatin1String("\n")); + setLabelText(QString(text).remove(QLatin1String("\n"))); qApp->processEvents(); //makes the result available in the ui } -double ProgressCoordinator::allPendingCalculatedPartPercentages(QObject *excludeKeyObject) +double ProgressCoordinator::allPendingCalculatedPartPercentages(const QString &excludeKeyObject) { double result = 0; - QHash<QPointer<QObject>, double>::iterator it = m_senderPendingCalculatedPercentageHash.begin(); + QHash<QString, double>::iterator it = m_senderPendingCalculatedPercentageHash.begin(); while (it != m_senderPendingCalculatedPercentageHash.end()) { if (it.key() != excludeKeyObject) result += it.value(); @@ -284,7 +297,29 @@ double ProgressCoordinator::allPendingCalculatedPartPercentages(QObject *exclude return result; } -void ProgressCoordinator::emitDownloadStatus(const QString &status) +void ProgressCoordinator::emitAdditionalProgressStatus(const QString &status) +{ + emit additionalProgressStatusChanged(status); +} + +void ProgressCoordinator::printProgressPercentage(int progress) +{ + if (!LoggingHandler::instance().isVerbose()) + return; + + Q_ASSERT(m_progressSpinner->currentIndex < m_progressSpinner->spinnerChars.size()); + + QString formatted = QString::fromLatin1("[%1 %2%]").arg( + m_progressSpinner->spinnerChars.at(m_progressSpinner->currentIndex), QString::number(progress)); + + qCDebug(QInstaller::lcProgressIndicator).noquote() << formatted; + + m_progressSpinner->currentIndex == (m_progressSpinner->spinnerChars.size() - 1) + ? m_progressSpinner->currentIndex = 0 + : m_progressSpinner->currentIndex++; +} + +void ProgressCoordinator::printProgressMessage(const QString &message) { - emit downloadStatusChanged(status); + qCDebug(QInstaller::lcInstallerInstallLog).nospace().noquote() << message; } |