forked from qt-creator/qt-creator
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:
@@ -37,6 +37,7 @@
|
|||||||
#include <coreplugin/helpmanager.h>
|
#include <coreplugin/helpmanager.h>
|
||||||
#include <coreplugin/icore.h>
|
#include <coreplugin/icore.h>
|
||||||
|
|
||||||
|
#include <utils/algorithm.h>
|
||||||
#include <utils/fileutils.h>
|
#include <utils/fileutils.h>
|
||||||
|
|
||||||
#include <QCoreApplication>
|
#include <QCoreApplication>
|
||||||
@@ -122,6 +123,21 @@ QWidget *GeneralSettingsPage::widget()
|
|||||||
|
|
||||||
m_scrollWheelZoomingEnabled = LocalHelpManager::isScrollWheelZoomingEnabled();
|
m_scrollWheelZoomingEnabled = LocalHelpManager::isScrollWheelZoomingEnabled();
|
||||||
m_ui->scrollWheelZooming->setChecked(m_scrollWheelZoomingEnabled);
|
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;
|
return m_widget;
|
||||||
}
|
}
|
||||||
@@ -168,6 +184,9 @@ void GeneralSettingsPage::apply()
|
|||||||
m_scrollWheelZoomingEnabled = zoom;
|
m_scrollWheelZoomingEnabled = zoom;
|
||||||
LocalHelpManager::setScrollWheelZoomingEnabled(m_scrollWheelZoomingEnabled);
|
LocalHelpManager::setScrollWheelZoomingEnabled(m_scrollWheelZoomingEnabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const QByteArray viewerBackendId = m_ui->viewerBackend->currentData().toByteArray();
|
||||||
|
LocalHelpManager::setViewerBackendId(viewerBackendId);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GeneralSettingsPage::setCurrentPage()
|
void GeneralSettingsPage::setCurrentPage()
|
||||||
|
@@ -305,6 +305,33 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</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>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
@@ -337,6 +364,15 @@
|
|||||||
</color>
|
</color>
|
||||||
</brush>
|
</brush>
|
||||||
</colorrole>
|
</colorrole>
|
||||||
|
<colorrole role="PlaceholderText">
|
||||||
|
<brush brushstyle="NoBrush">
|
||||||
|
<color alpha="128">
|
||||||
|
<red>255</red>
|
||||||
|
<green>0</green>
|
||||||
|
<blue>0</blue>
|
||||||
|
</color>
|
||||||
|
</brush>
|
||||||
|
</colorrole>
|
||||||
</active>
|
</active>
|
||||||
<inactive>
|
<inactive>
|
||||||
<colorrole role="Text">
|
<colorrole role="Text">
|
||||||
@@ -348,6 +384,15 @@
|
|||||||
</color>
|
</color>
|
||||||
</brush>
|
</brush>
|
||||||
</colorrole>
|
</colorrole>
|
||||||
|
<colorrole role="PlaceholderText">
|
||||||
|
<brush brushstyle="NoBrush">
|
||||||
|
<color alpha="128">
|
||||||
|
<red>255</red>
|
||||||
|
<green>0</green>
|
||||||
|
<blue>0</blue>
|
||||||
|
</color>
|
||||||
|
</brush>
|
||||||
|
</colorrole>
|
||||||
</inactive>
|
</inactive>
|
||||||
<disabled>
|
<disabled>
|
||||||
<colorrole role="Text">
|
<colorrole role="Text">
|
||||||
@@ -359,6 +404,15 @@
|
|||||||
</color>
|
</color>
|
||||||
</brush>
|
</brush>
|
||||||
</colorrole>
|
</colorrole>
|
||||||
|
<colorrole role="PlaceholderText">
|
||||||
|
<brush brushstyle="NoBrush">
|
||||||
|
<color alpha="128">
|
||||||
|
<red>255</red>
|
||||||
|
<green>0</green>
|
||||||
|
<blue>0</blue>
|
||||||
|
</color>
|
||||||
|
</brush>
|
||||||
|
</colorrole>
|
||||||
</disabled>
|
</disabled>
|
||||||
</palette>
|
</palette>
|
||||||
</property>
|
</property>
|
||||||
|
@@ -300,13 +300,15 @@ HelpWidget::HelpWidget(const Core::Context &context, WidgetStyle style, QWidget
|
|||||||
advancedMenu->addAction(cmd, Core::Constants::G_EDIT_FONT);
|
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) {
|
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)
|
if (m_switchToHelp)
|
||||||
openMenu->addAction(m_switchToHelp);
|
openMenu->addAction(m_switchToHelp);
|
||||||
if (style == ModeWidget) {
|
if (style == ModeWidget) {
|
||||||
@@ -324,7 +326,7 @@ HelpWidget::HelpWidget(const Core::Context &context, WidgetStyle style, QWidget
|
|||||||
emit closeButtonClicked();
|
emit closeButtonClicked();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
openButton->setMenu(openMenu);
|
openMenu->addSeparator();
|
||||||
|
|
||||||
const Utils::Icon &icon = style == ModeWidget ? Utils::Icons::CLOSE_TOOLBAR
|
const Utils::Icon &icon = style == ModeWidget ? Utils::Icons::CLOSE_TOOLBAR
|
||||||
: Utils::Icons::CLOSE_SPLIT_RIGHT;
|
: Utils::Icons::CLOSE_SPLIT_RIGHT;
|
||||||
@@ -335,6 +337,15 @@ HelpWidget::HelpWidget(const Core::Context &context, WidgetStyle style, QWidget
|
|||||||
layout->addWidget(button);
|
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) {
|
if (style != ModeWidget) {
|
||||||
addViewer({});
|
addViewer({});
|
||||||
setCurrentIndex(0);
|
setCurrentIndex(0);
|
||||||
@@ -516,9 +527,14 @@ void HelpWidget::setCurrentIndex(int index)
|
|||||||
|
|
||||||
HelpViewer *HelpWidget::addViewer(const QUrl &url, qreal zoom)
|
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);
|
HelpViewer *viewer = HelpPlugin::createHelpViewer(zoom);
|
||||||
m_viewerStack->addWidget(viewer);
|
m_viewerStack->insertWidget(index, viewer);
|
||||||
viewer->setFocus(Qt::OtherFocusReason);
|
viewer->setFocus(Qt::OtherFocusReason);
|
||||||
viewer->setActionVisible(HelpViewer::Action::NewPage, m_style == ModeWidget);
|
viewer->setActionVisible(HelpViewer::Action::NewPage, m_style == ModeWidget);
|
||||||
viewer->setActionVisible(HelpViewer::Action::ExternalWindow, m_style != ExternalWindow);
|
viewer->setActionVisible(HelpViewer::Action::ExternalWindow, m_style != ExternalWindow);
|
||||||
|
@@ -114,7 +114,7 @@ signals:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
int indexOf(HelpViewer *viewer) const;
|
int indexOf(HelpViewer *viewer) const;
|
||||||
|
HelpViewer *insertViewer(int index, const QUrl &url, qreal zoom);
|
||||||
void updateBackMenu();
|
void updateBackMenu();
|
||||||
void updateForwardMenu();
|
void updateForwardMenu();
|
||||||
void updateWindowTitle();
|
void updateWindowTitle();
|
||||||
|
@@ -45,6 +45,7 @@
|
|||||||
#include <coreplugin/icore.h>
|
#include <coreplugin/icore.h>
|
||||||
#include <utils/algorithm.h>
|
#include <utils/algorithm.h>
|
||||||
#include <utils/hostosinfo.h>
|
#include <utils/hostosinfo.h>
|
||||||
|
#include <utils/optional.h>
|
||||||
#include <utils/qtcassert.h>
|
#include <utils/qtcassert.h>
|
||||||
|
|
||||||
#include <QDesktopServices>
|
#include <QDesktopServices>
|
||||||
@@ -81,6 +82,10 @@ static const char kUseScrollWheelZooming[] = "Help/UseScrollWheelZooming";
|
|||||||
static const char kLastShownPagesKey[] = "Help/LastShownPages";
|
static const char kLastShownPagesKey[] = "Help/LastShownPages";
|
||||||
static const char kLastShownPagesZoomKey[] = "Help/LastShownPagesZoom";
|
static const char kLastShownPagesZoomKey[] = "Help/LastShownPagesZoom";
|
||||||
static const char kLastSelectedTabKey[] = "Help/LastSelectedTab";
|
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;
|
static const int kDefaultFallbackFontSize = 14;
|
||||||
|
|
||||||
@@ -287,25 +292,39 @@ void LocalHelpManager::setLastSelectedTab(int index)
|
|||||||
Core::ICore::settings()->setValue(kLastSelectedTabKey, 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");
|
const QByteArray backend = qgetenv("QTC_HELPVIEWER_BACKEND");
|
||||||
if (Utils::contains(viewerBackends(), Utils::equal(&HelpViewerFactory::id, backend)))
|
if (!backend.isEmpty()) {
|
||||||
return backend;
|
const Utils::optional<HelpViewerFactory> factory = backendForId(backend);
|
||||||
else if (!backend.isEmpty())
|
if (factory)
|
||||||
|
return *factory;
|
||||||
|
}
|
||||||
|
if (!backend.isEmpty())
|
||||||
qWarning("Help viewer backend \"%s\" not found, using default.", backend.constData());
|
qWarning("Help viewer backend \"%s\" not found, using default.", backend.constData());
|
||||||
#ifdef QTC_WEBENGINE_HELPVIEWER
|
const Utils::optional<HelpViewerFactory> factory = backendForId(kQtWebEngineBackend);
|
||||||
return "qtwebengine";
|
if (factory)
|
||||||
#else
|
return *factory;
|
||||||
return "textbrowser";
|
return backendForId(kTextBrowserBackend).value_or(HelpViewerFactory());
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QVector<HelpViewerFactory> LocalHelpManager::viewerBackends()
|
QVector<HelpViewerFactory> LocalHelpManager::viewerBackends()
|
||||||
{
|
{
|
||||||
QVector<HelpViewerFactory> result;
|
QVector<HelpViewerFactory> result;
|
||||||
#ifdef QTC_WEBENGINE_HELPVIEWER
|
#ifdef QTC_WEBENGINE_HELPVIEWER
|
||||||
result.append({"qtwebengine", tr("QtWebEngine"), []() { return new WebEngineHelpViewer; }});
|
result.append(
|
||||||
|
{kQtWebEngineBackend, tr("QtWebEngine"), []() { return new WebEngineHelpViewer; }});
|
||||||
#endif
|
#endif
|
||||||
#ifdef QTC_LITEHTML_HELPVIEWER
|
#ifdef QTC_LITEHTML_HELPVIEWER
|
||||||
result.append({"litehtml", tr("litehtml"), []() { return new LiteHtmlHelpViewer; }});
|
result.append({"litehtml", tr("litehtml"), []() { return new LiteHtmlHelpViewer; }});
|
||||||
@@ -313,18 +332,30 @@ QVector<HelpViewerFactory> LocalHelpManager::viewerBackends()
|
|||||||
#ifdef QTC_MAC_NATIVE_HELPVIEWER
|
#ifdef QTC_MAC_NATIVE_HELPVIEWER
|
||||||
result.append({"native", tr("WebKit"), []() { return new MacWebKitHelpViewer; }});
|
result.append({"native", tr("WebKit"), []() { return new MacWebKitHelpViewer; }});
|
||||||
#endif
|
#endif
|
||||||
result.append({"textbrowser", tr("QTextBrowser"), []() { return new TextBrowserHelpViewer; }});
|
result.append(
|
||||||
|
{kTextBrowserBackend, tr("QTextBrowser"), []() { return new TextBrowserHelpViewer; }});
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
HelpViewerFactory LocalHelpManager::viewerBackend()
|
HelpViewerFactory LocalHelpManager::viewerBackend()
|
||||||
{
|
{
|
||||||
const QVector<HelpViewerFactory> factories = viewerBackends();
|
const QByteArray id = Core::ICore::settings()->value(kViewerBackend).toByteArray();
|
||||||
const auto backend = std::find_if(std::begin(factories),
|
if (!id.isEmpty())
|
||||||
std::end(factories),
|
return backendForId(id).value_or(defaultViewerBackend());
|
||||||
Utils::equal(&HelpViewerFactory::id, defaultViewerBackend()));
|
return defaultViewerBackend();
|
||||||
QTC_ASSERT(backend != std::end(factories), return {});
|
}
|
||||||
return *backend;
|
|
||||||
|
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()
|
void LocalHelpManager::setupGuiHelpEngine()
|
||||||
|
@@ -26,7 +26,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <coreplugin/helpmanager.h>
|
#include <coreplugin/helpmanager.h>
|
||||||
#include <utils/optional.h>
|
|
||||||
|
|
||||||
#include <QMetaType>
|
#include <QMetaType>
|
||||||
#include <QMutex>
|
#include <QMutex>
|
||||||
@@ -102,9 +101,11 @@ public:
|
|||||||
static int lastSelectedTab();
|
static int lastSelectedTab();
|
||||||
static void setLastSelectedTab(int index);
|
static void setLastSelectedTab(int index);
|
||||||
|
|
||||||
static QByteArray defaultViewerBackend();
|
static HelpViewerFactory defaultViewerBackend();
|
||||||
static QVector<HelpViewerFactory> viewerBackends();
|
static QVector<HelpViewerFactory> viewerBackends();
|
||||||
static HelpViewerFactory viewerBackend();
|
static HelpViewerFactory viewerBackend();
|
||||||
|
static void setViewerBackendId(const QByteArray &id);
|
||||||
|
static QByteArray viewerBackendId();
|
||||||
|
|
||||||
static void setupGuiHelpEngine();
|
static void setupGuiHelpEngine();
|
||||||
static void setEngineNeedsUpdate();
|
static void setEngineNeedsUpdate();
|
||||||
|
Reference in New Issue
Block a user