diff --git a/doc/src/projects/creator-only/creator-projects-qt-versions.qdoc b/doc/src/projects/creator-only/creator-projects-qt-versions.qdoc index f0bff5d0bf8..58539f5534a 100644 --- a/doc/src/projects/creator-only/creator-projects-qt-versions.qdoc +++ b/doc/src/projects/creator-only/creator-projects-qt-versions.qdoc @@ -80,6 +80,16 @@ \endlist + \section1 Documentation + + By default, \QC registers only the latest available version of the documentation for each + installed Qt module. + + To register the documentation sets of all installed Qt versions, choose + \uicontrol{All} from the \uicontrol{Register documentation} list. + To register no Qt documentation at all, choose \uicontrol{None}. + The default behavior is \uicontrol{Highest Version Only}. + \section1 Troubleshooting Qt Installations If \QC detects problems in the installation of a Qt version, it displays diff --git a/src/plugins/help/helpmanager.cpp b/src/plugins/help/helpmanager.cpp index 3c40e187020..09fdc041fe3 100644 --- a/src/plugins/help/helpmanager.cpp +++ b/src/plugins/help/helpmanager.cpp @@ -196,6 +196,8 @@ void HelpManager::unregisterNamespaces(const QStringList &nameSpaces) bool docsChanged = false; for (const QString &nameSpace : nameSpaces) { const QString filePath = d->m_helpEngine->documentationFileName(nameSpace); + if (filePath.isEmpty()) // wasn't registered anyhow, ignore + continue; if (d->m_helpEngine->unregisterDocumentation(nameSpace)) { docsChanged = true; d->m_userRegisteredFiles.remove(filePath); diff --git a/src/plugins/qtsupport/qtoptionspage.cpp b/src/plugins/qtsupport/qtoptionspage.cpp index 93f79c004cf..d059b02dee9 100644 --- a/src/plugins/qtsupport/qtoptionspage.cpp +++ b/src/plugins/qtsupport/qtoptionspage.cpp @@ -243,6 +243,16 @@ QtOptionsPageWidget::QtOptionsPageWidget(QWidget *parent) m_ui->qtdirList->setTextElideMode(Qt::ElideMiddle); m_ui->qtdirList->sortByColumn(0, Qt::AscendingOrder); + m_ui->documentationSetting->addItem(tr("Highest Version Only"), + int(QtVersionManager::DocumentationSetting::HighestOnly)); + m_ui->documentationSetting->addItem(tr("All"), int(QtVersionManager::DocumentationSetting::All)); + m_ui->documentationSetting->addItem(tr("None"), + int(QtVersionManager::DocumentationSetting::None)); + const int selectedIndex = m_ui->documentationSetting->findData( + int(QtVersionManager::documentationSetting())); + if (selectedIndex >= 0) + m_ui->documentationSetting->setCurrentIndex(selectedIndex); + QList additions = transform(QtVersionManager::versions(), &BaseQtVersion::uniqueId); updateQtVersions(additions, QList(), QList()); @@ -756,19 +766,21 @@ void QtOptionsPageWidget::updateCurrentQtName() void QtOptionsPageWidget::apply() { - disconnect(QtVersionManager::instance(), &QtVersionManager::qtVersionsChanged, - this, &QtOptionsPageWidget::updateQtVersions); + disconnect(QtVersionManager::instance(), + &QtVersionManager::qtVersionsChanged, + this, + &QtOptionsPageWidget::updateQtVersions); + + QtVersionManager::setDocumentationSetting( + QtVersionManager::DocumentationSetting(m_ui->documentationSetting->currentData().toInt())); QList versions; - m_model->forItemsAtLevel<2>([&versions](QtVersionItem *item) { item->setChanged(false); versions.append(item->version()->clone()); }); - QtVersionManager::setNewQtVersions(versions); - connect(QtVersionManager::instance(), &QtVersionManager::qtVersionsChanged, this, &QtOptionsPageWidget::updateQtVersions); } diff --git a/src/plugins/qtsupport/qtversionmanager.cpp b/src/plugins/qtsupport/qtversionmanager.cpp index 5888f6a9388..124c64b3cd2 100644 --- a/src/plugins/qtsupport/qtversionmanager.cpp +++ b/src/plugins/qtsupport/qtversionmanager.cpp @@ -67,6 +67,9 @@ const char QTVERSION_FILENAME[] = "/qtversion.xml"; using VersionMap = QMap; static VersionMap m_versions; + +const char DOCUMENTATION_SETTING_KEY[] = "QtSupport/DocumentationSetting"; + static int m_idcount = 0; // managed by QtProjectManagerPlugin static QtVersionManager *m_instance = nullptr; @@ -95,9 +98,6 @@ bool qtVersionNumberCompare(BaseQtVersion *a, BaseQtVersion *b) static bool restoreQtVersions(); static void findSystemQt(); static void saveQtVersions(); -static void updateDocumentation(const QList &added, - const QList &removed = {}, - const QList &allNew = {}); // -------------------------------------------------------------------------- // QtVersionManager @@ -145,7 +145,8 @@ void QtVersionManager::triggerQtVersionRestore() FileSystemWatcher::WatchModifiedDate); } // exists - updateDocumentation(m_versions.values()); + const QList vs = versions(); + updateDocumentation(vs, {}, vs); } bool QtVersionManager::isLoaded() @@ -464,37 +465,57 @@ void QtVersionManager::removeVersion(BaseQtVersion *version) delete version; } -static QStringList documentationFiles(BaseQtVersion *v) +using Path = QString; +using FileName = QString; +static QList> documentationFiles(BaseQtVersion *v) { - QStringList files; + QList> files; const QStringList docPaths = QStringList( {v->docsPath().toString() + QChar('/'), v->docsPath().toString() + "/qch/"}); for (const QString &docPath : docPaths) { const QDir versionHelpDir(docPath); for (const QString &helpFile : versionHelpDir.entryList(QStringList("*.qch"), QDir::Files)) - files.append(docPath + helpFile); + files.append({docPath, helpFile}); } return files; } -static QStringList documentationFiles(const QList &vs) +static QStringList documentationFiles(const QList &vs, bool highestOnly = false) { - QStringList files; - for (BaseQtVersion *v : vs) - files += documentationFiles(v); - return files; + QSet includedFileNames; + QSet filePaths; + const QList versions = highestOnly ? QtVersionManager::sortVersions(vs) : vs; + for (BaseQtVersion *v : versions) { + for (const std::pair &file : documentationFiles(v)) { + if (!highestOnly || !includedFileNames.contains(file.second)) { + filePaths.insert(file.first + file.second); + includedFileNames.insert(file.second); + } + } + } + return filePaths.values(); } -static void updateDocumentation(const QList &added, - const QList &removed, - const QList &allNew) + +void QtVersionManager::updateDocumentation(const QList &added, + const QList &removed, + const QList &allNew) { - const QStringList docsOfAll = documentationFiles(allNew); + const DocumentationSetting setting = documentationSetting(); + const QStringList docsOfAll = setting == DocumentationSetting::None + ? QStringList() + : documentationFiles(allNew, + setting + == DocumentationSetting::HighestOnly); const QStringList docsToRemove = Utils::filtered(documentationFiles(removed), [&docsOfAll](const QString &f) { return !docsOfAll.contains(f); }); + const QStringList docsToAdd = Utils::filtered(documentationFiles(added), + [&docsOfAll](const QString &f) { + return docsOfAll.contains(f); + }); Core::HelpManager::unregisterDocumentation(docsToRemove); - Core::HelpManager::registerDocumentation(documentationFiles(added)); + Core::HelpManager::registerDocumentation(docsToAdd); } int QtVersionManager::getUniqueId() @@ -613,4 +634,21 @@ void QtVersionManager::setNewQtVersions(const QList &newVersion emit m_instance->qtVersionsChanged(addedIds, removedIds, changedIds); } +void QtVersionManager::setDocumentationSetting(const QtVersionManager::DocumentationSetting &setting) +{ + if (setting == documentationSetting()) + return; + Core::ICore::settings()->setValue(DOCUMENTATION_SETTING_KEY, int(setting)); + // force re-evaluating which documentation should be registered + // by claiming that all are removed and re-added + const QList vs = versions(); + updateDocumentation(vs, vs, vs); +} + +QtVersionManager::DocumentationSetting QtVersionManager::documentationSetting() +{ + return DocumentationSetting( + Core::ICore::settings()->value(DOCUMENTATION_SETTING_KEY, 0).toInt()); +} + } // namespace QtVersion diff --git a/src/plugins/qtsupport/qtversionmanager.h b/src/plugins/qtsupport/qtversionmanager.h index 2c05485c606..7f71547b498 100644 --- a/src/plugins/qtsupport/qtversionmanager.h +++ b/src/plugins/qtsupport/qtversionmanager.h @@ -69,11 +69,18 @@ signals: void qtVersionsLoaded(); private: + enum class DocumentationSetting { HighestOnly, All, None }; + + static void updateDocumentation(const QList &added, + const QList &removed, + const QList &allNew); void updateFromInstaller(bool emitSignal = true); void triggerQtVersionRestore(); // Used by QtOptionsPage static void setNewQtVersions(const QList &newVersions); + static void setDocumentationSetting(const DocumentationSetting &setting); + static DocumentationSetting documentationSetting(); // Used by QtVersion static int getUniqueId(); }; diff --git a/src/plugins/qtsupport/qtversionmanager.ui b/src/plugins/qtsupport/qtversionmanager.ui index 3d185a59a63..6f303b06bef 100644 --- a/src/plugins/qtsupport/qtversionmanager.ui +++ b/src/plugins/qtsupport/qtversionmanager.ui @@ -26,6 +26,33 @@ + + + + + + Register documentation: + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + +