Help: Add option for help viewer backend

Add "Reload" menu item, which re-creates the help viewer with the
current backend.

Change-Id: I979cb9cdf5ae5635f4d028dc41d71ab71ce80248
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Eike Ziller
2019-08-30 14:34:19 +02:00
parent d3c94edd93
commit 1bbdb1440f
6 changed files with 150 additions and 29 deletions

View File

@@ -37,6 +37,7 @@
#include <coreplugin/helpmanager.h>
#include <coreplugin/icore.h>
#include <utils/algorithm.h>
#include <utils/fileutils.h>
#include <QCoreApplication>
@@ -122,6 +123,21 @@ QWidget *GeneralSettingsPage::widget()
m_scrollWheelZoomingEnabled = LocalHelpManager::isScrollWheelZoomingEnabled();
m_ui->scrollWheelZooming->setChecked(m_scrollWheelZoomingEnabled);
const QString tooltip = tr("Change takes effect after reloading help pages.");
m_ui->viewerBackendLabel->setToolTip(tooltip);
m_ui->viewerBackend->setToolTip(tooltip);
m_ui->viewerBackend->addItem(tr("Default (%1)", "Default viewer backend")
.arg(LocalHelpManager::defaultViewerBackend().displayName));
const QByteArray currentBackend = LocalHelpManager::viewerBackendId();
const QVector<HelpViewerFactory> backends = LocalHelpManager::viewerBackends();
for (const HelpViewerFactory &f : backends) {
m_ui->viewerBackend->addItem(f.displayName, f.id);
if (f.id == currentBackend)
m_ui->viewerBackend->setCurrentIndex(m_ui->viewerBackend->count() - 1);
}
if (backends.size() == 1)
m_ui->viewerBackend->setEnabled(false);
}
return m_widget;
}
@@ -168,6 +184,9 @@ void GeneralSettingsPage::apply()
m_scrollWheelZoomingEnabled = zoom;
LocalHelpManager::setScrollWheelZoomingEnabled(m_scrollWheelZoomingEnabled);
}
const QByteArray viewerBackendId = m_ui->viewerBackend->currentData().toByteArray();
LocalHelpManager::setViewerBackendId(viewerBackendId);
}
void GeneralSettingsPage::setCurrentPage()

View File

@@ -305,6 +305,33 @@
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="QLabel" name="viewerBackendLabel">
<property name="text">
<string>Viewer backend:</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="viewerBackend"/>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
</item>
@@ -337,6 +364,15 @@
</color>
</brush>
</colorrole>
<colorrole role="PlaceholderText">
<brush brushstyle="NoBrush">
<color alpha="128">
<red>255</red>
<green>0</green>
<blue>0</blue>
</color>
</brush>
</colorrole>
</active>
<inactive>
<colorrole role="Text">
@@ -348,6 +384,15 @@
</color>
</brush>
</colorrole>
<colorrole role="PlaceholderText">
<brush brushstyle="NoBrush">
<color alpha="128">
<red>255</red>
<green>0</green>
<blue>0</blue>
</color>
</brush>
</colorrole>
</inactive>
<disabled>
<colorrole role="Text">
@@ -359,6 +404,15 @@
</color>
</brush>
</colorrole>
<colorrole role="PlaceholderText">
<brush brushstyle="NoBrush">
<color alpha="128">
<red>255</red>
<green>0</green>
<blue>0</blue>
</color>
</brush>
</colorrole>
</disabled>
</palette>
</property>

View File

@@ -300,13 +300,15 @@ HelpWidget::HelpWidget(const Core::Context &context, WidgetStyle style, QWidget
advancedMenu->addAction(cmd, Core::Constants::G_EDIT_FONT);
}
auto openButton = new QToolButton;
openButton->setIcon(Utils::Icons::SPLIT_HORIZONTAL_TOOLBAR.icon());
openButton->setPopupMode(QToolButton::InstantPopup);
openButton->setProperty("noArrow", true);
layout->addWidget(openButton);
auto openMenu = new QMenu(openButton);
openButton->setMenu(openMenu);
if (style != ExternalWindow) {
auto openButton = new QToolButton;
openButton->setIcon(Utils::Icons::SPLIT_HORIZONTAL_TOOLBAR.icon());
openButton->setPopupMode(QToolButton::InstantPopup);
openButton->setProperty("noArrow", true);
layout->addWidget(openButton);
auto openMenu = new QMenu(openButton);
if (m_switchToHelp)
openMenu->addAction(m_switchToHelp);
if (style == ModeWidget) {
@@ -324,7 +326,7 @@ HelpWidget::HelpWidget(const Core::Context &context, WidgetStyle style, QWidget
emit closeButtonClicked();
}
});
openButton->setMenu(openMenu);
openMenu->addSeparator();
const Utils::Icon &icon = style == ModeWidget ? Utils::Icons::CLOSE_TOOLBAR
: Utils::Icons::CLOSE_SPLIT_RIGHT;
@@ -335,6 +337,15 @@ HelpWidget::HelpWidget(const Core::Context &context, WidgetStyle style, QWidget
layout->addWidget(button);
}
QAction *reload = openMenu->addAction(tr("Reload"));
connect(reload, &QAction::triggered, this, [this]() {
const int index = m_viewerStack->currentIndex();
HelpViewer *previous = currentViewer();
insertViewer(index, previous->source(), previous->scale());
removeViewerAt(index + 1);
setCurrentIndex(index);
});
if (style != ModeWidget) {
addViewer({});
setCurrentIndex(0);
@@ -516,9 +527,14 @@ void HelpWidget::setCurrentIndex(int index)
HelpViewer *HelpWidget::addViewer(const QUrl &url, qreal zoom)
{
m_model.beginInsertRows(QModelIndex(), viewerCount(), viewerCount());
return insertViewer(m_viewerStack->count(), url, zoom);
}
HelpViewer *HelpWidget::insertViewer(int index, const QUrl &url, qreal zoom)
{
m_model.beginInsertRows({}, index, index);
HelpViewer *viewer = HelpPlugin::createHelpViewer(zoom);
m_viewerStack->addWidget(viewer);
m_viewerStack->insertWidget(index, viewer);
viewer->setFocus(Qt::OtherFocusReason);
viewer->setActionVisible(HelpViewer::Action::NewPage, m_style == ModeWidget);
viewer->setActionVisible(HelpViewer::Action::ExternalWindow, m_style != ExternalWindow);

View File

@@ -114,7 +114,7 @@ signals:
private:
int indexOf(HelpViewer *viewer) const;
HelpViewer *insertViewer(int index, const QUrl &url, qreal zoom);
void updateBackMenu();
void updateForwardMenu();
void updateWindowTitle();

View File

@@ -45,6 +45,7 @@
#include <coreplugin/icore.h>
#include <utils/algorithm.h>
#include <utils/hostosinfo.h>
#include <utils/optional.h>
#include <utils/qtcassert.h>
#include <QDesktopServices>
@@ -81,6 +82,10 @@ static const char kUseScrollWheelZooming[] = "Help/UseScrollWheelZooming";
static const char kLastShownPagesKey[] = "Help/LastShownPages";
static const char kLastShownPagesZoomKey[] = "Help/LastShownPagesZoom";
static const char kLastSelectedTabKey[] = "Help/LastSelectedTab";
static const char kViewerBackend[] = "Help/ViewerBackend";
static const char kQtWebEngineBackend[] = "qtwebengine";
static const char kTextBrowserBackend[] = "textbrowser";
static const int kDefaultFallbackFontSize = 14;
@@ -287,25 +292,39 @@ void LocalHelpManager::setLastSelectedTab(int index)
Core::ICore::settings()->setValue(kLastSelectedTabKey, index);
}
QByteArray LocalHelpManager::defaultViewerBackend()
static Utils::optional<HelpViewerFactory> backendForId(const QByteArray &id)
{
const QVector<HelpViewerFactory> factories = LocalHelpManager::viewerBackends();
const auto backend = std::find_if(std::begin(factories),
std::end(factories),
Utils::equal(&HelpViewerFactory::id, id));
if (backend != std::end(factories))
return *backend;
return {};
}
HelpViewerFactory LocalHelpManager::defaultViewerBackend()
{
const QByteArray backend = qgetenv("QTC_HELPVIEWER_BACKEND");
if (Utils::contains(viewerBackends(), Utils::equal(&HelpViewerFactory::id, backend)))
return backend;
else if (!backend.isEmpty())
if (!backend.isEmpty()) {
const Utils::optional<HelpViewerFactory> factory = backendForId(backend);
if (factory)
return *factory;
}
if (!backend.isEmpty())
qWarning("Help viewer backend \"%s\" not found, using default.", backend.constData());
#ifdef QTC_WEBENGINE_HELPVIEWER
return "qtwebengine";
#else
return "textbrowser";
#endif
const Utils::optional<HelpViewerFactory> factory = backendForId(kQtWebEngineBackend);
if (factory)
return *factory;
return backendForId(kTextBrowserBackend).value_or(HelpViewerFactory());
}
QVector<HelpViewerFactory> LocalHelpManager::viewerBackends()
{
QVector<HelpViewerFactory> result;
#ifdef QTC_WEBENGINE_HELPVIEWER
result.append({"qtwebengine", tr("QtWebEngine"), []() { return new WebEngineHelpViewer; }});
result.append(
{kQtWebEngineBackend, tr("QtWebEngine"), []() { return new WebEngineHelpViewer; }});
#endif
#ifdef QTC_LITEHTML_HELPVIEWER
result.append({"litehtml", tr("litehtml"), []() { return new LiteHtmlHelpViewer; }});
@@ -313,18 +332,30 @@ QVector<HelpViewerFactory> LocalHelpManager::viewerBackends()
#ifdef QTC_MAC_NATIVE_HELPVIEWER
result.append({"native", tr("WebKit"), []() { return new MacWebKitHelpViewer; }});
#endif
result.append({"textbrowser", tr("QTextBrowser"), []() { return new TextBrowserHelpViewer; }});
result.append(
{kTextBrowserBackend, tr("QTextBrowser"), []() { return new TextBrowserHelpViewer; }});
return result;
}
HelpViewerFactory LocalHelpManager::viewerBackend()
{
const QVector<HelpViewerFactory> factories = viewerBackends();
const auto backend = std::find_if(std::begin(factories),
std::end(factories),
Utils::equal(&HelpViewerFactory::id, defaultViewerBackend()));
QTC_ASSERT(backend != std::end(factories), return {});
return *backend;
const QByteArray id = Core::ICore::settings()->value(kViewerBackend).toByteArray();
if (!id.isEmpty())
return backendForId(id).value_or(defaultViewerBackend());
return defaultViewerBackend();
}
void LocalHelpManager::setViewerBackendId(const QByteArray &id)
{
if (id.isEmpty())
Core::ICore::settings()->remove(kViewerBackend);
else
Core::ICore::settings()->setValue(kViewerBackend, id);
}
QByteArray LocalHelpManager::viewerBackendId()
{
return Core::ICore::settings()->value(kViewerBackend).toByteArray();
}
void LocalHelpManager::setupGuiHelpEngine()

View File

@@ -26,7 +26,6 @@
#pragma once
#include <coreplugin/helpmanager.h>
#include <utils/optional.h>
#include <QMetaType>
#include <QMutex>
@@ -102,9 +101,11 @@ public:
static int lastSelectedTab();
static void setLastSelectedTab(int index);
static QByteArray defaultViewerBackend();
static HelpViewerFactory defaultViewerBackend();
static QVector<HelpViewerFactory> viewerBackends();
static HelpViewerFactory viewerBackend();
static void setViewerBackendId(const QByteArray &id);
static QByteArray viewerBackendId();
static void setupGuiHelpEngine();
static void setEngineNeedsUpdate();