diff options
Diffstat (limited to 'src/libs/installer')
-rw-r--r-- | src/libs/installer/componentselectionpage_p.cpp | 29 | ||||
-rw-r--r-- | src/libs/installer/componentselectionpage_p.h | 2 | ||||
-rw-r--r-- | src/libs/installer/metadatajob.cpp | 33 | ||||
-rw-r--r-- | src/libs/installer/packagemanagercore.cpp | 22 | ||||
-rw-r--r-- | src/libs/installer/packagemanagercore.h | 3 | ||||
-rw-r--r-- | src/libs/installer/packagemanagercore_p.cpp | 4 | ||||
-rw-r--r-- | src/libs/installer/packagemanagercore_p.h | 1 | ||||
-rw-r--r-- | src/libs/installer/packagemanagergui.cpp | 4 | ||||
-rw-r--r-- | src/libs/installer/repository.cpp | 18 | ||||
-rw-r--r-- | src/libs/installer/repository.h | 6 | ||||
-rw-r--r-- | src/libs/installer/settings.cpp | 4 |
11 files changed, 95 insertions, 31 deletions
diff --git a/src/libs/installer/componentselectionpage_p.cpp b/src/libs/installer/componentselectionpage_p.cpp index 4e7acc837..88ea86b8a 100644 --- a/src/libs/installer/componentselectionpage_p.cpp +++ b/src/libs/installer/componentselectionpage_p.cpp @@ -37,6 +37,7 @@ #include <QTreeView> #include <QLabel> +#include <QScrollArea> #include <QPushButton> #include <QGroupBox> #include <QProgressBar> @@ -69,17 +70,24 @@ ComponentSelectionPagePrivate::ComponentSelectionPagePrivate(ComponentSelectionP m_descriptionVLayout = new QVBoxLayout; m_descriptionVLayout->setObjectName(QLatin1String("DescriptionLayout")); + m_descriptionScrollArea = new QScrollArea(q); + m_descriptionScrollArea->setWidgetResizable(true); + m_descriptionScrollArea->setFrameShape(QFrame::NoFrame); + m_descriptionScrollArea->setObjectName(QLatin1String("DescriptionScrollArea")); + m_descriptionLabel = new QLabel(q); m_descriptionLabel->setWordWrap(true); + m_descriptionLabel->setTextInteractionFlags(Qt::TextBrowserInteraction); + m_descriptionLabel->setOpenExternalLinks(true); m_descriptionLabel->setObjectName(QLatin1String("ComponentDescriptionLabel")); - m_descriptionVLayout->addWidget(m_descriptionLabel); + m_descriptionLabel->setAlignment(Qt::AlignTop); + m_descriptionScrollArea->setWidget(m_descriptionLabel); + m_descriptionVLayout->addWidget(m_descriptionScrollArea); m_sizeLabel = new QLabel(q); m_sizeLabel->setWordWrap(true); m_sizeLabel->setObjectName(QLatin1String("ComponentSizeLabel")); m_descriptionVLayout->addWidget(m_sizeLabel); - m_descriptionVLayout->addSpacerItem(new QSpacerItem(1, 1, QSizePolicy::MinimumExpanding, - QSizePolicy::MinimumExpanding)); m_treeViewVLayout = new QVBoxLayout; m_treeViewVLayout->setObjectName(QLatin1String("TreeviewLayout")); @@ -193,7 +201,7 @@ void ComponentSelectionPagePrivate::setupCategoryLayout() m_categoryGroupBox->setTitle(m_core->settings().repositoryCategoryDisplayName()); m_categoryGroupBox->setObjectName(QLatin1String("CategoryGroupBox")); QVBoxLayout *categoryLayout = new QVBoxLayout(m_categoryGroupBox); - QPushButton *fetchCategoryButton = new QPushButton(tr("Refresh")); + QPushButton *fetchCategoryButton = new QPushButton(tr("Filter")); fetchCategoryButton->setObjectName(QLatin1String("FetchCategoryButton")); connect(fetchCategoryButton, &QPushButton::clicked, this, &ComponentSelectionPagePrivate::fetchRepositoryCategories); @@ -208,9 +216,9 @@ void ComponentSelectionPagePrivate::setupCategoryLayout() checkBox->setToolTip(repository.tooltip()); categoryLayout->addWidget(checkBox); } + categoryLayout->addWidget(fetchCategoryButton); vLayout->addWidget(m_categoryGroupBox); - vLayout->addWidget(fetchCategoryButton); vLayout->addStretch(); m_mainHLayout->insertWidget(0, m_categoryWidget); } @@ -290,8 +298,15 @@ void ComponentSelectionPagePrivate::currentSelectedChanged(const QModelIndex &cu return; m_sizeLabel->setText(QString()); - m_descriptionLabel->setText(m_currentModel->data(m_currentModel->index(current.row(), - ComponentModelHelper::NameColumn, current.parent()), Qt::ToolTipRole).toString()); + + QString description = m_currentModel->data(m_currentModel->index(current.row(), + ComponentModelHelper::NameColumn, current.parent()), Qt::ToolTipRole).toString(); + + // replace {external-link}='' fields in component description with proper link tags + description.replace(QRegularExpression(QLatin1String("{external-link}='(.*?)'")), + QLatin1String("<a href=\"\\1\"><span style=\"color:#17a81a;\">\\1</span></a>")); + + m_descriptionLabel->setText(description); Component *component = m_currentModel->componentFromIndex(current); if ((m_core->isUninstaller()) || (!component)) diff --git a/src/libs/installer/componentselectionpage_p.h b/src/libs/installer/componentselectionpage_p.h index 9ebec834a..6169a06f5 100644 --- a/src/libs/installer/componentselectionpage_p.h +++ b/src/libs/installer/componentselectionpage_p.h @@ -37,6 +37,7 @@ class QTreeView; class QLabel; +class QScrollArea; class QPushButton; class QGroupBox; class QListWidgetItem; @@ -87,6 +88,7 @@ private: PackageManagerCore *m_core; QTreeView *m_treeView; QLabel *m_sizeLabel; + QScrollArea *m_descriptionScrollArea; QLabel *m_descriptionLabel; QVBoxLayout *m_descriptionVLayout; QPushButton *m_checkAll; diff --git a/src/libs/installer/metadatajob.cpp b/src/libs/installer/metadatajob.cpp index 3beda7ef2..c69fda3d0 100644 --- a/src/libs/installer/metadatajob.cpp +++ b/src/libs/installer/metadatajob.cpp @@ -619,13 +619,25 @@ MetadataJob::Status MetadataJob::parseUpdatesXml(const QList<FileTaskResult> &re } } } - if (metadata.repository.archivename().isEmpty()) { + if (metadata.repository.categoryname().isEmpty()) { m_metaFromDefaultRepositories.insert(metadata.directory, metadata); } else { //Hash metadata to help checking if meta for repository is already fetched ArchiveMetadata archiveMetadata; archiveMetadata.metaData = metadata; - m_fetchedArchive.insertMulti(metadata.repository.archivename(), archiveMetadata); + m_fetchedArchive.insertMulti(metadata.repository.categoryname(), archiveMetadata); + + //Check if other categories have the same url (contains same metadata) + //so we can speed up other category fetches + foreach (RepositoryCategory category, m_core->settings().repositoryCategories()) { + if (category.displayname() != metadata.repository.categoryname()) { + foreach (Repository repository, category.repositories()) { + if (repository.url() == metadata.repository.url()) { + m_fetchedArchive.insertMulti(category.displayname(), archiveMetadata); + } + } + } + } // Hash for faster lookups m_metaFromArchive.insert(metadata.directory, metadata); } @@ -732,11 +744,20 @@ QSet<Repository> MetadataJob::getRepositories() // If repository is already fetched, do not fetch it again. // In updater mode, fetch always all archive repositories to get updates foreach (RepositoryCategory repositoryCategory, m_core->settings().repositoryCategories()) { - if (m_core->isUpdater() || (repositoryCategory.isEnabled() && !m_fetchedArchive.contains(repositoryCategory.displayname()))) { - foreach (Repository repository, repositoryCategory.repositories()) { - repositories.insert(repository); + if (m_core->isUpdater() || (repositoryCategory.isEnabled())) { + foreach (Repository repository, repositoryCategory.repositories()) { + QHashIterator<QString, ArchiveMetadata> i(m_fetchedArchive); + bool fetch = true; + while (i.hasNext()) { + i.next(); + ArchiveMetadata metaData = i.value(); + if (repository.url() == metaData.metaData.repository.url()) + fetch = false; + } + if (fetch) + repositories.insert(repository); + } } - } } return repositories; } diff --git a/src/libs/installer/packagemanagercore.cpp b/src/libs/installer/packagemanagercore.cpp index 78198156e..4a7f42621 100644 --- a/src/libs/installer/packagemanagercore.cpp +++ b/src/libs/installer/packagemanagercore.cpp @@ -665,6 +665,22 @@ int PackageManagerCore::downloadNeededArchives(double partProgressSize) } /*! + Returns \c true if essential component update is found. +*/ +bool PackageManagerCore::foundEssentialUpdate() const +{ + return d->m_foundEssentialUpdate; +} + +/*! + Sets the value of \a foundEssentialUpdate, defaults \c true. +*/ +void PackageManagerCore::setFoundEssentialUpdate(bool foundEssentialUpdate) +{ + d->m_foundEssentialUpdate = foundEssentialUpdate; +} + +/*! Returns \c true if a hard restart of the application is requested. */ bool PackageManagerCore::needsHardRestart() const @@ -2733,7 +2749,7 @@ bool PackageManagerCore::fetchUpdaterPackages(const PackagesList &remotes, const data.components = &components; data.installedPackages = &locals; - bool foundEssentialUpdate = false; + setFoundEssentialUpdate(false); LocalPackagesHash installedPackages = locals; QStringList replaceMes; @@ -2789,7 +2805,7 @@ bool PackageManagerCore::fetchUpdaterPackages(const PackagesList &remotes, const continue; if (update->data(scEssential, scFalse).toString().toLower() == scTrue) - foundEssentialUpdate = true; + setFoundEssentialUpdate(true); // this is not a dependency, it is a real update components.insert(name, d->m_updaterComponentsDeps.takeLast()); @@ -2840,7 +2856,7 @@ bool PackageManagerCore::fetchUpdaterPackages(const PackagesList &remotes, const } } - if (foundEssentialUpdate) { + if (foundEssentialUpdate()) { foreach (QInstaller::Component *component, components) { if (d->statusCanceledOrFailed()) return false; diff --git a/src/libs/installer/packagemanagercore.h b/src/libs/installer/packagemanagercore.h index 9f8d1a304..4fa2f2554 100644 --- a/src/libs/installer/packagemanagercore.h +++ b/src/libs/installer/packagemanagercore.h @@ -266,6 +266,9 @@ public: int downloadNeededArchives(double partProgressSize); + bool foundEssentialUpdate() const; + void setFoundEssentialUpdate(bool foundEssentialUpdate = true); + bool needsHardRestart() const; void setNeedsHardRestart(bool needsHardRestart = true); bool finishedWithSuccess() const; diff --git a/src/libs/installer/packagemanagercore_p.cpp b/src/libs/installer/packagemanagercore_p.cpp index c67480737..29c3fb03a 100644 --- a/src/libs/installer/packagemanagercore_p.cpp +++ b/src/libs/installer/packagemanagercore_p.cpp @@ -1336,7 +1336,11 @@ void PackageManagerCorePrivate::writeMaintenanceTool(OperationList performedOper newBinaryWritten = true; QFile tmp(binaryName); QInstaller::openForRead(&tmp); +#ifdef Q_OS_OSX writeMaintenanceToolBinary(&tmp, tmp.size(), true); +#else + writeMaintenanceToolBinary(&tmp, layout.endOfBinaryContent - layout.binaryContentSize, true); +#endif } } diff --git a/src/libs/installer/packagemanagercore_p.h b/src/libs/installer/packagemanagercore_p.h index 21ab3fc40..e0817c573 100644 --- a/src/libs/installer/packagemanagercore_p.h +++ b/src/libs/installer/packagemanagercore_p.h @@ -247,6 +247,7 @@ private: bool m_updateSourcesAdded; qint64 m_magicBinaryMarker; bool m_componentsToInstallCalculated; + bool m_foundEssentialUpdate; mutable ScriptEngine *m_componentScriptEngine; mutable ScriptEngine *m_controlScriptEngine; diff --git a/src/libs/installer/packagemanagergui.cpp b/src/libs/installer/packagemanagergui.cpp index a053e9bff..db1b99d3f 100644 --- a/src/libs/installer/packagemanagergui.cpp +++ b/src/libs/installer/packagemanagergui.cpp @@ -1898,7 +1898,8 @@ void ComponentSelectionPage::entering() QT_TR_NOOP("Please select the components you want to update."), QT_TR_NOOP("Please select the components you want to install."), QT_TR_NOOP("Please select the components you want to uninstall."), - QT_TR_NOOP("Select the components to install. Deselect installed components to uninstall them. Any components already installed will not be updated.") + QT_TR_NOOP("Select the components to install. Deselect installed components to uninstall them. Any components already installed will not be updated."), + QT_TR_NOOP("Mandatory components need to be updated first before you can select other components to update.") }; int index = 0; @@ -1906,6 +1907,7 @@ void ComponentSelectionPage::entering() if (core->isInstaller()) index = 1; if (core->isUninstaller()) index = 2; if (core->isPackageManager()) index = 3; + if (core->foundEssentialUpdate() && core->isUpdater()) index = 4; setColoredSubTitle(tr(strings[index])); d->updateTreeView(); diff --git a/src/libs/installer/repository.cpp b/src/libs/installer/repository.cpp index 5e31d81e2..a165b8617 100644 --- a/src/libs/installer/repository.cpp +++ b/src/libs/installer/repository.cpp @@ -57,7 +57,7 @@ Repository::Repository(const Repository &other) , m_password(other.m_password) , m_displayname(other.m_displayname) , m_compressed(other.m_compressed) - , m_archivename(other.m_archivename) + , m_categoryname(other.m_categoryname) { registerMetaType(); } @@ -202,17 +202,17 @@ void Repository::setDisplayName(const QString &displayname) /*! Returns the archive name if the repository belongs to an archive. */ -QString Repository::archivename() const +QString Repository::categoryname() const { - return m_archivename; + return m_categoryname; } /*! - Sets the archive name to \a archivename if the repository belongs to an archive. + Sets the category name to \a categoryname if the repository belongs to an category. */ -void Repository::setArchiveName(const QString &archivename) +void Repository::setCategoryName(const QString &categoryname) { - m_archivename = archivename; + m_categoryname = categoryname; } /*! @@ -265,7 +265,7 @@ const Repository &Repository::operator=(const Repository &other) m_password = other.m_password; m_displayname = other.m_displayname; m_compressed = other.m_compressed; - m_archivename = other.m_archivename; + m_categoryname = other.m_categoryname; return *this; } @@ -280,7 +280,7 @@ QDataStream &operator>>(QDataStream &istream, Repository &repository) { QByteArray url, username, password, displayname, compressed; istream >> url >> repository.m_default >> repository.m_enabled >> username >> password - >> displayname >> repository.m_archivename; + >> displayname >> repository.m_categoryname; repository.setUrl(QUrl::fromEncoded(QByteArray::fromBase64(url))); repository.setUsername(QString::fromUtf8(QByteArray::fromBase64(username))); repository.setPassword(QString::fromUtf8(QByteArray::fromBase64(password))); @@ -292,7 +292,7 @@ QDataStream &operator<<(QDataStream &ostream, const Repository &repository) { return ostream << repository.m_url.toEncoded().toBase64() << repository.m_default << repository.m_enabled << repository.m_username.toUtf8().toBase64() << repository.m_password.toUtf8().toBase64() - << repository.m_displayname.toUtf8().toBase64() << repository.m_archivename.toUtf8().toBase64(); + << repository.m_displayname.toUtf8().toBase64() << repository.m_categoryname.toUtf8().toBase64(); } } diff --git a/src/libs/installer/repository.h b/src/libs/installer/repository.h index 83393ead9..546cddc97 100644 --- a/src/libs/installer/repository.h +++ b/src/libs/installer/repository.h @@ -64,8 +64,8 @@ public: QString displayname() const; void setDisplayName(const QString &displayname); - QString archivename() const; - void setArchiveName(const QString &archivename); + QString categoryname() const; + void setCategoryName(const QString &categoryname); bool isCompressed() const; void setCompressed(bool compressed); @@ -85,7 +85,7 @@ private: QString m_username; QString m_password; QString m_displayname; - QString m_archivename; + QString m_categoryname; bool m_compressed; }; diff --git a/src/libs/installer/settings.cpp b/src/libs/installer/settings.cpp index 13eb2ce40..e0c9a3970 100644 --- a/src/libs/installer/settings.cpp +++ b/src/libs/installer/settings.cpp @@ -168,7 +168,7 @@ static QSet<Repository> readRepositories(QXmlStreamReader &reader, bool isDefaul } } if (displayName && !displayName->isEmpty()) - repo.setArchiveName(*displayName); + repo.setCategoryName(*displayName); set.insert(repo); } else if (reader.name() == QLatin1String("Tooltip")) { *tooltip = reader.readElementText(); @@ -832,7 +832,7 @@ void Settings::setSaveDefaultRepositories(bool save) QString Settings::repositoryCategoryDisplayName() const { QString displayName = d->m_data.value(QLatin1String(scRepositoryCategoryDisplayName)).toString(); - return displayName.isEmpty() ? tr("Show package categories") : displayName; + return displayName.isEmpty() ? tr("Select Package Categories") : displayName; } void Settings::setRepositoryCategoryDisplayName(const QString& name) |