diff options
Diffstat (limited to 'src/plugins/help')
23 files changed, 385 insertions, 149 deletions
diff --git a/src/plugins/help/docsettingspage.cpp b/src/plugins/help/docsettingspage.cpp index 159dbf1ec6..a1d3eff3c7 100644 --- a/src/plugins/help/docsettingspage.cpp +++ b/src/plugins/help/docsettingspage.cpp @@ -63,9 +63,13 @@ QWidget *DocSettingsPage::widget() m_ui.docsListWidget->installEventFilter(this); const QStringList nameSpaces = HelpManager::registeredNamespaces(); + const QSet<QString> userDocumentationPaths = HelpManager::userDocumentationPaths(); foreach (const QString &nameSpace, nameSpaces) { - addItem(nameSpace, HelpManager::fileFromNamespace(nameSpace)); - m_filesToRegister.insert(nameSpace, HelpManager::fileFromNamespace(nameSpace)); + const QString filePath = HelpManager::fileFromNamespace(nameSpace); + bool user = userDocumentationPaths.contains(filePath); + addItem(nameSpace, filePath, user); + m_filesToRegister.insert(nameSpace, filePath); + m_filesToRegisterUserManaged.insert(nameSpace, user); } m_filesToUnregister.clear(); @@ -98,8 +102,9 @@ void DocSettingsPage::addDocumentation() continue; } - addItem(nameSpace, file); + addItem(nameSpace, file, true/*user managed*/); m_filesToRegister.insert(nameSpace, QDir::toNativeSeparators(filePath)); + m_filesToRegisterUserManaged.insert(nameSpace, true/*user managed*/); // If the files to unregister contains the namespace, grab a copy of all paths added and try to // remove the current file path. Afterwards remove the whole entry and add the clean list back. @@ -150,7 +155,14 @@ void DocSettingsPage::removeDocumentation() void DocSettingsPage::apply() { HelpManager::unregisterDocumentation(m_filesToUnregister.keys()); - HelpManager::registerDocumentation(m_filesToRegister.values()); + QStringList files; + auto it = m_filesToRegisterUserManaged.constBegin(); + while (it != m_filesToRegisterUserManaged.constEnd()) { + if (it.value()/*userManaged*/) + files << m_filesToRegister.value(it.key()); + ++it; + } + HelpManager::registerUserDocumentation(files); m_filesToUnregister.clear(); } @@ -185,9 +197,10 @@ void DocSettingsPage::removeDocumentation(const QList<QListWidgetItem*> &items) int row = 0; foreach (QListWidgetItem* item, items) { - const QString nameSpace = item->text(); + const QString nameSpace = item->data(Qt::UserRole).toString(); m_filesToRegister.remove(nameSpace); + m_filesToRegisterUserManaged.remove(nameSpace); m_filesToUnregister.insertMulti(nameSpace, QDir::cleanPath(HelpManager::fileFromNamespace(nameSpace))); row = m_ui.docsListWidget->row(item); @@ -198,9 +211,11 @@ void DocSettingsPage::removeDocumentation(const QList<QListWidgetItem*> &items) QItemSelectionModel::ClearAndSelect); } -void DocSettingsPage::addItem(const QString &nameSpace, const QString &fileName) +void DocSettingsPage::addItem(const QString &nameSpace, const QString &fileName, bool userManaged) { - QListWidgetItem* item = new QListWidgetItem(nameSpace); + const QString name = userManaged ? nameSpace : tr("%1 (auto-detected)").arg(nameSpace); + QListWidgetItem* item = new QListWidgetItem(name); item->setToolTip(fileName); + item->setData(Qt::UserRole, nameSpace); m_ui.docsListWidget->addItem(item); } diff --git a/src/plugins/help/docsettingspage.h b/src/plugins/help/docsettingspage.h index 100308f1a4..b87cc1dbf7 100644 --- a/src/plugins/help/docsettingspage.h +++ b/src/plugins/help/docsettingspage.h @@ -57,7 +57,7 @@ private slots: private: bool eventFilter(QObject *object, QEvent *event); void removeDocumentation(const QList<QListWidgetItem *> &items); - void addItem(const QString &nameSpace, const QString &fileName); + void addItem(const QString &nameSpace, const QString &fileName, bool userManaged); private: Ui::DocSettingsPage m_ui; @@ -67,6 +67,7 @@ private: typedef QHash<QString, QString> NameSpaceToPathHash; NameSpaceToPathHash m_filesToRegister; + QHash<QString, bool> m_filesToRegisterUserManaged; NameSpaceToPathHash m_filesToUnregister; }; diff --git a/src/plugins/help/filtersettingspage.cpp b/src/plugins/help/filtersettingspage.cpp index 55643de63e..f9ae9459e2 100644 --- a/src/plugins/help/filtersettingspage.cpp +++ b/src/plugins/help/filtersettingspage.cpp @@ -60,14 +60,14 @@ QWidget *FilterSettingsPage::widget() updateFilterPage(); - connect(m_ui.attributeWidget, SIGNAL(itemChanged(QTreeWidgetItem*,int)), - this, SLOT(updateFilterMap())); - connect(m_ui.filterWidget, - SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)), this, - SLOT(updateAttributes(QListWidgetItem*))); - connect(m_ui.filterAddButton, SIGNAL(clicked()), this, SLOT(addFilter())); - connect(m_ui.filterRemoveButton, SIGNAL(clicked()), this, - SLOT(removeFilter())); + connect(m_ui.attributeWidget, &QTreeWidget::itemChanged, + this, &FilterSettingsPage::updateFilterMap); + connect(m_ui.filterWidget, &QListWidget::currentItemChanged, + this, &FilterSettingsPage::updateAttributes); + connect(m_ui.filterAddButton, &QPushButton::clicked, + this, &FilterSettingsPage::addFilter); + connect(m_ui.filterRemoveButton, &QPushButton::clicked, + this, &FilterSettingsPage::removeFilter); connect(HelpManager::instance(), SIGNAL(documentationChanged()), this, SLOT(updateFilterPage())); } diff --git a/src/plugins/help/generalsettingspage.cpp b/src/plugins/help/generalsettingspage.cpp index ade95e8add..e216b93da8 100644 --- a/src/plugins/help/generalsettingspage.cpp +++ b/src/plugins/help/generalsettingspage.cpp @@ -99,20 +99,25 @@ QWidget *GeneralSettingsPage::widget() m_ui->helpStartComboBox->setCurrentIndex(m_startOption); m_contextOption = HelpManager::customValue(QLatin1String("ContextHelpOption"), - Core::HelpManager::SideBySideIfPossible).toInt(); + HelpManager::SideBySideIfPossible).toInt(); m_ui->contextHelpComboBox->setCurrentIndex(m_contextOption); - connect(m_ui->currentPageButton, SIGNAL(clicked()), this, SLOT(setCurrentPage())); - connect(m_ui->blankPageButton, SIGNAL(clicked()), this, SLOT(setBlankPage())); - connect(m_ui->defaultPageButton, SIGNAL(clicked()), this, SLOT(setDefaultPage())); + connect(m_ui->currentPageButton, &QPushButton::clicked, + this, &GeneralSettingsPage::setCurrentPage); + connect(m_ui->blankPageButton, &QPushButton::clicked, + this, &GeneralSettingsPage::setBlankPage); + connect(m_ui->defaultPageButton, &QPushButton::clicked, + this, &GeneralSettingsPage::setDefaultPage); HelpViewer *viewer = CentralWidget::instance()->currentViewer(); if (!viewer) m_ui->currentPageButton->setEnabled(false); m_ui->errorLabel->setVisible(false); - connect(m_ui->importButton, SIGNAL(clicked()), this, SLOT(importBookmarks())); - connect(m_ui->exportButton, SIGNAL(clicked()), this, SLOT(exportBookmarks())); + connect(m_ui->importButton, &QPushButton::clicked, + this, &GeneralSettingsPage::importBookmarks); + connect(m_ui->exportButton, &QPushButton::clicked, + this, &GeneralSettingsPage::exportBookmarks); m_returnOnClose = HelpManager::customValue(QLatin1String("ReturnOnClose"), false).toBool(); @@ -177,7 +182,7 @@ void GeneralSettingsPage::apply() m_contextOption = helpOption; HelpManager::setCustomValue(QLatin1String("ContextHelpOption"), helpOption); - QSettings *settings = Core::ICore::settings(); + QSettings *settings = ICore::settings(); settings->beginGroup(QLatin1String(Help::Constants::ID_MODE_HELP)); settings->setValue(QLatin1String("ContextHelpOption"), helpOption); settings->endGroup(); @@ -212,7 +217,7 @@ void GeneralSettingsPage::importBookmarks() { m_ui->errorLabel->setVisible(false); - QString fileName = QFileDialog::getOpenFileName(Core::ICore::dialogParent(), + QString fileName = QFileDialog::getOpenFileName(ICore::dialogParent(), tr("Import Bookmarks"), QDir::currentPath(), tr("Files (*.xbel)")); if (fileName.isEmpty()) @@ -234,7 +239,7 @@ void GeneralSettingsPage::exportBookmarks() { m_ui->errorLabel->setVisible(false); - QString fileName = QFileDialog::getSaveFileName(Core::ICore::dialogParent(), + QString fileName = QFileDialog::getSaveFileName(ICore::dialogParent(), tr("Save File"), QLatin1String("untitled.xbel"), tr("Files (*.xbel)")); QLatin1String suffix(".xbel"); diff --git a/src/plugins/help/help.pro b/src/plugins/help/help.pro index c296fab572..ca6e1adb91 100644 --- a/src/plugins/help/help.pro +++ b/src/plugins/help/help.pro @@ -1,4 +1,4 @@ -QT += help network printsupport +QT += help network printsupport sql !isEmpty(QT.webkitwidgets.name): QT += webkitwidgets webkit else: DEFINES += QT_NO_WEBKIT @@ -67,9 +67,13 @@ osx { QT += macextras HEADERS += macwebkithelpviewer.h OBJECTIVE_SOURCES += macwebkithelpviewer.mm - LIBS += -framework WebKit -framework AppKit + + !isEmpty(USE_QUICK_WIDGET) { + DEFINES += QTC_MAC_NATIVE_HELPVIEWER_DEFAULT + } } + RESOURCES += help.qrc include(../../shared/help/help.pri) diff --git a/src/plugins/help/help.qbs b/src/plugins/help/help.qbs index d4b4535b6d..af3d320666 100644 --- a/src/plugins/help/help.qbs +++ b/src/plugins/help/help.qbs @@ -3,7 +3,7 @@ import qbs 1.0 QtcPlugin { name: "Help" - Depends { name: "Qt"; submodules: ["help", "network"]; } + Depends { name: "Qt"; submodules: ["help", "network", "sql"]; } Depends { name: "Qt.printsupport" } Depends { name: "Qt.webkit" diff --git a/src/plugins/help/helpfindsupport.cpp b/src/plugins/help/helpfindsupport.cpp index a3c42cbb67..aab70e6418 100644 --- a/src/plugins/help/helpfindsupport.cpp +++ b/src/plugins/help/helpfindsupport.cpp @@ -41,7 +41,7 @@ HelpViewerFindSupport::HelpViewerFindSupport(HelpViewer *viewer) { } -Core::FindFlags HelpViewerFindSupport::supportedFindFlags() const +FindFlags HelpViewerFindSupport::supportedFindFlags() const { return FindBackward | FindCaseSensitively; } @@ -52,23 +52,23 @@ QString HelpViewerFindSupport::currentFindString() const return m_viewer->selectedText(); } -Core::IFindSupport::Result HelpViewerFindSupport::findIncremental(const QString &txt, - Core::FindFlags findFlags) +IFindSupport::Result HelpViewerFindSupport::findIncremental(const QString &txt, + FindFlags findFlags) { QTC_ASSERT(m_viewer, return NotFound); findFlags &= ~FindBackward; return find(txt, findFlags, true) ? Found : NotFound; } -Core::IFindSupport::Result HelpViewerFindSupport::findStep(const QString &txt, - Core::FindFlags findFlags) +IFindSupport::Result HelpViewerFindSupport::findStep(const QString &txt, + FindFlags findFlags) { QTC_ASSERT(m_viewer, return NotFound); return find(txt, findFlags, false) ? Found : NotFound; } bool HelpViewerFindSupport::find(const QString &txt, - Core::FindFlags findFlags, bool incremental) + FindFlags findFlags, bool incremental) { QTC_ASSERT(m_viewer, return false); bool wrapped = false; diff --git a/src/plugins/help/helpindexfilter.cpp b/src/plugins/help/helpindexfilter.cpp index 52762f46f8..8fa6074983 100644 --- a/src/plugins/help/helpindexfilter.cpp +++ b/src/plugins/help/helpindexfilter.cpp @@ -37,8 +37,14 @@ #include <extensionsystem/pluginmanager.h> #include <coreplugin/icore.h> #include <coreplugin/helpmanager.h> +#include <utils/algorithm.h> #include <QIcon> +#include <QSqlDatabase> +#include <QSqlDriver> +#include <QSqlError> +#include <QSqlQuery> + using namespace Core; using namespace Help; @@ -47,6 +53,7 @@ using namespace Help::Internal; Q_DECLARE_METATYPE(ILocatorFilter*) HelpIndexFilter::HelpIndexFilter() + : m_needsUpdate(true) { setId("HelpIndexFilter"); setDisplayName(tr("Help Index")); @@ -54,6 +61,12 @@ HelpIndexFilter::HelpIndexFilter() setShortcutString(QString(QLatin1Char('?'))); m_icon = QIcon(QLatin1String(":/help/images/bookmark.png")); + connect(HelpManager::instance(), &HelpManager::setupFinished, + this, &HelpIndexFilter::invalidateCache); + connect(HelpManager::instance(), &HelpManager::documentationChanged, + this, &HelpIndexFilter::invalidateCache); + connect(HelpManager::instance(), &HelpManager::collectionFileChanged, + this, &HelpIndexFilter::invalidateCache); } HelpIndexFilter::~HelpIndexFilter() @@ -62,21 +75,63 @@ HelpIndexFilter::~HelpIndexFilter() void HelpIndexFilter::prepareSearch(const QString &entry) { - if (entry.length() < 2) - m_keywords = Core::HelpManager::findKeywords(entry, caseSensitivity(entry), 200); - else - m_keywords = Core::HelpManager::findKeywords(entry, caseSensitivity(entry)); + Q_UNUSED(entry) + QStringList namespaces = HelpManager::registeredNamespaces(); + m_helpDatabases = Utils::transform(namespaces, [](const QString &ns) { + return HelpManager::fileFromNamespace(ns); + }); } QList<LocatorFilterEntry> HelpIndexFilter::matchesFor(QFutureInterface<LocatorFilterEntry> &future, const QString &entry) { - Q_UNUSED(entry) // search is already done in the GUI thread in prepareSearch + m_mutex.lock(); // guard m_needsUpdate + bool forceUpdate = m_needsUpdate; + m_mutex.unlock(); + + if (forceUpdate || m_searchTermCache.size() < 2 || m_searchTermCache.isEmpty() + || !entry.contains(m_searchTermCache)) { + int limit = entry.size() < 2 ? 200 : INT_MAX; + QSet<QString> results; + foreach (const QString &filePath, m_helpDatabases) { + QSet<QString> result; + QMetaObject::invokeMethod(this, "searchMatches", Qt::BlockingQueuedConnection, + Q_RETURN_ARG(QSet<QString>, result), + Q_ARG(QString, filePath), + Q_ARG(QString, entry), + Q_ARG(int, limit)); + results.unite(result); + } + m_mutex.lock(); // guard m_needsUpdate + m_needsUpdate = false; + m_mutex.unlock(); + m_keywordCache = results; + m_searchTermCache = entry; + } + + Qt::CaseSensitivity cs = caseSensitivity(entry); QList<LocatorFilterEntry> entries; - foreach (const QString &keyword, m_keywords) { + QStringList keywords; + QStringList unsortedKeywords; + keywords.reserve(m_keywordCache.size()); + unsortedKeywords.reserve(m_keywordCache.size()); + QSet<QString> allresults; + foreach (const QString &keyword, m_keywordCache) { if (future.isCanceled()) break; - entries.append(LocatorFilterEntry(this, keyword, QVariant(), m_icon)); + if (keyword.startsWith(entry, cs)) { + keywords.append(keyword); + allresults.insert(keyword); + } else if (keyword.contains(entry, cs)) { + unsortedKeywords.append(keyword); + allresults.insert(keyword); + } } + Utils::sort(keywords); + keywords << unsortedKeywords; + m_keywordCache = allresults; + m_searchTermCache = entry; + foreach (const QString &keyword, keywords) + entries.append(LocatorFilterEntry(this, keyword, QVariant(), m_icon)); return entries; } @@ -84,7 +139,7 @@ QList<LocatorFilterEntry> HelpIndexFilter::matchesFor(QFutureInterface<LocatorFi void HelpIndexFilter::accept(LocatorFilterEntry selection) const { const QString &key = selection.displayName; - const QMap<QString, QUrl> &links = Core::HelpManager::linksForKeyword(key); + const QMap<QString, QUrl> &links = HelpManager::linksForKeyword(key); if (links.size() == 1) emit linkActivated(links.begin().value()); @@ -95,5 +150,42 @@ void HelpIndexFilter::accept(LocatorFilterEntry selection) const void HelpIndexFilter::refresh(QFutureInterface<void> &future) { Q_UNUSED(future) - // Nothing to refresh + invalidateCache(); +} + +QSet<QString> HelpIndexFilter::searchMatches(const QString &databaseFilePath, + const QString &term, int limit) +{ + static const QLatin1String sqlite("QSQLITE"); + static const QLatin1String name("HelpManager::findKeywords"); + + QSet<QString> keywords; + + { // make sure db is destroyed before removeDatabase call + QSqlDatabase db = QSqlDatabase::addDatabase(sqlite, name); + if (db.driver() && db.driver()->lastError().type() == QSqlError::NoError) { + db.setDatabaseName(databaseFilePath); + if (db.open()) { + QSqlQuery query = QSqlQuery(db); + query.setForwardOnly(true); + query.exec(QString::fromLatin1("SELECT DISTINCT Name FROM IndexTable WHERE Name LIKE " + "'%%1%' LIMIT %2").arg(term, QString::number(limit))); + while (query.next()) { + const QString &keyValue = query.value(0).toString(); + if (!keyValue.isEmpty()) + keywords.insert(keyValue); + } + db.close(); + } + } + } + QSqlDatabase::removeDatabase(name); + return keywords; +} + +void HelpIndexFilter::invalidateCache() +{ + m_mutex.lock(); + m_needsUpdate = true; + m_mutex.unlock(); } diff --git a/src/plugins/help/helpindexfilter.h b/src/plugins/help/helpindexfilter.h index 06526ec73e..237a522443 100644 --- a/src/plugins/help/helpindexfilter.h +++ b/src/plugins/help/helpindexfilter.h @@ -34,6 +34,7 @@ #include <coreplugin/locator/ilocatorfilter.h> #include <QIcon> +#include <QMutex> namespace Help { namespace Internal { @@ -48,17 +49,26 @@ public: // ILocatorFilter void prepareSearch(const QString &entry); - QList<Core::LocatorFilterEntry> matchesFor(QFutureInterface<Core::LocatorFilterEntry> &future, const QString &entry); + QList<Core::LocatorFilterEntry> matchesFor(QFutureInterface<Core::LocatorFilterEntry> &future, + const QString &entry); void accept(Core::LocatorFilterEntry selection) const; void refresh(QFutureInterface<void> &future); + Q_INVOKABLE QSet<QString> searchMatches(const QString &databaseFilePath, + const QString &term, int limit); signals: void linkActivated(const QUrl &link) const; void linksActivated(const QMap<QString, QUrl> &links, const QString &key) const; private: + void invalidateCache(); + + QStringList m_helpDatabases; + QSet<QString> m_keywordCache; + QString m_searchTermCache; + bool m_needsUpdate; + QMutex m_mutex; QIcon m_icon; - QStringList m_keywords; }; } // namespace Internal diff --git a/src/plugins/help/helpplugin.cpp b/src/plugins/help/helpplugin.cpp index 59787ffa6e..12dcbb02ec 100644 --- a/src/plugins/help/helpplugin.cpp +++ b/src/plugins/help/helpplugin.cpp @@ -95,12 +95,12 @@ #include <QHelpEngine> +#include <functional> + using namespace Help::Internal; static const char kExternalWindowStateKey[] = "Help/ExternalWindowState"; -#define IMAGEPATH ":/help/images/" - using namespace Core; using namespace Utils; @@ -149,7 +149,7 @@ bool HelpPlugin::initialize(const QStringList &arguments, QString *error) addAutoReleasedObject(m_generalSettingsPage = new GeneralSettingsPage()); addAutoReleasedObject(m_searchTaskHandler = new SearchTaskHandler); - m_centralWidget = new Help::Internal::CentralWidget(modecontext); + m_centralWidget = new CentralWidget(modecontext); connect(m_centralWidget, SIGNAL(sourceChanged(QUrl)), this, SLOT(updateSideBarSource(QUrl))); connect(m_centralWidget, &CentralWidget::closeButtonClicked, @@ -170,8 +170,6 @@ bool HelpPlugin::initialize(const QStringList &arguments, QString *error) SLOT(setupHelpEngineIfNeeded())); connect(HelpManager::instance(), SIGNAL(collectionFileChanged()), this, SLOT(setupHelpEngineIfNeeded())); - connect(HelpManager::instance(), SIGNAL(setupFinished()), this, - SLOT(unregisterOldQtCreatorDocumentation())); Command *cmd; QAction *action; @@ -265,22 +263,6 @@ ExtensionSystem::IPlugin::ShutdownFlag HelpPlugin::aboutToShutdown() return SynchronousShutdown; } -void HelpPlugin::unregisterOldQtCreatorDocumentation() -{ - const QString &nsInternal = QString::fromLatin1("org.qt-project.qtcreator.%1%2%3") - .arg(IDE_VERSION_MAJOR).arg(IDE_VERSION_MINOR).arg(IDE_VERSION_RELEASE); - - QStringList documentationToUnregister; - foreach (const QString &ns, HelpManager::registeredNamespaces()) { - if (ns.startsWith(QLatin1String("org.qt-project.qtcreator.")) - && ns != nsInternal) { - documentationToUnregister << ns; - } - } - if (!documentationToUnregister.isEmpty()) - HelpManager::unregisterDocumentation(documentationToUnregister); -} - void HelpPlugin::resetFilter() { const QString &filterInternal = QString::fromLatin1("Qt Creator %1.%2.%3") @@ -320,7 +302,7 @@ void HelpPlugin::saveExternalWindowSettings() if (!m_externalWindow) return; m_externalWindowState = m_externalWindow->geometry(); - QSettings *settings = Core::ICore::settings(); + QSettings *settings = ICore::settings(); settings->setValue(QLatin1String(kExternalWindowStateKey), qVariantFromValue(m_externalWindowState)); } @@ -340,7 +322,7 @@ HelpWidget *HelpPlugin::createHelpWidget(const Context &context, HelpWidget::Wid // force setup, as we might have never switched to full help mode // thus the help engine might still run without collection file setup - m_helpManager->setupGuiHelpEngine(); + LocalHelpManager::setupGuiHelpEngine(); return widget; } @@ -349,7 +331,7 @@ void HelpPlugin::createRightPaneContextViewer() { if (m_rightPaneSideBarWidget) return; - m_rightPaneSideBarWidget = createHelpWidget(Core::Context(Constants::C_HELP_SIDEBAR), + m_rightPaneSideBarWidget = createHelpWidget(Context(Constants::C_HELP_SIDEBAR), HelpWidget::SideBarWidget); } @@ -358,10 +340,10 @@ HelpViewer *HelpPlugin::externalHelpViewer() if (m_externalWindow) return m_externalWindow->currentViewer(); doSetupIfNeeded(); - m_externalWindow = createHelpWidget(Core::Context(Constants::C_HELP_EXTERNAL), + m_externalWindow = createHelpWidget(Context(Constants::C_HELP_EXTERNAL), HelpWidget::ExternalWindow); if (m_externalWindowState.isNull()) { - QSettings *settings = Core::ICore::settings(); + QSettings *settings = ICore::settings(); m_externalWindowState = settings->value(QLatin1String(kExternalWindowStateKey)).toRect(); } if (m_externalWindowState.isNull()) @@ -375,30 +357,46 @@ HelpViewer *HelpPlugin::externalHelpViewer() HelpViewer *HelpPlugin::createHelpViewer(qreal zoom) { - HelpViewer *viewer = 0; - const QString backend = QLatin1String(qgetenv("QTC_HELPVIEWER_BACKEND")); - if (backend.compare(QLatin1String("native"), Qt::CaseInsensitive) == 0) { + // check for backends + typedef std::function<HelpViewer *()> ViewerFactory; + QHash<QString, ViewerFactory> factories; // id -> factory #ifdef QTC_MAC_NATIVE_HELPVIEWER - viewer = new MacWebKitHelpViewer(zoom); -#else - qWarning() << "native help viewer is requested, but was not enabled during compilation"; - viewer = new TextBrowserHelpViewer(zoom); + factories.insert(QLatin1String("native"), []() { return new MacWebKitHelpViewer(); }); #endif - } else if (backend.compare(QLatin1String("textbrowser"), Qt::CaseInsensitive) == 0) { - viewer = new TextBrowserHelpViewer(zoom); - } else { #ifndef QT_NO_WEBKIT - viewer = new QtWebKitHelpViewer(zoom); -#else - viewer = new TextBrowserHelpViewer(zoom); + factories.insert(QLatin1String("qtwebkit"), []() { return new QtWebKitHelpViewer(); }); #endif + factories.insert(QLatin1String("textbrowser"), []() { return new TextBrowserHelpViewer(); }); + + ViewerFactory factory; + // check requested backend + const QString backend = QLatin1String(qgetenv("QTC_HELPVIEWER_BACKEND")); + if (!backend.isEmpty()) { + factory = factories.value(backend); + if (!factory) + qWarning("Help viewer backend \"%s\" not found, using default.", qPrintable(backend)); } + // default setting +#ifdef QTC_MAC_NATIVE_HELPVIEWER_DEFAULT + if (!factory) + factory = factories.value(QLatin1String("native")); +#endif + if (!factory) + factory = factories.value(QLatin1String("qtwebkit")); + if (!factory) + factory = factories.value(QLatin1String("textbrowser")); + + QTC_ASSERT(factory, return 0); + HelpViewer *viewer = factory(); // initialize font QVariant fontSetting = LocalHelpManager::engineFontSettings(); if (fontSetting.isValid()) viewer->setViewerFont(fontSetting.value<QFont>()); + // initialize zoom + viewer->setScale(zoom); + // add find support Aggregation::Aggregate *agg = new Aggregation::Aggregate(); agg->add(viewer); @@ -415,7 +413,7 @@ void HelpPlugin::activateHelpMode() void HelpPlugin::showLinkInHelpMode(const QUrl &source) { activateHelpMode(); - Core::ICore::raiseWindow(m_mode->widget()); + ICore::raiseWindow(m_mode->widget()); m_centralWidget->setSource(source); m_centralWidget->setFocus(); } @@ -423,7 +421,7 @@ void HelpPlugin::showLinkInHelpMode(const QUrl &source) void HelpPlugin::showLinksInHelpMode(const QMap<QString, QUrl> &links, const QString &key) { activateHelpMode(); - Core::ICore::raiseWindow(m_mode->widget()); + ICore::raiseWindow(m_mode->widget()); m_centralWidget->showTopicChooser(links, key); } @@ -477,10 +475,10 @@ void HelpPlugin::fontChanged() void HelpPlugin::setupHelpEngineIfNeeded() { - m_helpManager->setEngineNeedsUpdate(); + LocalHelpManager::setEngineNeedsUpdate(); if (ModeManager::currentMode() == m_mode - || contextHelpOption() == Core::HelpManager::ExternalHelpAlways) - m_helpManager->setupGuiHelpEngine(); + || contextHelpOption() == HelpManager::ExternalHelpAlways) + LocalHelpManager::setupGuiHelpEngine(); } bool HelpPlugin::canShowHelpSideBySide() const @@ -502,24 +500,24 @@ bool HelpPlugin::canShowHelpSideBySide() const return true; } -HelpViewer *HelpPlugin::viewerForHelpViewerLocation(Core::HelpManager::HelpViewerLocation location) +HelpViewer *HelpPlugin::viewerForHelpViewerLocation(HelpManager::HelpViewerLocation location) { - Core::HelpManager::HelpViewerLocation actualLocation = location; - if (location == Core::HelpManager::SideBySideIfPossible) - actualLocation = canShowHelpSideBySide() ? Core::HelpManager::SideBySideAlways - : Core::HelpManager::HelpModeAlways; + HelpManager::HelpViewerLocation actualLocation = location; + if (location == HelpManager::SideBySideIfPossible) + actualLocation = canShowHelpSideBySide() ? HelpManager::SideBySideAlways + : HelpManager::HelpModeAlways; - if (actualLocation == Core::HelpManager::ExternalHelpAlways) + if (actualLocation == HelpManager::ExternalHelpAlways) return externalHelpViewer(); - if (actualLocation == Core::HelpManager::SideBySideAlways) { + if (actualLocation == HelpManager::SideBySideAlways) { createRightPaneContextViewer(); RightPaneWidget::instance()->setWidget(m_rightPaneSideBarWidget); RightPaneWidget::instance()->setShown(true); return m_rightPaneSideBarWidget->currentViewer(); } - QTC_CHECK(actualLocation == Core::HelpManager::HelpModeAlways); + QTC_CHECK(actualLocation == HelpManager::HelpModeAlways); activateHelpMode(); // should trigger an createPage... HelpViewer *viewer = m_centralWidget->currentViewer(); @@ -569,7 +567,7 @@ void HelpPlugin::showContextHelp() // Find out what to show QMap<QString, QUrl> links; QString idFromContext; - if (IContext *context = Core::ICore::currentContextObject()) { + if (IContext *context = ICore::currentContextObject()) { idFromContext = context->contextHelpId(); links = HelpManager::linksForIdentifier(idFromContext); // Maybe the id is already an URL @@ -599,7 +597,7 @@ void HelpPlugin::showContextHelp() viewer->scrollToAnchor(source.fragment()); } viewer->setFocus(); - Core::ICore::raiseWindow(viewer); + ICore::raiseWindow(viewer); } } } @@ -626,7 +624,7 @@ void HelpPlugin::highlightSearchTermsInContextHelp() m_contextHelpHighlightId.clear(); } -void HelpPlugin::handleHelpRequest(const QUrl &url, Core::HelpManager::HelpViewerLocation location) +void HelpPlugin::handleHelpRequest(const QUrl &url, HelpManager::HelpViewerLocation location) { if (HelpViewer::launchWithExternalApp(url)) return; @@ -650,7 +648,7 @@ void HelpPlugin::handleHelpRequest(const QUrl &url, Core::HelpManager::HelpViewe HelpViewer *viewer = viewerForHelpViewerLocation(location); QTC_ASSERT(viewer, return); viewer->setSource(newUrl); - Core::ICore::raiseWindow(viewer); + ICore::raiseWindow(viewer); } void HelpPlugin::slotOpenSupportPage() @@ -665,7 +663,7 @@ void HelpPlugin::slotReportBug() void HelpPlugin::doSetupIfNeeded() { - m_helpManager->setupGuiHelpEngine(); + LocalHelpManager::setupGuiHelpEngine(); if (m_setupNeeded) { qApp->processEvents(); resetFilter(); @@ -674,15 +672,15 @@ void HelpPlugin::doSetupIfNeeded() } } -Core::HelpManager::HelpViewerLocation HelpPlugin::contextHelpOption() const +HelpManager::HelpViewerLocation HelpPlugin::contextHelpOption() const { - QSettings *settings = Core::ICore::settings(); + QSettings *settings = ICore::settings(); const QString key = QLatin1String(Help::Constants::ID_MODE_HELP) + QLatin1String("/ContextHelpOption"); if (settings->contains(key)) - return Core::HelpManager::HelpViewerLocation( - settings->value(key, Core::HelpManager::SideBySideIfPossible).toInt()); + return HelpManager::HelpViewerLocation( + settings->value(key, HelpManager::SideBySideIfPossible).toInt()); const QHelpEngineCore &engine = LocalHelpManager::helpEngine(); - return Core::HelpManager::HelpViewerLocation(engine.customValue(QLatin1String("ContextHelpOption"), - Core::HelpManager::SideBySideIfPossible).toInt()); + return HelpManager::HelpViewerLocation(engine.customValue(QLatin1String("ContextHelpOption"), + HelpManager::SideBySideIfPossible).toInt()); } diff --git a/src/plugins/help/helpplugin.h b/src/plugins/help/helpplugin.h index 1ced29cdff..0540c5ad53 100644 --- a/src/plugins/help/helpplugin.h +++ b/src/plugins/help/helpplugin.h @@ -85,8 +85,6 @@ public: static HelpViewer *createHelpViewer(qreal zoom); private slots: - void unregisterOldQtCreatorDocumentation(); - void modeChanged(Core::IMode *mode, Core::IMode *old); void showContextHelp(); diff --git a/src/plugins/help/helpviewer.h b/src/plugins/help/helpviewer.h index 5d191f8aff..8454fb6ee1 100644 --- a/src/plugins/help/helpviewer.h +++ b/src/plugins/help/helpviewer.h @@ -55,6 +55,7 @@ public: virtual void setViewerFont(const QFont &font) = 0; virtual qreal scale() const = 0; + virtual void setScale(qreal scale) = 0; virtual QString title() const = 0; diff --git a/src/plugins/help/localhelpmanager.cpp b/src/plugins/help/localhelpmanager.cpp index fb05e69c29..3603d6fbb8 100644 --- a/src/plugins/help/localhelpmanager.cpp +++ b/src/plugins/help/localhelpmanager.cpp @@ -47,6 +47,9 @@ using namespace Help::Internal; static LocalHelpManager *m_instance = 0; +bool LocalHelpManager::m_guiNeedsSetup = true; +bool LocalHelpManager::m_needsCollectionFile = true; + QMutex LocalHelpManager::m_guiMutex; QHelpEngine* LocalHelpManager::m_guiEngine = 0; @@ -61,8 +64,6 @@ static char kHelpHomePageKey[] = "Help/HomePage"; LocalHelpManager::LocalHelpManager(QObject *parent) : QObject(parent) - , m_guiNeedsSetup(true) - , m_needsCollectionFile(true) { m_instance = this; qRegisterMetaType<Help::Internal::LocalHelpManager::HelpData>("Help::Internal::LocalHelpManager::HelpData"); diff --git a/src/plugins/help/localhelpmanager.h b/src/plugins/help/localhelpmanager.h index 1b4be734cd..0fe6676057 100644 --- a/src/plugins/help/localhelpmanager.h +++ b/src/plugins/help/localhelpmanager.h @@ -64,8 +64,8 @@ public: static QString homePage(); static void setHomePage(const QString &page); - void setupGuiHelpEngine(); - void setEngineNeedsUpdate(); + static void setupGuiHelpEngine(); + static void setEngineNeedsUpdate(); static QHelpEngine& helpEngine(); static BookmarkManager& bookmarkManager(); @@ -86,8 +86,8 @@ signals: void filterIndexChanged(int index); private: - bool m_guiNeedsSetup; - bool m_needsCollectionFile; + static bool m_guiNeedsSetup; + static bool m_needsCollectionFile; static QStandardItemModel *m_filterModel; static QString m_currentFilter; diff --git a/src/plugins/help/macwebkithelpviewer.h b/src/plugins/help/macwebkithelpviewer.h index 236c9ee4a1..8b8df61085 100644 --- a/src/plugins/help/macwebkithelpviewer.h +++ b/src/plugins/help/macwebkithelpviewer.h @@ -68,12 +68,15 @@ public: void setOpenInNewPageActionVisible(bool visible); WebView *webView() const; + void startToolTipTimer(const QPoint &pos, const QString &text); + void hideToolTip(); protected: void hideEvent(QHideEvent *); void showEvent(QShowEvent *); private: + void showToolTip(); MacWebKitHelpWidgetPrivate *d; }; @@ -82,13 +85,14 @@ class MacWebKitHelpViewer : public HelpViewer Q_OBJECT public: - explicit MacWebKitHelpViewer(qreal zoom, QWidget *parent = 0); + explicit MacWebKitHelpViewer(QWidget *parent = 0); ~MacWebKitHelpViewer(); QFont viewerFont() const; void setViewerFont(const QFont &font); qreal scale() const; + void setScale(qreal scale); QString title() const; diff --git a/src/plugins/help/macwebkithelpviewer.mm b/src/plugins/help/macwebkithelpviewer.mm index 9fb1c26041..096d0c3412 100644 --- a/src/plugins/help/macwebkithelpviewer.mm +++ b/src/plugins/help/macwebkithelpviewer.mm @@ -39,7 +39,10 @@ #include <QApplication> #include <QClipboard> #include <QHelpEngine> +#include <QStyle> +#include <QTimer> #include <QtMac> +#include <QToolTip> #include <QUrl> #include <QVBoxLayout> @@ -86,6 +89,22 @@ AutoreleasePool::~AutoreleasePool() [pool release]; } +// #pragma mark -- mac helpers + +// copy from qcocoahelpers.mm +static int mainScreenHeight() +{ + // The first screen in the screens array is documented + // to have the (0,0) origin. + NSRect screenFrame = [[[NSScreen screens] firstObject] frame]; + return screenFrame.size.height; +} + +static QPoint flipPoint(const NSPoint &p) +{ + return QPoint(p.x, mainScreenHeight() - p.y); +} + // #pragma mark -- DOMNodeIterator (PrivateExtensions) @interface DOMNodeIterator (PrivateExtensions) @@ -212,6 +231,7 @@ static void ensureProtocolHandler() - (void)webView:(WebView *)sender didStartProvisionalLoadForFrame:(WebFrame *)frame; - (void)webView:(WebView *)sender didReceiveTitle:(NSString *)title forFrame:(WebFrame *)frame; - (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame; +- (void)webView:(WebView *)sender didFailProvisionalLoadWithError:(NSError *)error forFrame:(WebFrame *)frame; @end @@ -249,28 +269,37 @@ static void ensureProtocolHandler() viewer->slotLoadFinished(); } +- (void)webView:(WebView *)sender didFailProvisionalLoadWithError:(NSError *)error forFrame:(WebFrame *)frame +{ + Q_UNUSED(sender) + Q_UNUSED(error) + if (frame == mainFrame) + viewer->slotLoadFinished(); +} + @end // #pragma mark -- UIDelegate @interface UIDelegate : NSObject { - QWidget *widget; + Help::Internal::MacWebKitHelpWidget *widget; } @property (assign) BOOL openInNewPageActionVisible; -- (id)initWithWidget:(QWidget *)theWidget; +- (id)initWithWidget:(Help::Internal::MacWebKitHelpWidget *)theWidget; - (void)webView:(WebView *)sender makeFirstResponder:(NSResponder *)responder; - (NSArray *)webView:(WebView *)sender contextMenuItemsForElement:(NSDictionary *)element defaultMenuItems:(NSArray *)defaultMenuItems; - (WebView *)webView:(WebView *)sender createWebViewWithRequest:(NSURLRequest *)request; - +- (void)webView:(WebView *)sender mouseDidMoveOverElement:(NSDictionary *)elementInformation + modifierFlags:(NSUInteger)modifierFlags; @end @implementation UIDelegate -- (id)initWithWidget:(QWidget *)theWidget +- (id)initWithWidget:(Help::Internal::MacWebKitHelpWidget *)theWidget { self = [super init]; if (self) { @@ -334,6 +363,23 @@ static void ensureProtocolHandler() return viewer->widget()->webView(); } +- (void)webView:(WebView *)sender mouseDidMoveOverElement:(NSDictionary *)elementInformation + modifierFlags:(NSUInteger)modifierFlags +{ + Q_UNUSED(sender) + if (!elementInformation || (modifierFlags & NSDeviceIndependentModifierFlagsMask) != 0) { + widget->hideToolTip(); + return; + } + NSURL *url = [elementInformation objectForKey:WebElementLinkURLKey]; + if (!url) { + widget->hideToolTip(); + return; + } + widget->startToolTipTimer(flipPoint(NSEvent.mouseLocation), + QString::fromNSString(url.absoluteString)); +} + @end // #pragma mark -- MyWebView @@ -396,6 +442,9 @@ public: FrameLoadDelegate *m_frameLoadDelegate; UIDelegate *m_uiDelegate; NSResponder *m_savedResponder; + QTimer m_toolTipTimer; + QPoint m_toolTipPos; + QString m_toolTipText; }; // #pragma mark -- MacWebKitHelpWidget @@ -404,8 +453,13 @@ MacWebKitHelpWidget::MacWebKitHelpWidget(MacWebKitHelpViewer *parent) : QMacCocoaViewContainer(0, parent), d(new MacWebKitHelpWidgetPrivate) { + d->m_toolTipTimer.setSingleShot(true); + connect(&d->m_toolTipTimer, &QTimer::timeout, this, &MacWebKitHelpWidget::showToolTip); AutoreleasePool pool; Q_UNUSED(pool) d->m_webView = [[MyWebView alloc] init]; + // Turn layered rendering on. + // Otherwise the WebView will render empty after any QQuickWidget was shown. + d->m_webView.wantsLayer = YES; d->m_frameLoadDelegate = [[FrameLoadDelegate alloc] initWithMainFrame:d->m_webView.mainFrame viewer:parent]; [d->m_webView setFrameLoadDelegate:d->m_frameLoadDelegate]; @@ -430,6 +484,20 @@ WebView *MacWebKitHelpWidget::webView() const return d->m_webView; } +void MacWebKitHelpWidget::startToolTipTimer(const QPoint &pos, const QString &text) +{ + int delay = style()->styleHint(QStyle::SH_ToolTip_WakeUpDelay, 0, this, 0); + d->m_toolTipPos = pos; + d->m_toolTipText = text; + d->m_toolTipTimer.start(delay); +} + +void MacWebKitHelpWidget::hideToolTip() +{ + d->m_toolTipTimer.stop(); + QToolTip::showText(QPoint(), QString()); +} + void MacWebKitHelpWidget::hideEvent(QHideEvent *) { [d->m_webView setHidden:YES]; @@ -440,9 +508,14 @@ void MacWebKitHelpWidget::showEvent(QShowEvent *) [d->m_webView setHidden:NO]; } +void MacWebKitHelpWidget::showToolTip() +{ + QToolTip::showText(d->m_toolTipPos, d->m_toolTipText, this); +} + // #pragma mark -- MacWebKitHelpViewer -MacWebKitHelpViewer::MacWebKitHelpViewer(qreal zoom, QWidget *parent) +MacWebKitHelpViewer::MacWebKitHelpViewer(QWidget *parent) : HelpViewer(parent), m_widget(new MacWebKitHelpWidget(this)) { @@ -457,7 +530,6 @@ MacWebKitHelpViewer::MacWebKitHelpViewer(qreal zoom, QWidget *parent) setLayout(layout); layout->setContentsMargins(0, 0, 0, 0); layout->addWidget(m_widget, 10); - m_widget->webView().textSizeMultiplier = (zoom == 0.0 ? 1.0 : zoom); } MacWebKitHelpViewer::~MacWebKitHelpViewer() @@ -503,7 +575,12 @@ void MacWebKitHelpViewer::resetScale() qreal MacWebKitHelpViewer::scale() const { AutoreleasePool pool; Q_UNUSED(pool) - return m_widget->webView().textSizeMultiplier; + return m_widget->webView().textSizeMultiplier; +} + +void MacWebKitHelpViewer::setScale(qreal scale) +{ + m_widget->webView().textSizeMultiplier = (scale <= 0.0 ? 1.0 : scale); } QString MacWebKitHelpViewer::title() const diff --git a/src/plugins/help/openpagesmodel.cpp b/src/plugins/help/openpagesmodel.cpp index 0e27b804ac..f87b427154 100644 --- a/src/plugins/help/openpagesmodel.cpp +++ b/src/plugins/help/openpagesmodel.cpp @@ -75,7 +75,8 @@ void OpenPagesModel::addPage(const QUrl &url, qreal zoom) { beginInsertRows(QModelIndex(), rowCount(), rowCount()); HelpViewer *page = HelpPlugin::createHelpViewer(zoom); - connect(page, SIGNAL(titleChanged()), this, SLOT(handleTitleChanged())); + connect(page, &HelpViewer::titleChanged, + this, &OpenPagesModel::handleTitleChanged); m_pages << page; endInsertRows(); if (url.isValid()) diff --git a/src/plugins/help/openpagesswitcher.cpp b/src/plugins/help/openpagesswitcher.cpp index c77a60cf1d..12c929745d 100644 --- a/src/plugins/help/openpagesswitcher.cpp +++ b/src/plugins/help/openpagesswitcher.cpp @@ -67,10 +67,10 @@ OpenPagesSwitcher::OpenPagesSwitcher(OpenPagesModel *model) layout->setMargin(0); layout->addWidget(m_openPagesWidget); - connect(m_openPagesWidget, SIGNAL(closePage(QModelIndex)), this, - SIGNAL(closePage(QModelIndex))); - connect(m_openPagesWidget, SIGNAL(setCurrentPage(QModelIndex)), this, - SIGNAL(setCurrentPage(QModelIndex))); + connect(m_openPagesWidget, &OpenPagesWidget::closePage, + this, &OpenPagesSwitcher::closePage); + connect(m_openPagesWidget, &OpenPagesWidget::setCurrentPage, + this, &OpenPagesSwitcher::setCurrentPage); } OpenPagesSwitcher::~OpenPagesSwitcher() diff --git a/src/plugins/help/qtwebkithelpviewer.cpp b/src/plugins/help/qtwebkithelpviewer.cpp index a2c264b42e..1821e1c0da 100644 --- a/src/plugins/help/qtwebkithelpviewer.cpp +++ b/src/plugins/help/qtwebkithelpviewer.cpp @@ -38,6 +38,7 @@ #include <coreplugin/find/findplugin.h> #include <utils/hostosinfo.h> +#include <utils/networkaccessmanager.h> #include <utils/qtcassert.h> #include <QAction> @@ -59,7 +60,6 @@ #include <QNetworkReply> #include <QNetworkRequest> -#include <utils/networkaccessmanager.h> #include <cstring> @@ -250,7 +250,7 @@ void HelpPage::onHandleUnsupportedContent(QNetworkReply *reply) // -- HelpViewer -QtWebKitHelpWidget::QtWebKitHelpWidget(qreal zoom, QtWebKitHelpViewer *parent) +QtWebKitHelpWidget::QtWebKitHelpWidget(QtWebKitHelpViewer *parent) : QWebView(parent), m_parent(parent) { @@ -278,8 +278,6 @@ QtWebKitHelpWidget::QtWebKitHelpWidget(qreal zoom, QtWebKitHelpViewer *parent) SLOT(actionChanged())); connect(pageAction(QWebPage::Forward), SIGNAL(changed()), this, SLOT(actionChanged())); - - setZoomFactor(zoom == 0.0 ? 1.0 : zoom); } QtWebKitHelpWidget::~QtWebKitHelpWidget() @@ -387,15 +385,15 @@ bool QtWebKitHelpWidget::eventFilter(QObject *obj, QEvent *event) if (event->type() == QEvent::KeyPress) { if (QKeyEvent *keyEvent = static_cast<QKeyEvent*> (event)) { if (keyEvent->key() == Qt::Key_Slash) - Core::FindPlugin::instance()->openFindToolBar(Core::FindPlugin::FindForwardDirection); + FindPlugin::instance()->openFindToolBar(FindPlugin::FindForwardDirection); } } return QWebView::eventFilter(obj, event); } -QtWebKitHelpViewer::QtWebKitHelpViewer(qreal zoom, QWidget *parent) +QtWebKitHelpViewer::QtWebKitHelpViewer(QWidget *parent) : HelpViewer(parent), - m_webView(new QtWebKitHelpWidget(zoom, this)) + m_webView(new QtWebKitHelpWidget(this)) { QVBoxLayout *layout = new QVBoxLayout; setLayout(layout); @@ -413,6 +411,7 @@ QtWebKitHelpViewer::QtWebKitHelpViewer(qreal zoom, QWidget *parent) connect(m_webView->page(), SIGNAL(printRequested(QWebFrame*)), this, SIGNAL(printRequested())); connect(m_webView, SIGNAL(backwardAvailable(bool)), this, SIGNAL(backwardAvailable(bool))); connect(m_webView, SIGNAL(forwardAvailable(bool)), this, SIGNAL(forwardAvailable(bool))); + connect(page(), &HelpPage::linkHovered, this, &QtWebKitHelpViewer::setToolTip); } QFont QtWebKitHelpViewer::viewerFont() const @@ -449,6 +448,11 @@ qreal QtWebKitHelpViewer::scale() const return m_webView->zoomFactor(); } +void QtWebKitHelpViewer::setScale(qreal scale) +{ + m_webView->setZoomFactor(scale <= 0.0 ? 1.0 : scale); +} + QString QtWebKitHelpViewer::title() const { return m_webView->title(); @@ -565,7 +569,7 @@ void QtWebKitHelpViewer::setOpenInNewPageActionVisible(bool visible) m_webView->setOpenInNewPageActionVisible(visible); } -bool QtWebKitHelpViewer::findText(const QString &text, Core::FindFlags flags, +bool QtWebKitHelpViewer::findText(const QString &text, FindFlags flags, bool incremental, bool fromSearch, bool *wrapped) { Q_UNUSED(incremental); @@ -573,9 +577,9 @@ bool QtWebKitHelpViewer::findText(const QString &text, Core::FindFlags flags, if (wrapped) *wrapped = false; QWebPage::FindFlags options; - if (flags & Core::FindBackward) + if (flags & FindBackward) options |= QWebPage::FindBackward; - if (flags & Core::FindCaseSensitively) + if (flags & FindCaseSensitively) options |= QWebPage::FindCaseSensitively; bool found = m_webView->findText(text, options); diff --git a/src/plugins/help/qtwebkithelpviewer.h b/src/plugins/help/qtwebkithelpviewer.h index 4f05c74ded..669455fcb9 100644 --- a/src/plugins/help/qtwebkithelpviewer.h +++ b/src/plugins/help/qtwebkithelpviewer.h @@ -48,13 +48,14 @@ class QtWebKitHelpViewer : public HelpViewer { Q_OBJECT public: - explicit QtWebKitHelpViewer(qreal zoom, QWidget *parent = 0); + explicit QtWebKitHelpViewer(QWidget *parent = 0); ~QtWebKitHelpViewer() { } QFont viewerFont() const; void setViewerFont(const QFont &font); qreal scale() const; + void setScale(qreal scale); QString title() const; @@ -103,7 +104,7 @@ class QtWebKitHelpWidget : public QWebView Q_OBJECT public: - explicit QtWebKitHelpWidget(qreal zoom, QtWebKitHelpViewer *parent = 0); + explicit QtWebKitHelpWidget(QtWebKitHelpViewer *parent = 0); ~QtWebKitHelpWidget(); void scaleUp(); diff --git a/src/plugins/help/remotehelpfilter.cpp b/src/plugins/help/remotehelpfilter.cpp index 4da4d2c847..c6b64119a7 100644 --- a/src/plugins/help/remotehelpfilter.cpp +++ b/src/plugins/help/remotehelpfilter.cpp @@ -49,8 +49,10 @@ RemoteFilterOptions::RemoteFilterOptions(RemoteHelpFilter *filter, QWidget *pare item->setFlags(item->flags() | Qt::ItemIsEditable); } - connect(m_ui.add, SIGNAL(clicked()), this, SLOT(addNewItem())); - connect(m_ui.remove, SIGNAL(clicked()), this, SLOT(removeItem())); + connect(m_ui.add, &QPushButton::clicked, + this, &RemoteFilterOptions::addNewItem); + connect(m_ui.remove, &QPushButton::clicked, + this, &RemoteFilterOptions::removeItem); connect(m_ui.listWidget, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)), SLOT(updateRemoveButton())); updateRemoveButton(); } diff --git a/src/plugins/help/textbrowserhelpviewer.cpp b/src/plugins/help/textbrowserhelpviewer.cpp index fad3d1bff5..6f2b9b9cd2 100644 --- a/src/plugins/help/textbrowserhelpviewer.cpp +++ b/src/plugins/help/textbrowserhelpviewer.cpp @@ -43,6 +43,7 @@ #include <QHelpEngine> #include <QKeyEvent> #include <QMenu> +#include <QToolTip> #include <QVBoxLayout> using namespace Help; @@ -50,9 +51,9 @@ using namespace Help::Internal; // -- HelpViewer -TextBrowserHelpViewer::TextBrowserHelpViewer(qreal zoom, QWidget *parent) +TextBrowserHelpViewer::TextBrowserHelpViewer(QWidget *parent) : HelpViewer(parent) - , m_textBrowser(new TextBrowserHelpWidget(zoom, this)) + , m_textBrowser(new TextBrowserHelpWidget(this)) { QVBoxLayout *layout = new QVBoxLayout; setLayout(layout); @@ -112,6 +113,22 @@ qreal TextBrowserHelpViewer::scale() const return m_textBrowser->zoomCount; } +void TextBrowserHelpViewer::setScale(qreal scale) +{ + m_textBrowser->forceFont = true; + if (scale > 10) + scale = 10; + else if (scale < -5) + scale = -5; + int diff = (int)scale - m_textBrowser->zoomCount; + if (diff > 0) + m_textBrowser->zoomIn(diff); + else if (diff < 0) + m_textBrowser->zoomOut(-diff); + m_textBrowser->zoomCount = (int)scale; + m_textBrowser->forceFont = false; +} + QString TextBrowserHelpViewer::title() const { return m_textBrowser->documentTitle(); @@ -284,9 +301,9 @@ void TextBrowserHelpViewer::goToHistoryItem() // -- private -TextBrowserHelpWidget::TextBrowserHelpWidget(int zoom, TextBrowserHelpViewer *parent) +TextBrowserHelpWidget::TextBrowserHelpWidget(TextBrowserHelpViewer *parent) : QTextBrowser(parent) - , zoomCount(zoom) + , zoomCount(0) , forceFont(false) , m_openInNewPageActionVisible(true) , m_parent(parent) @@ -389,6 +406,10 @@ bool TextBrowserHelpWidget::eventFilter(QObject *obj, QEvent *event) Core::FindPlugin::instance()->openFindToolBar(Core::FindPlugin::FindForwardDirection); return true; } + } else if (event->type() == QEvent::ToolTip) { + QHelpEvent *e = static_cast<QHelpEvent *>(event); + QToolTip::showText(e->globalPos(), linkAt(e->pos())); + return true; } } return QTextBrowser::eventFilter(obj, event); diff --git a/src/plugins/help/textbrowserhelpviewer.h b/src/plugins/help/textbrowserhelpviewer.h index 81dab92af6..d00bd169e9 100644 --- a/src/plugins/help/textbrowserhelpviewer.h +++ b/src/plugins/help/textbrowserhelpviewer.h @@ -47,13 +47,14 @@ class TextBrowserHelpViewer : public HelpViewer Q_OBJECT public: - explicit TextBrowserHelpViewer(qreal zoom, QWidget *parent = 0); + explicit TextBrowserHelpViewer(QWidget *parent = 0); ~TextBrowserHelpViewer(); QFont viewerFont() const; void setViewerFont(const QFont &font); qreal scale() const; + void setScale(qreal scale); QString title() const; @@ -97,7 +98,7 @@ class TextBrowserHelpWidget : public QTextBrowser Q_OBJECT public: - TextBrowserHelpWidget(int zoom, TextBrowserHelpViewer *parent); + TextBrowserHelpWidget(TextBrowserHelpViewer *parent); QVariant loadResource(int type, const QUrl &name); |