summaryrefslogtreecommitdiffstats
path: root/src/libs/installer/progresscoordinator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/installer/progresscoordinator.cpp')
-rw-r--r--src/libs/installer/progresscoordinator.cpp123
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;
}