diff options
Diffstat (limited to 'src/libs/installer/packagemanagercore.cpp')
-rw-r--r-- | src/libs/installer/packagemanagercore.cpp | 87 |
1 files changed, 66 insertions, 21 deletions
diff --git a/src/libs/installer/packagemanagercore.cpp b/src/libs/installer/packagemanagercore.cpp index b6f79a92b..041c0fd31 100644 --- a/src/libs/installer/packagemanagercore.cpp +++ b/src/libs/installer/packagemanagercore.cpp @@ -583,22 +583,10 @@ void PackageManagerCore::componentsToInstallNeedsRecalculation() QList<Component*> selectedComponentsToInstall = componentsMarkedForInstallation(); d->m_componentsToInstallCalculated = - d->installerCalculator()->appendComponentsToInstall(selectedComponentsToInstall); - - QList<Component *> componentsToInstall = d->installerCalculator()->orderedComponentsToInstall(); + d->installerCalculator()->appendComponentsToInstall(selectedComponentsToInstall, true); d->calculateUninstallComponents(); - - QSet<Component *> componentsToUninstall = d->uninstallerCalculator()->componentsToUninstall(); - - foreach (Component *component, components(ComponentType::All)) - component->setInstallAction(component->isInstalled() - ? ComponentModelHelper::KeepInstalled - : ComponentModelHelper::KeepUninstalled); - foreach (Component *component, componentsToUninstall) - component->setInstallAction(ComponentModelHelper::Uninstall); - foreach (Component *component, componentsToInstall) - component->setInstallAction(ComponentModelHelper::Install); + d->updateComponentCheckedState(); // update all nodes uncompressed size foreach (Component *const component, components(ComponentType::Root)) @@ -606,6 +594,59 @@ void PackageManagerCore::componentsToInstallNeedsRecalculation() } /*! + Calculates components to install based on user selection. \a indexes + contains list of model indexes user has selected for install, dependencies + and autodependencies are resolved later. + */ +void PackageManagerCore::calculateUserSelectedComponentsToInstall(const QList<QModelIndex> &indexes) +{ + QList<Component*> componentsToInstall; + QList<Component*> componentsToUnInstall; + ComponentModel *model = isUpdater() ? updaterComponentModel() : defaultComponentModel(); + for (QModelIndex index : indexes) { + Component *installComponent = model->componentFromIndex(index); + // 1. Component is selected for install + if (installComponent->isSelected() && !installComponent->isInstalled()) { + componentsToInstall.append(installComponent); + // Check if component has replacements that needs to be removed + const QList<Component*> replacedComponents = d->replacedComponentsByName(installComponent->name()); + for (Component *replacedComponent : replacedComponents) { + componentsToUnInstall.append(replacedComponent); + d->uninstallerCalculator()->insertUninstallReason(replacedComponent, + UninstallerCalculator::UninstallReasonType::Replaced); + } + } + // 2. Component is reseleted for install (tapping checkbox off/on) + else if (installComponent->isSelected() && installComponent->isInstalled() + && !d->installerCalculator()->orderedComponentsToInstall().contains(installComponent)) { + componentsToInstall.append(installComponent); + } + // 3. Component is selected for uninstall + else if (!isUpdater() && !installComponent->isSelected() && installComponent->isInstalled()) { + componentsToUnInstall.append(installComponent); + } + // 4. Component is reselected for uninstall (tapping checkbox on/off) + else if (!installComponent->isSelected() + && d->installerCalculator()->orderedComponentsToInstall().contains(installComponent)) { + componentsToUnInstall.append(installComponent); + // Check if component has replacements that needs to be readded + componentsToInstall.append(d->replacedComponentsByName(installComponent->name())); + } + } + + d->installerCalculator()->removeComponentsFromInstall(componentsToUnInstall); + d->m_componentsToInstallCalculated + = d->installerCalculator()->appendComponentsToInstall(componentsToInstall, false); + if (!isUpdater()) { + d->uninstallerCalculator()->appendComponentsToUninstall(componentsToUnInstall, false); + } + d->uninstallerCalculator()->removeComponentsFromUnInstall(componentsToInstall); + + d->updateComponentCheckedState(); +} + + +/*! Forces a recalculation of components to install. \sa {installer::clearComponentsToInstallCalculated}{installer.clearComponentsToInstallCalculated} */ @@ -2141,8 +2182,7 @@ QList<Component*> PackageManagerCore::orderedComponentsToInstall() const bool PackageManagerCore::calculateComponents(QString *displayString) { QString htmlOutput; - if (!calculateComponentsToUninstall() || - !calculateComponentsToInstall()) { + if (!calculateComponentsToInstall()) { htmlOutput.append(QString::fromLatin1("<h2><font color=\"red\">%1</font></h2><ul>") .arg(tr("Cannot resolve all dependencies."))); //if we have a missing dependency or a recursion we can display it @@ -3942,8 +3982,12 @@ void PackageManagerCore::storeReplacedComponents(QHash<QString, Component *> &co components.remove(key); d->m_deletedReplacedComponents.append(componentToReplace); } - d->componentsToReplace().insert(componentName, qMakePair(it.key(), componentToReplace)); d->replacementDependencyComponents().append(componentToReplace); + + //Following hashes are created for quicker search of components + d->componentsToReplace().insert(componentName, qMakePair(it.key(), componentToReplace)); + QStringList oldValue = d->componentReplaces().value(it.key()->name()); + d->componentReplaces().insert(it.key()->name(), oldValue << componentToReplace->name()); } } } @@ -4205,8 +4249,8 @@ bool PackageManagerCore::fetchUpdaterPackages(const PackagesList &remotes, const if (!component->isUnstable()) component->setCheckState(Qt::Checked); } + d->createDependencyHashes(component); } - if (foundEssentialUpdate()) { foreach (QInstaller::Component *component, components) { if (d->statusCanceledOrFailed()) @@ -4379,9 +4423,10 @@ ComponentModel *PackageManagerCore::componentModel(PackageManagerCore *core, con ComponentModel::tr("Release Date")); model->setHeaderData(ComponentModelHelper::UncompressedSizeColumn, Qt::Horizontal, ComponentModel::tr("Size")); - connect(model, SIGNAL(checkStateChanged(QInstaller::ComponentModel::ModelState)), this, - SLOT(componentsToInstallNeedsRecalculation())); - + connect(model, &ComponentModel::modelCheckStateChanged, + this, &PackageManagerCore::componentsToInstallNeedsRecalculation); + connect(model, &ComponentModel::componentsCheckStateChanged, + this, &PackageManagerCore::calculateUserSelectedComponentsToInstall); return model; } |