summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArttu Tarkiainen <arttu.tarkiainen@qt.io>2020-06-26 17:33:36 +0300
committerArttu Tarkiainen <arttu.tarkiainen@qt.io>2020-07-03 10:05:54 +0300
commit99cbbd439ea1f572b4242d77035b0da3a27c79ec (patch)
tree3a2b46efdad030aef4fe5de69d9dc66d1cee5de9
parent519899850f86cb99cdd4c2f84f63ac2a28bfe193 (diff)
Modify repository category functionality
Remove conditions for checking whether a category containing a certain repository needs to be enabled when fetching & parsing metadata for that repository. All categorized repositories will now be fetched regardless of their enabled state, that will be only used to hide/show individual components in the view. Task-number: QTIFW-1821 Change-Id: Id0dbaed9c5b460bf0faeebd6e45349f0c07d10c2 Reviewed-by: Katja Marttila <katja.marttila@qt.io>
-rw-r--r--src/libs/installer/componentselectionpage_p.cpp65
-rw-r--r--src/libs/installer/componentselectionpage_p.h5
-rw-r--r--src/libs/installer/metadatajob.cpp32
-rw-r--r--src/libs/installer/repositorycategory.cpp14
-rw-r--r--src/libs/installer/repositorycategory.h4
-rw-r--r--src/libs/installer/settings.cpp10
-rw-r--r--src/libs/installer/settings.h1
7 files changed, 85 insertions, 46 deletions
diff --git a/src/libs/installer/componentselectionpage_p.cpp b/src/libs/installer/componentselectionpage_p.cpp
index cb8f321d0..d0603844c 100644
--- a/src/libs/installer/componentselectionpage_p.cpp
+++ b/src/libs/installer/componentselectionpage_p.cpp
@@ -1,6 +1,6 @@
/**************************************************************************
**
-** Copyright (C) 2018 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt Installer Framework.
@@ -216,26 +216,24 @@ 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("Filter"));
- fetchCategoryButton->setObjectName(QLatin1String("FetchCategoryButton"));
- connect(fetchCategoryButton, &QPushButton::clicked, this,
- &ComponentSelectionPagePrivate::fetchRepositoryCategories);
foreach (RepositoryCategory repository, m_core->settings().organizedRepositoryCategories()) {
QCheckBox *checkBox = new QCheckBox;
checkBox->setObjectName(repository.displayname());
checkBox->setChecked(repository.isEnabled());
connect(checkBox, &QCheckBox::stateChanged, this,
- &ComponentSelectionPagePrivate::checkboxStateChanged);
+ &ComponentSelectionPagePrivate::updateRepositoryCategories, Qt::QueuedConnection);
checkBox->setText(repository.displayname());
checkBox->setToolTip(repository.tooltip());
categoryLayout->addWidget(checkBox);
}
- categoryLayout->addWidget(fetchCategoryButton);
vLayout->addWidget(m_categoryGroupBox);
vLayout->addStretch();
m_mainGLayout->addWidget(m_categoryWidget, 1, 0);
+
+ // Apply default enabled categories as initial component filters
+ QMetaObject::invokeMethod(this, "updateRepositoryCategories", Qt::QueuedConnection);
}
void ComponentSelectionPagePrivate::showCategoryLayout(bool show)
@@ -344,18 +342,6 @@ void ComponentSelectionPagePrivate::deselectAll()
m_currentModel->setCheckedState(ComponentModel::AllUnchecked);
}
-void ComponentSelectionPagePrivate::checkboxStateChanged()
-{
- QList<QCheckBox*> checkboxes = m_categoryGroupBox->findChildren<QCheckBox *>();
- bool enableFetchButton = false;
- foreach (QCheckBox *checkbox, checkboxes) {
- if (checkbox->isChecked()) {
- enableFetchButton = true;
- break;
- }
- }
-}
-
void ComponentSelectionPagePrivate::enableRepositoryCategory(const QString &repositoryName, bool enable)
{
QMap<QString, RepositoryCategory> organizedRepositoryCategories = m_core->settings().organizedRepositoryCategories();
@@ -393,7 +379,7 @@ void ComponentSelectionPagePrivate::updateWidgetVisibility(bool show)
#endif
}
-void ComponentSelectionPagePrivate::fetchRepositoryCategories()
+void ComponentSelectionPagePrivate::updateRepositoryCategories()
{
updateWidgetVisibility(true);
@@ -404,10 +390,43 @@ void ComponentSelectionPagePrivate::fetchRepositoryCategories()
enableRepositoryCategory(checkbox->objectName(), checkbox->isChecked());
}
- if (!m_core->fetchRemotePackagesTree()) {
- MessageBoxHandler::critical(MessageBoxHandler::currentBestSuitParent(),
- QLatin1String("FailToFetchPackages"), tr("Error"), m_core->error());
+ // < name, visible >
+ QHash<QString, bool> componentVisibleHash;
+ // Prepare a QHash dictionary for repository urls, so we don't have to get
+ // copies of Repository objects later by value when iterating over categories.
+ const QHash<QString, QSet<QUrl> > repoUrlsForCategories = m_core->settings().repositoryUrlsForCategories();
+ const QSet<RepositoryCategory> repoCategories = m_core->settings().repositoryCategories();
+ const QList<Component *> components = m_core->components(PackageManagerCore::ComponentType::All);
+ foreach (const Component *component, components) {
+ bool hasRepoCategory = false;
+ bool hasEnabledCategory = false;
+
+ foreach (const RepositoryCategory &repoCategory, repoCategories) {
+ const QSet<QUrl> repoUrls = repoUrlsForCategories.value(repoCategory.displayname());
+ foreach (const QUrl &url, repoUrls) {
+ if (component->repositoryUrl() == url) {
+ hasRepoCategory = true;
+ hasEnabledCategory = repoCategory.isEnabled();
+ break;
+ }
+ }
+ if (hasEnabledCategory)
+ break;
+ }
+ const QString componentName = component->name();
+ const QModelIndex &idx = m_currentModel->indexFromComponentName(componentName);
+ if (idx.isValid()) {
+ // Same component name can appear in multiple repositories, only one enabled
+ // category or non-categorized repo is required to show the component in view.
+ if (componentVisibleHash.value(componentName))
+ continue;
+
+ const bool show = (!hasRepoCategory || hasEnabledCategory);
+ m_treeView->setRowHidden(idx.row(), idx.parent(), !show);
+ componentVisibleHash.insert(componentName, show);
+ }
}
+
updateWidgetVisibility(false);
}
diff --git a/src/libs/installer/componentselectionpage_p.h b/src/libs/installer/componentselectionpage_p.h
index bce13246b..0ed00152e 100644
--- a/src/libs/installer/componentselectionpage_p.h
+++ b/src/libs/installer/componentselectionpage_p.h
@@ -1,6 +1,6 @@
/**************************************************************************
**
-** Copyright (C) 2018 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt Installer Framework.
@@ -74,10 +74,9 @@ public slots:
void currentSelectedChanged(const QModelIndex &current);
void selectAll();
void deselectAll();
- void checkboxStateChanged();
void enableRepositoryCategory(const QString &repositoryName, bool enable);
void updateWidgetVisibility(bool show);
- void fetchRepositoryCategories();
+ void updateRepositoryCategories();
void customButtonClicked(int which);
void onProgressChanged(int progress);
void setMessage(const QString &msg);
diff --git a/src/libs/installer/metadatajob.cpp b/src/libs/installer/metadatajob.cpp
index 4c84dfae8..4064fa8b0 100644
--- a/src/libs/installer/metadatajob.cpp
+++ b/src/libs/installer/metadatajob.cpp
@@ -88,11 +88,9 @@ QList<Metadata> MetadataJob::metadata() const
{
QList<Metadata> metadata = m_metaFromDefaultRepositories.values();
foreach (RepositoryCategory repositoryCategory, m_core->settings().repositoryCategories()) {
- if (m_core->isUpdater() || (repositoryCategory.isEnabled() && m_fetchedArchive.contains(repositoryCategory.displayname()))) {
- QList<ArchiveMetadata> archiveMetaList = m_fetchedArchive.values(repositoryCategory.displayname());
- foreach (ArchiveMetadata archiveMeta, archiveMetaList) {
- metadata.append(archiveMeta.metaData);
- }
+ QList<ArchiveMetadata> archiveMetaList = m_fetchedArchive.values(repositoryCategory.displayname());
+ foreach (ArchiveMetadata archiveMeta, archiveMetaList) {
+ metadata.append(archiveMeta.metaData);
}
}
return metadata;
@@ -690,20 +688,18 @@ 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())) {
- 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);
- }
+ 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/repositorycategory.cpp b/src/libs/installer/repositorycategory.cpp
index 79b1cc6a8..d1a51e8b0 100644
--- a/src/libs/installer/repositorycategory.cpp
+++ b/src/libs/installer/repositorycategory.cpp
@@ -1,6 +1,6 @@
/**************************************************************************
**
-** Copyright (C) 2018 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt Installer Framework.
@@ -113,6 +113,18 @@ QSet<Repository> RepositoryCategory::repositories() const
}
/*!
+ Returns the list of repository URLs the category has.
+*/
+QSet<QUrl> RepositoryCategory::repositoryUrls() const
+{
+ QSet<QUrl> repositoryUrls;
+ foreach (const Repository &repository, repositories())
+ repositoryUrls.insert(repository.url());
+
+ return repositoryUrls;
+}
+
+/*!
Inserts a set of \a repositories to the category. Removes old \a repositories
if \a replace is set to \c true.
*/
diff --git a/src/libs/installer/repositorycategory.h b/src/libs/installer/repositorycategory.h
index faa8d252b..0f950d577 100644
--- a/src/libs/installer/repositorycategory.h
+++ b/src/libs/installer/repositorycategory.h
@@ -1,6 +1,6 @@
/**************************************************************************
**
-** Copyright (C) 2018 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt Installer Framework.
@@ -54,6 +54,8 @@ public:
void setTooltip(const QString &tooltip);
QSet<Repository> repositories() const;
+ QSet<QUrl> repositoryUrls() const;
+
void setRepositories(const QSet<Repository> repositories, const bool replace = false);
void addRepository(const Repository repository);
diff --git a/src/libs/installer/settings.cpp b/src/libs/installer/settings.cpp
index 97c20243d..4b19cafe1 100644
--- a/src/libs/installer/settings.cpp
+++ b/src/libs/installer/settings.cpp
@@ -620,6 +620,16 @@ QMap<QString, RepositoryCategory> Settings::organizedRepositoryCategories() cons
return map;
}
+QHash<QString, QSet<QUrl> > Settings::repositoryUrlsForCategories() const
+{
+ // < category displayname, repo urls >
+ QHash<QString, QSet<QUrl> > repoUrlsForCategories;
+ foreach (const RepositoryCategory &repoCategory, repositoryCategories())
+ repoUrlsForCategories.insert(repoCategory.displayname(), repoCategory.repositoryUrls());
+
+ return repoUrlsForCategories;
+}
+
void Settings::setDefaultRepositories(const QSet<Repository> &repositories)
{
d->m_data.remove(scRepositories);
diff --git a/src/libs/installer/settings.h b/src/libs/installer/settings.h
index 0c2bcd95e..82e10beb1 100644
--- a/src/libs/installer/settings.h
+++ b/src/libs/installer/settings.h
@@ -122,6 +122,7 @@ public:
QSet<RepositoryCategory> repositoryCategories() const;
QMap<QString, RepositoryCategory> organizedRepositoryCategories() const;
+ QHash<QString, QSet<QUrl> > repositoryUrlsForCategories() const;
void setRepositoryCategories(const QSet<RepositoryCategory> &repositories);
void addRepositoryCategories(const QSet<RepositoryCategory> &repositories);
Settings::Update updateRepositoryCategories(const RepoHash &updates);