6#include "../shared/collectionconfiguration.h"
8#include <QtCore/QDateTime>
9#include <QtCore/QFileInfo>
10#include <QtCore/QFileSystemWatcher>
11#include <QtCore/QTimer>
12#include <QtHelp/QHelpContentModel>
13#include <QtHelp/QHelpEngine>
14#include <QtHelp/QHelpFilterEngine>
15#include <QtHelp/QHelpIndexModel>
16#include <QtHelp/QHelpLink>
17#include <QtHelp/QHelpSearchEngine>
24using namespace Qt::StringLiterals;
27 const QString AppFontKey(
"appFont"_L1);
28 const QString AppWritingSystemKey(
"appWritingSystem"_L1);
29 const QString BookmarksKey(
"Bookmarks"_L1);
30 const QString BrowserFontKey(
"browserFont"_L1);
31 const QString BrowserWritingSystemKey(
"browserWritingSystem"_L1);
32 const QString HomePageKey(
"homepage"_L1);
33 const QString MainWindowKey(
"MainWindow"_L1);
34 const QString MainWindowGeometryKey(
"MainWindowGeometry"_L1);
35 const QString SearchWasAttachedKey(
"SearchWasAttached"_L1);
36 const QString StartOptionKey(
"StartOption"_L1);
37 const QString UseAppFontKey(
"useAppFont"_L1);
38 const QString UseBrowserFontKey(
"useBrowserFont"_L1);
39 const QString VersionKey(
"qtVersion%1$$$%2"_L1.arg(QLatin1StringView(QT_VERSION_STR)));
40 const QString ShowTabsKey(
"showTabs"_L1);
41 const QString TopicChooserGeometryKey(
"TopicChooserGeometry"_L1);
54 const QString m_fileName;
70 HelpEngineWrapperPrivate(
const QString &collectionFile);
72 void removeStaleDocumentation();
73 void initFileSystemWatchers();
74 void checkDocFilesWatched();
75 void qchFileChanged(
const QString &fileName,
bool fromTimeout);
77 static const int UpdateGracePeriod = 2000;
79 QHelpEngine *
const m_helpEngine;
80 QFileSystemWatcher *
const m_qchWatcher;
83 std::unique_ptr<TimeoutForwarder> forwarder;
85 std::map<QString, RecentSignal> m_recentQchUpdates;
99
100
101
102 if (!helpEngineWrapper)
104 return *helpEngineWrapper;
110 delete helpEngineWrapper;
111 helpEngineWrapper =
nullptr;
120
121
122
123
124
125
126
128 disconnect(d->m_helpEngine, &QHelpEngineCore::setupFinished,
131 connect(d, &HelpEngineWrapperPrivate::documentationRemoved,
132 this, &HelpEngineWrapper::documentationRemoved);
133 connect(d, &HelpEngineWrapperPrivate::documentationUpdated,
134 this, &HelpEngineWrapper::documentationUpdated);
135 connect(d->m_helpEngine, &QHelpEngineCore::setupFinished,
142 const QStringList &namespaces = d->m_helpEngine->registeredDocumentations();
143 for (
const QString &nameSpace : namespaces) {
144 const QString &docFile
145 = d->m_helpEngine->documentationFileName(nameSpace);
146 d->m_qchWatcher->removePath(docFile);
156 connect(d->m_helpEngine, &QHelpEngineCore::setupFinished,
164 return d->m_helpEngine->searchEngine();
170 return d->m_helpEngine->contentModel();
176 return d->m_helpEngine->indexModel();
182 return d->m_helpEngine->contentWidget();
188 return d->m_helpEngine->indexWidget();
194 return d->m_helpEngine->registeredDocumentations();
200 return d->m_helpEngine->documentationFileName(namespaceName);
206 return d->m_helpEngine->collectionFile();
212 d->checkDocFilesWatched();
213 if (!d->m_helpEngine->registerDocumentation(docFile))
215 d->m_qchWatcher->addPath(docFile);
216 d->checkDocFilesWatched();
223 d->checkDocFilesWatched();
224 const QString &file = d->m_helpEngine->documentationFileName(namespaceName);
225 if (!d->m_helpEngine->unregisterDocumentation(namespaceName))
227 d->m_qchWatcher->removePath(file);
228 d->checkDocFilesWatched();
235 return d->m_helpEngine->setupData();
241 return d->m_helpEngine->findFile(url);
247 return d->m_helpEngine->fileData(url);
253 return d->m_helpEngine->documentsForIdentifier(id);
259 return d->m_helpEngine->error();
264 return d->m_helpEngine->filterEngine();
270 return d->m_helpEngine->customValue(VersionKey.arg(component)).toString().
271 split(CollectionConfiguration::ListSeparator);
275 const QStringList &doc)
278 d->m_helpEngine->setCustomValue(VersionKey.arg(component),
279 doc.join(CollectionConfiguration::ListSeparator));
285 return CollectionConfiguration::lastShownPages(*d->m_helpEngine);
291 CollectionConfiguration::setLastShownPages(*d->m_helpEngine, lastShownPages);
297 return CollectionConfiguration::lastZoomFactors(*d->m_helpEngine);
303 CollectionConfiguration::setLastZoomFactors(*d->m_helpEngine, lastZoomFactors);
309 return CollectionConfiguration::cacheDir(*d->m_helpEngine);
319 bool relativeToCollection)
322 CollectionConfiguration::setCacheDir(*d->m_helpEngine, cacheDir,
323 relativeToCollection);
391 return CollectionConfiguration::aboutMenuTexts(*d->m_helpEngine);
397 CollectionConfiguration::setAboutMenuTexts(*d->m_helpEngine, texts);
403 return CollectionConfiguration::aboutIcon(*d->m_helpEngine);
409 CollectionConfiguration::setAboutIcon(*d->m_helpEngine, icon);
415 return CollectionConfiguration::aboutImages(*d->m_helpEngine);
421 CollectionConfiguration::setAboutImages(*d->m_helpEngine, images);
427 return CollectionConfiguration::aboutTexts(*d->m_helpEngine);
433 CollectionConfiguration::setAboutTexts(*d->m_helpEngine, texts);
439 return CollectionConfiguration::windowTitle(*d->m_helpEngine);
445 CollectionConfiguration::setWindowTitle(*d->m_helpEngine, windowTitle);
451 return CollectionConfiguration::applicationIcon(*d->m_helpEngine);
457 CollectionConfiguration::setApplicationIcon(*d->m_helpEngine, icon);
463 return d->m_helpEngine->customValue(MainWindowKey).toByteArray();
469 d->m_helpEngine->setCustomValue(MainWindowKey, mainWindow);
475 return d->m_helpEngine->customValue(MainWindowGeometryKey).toByteArray();
481 d->m_helpEngine->setCustomValue(MainWindowGeometryKey, geometry);
487 return d->m_helpEngine->customValue(BookmarksKey).toByteArray();
493 d->m_helpEngine->setCustomValue(BookmarksKey, bookmarks);
511 return d->m_helpEngine->customValue(StartOptionKey,
ShowLastPages).toInt();
517 d->m_helpEngine->setCustomValue(StartOptionKey, option);
523 const QString &homePage
524 = d->m_helpEngine->customValue(HomePageKey).toString();
525 if (!homePage.isEmpty())
527 return defaultHomePage();
533 d->m_helpEngine->setCustomValue(HomePageKey, page);
540 return CollectionConfiguration::defaultHomePage(*d->m_helpEngine);
546 CollectionConfiguration::setDefaultHomePage(*d->m_helpEngine, page);
552 return d->m_helpEngine->customValue(UseAppFontKey).isValid();
558 return d->m_helpEngine->customValue(UseAppFontKey).toBool();
564 d->m_helpEngine->setCustomValue(UseAppFontKey, useAppFont);
570 return d->m_helpEngine->customValue(UseBrowserFontKey,
false).toBool();
576 d->m_helpEngine->setCustomValue(UseBrowserFontKey, useBrowserFont);
582 return qvariant_cast<QFont>(d->m_helpEngine->customValue(AppFontKey));
588 d->m_helpEngine->setCustomValue(AppFontKey, font);
594 return static_cast<QFontDatabase::WritingSystem>(
595 d->m_helpEngine->customValue(AppWritingSystemKey).toInt());
601 d->m_helpEngine->setCustomValue(AppWritingSystemKey, system);
607 return qvariant_cast<QFont>(d->m_helpEngine->customValue(BrowserFontKey));
613 d->m_helpEngine->setCustomValue(BrowserFontKey, font);
619 return static_cast<QFontDatabase::WritingSystem>(
620 d->m_helpEngine->customValue(BrowserWritingSystemKey).toInt());
626 d->m_helpEngine->setCustomValue(BrowserWritingSystemKey, system);
632 return d->m_helpEngine->customValue(ShowTabsKey,
false).toBool();
638 d->m_helpEngine->setCustomValue(ShowTabsKey, show);
650 return d->m_helpEngine->customValue(TopicChooserGeometryKey).toByteArray();
656 d->m_helpEngine->setCustomValue(TopicChooserGeometryKey, geometry);
661 return d->m_helpEngine;
668 : m_fileName(fileName)
682 : m_helpEngine(
new QHelpEngine(collectionFile,
this)),
683 m_qchWatcher(
new QFileSystemWatcher(
this))
686 m_helpEngine->setReadOnly(
false);
687 m_helpEngine->setUsesFilterEngine(
true);
688 removeStaleDocumentation();
689 initFileSystemWatchers();
693
694
695
696
700 const auto &docs = m_helpEngine->registeredDocumentations();
701 for (
const QString &ns : docs) {
702 const QString fileNs = QHelpEngineCore::namespaceName(
703 m_helpEngine->documentationFileName(ns));
704 if (!fileNs.isEmpty() && fileNs != ns)
705 m_helpEngine->unregisterDocumentation(ns);
712 const auto &docs = m_helpEngine->registeredDocumentations();
713 for (
const QString &ns : docs)
714 m_qchWatcher->addPath(m_helpEngine->documentationFileName(ns));
716 connect(m_qchWatcher, &QFileSystemWatcher::fileChanged,
this,
717 QOverload<
const QString &>::of(&HelpEngineWrapperPrivate::qchFileChanged));
718 checkDocFilesWatched();
724 qchFileChanged(fileName,
false);
730 const int watchedFilesCount = m_qchWatcher->files().size();
731 const int docFilesCount = m_helpEngine->registeredDocumentations().size();
732 if (watchedFilesCount != docFilesCount) {
733 qWarning(
"Strange: Have %d docs, but %d are being watched",
734 docFilesCount, watchedFilesCount);
744
745
746
748 const auto &docs = m_helpEngine->registeredDocumentations();
749 for (
const QString &curNs : docs) {
750 if (m_helpEngine->documentationFileName(curNs) == fileName) {
757
758
759
761 m_recentQchUpdates.erase(fileName);
766
767
768
769
771 const auto &it = m_recentQchUpdates.find(fileName);
772 const QDateTime now = QDateTime::currentDateTimeUtc();
775 if (it == m_recentQchUpdates.end()) {
777 QTimer::singleShot(UpdateGracePeriod, forwarder.get(),
778 &TimeoutForwarder::forward);
779 m_recentQchUpdates.emplace(fileName,
780 RecentSignal{std::move(now), std::move(forwarder)});
784 auto &[key, entry] = *it;
787 if (entry.timestamp > now.addMSecs(-UpdateGracePeriod)) {
789 entry.timestamp = now;
791 QTimer::singleShot(UpdateGracePeriod, entry.forwarder.get(),
792 &TimeoutForwarder::forward);
797 if (m_helpEngine->unregisterDocumentation(ns)) {
798 if (!QFileInfo(fileName).exists()
799 || !m_helpEngine->registerDocumentation(fileName)) {
800 m_qchWatcher->removePath(fileName);
801 emit documentationRemoved(ns);
803 emit documentationUpdated(ns);
805 m_helpEngine->setupData();
807 m_recentQchUpdates.erase(it);
812#include "helpenginewrapper.moc"
static bool filterFunctionalityEnabled(const QHelpEngineCore &helpEngine)
static void setLastTabPage(QHelpEngineCore &helpEngine, int lastPage)
static bool addressBarVisible(const QHelpEngineCore &helpEngine)
static bool addressBarEnabled(const QHelpEngineCore &helpEngine)
static void setAddressBarVisible(QHelpEngineCore &helpEngine, bool visible)
static void setDocumentationManagerEnabled(QHelpEngineCore &helpEngine, bool enabled)
static bool documentationManagerEnabled(const QHelpEngineCore &helpEngine)
static void setAddressBarEnabled(QHelpEngineCore &helpEngine, bool enabled)
static int lastTabPage(const QHelpEngineCore &helpEngine)
static bool cacheDirIsRelativeToCollection(const QHelpEngineCore &helpEngine)
static void setFilterToolbarVisible(QHelpEngineCore &helpEngine, bool visible)
static void setFilterFunctionalityEnabled(QHelpEngineCore &helpEngine, bool enabled)
static bool filterToolbarVisible(const QHelpEngineCore &helpEngine)
static bool fullTextSearchFallbackEnabled(const QHelpEngineCore &helpEngine)
void documentationUpdated(const QString &namespaceName)
void setHomePage(const QString &page)
QHelpEngineCore * helpEngine() const
QHelpFilterEngine * filterEngine() const
bool registerDocumentation(const QString &docFile)
const QString defaultHomePage() const
void setStartOption(int option)
QHelpSearchEngine * searchEngine() const
const QByteArray bookmarks() const
bool usesBrowserFont() const
const QStringList lastShownPages() const
void setDefaultHomePage(const QString &page)
static void removeInstance()
const QString homePage() const
bool fullTextSearchFallbackEnabled() const
void setAddressBarEnabled(bool enabled)
QHelpIndexWidget * indexWidget()
bool cacheDirIsRelativeToCollection() const
const QString windowTitle() const
void setLastZoomFactors(const QStringList &lastZoomFactors)
void setFilterFunctionalityEnabled(bool enabled)
void setShowTabs(bool show)
const QStringList qtDocInfo(const QString &component) const
void setBookmarks(const QByteArray &bookmarks)
const QByteArray mainWindow() const
static HelpEngineWrapper & instance()
const QByteArray mainWindowGeometry() const
void setBrowserFont(const QFont &font)
const QByteArray topicChooserGeometry() const
bool addressBarEnabled() const
const QFont browserFont() const
void setAboutMenuTexts(const QByteArray &texts)
void setFilterToolbarVisible(bool visible)
const QByteArray aboutMenuTexts() const
const QString collectionFile() const
void setAppWritingSystem(QFontDatabase::WritingSystem system)
QByteArray fileData(const QUrl &url) const
void setBrowserWritingSystem(QFontDatabase::WritingSystem system)
void setAppFont(const QFont &font)
bool unregisterDocumentation(const QString &namespaceName)
bool addressBarVisible() const
void setAboutIcon(const QByteArray &icon)
void setUseBrowserFont(bool useBrowserFont)
void setCacheDir(const QString &cacheDir, bool relativeToCollection)
bool documentationManagerEnabled() const
bool hasFontSettings() const
QFontDatabase::WritingSystem browserWritingSystem() const
void setApplicationIcon(const QByteArray &icon)
const QStringList registeredDocumentations() const
QHelpContentWidget * contentWidget()
const QByteArray aboutTexts() const
QHelpIndexModel * indexModel() const
void setAboutImages(const QByteArray &images)
void setTopicChooserGeometry(const QByteArray &geometry)
bool filterFunctionalityEnabled() const
void setMainWindowGeometry(const QByteArray &geometry)
void setAboutTexts(const QByteArray &texts)
void setAddressBarVisible(bool visible)
void setLastTabPage(int lastPage)
const QString cacheDir() const
QUrl findFile(const QUrl &url) const
const QStringList lastZoomFactors() const
const QByteArray applicationIcon() const
const QByteArray aboutImages() const
QList< QHelpLink > documentsForIdentifier(const QString &id) const
QFontDatabase::WritingSystem appWritingSystem() const
void setQtDocInfo(const QString &component, const QStringList &doc)
void initialDocSetupDone()
void setDocumentationManagerEnabled(bool enabled)
void setWindowTitle(const QString &windowTitle)
bool filterToolbarVisible() const
const QByteArray aboutIcon() const
void setUseAppFont(bool useAppFont)
QHelpContentModel * contentModel() const
void setLastShownPages(const QStringList &lastShownPages)
void setMainWindow(const QByteArray &mainWindow)
QString documentationFileName(const QString &namespaceName) const
const QFont appFont() const