From 99cbbd439ea1f572b4242d77035b0da3a27c79ec Mon Sep 17 00:00:00 2001 From: Arttu Tarkiainen Date: Fri, 26 Jun 2020 17:33:36 +0300 Subject: 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 --- src/libs/installer/componentselectionpage_p.cpp | 65 ++++++++++++++++--------- src/libs/installer/componentselectionpage_p.h | 5 +- src/libs/installer/metadatajob.cpp | 32 ++++++------ src/libs/installer/repositorycategory.cpp | 14 +++++- src/libs/installer/repositorycategory.h | 4 +- src/libs/installer/settings.cpp | 10 ++++ src/libs/installer/settings.h | 1 + 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 checkboxes = m_categoryGroupBox->findChildren(); - bool enableFetchButton = false; - foreach (QCheckBox *checkbox, checkboxes) { - if (checkbox->isChecked()) { - enableFetchButton = true; - break; - } - } -} - void ComponentSelectionPagePrivate::enableRepositoryCategory(const QString &repositoryName, bool enable) { QMap 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 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 > repoUrlsForCategories = m_core->settings().repositoryUrlsForCategories(); + const QSet repoCategories = m_core->settings().repositoryCategories(); + const QList 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 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 ¤t); 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 MetadataJob::metadata() const { QList metadata = m_metaFromDefaultRepositories.values(); foreach (RepositoryCategory repositoryCategory, m_core->settings().repositoryCategories()) { - if (m_core->isUpdater() || (repositoryCategory.isEnabled() && m_fetchedArchive.contains(repositoryCategory.displayname()))) { - QList archiveMetaList = m_fetchedArchive.values(repositoryCategory.displayname()); - foreach (ArchiveMetadata archiveMeta, archiveMetaList) { - metadata.append(archiveMeta.metaData); - } + QList archiveMetaList = m_fetchedArchive.values(repositoryCategory.displayname()); + foreach (ArchiveMetadata archiveMeta, archiveMetaList) { + metadata.append(archiveMeta.metaData); } } return metadata; @@ -690,20 +688,18 @@ QSet 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 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 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. @@ -112,6 +112,18 @@ QSet RepositoryCategory::repositories() const return variantListToSet(m_data.values(scRepositories)); } +/*! + Returns the list of repository URLs the category has. +*/ +QSet RepositoryCategory::repositoryUrls() const +{ + QSet 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 repositories() const; + QSet repositoryUrls() const; + void setRepositories(const QSet 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 Settings::organizedRepositoryCategories() cons return map; } +QHash > Settings::repositoryUrlsForCategories() const +{ + // < category displayname, repo urls > + QHash > repoUrlsForCategories; + foreach (const RepositoryCategory &repoCategory, repositoryCategories()) + repoUrlsForCategories.insert(repoCategory.displayname(), repoCategory.repositoryUrls()); + + return repoUrlsForCategories; +} + void Settings::setDefaultRepositories(const QSet &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 repositoryCategories() const; QMap organizedRepositoryCategories() const; + QHash > repositoryUrlsForCategories() const; void setRepositoryCategories(const QSet &repositories); void addRepositoryCategories(const QSet &repositories); Settings::Update updateRepositoryCategories(const RepoHash &updates); -- cgit v1.2.3