diff options
author | Arttu Tarkiainen <arttu.tarkiainen@qt.io> | 2020-06-26 17:33:36 +0300 |
---|---|---|
committer | Arttu Tarkiainen <arttu.tarkiainen@qt.io> | 2020-07-03 10:05:54 +0300 |
commit | 99cbbd439ea1f572b4242d77035b0da3a27c79ec (patch) | |
tree | 3a2b46efdad030aef4fe5de69d9dc66d1cee5de9 /src/libs/installer/componentselectionpage_p.cpp | |
parent | 519899850f86cb99cdd4c2f84f63ac2a28bfe193 (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>
Diffstat (limited to 'src/libs/installer/componentselectionpage_p.cpp')
-rw-r--r-- | src/libs/installer/componentselectionpage_p.cpp | 65 |
1 files changed, 42 insertions, 23 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); } |