summaryrefslogtreecommitdiffstats
path: root/src/libs/installer/packagemanagercore_p.cpp
diff options
context:
space:
mode:
authorArttu Tarkiainen <arttu.tarkiainen@qt.io>2022-03-31 12:33:31 +0300
committerArttu Tarkiainen <arttu.tarkiainen@qt.io>2022-04-21 17:24:31 +0300
commit4b1af7d32b062f954a84616e28bb6296a28522b4 (patch)
tree872a2bdb1f4c9a89eedd042ec0fd455ecee676ec /src/libs/installer/packagemanagercore_p.cpp
parent2dd3c7d62a7f7e2e4b9cae4aedb9c1c952dcb4d6 (diff)
Show additional progress information on PerformInstallationPage
In a similar fashion to the archive download status, display: * Performed operations - total operations, on unpack. * Installed components - total components, on install. * Rolled back operations - total undo operations, on uninstall. Task-number: QTIFW-2513 Change-Id: I61690a25afadd1ca1e4a46b5b980ac094429135b Reviewed-by: Katja Marttila <katja.marttila@qt.io>
Diffstat (limited to 'src/libs/installer/packagemanagercore_p.cpp')
-rw-r--r--src/libs/installer/packagemanagercore_p.cpp57
1 files changed, 44 insertions, 13 deletions
diff --git a/src/libs/installer/packagemanagercore_p.cpp b/src/libs/installer/packagemanagercore_p.cpp
index 35d881f80..4fffcab35 100644
--- a/src/libs/installer/packagemanagercore_p.cpp
+++ b/src/libs/installer/packagemanagercore_p.cpp
@@ -1694,12 +1694,8 @@ bool PackageManagerCorePrivate::runInstaller()
+ (PackageManagerCore::createLocalRepositoryFromBinary() ? 1 : 0);
double progressOperationSize = componentsInstallPartProgressSize / progressOperationCount;
- // Perform extract operations
- unpackComponents(componentsToInstall, progressOperationSize, adminRightsGained);
-
- // Perform rest of the operations and mark component as installed
- foreach (Component *component, componentsToInstall)
- installComponent(component, progressOperationSize, adminRightsGained);
+ // Now install the requested components
+ unpackAndInstallComponents(componentsToInstall, progressOperationSize, adminRightsGained);
if (m_core->isOfflineOnly() && PackageManagerCore::createLocalRepositoryFromBinary()) {
emit m_core->titleMessageChanged(tr("Creating local repository"));
@@ -1922,12 +1918,8 @@ bool PackageManagerCorePrivate::runPackageUpdater()
const double progressOperationCount = countProgressOperations(componentsToInstall);
const double progressOperationSize = componentsInstallPartProgressSize / progressOperationCount;
- // Perform extract operations
- unpackComponents(componentsToInstall, progressOperationSize, adminRightsGained);
-
- // Perform rest of the operations and mark component as installed
- foreach (Component *component, componentsToInstall)
- installComponent(component, progressOperationSize, adminRightsGained);
+ // Now install the requested new components
+ unpackAndInstallComponents(componentsToInstall, progressOperationSize, adminRightsGained);
emit m_core->titleMessageChanged(tr("Creating Maintenance Tool"));
@@ -2176,7 +2168,7 @@ void PackageManagerCorePrivate::unpackComponents(const QList<Component *> &compo
OperationList unpackOperations;
bool becameAdmin = false;
- ProgressCoordinator::instance()->emitLabelAndDetailTextChanged(tr("\nUnpacking components..."));
+ ProgressCoordinator::instance()->emitLabelAndDetailTextChanged(tr("\nPreparing to unpack components..."));
// 1. Collect operations
quint64 totalOperationsSizeHint = 0;
@@ -2214,6 +2206,16 @@ void PackageManagerCorePrivate::unpackComponents(const QList<Component *> &compo
connect(m_core, &PackageManagerCore::installationInterrupted,
&runner, &ConcurrentOperationRunner::cancel);
+ connect(&runner, &ConcurrentOperationRunner::progressChanged, [](const int completed, const int total) {
+ const QString statusText = tr("%1 of %2 operations completed.")
+ .arg(QString::number(completed), QString::number(total));
+ ProgressCoordinator::instance()->emitAdditionalProgressStatus(statusText);
+ });
+ connect(&runner, &ConcurrentOperationRunner::finished, [] {
+ // Clear the status text to not cause confusion when installations begin.
+ ProgressCoordinator::instance()->emitAdditionalProgressStatus(QLatin1String(""));
+ });
+
const QHash<Operation *, bool> backupResults = runner.run();
const OperationList backupOperations = backupResults.keys();
@@ -2242,6 +2244,8 @@ void PackageManagerCorePrivate::unpackComponents(const QList<Component *> &compo
return lhs->sizeHint() > rhs->sizeHint();
});
+ ProgressCoordinator::instance()->emitLabelAndDetailTextChanged(tr("\nUnpacking components..."));
+
runner.setType(Operation::Perform);
const QHash<Operation *, bool> results = runner.run();
const OperationList performedOperations = backupResults.keys();
@@ -2558,6 +2562,9 @@ void PackageManagerCorePrivate::runUndoOperations(const OperationList &undoOpera
bool adminRightsGained, bool deleteOperation)
{
try {
+ const int operationsCount = undoOperations.size();
+ int rolledBackOperations = 0;
+
foreach (Operation *undoOperation, undoOperations) {
if (statusCanceledOrFailed())
throw Error(tr("Installation canceled by user"));
@@ -2596,6 +2603,10 @@ void PackageManagerCorePrivate::runUndoOperations(const OperationList &undoOpera
}
}
+ ++rolledBackOperations;
+ ProgressCoordinator::instance()->emitAdditionalProgressStatus(tr("%1 of %2 operations rolled back.")
+ .arg(QString::number(rolledBackOperations), QString::number(operationsCount)));
+
if (becameAdmin)
m_core->dropAdminRights();
@@ -2610,6 +2621,7 @@ void PackageManagerCorePrivate::runUndoOperations(const OperationList &undoOpera
throw Error(tr("Unknown error"));
}
m_localPackageHub->writeToDisk();
+ ProgressCoordinator::instance()->emitAdditionalProgressStatus(tr("Rollbacks complete."));
}
PackagesList PackageManagerCorePrivate::remotePackages()
@@ -2856,6 +2868,25 @@ void PackageManagerCorePrivate::handleMethodInvocationRequest(const QString &inv
QMetaObject::invokeMethod(obj, qPrintable(invokableMethodName));
}
+void PackageManagerCorePrivate::unpackAndInstallComponents(const QList<Component *> &components,
+ const double progressOperationSize, const bool adminRightsGained)
+{
+ // Perform extract operations
+ unpackComponents(components, progressOperationSize, adminRightsGained);
+
+ // Perform rest of the operations and mark component as installed
+ const int componentsToInstallCount = components.size();
+ int installedComponents = 0;
+ foreach (Component *component, components) {
+ installComponent(component, progressOperationSize, adminRightsGained);
+
+ ++installedComponents;
+ ProgressCoordinator::instance()->emitAdditionalProgressStatus(tr("%1 of %2 components installed.")
+ .arg(QString::number(installedComponents), QString::number(componentsToInstallCount)));
+ }
+ ProgressCoordinator::instance()->emitAdditionalProgressStatus(tr("All components installed."));
+}
+
void PackageManagerCorePrivate::processFilesForDelayedDeletion()
{
if (m_filesForDelayedDeletion.isEmpty())