Share code between "central" and other help viewers.

This removes a lot of duplication of actions and interaction.
It's also a preparation step into making the external help
window behave more like the full-fledged help mode.

Change-Id: I318d831f229b0a75bb8702a5f163c96cce6a668c
Reviewed-by: Eike Ziller <eike.ziller@digia.com>
This commit is contained in:
Eike Ziller
2014-09-25 16:29:56 +02:00
parent 85ac965116
commit a56432b3b1
11 changed files with 391 additions and 649 deletions

View File

@@ -31,22 +31,11 @@
#include "helpviewer.h" #include "helpviewer.h"
#include "localhelpmanager.h" #include "localhelpmanager.h"
#include "topicchooser.h"
#include <topicchooser.h> #include <utils/qtcassert.h>
#include <QEvent>
#include <QTimer>
#include <QKeyEvent>
#include <QLayout>
#include <QPageSetupDialog>
#include <QPrinter>
#include <QPrintDialog>
#include <QPrintPreviewDialog>
#include <QStackedWidget>
#include <QHelpEngine> #include <QHelpEngine>
#include <QHelpSearchEngine>
using namespace Help::Internal; using namespace Help::Internal;
@@ -54,29 +43,19 @@ CentralWidget *gStaticCentralWidget = 0;
// -- CentralWidget // -- CentralWidget
CentralWidget::CentralWidget(QWidget *parent) CentralWidget::CentralWidget(const Core::Context &context, QWidget *parent)
: QWidget(parent) : HelpWidget(context, HelpWidget::ModeWidget, parent)
, printer(0)
, m_stackedWidget(0)
{ {
Q_ASSERT(!gStaticCentralWidget); QTC_CHECK(!gStaticCentralWidget);
gStaticCentralWidget = this; gStaticCentralWidget = this;
QVBoxLayout *vboxLayout = new QVBoxLayout(this);
vboxLayout->setMargin(0);
m_stackedWidget = new QStackedWidget(this);
vboxLayout->addWidget(m_stackedWidget);
} }
CentralWidget::~CentralWidget() CentralWidget::~CentralWidget()
{ {
#ifndef QT_NO_PRINTER // TODO: this shouldn't be done here
delete printer;
#endif
QString zoomFactors; QString zoomFactors;
QString currentPages; QString currentPages;
for (int i = 0; i < m_stackedWidget->count(); ++i) { for (int i = 0; i < viewerCount(); ++i) {
const HelpViewer * const viewer = viewerAt(i); const HelpViewer * const viewer = viewerAt(i);
const QUrl &source = viewer->source(); const QUrl &source = viewer->source();
if (source.isValid()) { if (source.isValid()) {
@@ -97,171 +76,6 @@ CentralWidget *CentralWidget::instance()
return gStaticCentralWidget; return gStaticCentralWidget;
} }
bool CentralWidget::isForwardAvailable() const
{
const HelpViewer* viewer = currentHelpViewer();
if (viewer)
return viewer->isForwardAvailable();
return false;
}
bool CentralWidget::isBackwardAvailable() const
{
const HelpViewer* viewer = currentHelpViewer();
if (viewer)
return viewer->isBackwardAvailable();
return false;
}
HelpViewer* CentralWidget::viewerAt(int index) const
{
return qobject_cast<HelpViewer*> (m_stackedWidget->widget(index));
}
HelpViewer* CentralWidget::currentHelpViewer() const
{
return qobject_cast<HelpViewer*> (m_stackedWidget->currentWidget());
}
void CentralWidget::addPage(HelpViewer *page, bool fromSearch)
{
page->installEventFilter(this);
page->setFocus(Qt::OtherFocusReason);
connectSignals(page);
m_stackedWidget->addWidget(page);
if (fromSearch) {
connect(currentHelpViewer(), SIGNAL(loadFinished()), this,
SLOT(highlightSearchTerms()));
}
}
void CentralWidget::removePage(int index)
{
m_stackedWidget->removeWidget(m_stackedWidget->widget(index));
}
int CentralWidget::currentIndex() const
{
return m_stackedWidget->currentIndex();
}
void CentralWidget::setCurrentPage(HelpViewer *page)
{
m_stackedWidget->setCurrentWidget(page);
}
bool CentralWidget::find(const QString &txt, Core::FindFlags flags,
bool incremental, bool *wrapped)
{
return currentHelpViewer()->findText(txt, flags, incremental, false, wrapped);
}
// -- public slots
void CentralWidget::copy()
{
if (HelpViewer* viewer = currentHelpViewer())
viewer->copy();
}
void CentralWidget::home()
{
if (HelpViewer* viewer = currentHelpViewer())
viewer->home();
}
void CentralWidget::zoomIn()
{
HelpViewer* viewer = currentHelpViewer();
if (viewer)
viewer->scaleUp();
}
void CentralWidget::zoomOut()
{
HelpViewer* viewer = currentHelpViewer();
if (viewer)
viewer->scaleDown();
}
void CentralWidget::resetZoom()
{
HelpViewer* viewer = currentHelpViewer();
if (viewer)
viewer->resetScale();
}
void CentralWidget::forward()
{
if (HelpViewer* viewer = currentHelpViewer())
viewer->forward();
}
void CentralWidget::backward()
{
if (HelpViewer* viewer = currentHelpViewer())
viewer->backward();
}
void CentralWidget::print()
{
#ifndef QT_NO_PRINTER
if (HelpViewer* viewer = currentHelpViewer()) {
initPrinter();
QPrintDialog dlg(printer, this);
dlg.setWindowTitle(tr("Print Document"));
if (!viewer->selectedText().isEmpty())
dlg.addEnabledOption(QAbstractPrintDialog::PrintSelection);
dlg.addEnabledOption(QAbstractPrintDialog::PrintPageRange);
dlg.addEnabledOption(QAbstractPrintDialog::PrintCollateCopies);
if (dlg.exec() == QDialog::Accepted)
viewer->print(printer);
}
#endif
}
void CentralWidget::pageSetup()
{
#ifndef QT_NO_PRINTER
initPrinter();
QPageSetupDialog dlg(printer);
dlg.exec();
#endif
}
void CentralWidget::printPreview()
{
#ifndef QT_NO_PRINTER
initPrinter();
QPrintPreviewDialog preview(printer, this);
connect(&preview, SIGNAL(paintRequested(QPrinter*)),
SLOT(printPreview(QPrinter*)));
preview.exec();
#endif
}
void CentralWidget::setSource(const QUrl &url)
{
if (HelpViewer* viewer = currentHelpViewer()) {
viewer->setSource(url);
viewer->setFocus(Qt::OtherFocusReason);
}
}
void CentralWidget::setSourceFromSearch(const QUrl &url)
{
if (HelpViewer* viewer = currentHelpViewer()) {
connect(viewer, SIGNAL(loadFinished()), this,
SLOT(highlightSearchTerms()));
viewer->setSource(url);
viewer->setFocus(Qt::OtherFocusReason);
}
}
void CentralWidget::showTopicChooser(const QMap<QString, QUrl> &links, void CentralWidget::showTopicChooser(const QMap<QString, QUrl> &links,
const QString &keyword) const QString &keyword)
{ {
@@ -269,99 +83,3 @@ void CentralWidget::showTopicChooser(const QMap<QString, QUrl> &links,
if (tc.exec() == QDialog::Accepted) if (tc.exec() == QDialog::Accepted)
setSource(tc.link()); setSource(tc.link());
} }
// -- protected
void CentralWidget::focusInEvent(QFocusEvent * /* event */)
{
// If we have a current help viewer then this is the 'focus proxy',
// otherwise it's the central widget. This is needed, so an embedding
// program can just set the focus to the central widget and it does
// The Right Thing(TM)
QObject *receiver = m_stackedWidget;
if (HelpViewer *viewer = currentHelpViewer())
receiver = viewer;
QTimer::singleShot(1, receiver, SLOT(setFocus()));
}
// -- private slots
void CentralWidget::highlightSearchTerms()
{
if (HelpViewer *viewer = currentHelpViewer()) {
QHelpSearchEngine *searchEngine =
LocalHelpManager::helpEngine().searchEngine();
QList<QHelpSearchQuery> queryList = searchEngine->query();
QStringList terms;
foreach (const QHelpSearchQuery &query, queryList) {
switch (query.fieldName) {
default: break;
case QHelpSearchQuery::ALL: {
case QHelpSearchQuery::PHRASE:
case QHelpSearchQuery::DEFAULT:
case QHelpSearchQuery::ATLEAST:
foreach (QString term, query.wordList)
terms.append(term.remove(QLatin1Char('"')));
}
}
}
foreach (const QString& term, terms)
viewer->findText(term, 0, false, true);
disconnect(viewer, SIGNAL(loadFinished()), this,
SLOT(highlightSearchTerms()));
}
}
void CentralWidget::printPreview(QPrinter *p)
{
#ifndef QT_NO_PRINTER
HelpViewer *viewer = currentHelpViewer();
if (viewer)
viewer->print(p);
#else
Q_UNUSED(p)
#endif
}
void CentralWidget::handleSourceChanged(const QUrl &url)
{
if (sender() == currentHelpViewer())
emit sourceChanged(url);
}
// -- private
void CentralWidget::initPrinter()
{
#ifndef QT_NO_PRINTER
if (!printer)
printer = new QPrinter(QPrinter::HighResolution);
#endif
}
void CentralWidget::connectSignals(HelpViewer *page)
{
connect(page, SIGNAL(sourceChanged(QUrl)), this, SLOT(handleSourceChanged(QUrl)));
connect(page, SIGNAL(forwardAvailable(bool)), this, SIGNAL(forwardAvailable(bool)));
connect(page, SIGNAL(backwardAvailable(bool)), this, SIGNAL(backwardAvailable(bool)));
connect(page, SIGNAL(printRequested()), this, SLOT(print()));
}
bool CentralWidget::eventFilter(QObject *object, QEvent *e)
{
if (e->type() != QEvent::KeyPress)
return QWidget::eventFilter(object, e);
HelpViewer *viewer = currentHelpViewer();
QKeyEvent *keyEvent = static_cast<QKeyEvent*> (e);
if (viewer == object && keyEvent->key() == Qt::Key_Backspace) {
if (viewer->isBackwardAvailable()) {
// this helps in case there is an html <input> field
if (!viewer->hasFocus())
viewer->backward();
}
}
return QWidget::eventFilter(object, e);
}

View File

@@ -30,87 +30,29 @@
#ifndef CENTRALWIDGET_H #ifndef CENTRALWIDGET_H
#define CENTRALWIDGET_H #define CENTRALWIDGET_H
#include "helpwidget.h"
#include <coreplugin/find/ifindsupport.h> #include <coreplugin/find/ifindsupport.h>
#include <QWidget>
QT_FORWARD_DECLARE_CLASS(QEvent)
QT_FORWARD_DECLARE_CLASS(QAction)
QT_FORWARD_DECLARE_CLASS(QStackedWidget)
QT_FORWARD_DECLARE_CLASS(QFocusEvent)
QT_FORWARD_DECLARE_CLASS(QPrinter)
namespace Help { namespace Help {
namespace Internal { namespace Internal {
class HelpViewer; class HelpViewer;
class PrintHelper; class PrintHelper;
class CentralWidget : public QWidget class CentralWidget : public HelpWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
CentralWidget(QWidget *parent = 0); CentralWidget(const Core::Context &context, QWidget *parent = 0);
~CentralWidget(); ~CentralWidget();
static CentralWidget *instance(); static CentralWidget *instance();
bool isForwardAvailable() const;
bool isBackwardAvailable() const;
HelpViewer *viewerAt(int index) const;
HelpViewer *currentHelpViewer() const;
void addPage(HelpViewer *page, bool fromSearch = false);
void removePage(int index);
int currentIndex() const;
void setCurrentPage(HelpViewer *page);
bool find(const QString &txt, Core::FindFlags findFlags,
bool incremental, bool *wrapped = 0);
public slots: public slots:
void copy();
void home();
void zoomIn();
void zoomOut();
void resetZoom();
void forward();
void backward();
void print();
void pageSetup();
void printPreview();
void setSource(const QUrl &url);
void setSourceFromSearch(const QUrl &url);
void showTopicChooser(const QMap<QString, QUrl> &links, const QString &key); void showTopicChooser(const QMap<QString, QUrl> &links, const QString &key);
protected:
void focusInEvent(QFocusEvent *event);
signals:
void sourceChanged(const QUrl &url);
void forwardAvailable(bool available);
void backwardAvailable(bool available);
private slots:
void highlightSearchTerms();
void printPreview(QPrinter *printer);
void handleSourceChanged(const QUrl &url);
private:
void initPrinter();
void connectSignals(HelpViewer *page);
bool eventFilter(QObject *object, QEvent *e);
private:
QPrinter *printer;
QStackedWidget *m_stackedWidget;
}; };
} // namespace Internal } // namespace Internal

View File

@@ -110,7 +110,7 @@ QWidget *GeneralSettingsPage::widget()
connect(m_ui->blankPageButton, SIGNAL(clicked()), this, SLOT(setBlankPage())); connect(m_ui->blankPageButton, SIGNAL(clicked()), this, SLOT(setBlankPage()));
connect(m_ui->defaultPageButton, SIGNAL(clicked()), this, SLOT(setDefaultPage())); connect(m_ui->defaultPageButton, SIGNAL(clicked()), this, SLOT(setDefaultPage()));
HelpViewer *viewer = CentralWidget::instance()->currentHelpViewer(); HelpViewer *viewer = CentralWidget::instance()->currentViewer();
if (!viewer) if (!viewer)
m_ui->currentPageButton->setEnabled(false); m_ui->currentPageButton->setEnabled(false);
@@ -197,7 +197,7 @@ void GeneralSettingsPage::apply()
void GeneralSettingsPage::setCurrentPage() void GeneralSettingsPage::setCurrentPage()
{ {
HelpViewer *viewer = CentralWidget::instance()->currentHelpViewer(); HelpViewer *viewer = CentralWidget::instance()->currentViewer();
if (viewer) if (viewer)
m_ui->homePageLineEdit->setText(viewer->source().toString()); m_ui->homePageLineEdit->setText(viewer->source().toString());
} }

View File

@@ -107,18 +107,6 @@ static const char kExternalWindowStateKey[] = "Help/ExternalWindowState";
using namespace Core; using namespace Core;
static QToolButton *toolButton(Core::Command *cmd, QAction *action)
{
QToolButton *button = new QToolButton;
button->setDefaultAction(action);
button->setPopupMode(QToolButton::DelayedPopup);
action->setToolTip(cmd->stringWithAppendedShortcut(action->text()));
QObject::connect(cmd, &Core::Command::keySequenceChanged, action, [cmd, action]() {
action->setToolTip(cmd->stringWithAppendedShortcut(action->text()));
});
return button;
}
HelpPlugin::HelpPlugin() HelpPlugin::HelpPlugin()
: m_mode(0), : m_mode(0),
m_centralWidget(0), m_centralWidget(0),
@@ -131,8 +119,6 @@ HelpPlugin::HelpPlugin()
m_firstModeChange(true), m_firstModeChange(true),
m_helpManager(0), m_helpManager(0),
m_openPagesManager(0), m_openPagesManager(0),
m_backMenu(0),
m_nextMenu(0),
m_isSidebarVisible(true) m_isSidebarVisible(true)
{ {
} }
@@ -175,9 +161,15 @@ bool HelpPlugin::initialize(const QStringList &arguments, QString *error)
addAutoReleasedObject(m_generalSettingsPage = new GeneralSettingsPage()); addAutoReleasedObject(m_generalSettingsPage = new GeneralSettingsPage());
addAutoReleasedObject(m_searchTaskHandler = new SearchTaskHandler); addAutoReleasedObject(m_searchTaskHandler = new SearchTaskHandler);
m_centralWidget = new Help::Internal::CentralWidget(modecontext);
connect(m_centralWidget, SIGNAL(sourceChanged(QUrl)), this,
SLOT(updateSideBarSource(QUrl)));
connect(m_centralWidget, &CentralWidget::closeButtonClicked,
&OpenPagesManager::instance(), &OpenPagesManager::closeCurrentPage);
connect(m_generalSettingsPage, SIGNAL(fontChanged()), this, connect(m_generalSettingsPage, SIGNAL(fontChanged()), this,
SLOT(fontChanged())); SLOT(fontChanged()));
connect(m_generalSettingsPage, SIGNAL(returnOnCloseChanged()), this, connect(m_generalSettingsPage, SIGNAL(returnOnCloseChanged()), m_centralWidget,
SLOT(updateCloseButton())); SLOT(updateCloseButton()));
connect(HelpManager::instance(), SIGNAL(helpRequested(QUrl,Core::HelpManager::HelpViewerLocation)), connect(HelpManager::instance(), SIGNAL(helpRequested(QUrl,Core::HelpManager::HelpViewerLocation)),
this, SLOT(handleHelpRequest(QUrl,Core::HelpManager::HelpViewerLocation))); this, SLOT(handleHelpRequest(QUrl,Core::HelpManager::HelpViewerLocation)));
@@ -193,52 +185,9 @@ bool HelpPlugin::initialize(const QStringList &arguments, QString *error)
connect(HelpManager::instance(), SIGNAL(setupFinished()), this, connect(HelpManager::instance(), SIGNAL(setupFinished()), this,
SLOT(unregisterOldQtCreatorDocumentation())); SLOT(unregisterOldQtCreatorDocumentation()));
auto helpButtonBar = new Utils::StyledBar;
auto helpButtonLayout = new QHBoxLayout(helpButtonBar);
helpButtonLayout->setMargin(0);
helpButtonLayout->setSpacing(0);
m_splitter = new MiniSplitter; m_splitter = new MiniSplitter;
Command *cmd; Command *cmd;
m_centralWidget = new Help::Internal::CentralWidget(); QAction *action;
connect(m_centralWidget, SIGNAL(sourceChanged(QUrl)), this,
SLOT(updateSideBarSource(QUrl)));
// Add Home, Previous and Next actions (used in the toolbar)
QAction *action = new QAction(QIcon(QLatin1String(IMAGEPATH "home.png")),
tr("Home"), this);
cmd = ActionManager::registerAction(action, Constants::HELP_HOME, globalcontext);
connect(action, SIGNAL(triggered()), m_centralWidget, SLOT(home()));
helpButtonLayout->addWidget(toolButton(cmd, action));
QAction *back = new QAction(QIcon(QLatin1String(IMAGEPATH "previous.png")),
tr("Previous Page"), this);
cmd = ActionManager::registerAction(back, Constants::HELP_PREVIOUS, modecontext);
cmd->setDefaultKeySequence(QKeySequence::Back);
back->setEnabled(m_centralWidget->isBackwardAvailable());
connect(back, SIGNAL(triggered()), m_centralWidget, SLOT(backward()));
connect(m_centralWidget, SIGNAL(backwardAvailable(bool)), back,
SLOT(setEnabled(bool)));
helpButtonLayout->addWidget(toolButton(cmd, back));
QAction *next = new QAction(QIcon(QLatin1String(IMAGEPATH "next.png")), tr("Next Page"), this);
cmd = ActionManager::registerAction(next, Constants::HELP_NEXT, modecontext);
cmd->setDefaultKeySequence(QKeySequence::Forward);
next->setEnabled(m_centralWidget->isForwardAvailable());
connect(next, SIGNAL(triggered()), m_centralWidget, SLOT(forward()));
connect(m_centralWidget, SIGNAL(forwardAvailable(bool)), next,
SLOT(setEnabled(bool)));
helpButtonLayout->addWidget(toolButton(cmd, next));
helpButtonLayout->addWidget(new Utils::StyledSeparator(helpButtonBar));
setupNavigationMenus(back, next, helpButtonBar);
action = new QAction(QIcon(QLatin1String(IMAGEPATH "bookmark.png")),
tr("Add Bookmark"), this);
cmd = ActionManager::registerAction(action, Constants::HELP_BOOKMARK, modecontext);
cmd->setDefaultKeySequence(QKeySequence(UseMacShortcuts ? tr("Meta+M") : tr("Ctrl+M")));
connect(action, SIGNAL(triggered()), this, SLOT(addBookmark()));
helpButtonLayout->addWidget(toolButton(cmd, action));
helpButtonLayout->addWidget(new Utils::StyledSeparator(helpButtonBar));
// Add Contents, Index, and Context menu items // Add Contents, Index, and Context menu items
action = new QAction(QIcon::fromTheme(QLatin1String("help-contents")), action = new QAction(QIcon::fromTheme(QLatin1String("help-contents")),
@@ -268,34 +217,6 @@ bool HelpPlugin::initialize(const QStringList &arguments, QString *error)
ActionManager::actionContainer(Core::Constants::M_HELP)->addAction(cmd, Core::Constants::G_HELP_SUPPORT); ActionManager::actionContainer(Core::Constants::M_HELP)->addAction(cmd, Core::Constants::G_HELP_SUPPORT);
connect(action, SIGNAL(triggered()), this, SLOT(slotReportBug())); connect(action, SIGNAL(triggered()), this, SLOT(slotReportBug()));
action = new QAction(this);
ActionManager::registerAction(action, Core::Constants::PRINT, modecontext);
connect(action, SIGNAL(triggered()), m_centralWidget, SLOT(print()));
action = new QAction(this);
cmd = ActionManager::registerAction(action, Core::Constants::COPY, modecontext);
connect(action, SIGNAL(triggered()), m_centralWidget, SLOT(copy()));
action->setText(cmd->action()->text());
action->setIcon(cmd->action()->icon());
if (ActionContainer *advancedMenu = ActionManager::actionContainer(Core::Constants::M_EDIT_ADVANCED)) {
// reuse TextEditor constants to avoid a second pair of menu actions
action = new QAction(tr("Increase Font Size"), this);
cmd = ActionManager::registerAction(action, TextEditor::Constants::INCREASE_FONT_SIZE, modecontext);
connect(action, SIGNAL(triggered()), m_centralWidget, SLOT(zoomIn()));
advancedMenu->addAction(cmd, Core::Constants::G_EDIT_FONT);
action = new QAction(tr("Decrease Font Size"), this);
cmd = ActionManager::registerAction(action, TextEditor::Constants::DECREASE_FONT_SIZE, modecontext);
connect(action, SIGNAL(triggered()), m_centralWidget, SLOT(zoomOut()));
advancedMenu->addAction(cmd, Core::Constants::G_EDIT_FONT);
action = new QAction(tr("Reset Font Size"), this);
cmd = ActionManager::registerAction(action, TextEditor::Constants::RESET_FONT_SIZE, modecontext);
connect(action, SIGNAL(triggered()), m_centralWidget, SLOT(resetZoom()));
advancedMenu->addAction(cmd, Core::Constants::G_EDIT_FONT);
}
if (ActionContainer *windowMenu = ActionManager::actionContainer(Core::Constants::M_WINDOW)) { if (ActionContainer *windowMenu = ActionManager::actionContainer(Core::Constants::M_WINDOW)) {
// reuse EditorManager constants to avoid a second pair of menu actions // reuse EditorManager constants to avoid a second pair of menu actions
// Goto Previous In History Action // Goto Previous In History Action
@@ -315,27 +236,7 @@ bool HelpPlugin::initialize(const QStringList &arguments, QString *error)
SLOT(gotoNextPage())); SLOT(gotoNextPage()));
} }
QWidget *toolBarWidget = new QWidget; m_splitter->addWidget(m_centralWidget);
QHBoxLayout *toolBarLayout = new QHBoxLayout(toolBarWidget);
toolBarLayout->setMargin(0);
toolBarLayout->setSpacing(0);
toolBarLayout->addWidget(helpButtonBar);
toolBarLayout->addWidget(createWidgetToolBar());
QWidget *mainWidget = new QWidget;
m_splitter->addWidget(mainWidget);
QVBoxLayout *mainWidgetLayout = new QVBoxLayout(mainWidget);
mainWidgetLayout->setMargin(0);
mainWidgetLayout->setSpacing(0);
mainWidgetLayout->addWidget(toolBarWidget);
mainWidgetLayout->addWidget(m_centralWidget);
if (QLayout *layout = m_centralWidget->layout()) {
layout->setSpacing(0);
FindToolBarPlaceHolder *fth = new FindToolBarPlaceHolder(m_centralWidget);
fth->setObjectName(QLatin1String("HelpFindToolBarPlaceHolder"));
mainWidgetLayout->addWidget(fth);
}
HelpIndexFilter *helpIndexFilter = new HelpIndexFilter(); HelpIndexFilter *helpIndexFilter = new HelpIndexFilter();
addAutoReleasedObject(helpIndexFilter); addAutoReleasedObject(helpIndexFilter);
@@ -516,8 +417,9 @@ void HelpPlugin::resetFilter()
engine->setCustomValue(Help::Constants::PreviousFilterNameKey, filterName); engine->setCustomValue(Help::Constants::PreviousFilterNameKey, filterName);
engine->setCurrentFilter(filterName); engine->setCurrentFilter(filterName);
updateFilterComboBox(); LocalHelpManager::updateFilterModel();
connect(engine, SIGNAL(setupFinished()), this, SLOT(updateFilterComboBox())); connect(engine, &QHelpEngineCore::setupFinished,
LocalHelpManager::instance(), &LocalHelpManager::updateFilterModel);
} }
void HelpPlugin::saveExternalWindowSettings() void HelpPlugin::saveExternalWindowSettings()
@@ -647,7 +549,7 @@ void HelpPlugin::modeChanged(IMode *mode, IMode *old)
void HelpPlugin::updateSideBarSource() void HelpPlugin::updateSideBarSource()
{ {
if (HelpViewer *viewer = m_centralWidget->currentHelpViewer()) { if (HelpViewer *viewer = m_centralWidget->currentViewer()) {
const QUrl &url = viewer->source(); const QUrl &url = viewer->source();
if (url.isValid()) if (url.isValid())
updateSideBarSource(url); updateSideBarSource(url);
@@ -660,14 +562,6 @@ void HelpPlugin::updateSideBarSource(const QUrl &newUrl)
m_rightPaneSideBarWidget->currentViewer()->setSource(newUrl); m_rightPaneSideBarWidget->currentViewer()->setSource(newUrl);
} }
void HelpPlugin::updateCloseButton()
{
const bool closeOnReturn = HelpManager::customValue(QLatin1String("ReturnOnClose"),
false).toBool();
m_closeButton->setEnabled((OpenPagesManager::instance().pageCount() > 1)
|| closeOnReturn);
}
void HelpPlugin::fontChanged() void HelpPlugin::fontChanged()
{ {
if (!m_rightPaneSideBarWidget) if (!m_rightPaneSideBarWidget)
@@ -677,23 +571,8 @@ void HelpPlugin::fontChanged()
QFont font = fontSetting.isValid() ? fontSetting.value<QFont>() QFont font = fontSetting.isValid() ? fontSetting.value<QFont>()
: m_rightPaneSideBarWidget->currentViewer()->viewerFont(); : m_rightPaneSideBarWidget->currentViewer()->viewerFont();
m_rightPaneSideBarWidget->currentViewer()->setViewerFont(font); m_rightPaneSideBarWidget->setViewerFont(font);
const int count = OpenPagesManager::instance().pageCount(); CentralWidget::instance()->setViewerFont(font);
for (int i = 0; i < count; ++i) {
if (HelpViewer *viewer = CentralWidget::instance()->viewerAt(i))
viewer->setViewerFont(font);
}
}
QStackedLayout * layoutForWidget(QWidget *parent, QWidget *widget)
{
QList<QStackedLayout*> list = parent->findChildren<QStackedLayout*>();
foreach (QStackedLayout *layout, list) {
const int index = layout->indexOf(widget);
if (index >= 0)
return layout;
}
return 0;
} }
void HelpPlugin::setupHelpEngineIfNeeded() void HelpPlugin::setupHelpEngineIfNeeded()
@@ -743,7 +622,7 @@ HelpViewer *HelpPlugin::viewerForHelpViewerLocation(Core::HelpManager::HelpViewe
QTC_CHECK(actualLocation == Core::HelpManager::HelpModeAlways); QTC_CHECK(actualLocation == Core::HelpManager::HelpModeAlways);
activateHelpMode(); // should trigger an createPage... activateHelpMode(); // should trigger an createPage...
HelpViewer *viewer = m_centralWidget->currentHelpViewer(); HelpViewer *viewer = m_centralWidget->currentViewer();
if (!viewer) if (!viewer)
viewer = OpenPagesManager::instance().createPage(); viewer = OpenPagesManager::instance().createPage();
return viewer; return viewer;
@@ -850,69 +729,6 @@ void HelpPlugin::activateBookmarks()
m_sideBar->activateItem(m_bookmarkItem); m_sideBar->activateItem(m_bookmarkItem);
} }
Utils::StyledBar *HelpPlugin::createWidgetToolBar()
{
m_filterComboBox = new QComboBox;
m_filterComboBox->setMinimumContentsLength(15);
connect(m_filterComboBox, SIGNAL(activated(QString)), this,
SLOT(filterDocumentation(QString)));
connect(m_filterComboBox, SIGNAL(currentIndexChanged(int)), this,
SLOT(updateSideBarSource()));
m_closeButton = new QToolButton();
m_closeButton->setIcon(QIcon(QLatin1String(Core::Constants::ICON_BUTTON_CLOSE)));
m_closeButton->setToolTip(tr("Close current page"));
connect(m_closeButton, SIGNAL(clicked()), &OpenPagesManager::instance(),
SLOT(closeCurrentPage()));
connect(&OpenPagesManager::instance(), SIGNAL(pagesChanged()), this,
SLOT(updateCloseButton()));
Utils::StyledBar *toolBar = new Utils::StyledBar;
QHBoxLayout *layout = new QHBoxLayout(toolBar);
layout->setMargin(0);
layout->setSpacing(0);
layout->addWidget(OpenPagesManager::instance().openPagesComboBox(), 10);
layout->addSpacing(5);
layout->addWidget(new QLabel(tr("Filtered by:")));
layout->addWidget(m_filterComboBox);
layout->addStretch();
layout->addWidget(m_closeButton);
return toolBar;
}
void HelpPlugin::updateFilterComboBox()
{
const QHelpEngine &engine = LocalHelpManager::helpEngine();
QString curFilter = m_filterComboBox->currentText();
if (curFilter.isEmpty())
curFilter = engine.currentFilter();
m_filterComboBox->clear();
m_filterComboBox->addItems(engine.customFilters());
int idx = m_filterComboBox->findText(curFilter);
if (idx < 0)
idx = 0;
m_filterComboBox->setCurrentIndex(idx);
}
void HelpPlugin::filterDocumentation(const QString &customFilter)
{
LocalHelpManager::helpEngine().setCurrentFilter(customFilter);
}
void HelpPlugin::addBookmark()
{
HelpViewer *viewer = m_centralWidget->currentHelpViewer();
const QString &url = viewer->source().toString();
if (url.isEmpty() || url == Help::Constants::AboutBlank)
return;
BookmarkManager *manager = &LocalHelpManager::bookmarkManager();
manager->showBookmarkDialog(m_centralWidget, viewer->title(), url);
}
void HelpPlugin::highlightSearchTermsInContextHelp() void HelpPlugin::highlightSearchTermsInContextHelp()
{ {
if (m_contextHelpHighlightId.isEmpty()) if (m_contextHelpHighlightId.isEmpty())
@@ -950,20 +766,6 @@ void HelpPlugin::handleHelpRequest(const QUrl &url, Core::HelpManager::HelpViewe
Core::ICore::raiseWindow(viewer); Core::ICore::raiseWindow(viewer);
} }
void HelpPlugin::slotAboutToShowBackMenu()
{
m_backMenu->clear();
if (HelpViewer *viewer = m_centralWidget->currentHelpViewer())
viewer->addBackHistoryItems(m_backMenu);
}
void HelpPlugin::slotAboutToShowNextMenu()
{
m_nextMenu->clear();
if (HelpViewer *viewer = m_centralWidget->currentHelpViewer())
viewer->addForwardHistoryItems(m_nextMenu);
}
void HelpPlugin::slotOpenSupportPage() void HelpPlugin::slotOpenSupportPage()
{ {
switchToHelpMode(QUrl(QLatin1String("qthelp://org.qt-project.qtcreator/doc/technical-support.html"))); switchToHelpMode(QUrl(QLatin1String("qthelp://org.qt-project.qtcreator/doc/technical-support.html")));
@@ -1005,21 +807,3 @@ Core::HelpManager::HelpViewerLocation HelpPlugin::contextHelpOption() const
return Core::HelpManager::HelpViewerLocation(engine.customValue(QLatin1String("ContextHelpOption"), return Core::HelpManager::HelpViewerLocation(engine.customValue(QLatin1String("ContextHelpOption"),
Core::HelpManager::SideBySideIfPossible).toInt()); Core::HelpManager::SideBySideIfPossible).toInt());
} }
void HelpPlugin::setupNavigationMenus(QAction *back, QAction *next, QWidget *parent)
{
if (!m_backMenu) {
m_backMenu = new QMenu(parent);
connect(m_backMenu, SIGNAL(aboutToShow()), this,
SLOT(slotAboutToShowBackMenu()));
}
if (!m_nextMenu) {
m_nextMenu = new QMenu(parent);
connect(m_nextMenu, SIGNAL(aboutToShow()), this,
SLOT(slotAboutToShowNextMenu()));
}
back->setMenu(m_backMenu);
next->setMenu(m_nextMenu);
}

View File

@@ -41,7 +41,6 @@
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QAction; class QAction;
class QComboBox;
class QMenu; class QMenu;
class QToolButton; class QToolButton;
class QUrl; class QUrl;
@@ -96,10 +95,6 @@ private slots:
void activateOpenPages(); void activateOpenPages();
void activateBookmarks(); void activateBookmarks();
void addBookmark();
void updateFilterComboBox();
void filterDocumentation(const QString &customFilter);
void saveExternalWindowSettings(); void saveExternalWindowSettings();
void switchToHelpMode(const QUrl &source); void switchToHelpMode(const QUrl &source);
void slotHideRightPane(); void slotHideRightPane();
@@ -110,14 +105,11 @@ private slots:
void fontChanged(); void fontChanged();
void updateCloseButton();
void setupHelpEngineIfNeeded(); void setupHelpEngineIfNeeded();
void highlightSearchTermsInContextHelp(); void highlightSearchTermsInContextHelp();
void handleHelpRequest(const QUrl &url, Core::HelpManager::HelpViewerLocation location); void handleHelpRequest(const QUrl &url, Core::HelpManager::HelpViewerLocation location);
void slotAboutToShowBackMenu();
void slotAboutToShowNextMenu();
void slotOpenSupportPage(); void slotOpenSupportPage();
void slotReportBug(); void slotReportBug();
@@ -127,7 +119,6 @@ private:
void setupUi(); void setupUi();
void resetFilter(); void resetFilter();
void activateHelpMode(); void activateHelpMode();
Utils::StyledBar *createWidgetToolBar();
bool canShowHelpSideBySide() const; bool canShowHelpSideBySide() const;
HelpViewer *viewerForHelpViewerLocation(Core::HelpManager::HelpViewerLocation location); HelpViewer *viewerForHelpViewerLocation(Core::HelpManager::HelpViewerLocation location);
HelpViewer *viewerForContextHelp(); HelpViewer *viewerForContextHelp();
@@ -137,7 +128,6 @@ private:
void doSetupIfNeeded(); void doSetupIfNeeded();
Core::HelpManager::HelpViewerLocation contextHelpOption() const; Core::HelpManager::HelpViewerLocation contextHelpOption() const;
void setupNavigationMenus(QAction *back, QAction *next, QWidget *parent);
private: private:
HelpMode *m_mode; HelpMode *m_mode;
@@ -155,7 +145,6 @@ private:
GeneralSettingsPage *m_generalSettingsPage; GeneralSettingsPage *m_generalSettingsPage;
SearchTaskHandler *m_searchTaskHandler; SearchTaskHandler *m_searchTaskHandler;
QComboBox *m_filterComboBox;
Core::SideBar *m_sideBar; Core::SideBar *m_sideBar;
bool m_firstModeChange; bool m_firstModeChange;
@@ -163,16 +152,11 @@ private:
OpenPagesManager *m_openPagesManager; OpenPagesManager *m_openPagesManager;
Core::MiniSplitter *m_splitter; Core::MiniSplitter *m_splitter;
QToolButton *m_closeButton;
QString m_contextHelpHighlightId; QString m_contextHelpHighlightId;
QPointer<HelpWidget> m_externalWindow; QPointer<HelpWidget> m_externalWindow;
QRect m_externalWindowState; QRect m_externalWindowState;
QMenu *m_backMenu;
QMenu *m_nextMenu;
bool m_isSidebarVisible; bool m_isSidebarVisible;
QAction *m_toggleSideBarAction; QAction *m_toggleSideBarAction;
}; };

View File

@@ -34,18 +34,26 @@
#include "helpplugin.h" #include "helpplugin.h"
#include "helpviewer.h" #include "helpviewer.h"
#include "localhelpmanager.h" #include "localhelpmanager.h"
#include "openpagesmanager.h"
#include <coreplugin/actionmanager/actioncontainer.h> #include <coreplugin/actionmanager/actioncontainer.h>
#include <coreplugin/actionmanager/actionmanager.h> #include <coreplugin/actionmanager/actionmanager.h>
#include <coreplugin/coreconstants.h> #include <coreplugin/coreconstants.h>
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <coreplugin/findplaceholder.h> #include <coreplugin/findplaceholder.h>
#include <coreplugin/helpmanager.h>
#include <texteditor/texteditorconstants.h> #include <texteditor/texteditorconstants.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <utils/styledbar.h> #include <utils/styledbar.h>
#include <QHBoxLayout> #include <QHBoxLayout>
#include <QHelpEngine>
#include <QHelpSearchEngine>
#include <QHelpSearchQuery>
#include <QMenu> #include <QMenu>
#include <QPrinter>
#include <QPrintDialog>
#include <QStackedWidget>
#include <QToolButton> #include <QToolButton>
static QToolButton *toolButton(QAction *action, Core::Command *cmd = 0) static QToolButton *toolButton(QAction *action, Core::Command *cmd = 0)
@@ -67,10 +75,14 @@ namespace Internal {
HelpWidget::HelpWidget(const Core::Context &context, WidgetStyle style, QWidget *parent) : HelpWidget::HelpWidget(const Core::Context &context, WidgetStyle style, QWidget *parent) :
QWidget(parent), QWidget(parent),
m_style(style),
m_switchToHelp(0),
m_filterComboBox(0),
m_closeAction(0),
m_scaleUp(0), m_scaleUp(0),
m_scaleDown(0), m_scaleDown(0),
m_resetScale(0), m_resetScale(0),
m_style(style) m_printer(0)
{ {
Utils::StyledBar *toolBar = new Utils::StyledBar(); Utils::StyledBar *toolBar = new Utils::StyledBar();
QHBoxLayout *layout = new QHBoxLayout(toolBar); QHBoxLayout *layout = new QHBoxLayout(toolBar);
@@ -78,10 +90,12 @@ HelpWidget::HelpWidget(const Core::Context &context, WidgetStyle style, QWidget
layout->setMargin(0); layout->setMargin(0);
Core::Command *cmd; Core::Command *cmd;
if (style != ModeWidget) {
m_switchToHelp = new QAction(tr("Go to Help Mode"), toolBar); m_switchToHelp = new QAction(tr("Go to Help Mode"), toolBar);
cmd = Core::ActionManager::registerAction(m_switchToHelp, Constants::CONTEXT_HELP, context); cmd = Core::ActionManager::registerAction(m_switchToHelp, Constants::CONTEXT_HELP, context);
connect(m_switchToHelp, SIGNAL(triggered()), this, SLOT(helpModeButtonClicked())); connect(m_switchToHelp, SIGNAL(triggered()), this, SLOT(helpModeButtonClicked()));
layout->addWidget(toolButton(m_switchToHelp, cmd)); layout->addWidget(toolButton(m_switchToHelp, cmd));
}
m_homeAction = new QAction(QIcon(QLatin1String(":/help/images/home.png")), m_homeAction = new QAction(QIcon(QLatin1String(":/help/images/home.png")),
tr("Home"), this); tr("Home"), this);
@@ -91,6 +105,7 @@ HelpWidget::HelpWidget(const Core::Context &context, WidgetStyle style, QWidget
m_backAction = new QAction(QIcon(QLatin1String(":/help/images/previous.png")), m_backAction = new QAction(QIcon(QLatin1String(":/help/images/previous.png")),
tr("Back"), toolBar); tr("Back"), toolBar);
connect(m_backAction, &QAction::triggered, this, &HelpWidget::backward);
m_backMenu = new QMenu(toolBar); m_backMenu = new QMenu(toolBar);
connect(m_backMenu, SIGNAL(aboutToShow()), this, SLOT(updateBackMenu())); connect(m_backMenu, SIGNAL(aboutToShow()), this, SLOT(updateBackMenu()));
m_backAction->setMenu(m_backMenu); m_backAction->setMenu(m_backMenu);
@@ -100,6 +115,7 @@ HelpWidget::HelpWidget(const Core::Context &context, WidgetStyle style, QWidget
m_forwardAction = new QAction(QIcon(QLatin1String(":/help/images/next.png")), m_forwardAction = new QAction(QIcon(QLatin1String(":/help/images/next.png")),
tr("Forward"), toolBar); tr("Forward"), toolBar);
connect(m_forwardAction, &QAction::triggered, this, &HelpWidget::forward);
m_forwardMenu = new QMenu(toolBar); m_forwardMenu = new QMenu(toolBar);
connect(m_forwardMenu, SIGNAL(aboutToShow()), this, SLOT(updateForwardMenu())); connect(m_forwardMenu, SIGNAL(aboutToShow()), this, SLOT(updateForwardMenu()));
m_forwardAction->setMenu(m_forwardMenu); m_forwardAction->setMenu(m_forwardMenu);
@@ -115,38 +131,45 @@ HelpWidget::HelpWidget(const Core::Context &context, WidgetStyle style, QWidget
layout->addWidget(new Utils::StyledSeparator(toolBar)); layout->addWidget(new Utils::StyledSeparator(toolBar));
layout->addWidget(toolButton(m_addBookmarkAction, cmd)); layout->addWidget(toolButton(m_addBookmarkAction, cmd));
if (style == ModeWidget) {
layout->addWidget(new Utils::StyledSeparator(toolBar));
layout->addWidget(OpenPagesManager::instance().openPagesComboBox(), 10);
m_filterComboBox = new QComboBox;
m_filterComboBox->setMinimumContentsLength(15);
m_filterComboBox->setModel(LocalHelpManager::filterModel());
layout->addWidget(m_filterComboBox);
connect(m_filterComboBox, static_cast<void (QComboBox::*)(int)>(&QComboBox::activated),
LocalHelpManager::instance(), &LocalHelpManager::setFilterIndex);
connect(LocalHelpManager::instance(), &LocalHelpManager::filterIndexChanged,
m_filterComboBox, &QComboBox::setCurrentIndex);
}
layout->addStretch(); layout->addStretch();
m_viewer = HelpPlugin::createHelpViewer(qreal(0.0)); m_viewerStack = new QStackedWidget;
QVBoxLayout *vLayout = new QVBoxLayout(this); QVBoxLayout *vLayout = new QVBoxLayout(this);
vLayout->setMargin(0); vLayout->setMargin(0);
vLayout->setSpacing(0); vLayout->setSpacing(0);
vLayout->addWidget(toolBar); vLayout->addWidget(toolBar);
vLayout->addWidget(m_viewer); vLayout->addWidget(m_viewerStack);
Core::FindToolBarPlaceHolder *fth = new Core::FindToolBarPlaceHolder(this); Core::FindToolBarPlaceHolder *fth = new Core::FindToolBarPlaceHolder(this);
vLayout->addWidget(fth); vLayout->addWidget(fth);
setFocusProxy(m_viewer); setFocusProxy(m_viewerStack);
m_context = new Core::IContext(this); m_context = new Core::IContext(this);
m_context->setContext(context); m_context->setContext(context);
m_context->setWidget(m_viewer); m_context->setWidget(m_viewerStack);
Core::ICore::addContextObject(m_context); Core::ICore::addContextObject(m_context);
m_backAction->setEnabled(m_viewer->isBackwardAvailable()); m_printAction = new QAction(this);
connect(m_backAction, SIGNAL(triggered()), m_viewer, SLOT(backward())); Core::ActionManager::registerAction(m_printAction, Core::Constants::PRINT, context);
connect(m_viewer, SIGNAL(backwardAvailable(bool)), m_backAction, connect(m_printAction, &QAction::triggered, this, [this]() { print(currentViewer()); });
SLOT(setEnabled(bool)));
m_forwardAction->setEnabled(m_viewer->isForwardAvailable());
connect(m_forwardAction, SIGNAL(triggered()), m_viewer, SLOT(forward()));
connect(m_viewer, SIGNAL(forwardAvailable(bool)), m_forwardAction,
SLOT(setEnabled(bool)));
m_copy = new QAction(this); m_copy = new QAction(this);
Core::ActionManager::registerAction(m_copy, Core::Constants::COPY, context); Core::ActionManager::registerAction(m_copy, Core::Constants::COPY, context);
connect(m_copy, SIGNAL(triggered()), m_viewer, SLOT(copy())); connect(m_copy, &QAction::triggered, this, &HelpWidget::copy);
Core::ActionContainer *advancedMenu = Core::ActionManager::actionContainer(Core::Constants::M_EDIT_ADVANCED); Core::ActionContainer *advancedMenu = Core::ActionManager::actionContainer(Core::Constants::M_EDIT_ADVANCED);
QTC_CHECK(advancedMenu); QTC_CHECK(advancedMenu);
@@ -155,37 +178,44 @@ HelpWidget::HelpWidget(const Core::Context &context, WidgetStyle style, QWidget
m_scaleUp = new QAction(tr("Increase Font Size"), this); m_scaleUp = new QAction(tr("Increase Font Size"), this);
cmd = Core::ActionManager::registerAction(m_scaleUp, TextEditor::Constants::INCREASE_FONT_SIZE, cmd = Core::ActionManager::registerAction(m_scaleUp, TextEditor::Constants::INCREASE_FONT_SIZE,
context); context);
connect(m_scaleUp, SIGNAL(triggered()), m_viewer, SLOT(scaleUp())); connect(m_scaleUp, &QAction::triggered, this, &HelpWidget::scaleUp);
advancedMenu->addAction(cmd, Core::Constants::G_EDIT_FONT); advancedMenu->addAction(cmd, Core::Constants::G_EDIT_FONT);
m_scaleDown = new QAction(tr("Decrease Font Size"), this); m_scaleDown = new QAction(tr("Decrease Font Size"), this);
cmd = Core::ActionManager::registerAction(m_scaleDown, TextEditor::Constants::DECREASE_FONT_SIZE, cmd = Core::ActionManager::registerAction(m_scaleDown, TextEditor::Constants::DECREASE_FONT_SIZE,
context); context);
connect(m_scaleDown, SIGNAL(triggered()), m_viewer, SLOT(scaleDown())); connect(m_scaleDown, &QAction::triggered, this, &HelpWidget::scaleDown);
advancedMenu->addAction(cmd, Core::Constants::G_EDIT_FONT); advancedMenu->addAction(cmd, Core::Constants::G_EDIT_FONT);
m_resetScale = new QAction(tr("Reset Font Size"), this); m_resetScale = new QAction(tr("Reset Font Size"), this);
cmd = Core::ActionManager::registerAction(m_resetScale, TextEditor::Constants::RESET_FONT_SIZE, cmd = Core::ActionManager::registerAction(m_resetScale, TextEditor::Constants::RESET_FONT_SIZE,
context); context);
connect(m_resetScale, SIGNAL(triggered()), m_viewer, SLOT(resetScale())); connect(m_resetScale, &QAction::triggered, this, &HelpWidget::resetScale);
advancedMenu->addAction(cmd, Core::Constants::G_EDIT_FONT); advancedMenu->addAction(cmd, Core::Constants::G_EDIT_FONT);
} }
if (style == SideBarWidget) { if (style == ModeWidget) {
QAction *close = new QAction(QIcon(QLatin1String(Core::Constants::ICON_BUTTON_CLOSE)), m_closeAction = new QAction(QIcon(QLatin1String(Core::Constants::ICON_BUTTON_CLOSE)),
QString(), toolBar); QString(), toolBar);
connect(close, SIGNAL(triggered()), this, SIGNAL(closeButtonClicked())); connect(m_closeAction, SIGNAL(triggered()), this, SIGNAL(closeButtonClicked()));
layout->addWidget(toolButton(close)); layout->addWidget(toolButton(m_closeAction));
m_viewer->setOpenInNewPageActionVisible(false); } else if (style == SideBarWidget) {
m_closeAction = new QAction(QIcon(QLatin1String(Core::Constants::ICON_BUTTON_CLOSE)),
QString(), toolBar);
connect(m_closeAction, SIGNAL(triggered()), this, SIGNAL(closeButtonClicked()));
layout->addWidget(toolButton(m_closeAction));
} else if (style == ExternalWindow) { } else if (style == ExternalWindow) {
static int windowId = 0; static int windowId = 0;
Core::ICore::registerWindow(this, Core::ICore::registerWindow(this,
Core::Context(Core::Id("Help.Window.").withSuffix(++windowId))); Core::Context(Core::Id("Help.Window.").withSuffix(++windowId)));
setAttribute(Qt::WA_DeleteOnClose); setAttribute(Qt::WA_DeleteOnClose);
setAttribute(Qt::WA_QuitOnClose, false); // don't prevent Qt Creator from closing setAttribute(Qt::WA_QuitOnClose, false); // don't prevent Qt Creator from closing
connect(m_viewer, SIGNAL(titleChanged()), this, SLOT(updateWindowTitle())); }
updateWindowTitle();
m_viewer->setOpenInNewPageActionVisible(false); if (style != ModeWidget) {
HelpViewer *viewer = HelpPlugin::createHelpViewer(qreal(0.0));
addViewer(viewer);
setCurrentViewer(viewer);
} }
} }
@@ -193,6 +223,7 @@ HelpWidget::~HelpWidget()
{ {
Core::ICore::removeContextObject(m_context); Core::ICore::removeContextObject(m_context);
Core::ActionManager::unregisterAction(m_copy, Core::Constants::COPY); Core::ActionManager::unregisterAction(m_copy, Core::Constants::COPY);
if (m_switchToHelp)
Core::ActionManager::unregisterAction(m_switchToHelp, Constants::CONTEXT_HELP); Core::ActionManager::unregisterAction(m_switchToHelp, Constants::CONTEXT_HELP);
Core::ActionManager::unregisterAction(m_homeAction, Constants::HELP_HOME); Core::ActionManager::unregisterAction(m_homeAction, Constants::HELP_HOME);
Core::ActionManager::unregisterAction(m_forwardAction, Constants::HELP_NEXT); Core::ActionManager::unregisterAction(m_forwardAction, Constants::HELP_NEXT);
@@ -208,7 +239,100 @@ HelpWidget::~HelpWidget()
HelpViewer *HelpWidget::currentViewer() const HelpViewer *HelpWidget::currentViewer() const
{ {
return m_viewer; return qobject_cast<HelpViewer *>(m_viewerStack->currentWidget());
}
void HelpWidget::setCurrentViewer(HelpViewer *viewer)
{
m_viewerStack->setCurrentWidget(viewer);
m_backAction->setEnabled(viewer->isBackwardAvailable());
m_forwardAction->setEnabled(viewer->isForwardAvailable());
if (m_style == ExternalWindow)
updateWindowTitle();
emit sourceChanged(viewer->source());
}
int HelpWidget::currentIndex() const
{
return m_viewerStack->currentIndex();
}
void HelpWidget::addViewer(HelpViewer *viewer, bool highlightSearchTerms)
{
m_viewerStack->addWidget(viewer);
viewer->setFocus(Qt::OtherFocusReason);
if (m_style == SideBarWidget || m_style == ExternalWindow)
viewer->setOpenInNewPageActionVisible(false);
connect(viewer, &HelpViewer::sourceChanged, this, [viewer, this](const QUrl &url) {
if (currentViewer() == viewer)
emit sourceChanged(url);
});
connect(viewer, &HelpViewer::forwardAvailable, this, [viewer, this](bool available) {
if (currentViewer() == viewer)
m_forwardAction->setEnabled(available);
});
connect(viewer, &HelpViewer::backwardAvailable, this, [viewer, this](bool available) {
if (currentViewer() == viewer)
m_backAction->setEnabled(available);
});
connect(viewer, &HelpViewer::printRequested, this, [viewer, this]() {
print(viewer);
});
if (m_style == ExternalWindow)
connect(viewer, SIGNAL(titleChanged()), this, SLOT(updateWindowTitle()));
if (highlightSearchTerms)
connect(viewer, &HelpViewer::loadFinished, this, &HelpWidget::highlightSearchTerms);
updateCloseButton();
}
void HelpWidget::removeViewerAt(int index)
{
QWidget *viewerWidget = m_viewerStack->widget(index);
QTC_ASSERT(viewerWidget, return);
m_viewerStack->removeWidget(viewerWidget);
// do not delete, that is done in the model
// delete viewerWidget;
if (m_viewerStack->currentWidget())
setCurrentViewer(qobject_cast<HelpViewer *>(m_viewerStack->currentWidget()));
updateCloseButton();
}
void HelpWidget::setViewerFont(const QFont &font)
{
for (int i = 0; i < m_viewerStack->count(); ++i) {
HelpViewer *viewer = qobject_cast<HelpViewer *>(m_viewerStack->widget(i));
QTC_ASSERT(viewer, continue);
viewer->setFont(font);
}
}
int HelpWidget::viewerCount() const
{
return m_viewerStack->count();
}
HelpViewer *HelpWidget::viewerAt(int index) const
{
return qobject_cast<HelpViewer *>(m_viewerStack->widget(index));
}
void HelpWidget::setSource(const QUrl &url)
{
HelpViewer* viewer = currentViewer();
QTC_ASSERT(viewer, return);
viewer->setSource(url);
viewer->setFocus(Qt::OtherFocusReason);
}
void HelpWidget::setSourceFromSearch(const QUrl &url)
{
HelpViewer* viewer = currentViewer();
QTC_ASSERT(viewer, return);
connect(viewer, &HelpViewer::loadFinished, this, &HelpWidget::highlightSearchTerms);
viewer->setSource(url);
viewer->setFocus(Qt::OtherFocusReason);
} }
void HelpWidget::closeEvent(QCloseEvent *) void HelpWidget::closeEvent(QCloseEvent *)
@@ -219,18 +343,21 @@ void HelpWidget::closeEvent(QCloseEvent *)
void HelpWidget::updateBackMenu() void HelpWidget::updateBackMenu()
{ {
m_backMenu->clear(); m_backMenu->clear();
m_viewer->addBackHistoryItems(m_backMenu); QTC_ASSERT(currentViewer(), return);
currentViewer()->addBackHistoryItems(m_backMenu);
} }
void HelpWidget::updateForwardMenu() void HelpWidget::updateForwardMenu()
{ {
m_forwardMenu->clear(); m_forwardMenu->clear();
m_viewer->addForwardHistoryItems(m_forwardMenu); QTC_ASSERT(currentViewer(), return);
currentViewer()->addForwardHistoryItems(m_forwardMenu);
} }
void HelpWidget::updateWindowTitle() void HelpWidget::updateWindowTitle()
{ {
const QString pageTitle = m_viewer->title(); QTC_ASSERT(currentViewer(), return);
const QString pageTitle = currentViewer()->title();
if (pageTitle.isEmpty()) if (pageTitle.isEmpty())
setWindowTitle(tr("Help")); setWindowTitle(tr("Help"));
else else
@@ -239,11 +366,21 @@ void HelpWidget::updateWindowTitle()
void HelpWidget::helpModeButtonClicked() void HelpWidget::helpModeButtonClicked()
{ {
emit openHelpMode(m_viewer->source()); QTC_ASSERT(currentViewer(), return);
emit openHelpMode(currentViewer()->source());
if (m_style == ExternalWindow) if (m_style == ExternalWindow)
close(); close();
} }
void HelpWidget::updateCloseButton()
{
if (m_style == ModeWidget) {
const bool closeOnReturn = Core::HelpManager::customValue(QLatin1String("ReturnOnClose"),
false).toBool();
m_closeAction->setEnabled(closeOnReturn || m_viewerStack->count() > 1);
}
}
void HelpWidget::goHome() void HelpWidget::goHome()
{ {
if (HelpViewer *viewer = currentViewer()) if (HelpViewer *viewer = currentViewer())
@@ -263,5 +400,84 @@ void HelpWidget::addBookmark()
manager->showBookmarkDialog(this, viewer->title(), url); manager->showBookmarkDialog(this, viewer->title(), url);
} }
void HelpWidget::copy()
{
QTC_ASSERT(currentViewer(), return);
currentViewer()->copy();
}
void HelpWidget::forward()
{
QTC_ASSERT(currentViewer(), return);
currentViewer()->forward();
}
void HelpWidget::backward()
{
QTC_ASSERT(currentViewer(), return);
currentViewer()->backward();
}
void HelpWidget::scaleUp()
{
QTC_ASSERT(currentViewer(), return);
currentViewer()->scaleUp();
}
void HelpWidget::scaleDown()
{
QTC_ASSERT(currentViewer(), return);
currentViewer()->scaleDown();
}
void HelpWidget::resetScale()
{
QTC_ASSERT(currentViewer(), return);
currentViewer()->resetScale();
}
void HelpWidget::print(HelpViewer *viewer)
{
QTC_ASSERT(viewer, return);
if (!m_printer)
m_printer = new QPrinter(QPrinter::HighResolution);
QPrintDialog dlg(m_printer, this);
dlg.setWindowTitle(tr("Print Documentation"));
if (!viewer->selectedText().isEmpty())
dlg.addEnabledOption(QAbstractPrintDialog::PrintSelection);
dlg.addEnabledOption(QAbstractPrintDialog::PrintPageRange);
dlg.addEnabledOption(QAbstractPrintDialog::PrintCollateCopies);
if (dlg.exec() == QDialog::Accepted)
viewer->print(m_printer);
}
void HelpWidget::highlightSearchTerms()
{
if (HelpViewer *viewer = qobject_cast<HelpViewer *>(sender())) {
QHelpSearchEngine *searchEngine =
LocalHelpManager::helpEngine().searchEngine();
QList<QHelpSearchQuery> queryList = searchEngine->query();
QStringList terms;
foreach (const QHelpSearchQuery &query, queryList) {
switch (query.fieldName) {
default: break;
case QHelpSearchQuery::ALL: {
case QHelpSearchQuery::PHRASE:
case QHelpSearchQuery::DEFAULT:
case QHelpSearchQuery::ATLEAST:
foreach (QString term, query.wordList)
terms.append(term.remove(QLatin1Char('"')));
}
}
}
foreach (const QString& term, terms)
viewer->findText(term, 0, false, true);
disconnect(viewer, &HelpViewer::loadFinished, this, &HelpWidget::highlightSearchTerms);
}
}
} // Internal } // Internal
} // Help } // Help

View File

@@ -37,7 +37,11 @@
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QAction; class QAction;
class QComboBox;
class QFont;
class QMenu; class QMenu;
class QPrinter;
class QStackedWidget;
QT_END_NAMESPACE QT_END_NAMESPACE
namespace Help { namespace Help {
@@ -50,6 +54,7 @@ class HelpWidget : public QWidget
Q_OBJECT Q_OBJECT
public: public:
enum WidgetStyle { enum WidgetStyle {
ModeWidget,
SideBarWidget, SideBarWidget,
ExternalWindow ExternalWindow
}; };
@@ -58,6 +63,21 @@ public:
~HelpWidget(); ~HelpWidget();
HelpViewer *currentViewer() const; HelpViewer *currentViewer() const;
void setCurrentViewer(HelpViewer *viewer);
int currentIndex() const;
void addViewer(HelpViewer *viewer, bool highlightSearchTerms = false);
void removeViewerAt(int index);
void setViewerFont(const QFont &font);
// so central widget can save the state
int viewerCount() const;
HelpViewer *viewerAt(int index) const;
public slots:
void setSource(const QUrl &url);
void setSourceFromSearch(const QUrl &url);
void updateCloseButton();
protected: protected:
void closeEvent(QCloseEvent *); void closeEvent(QCloseEvent *);
@@ -66,17 +86,29 @@ signals:
void openHelpMode(const QUrl &url); void openHelpMode(const QUrl &url);
void closeButtonClicked(); void closeButtonClicked();
void aboutToClose(); void aboutToClose();
void sourceChanged(const QUrl &url);
void filterActivated(const QString &name);
private slots: private slots:
void updateBackMenu(); void updateBackMenu();
void updateForwardMenu(); void updateForwardMenu();
void updateWindowTitle(); void updateWindowTitle();
void helpModeButtonClicked(); void helpModeButtonClicked();
void goHome();
void addBookmark();
private: private:
void goHome();
void addBookmark();
void copy();
void forward();
void backward();
void scaleUp();
void scaleDown();
void resetScale();
void print(HelpViewer *viewer);
void highlightSearchTerms();
Core::IContext *m_context; Core::IContext *m_context;
WidgetStyle m_style;
QAction *m_switchToHelp; QAction *m_switchToHelp;
QAction *m_homeAction; QAction *m_homeAction;
QMenu *m_backMenu; QMenu *m_backMenu;
@@ -84,13 +116,16 @@ private:
QAction *m_backAction; QAction *m_backAction;
QAction *m_forwardAction; QAction *m_forwardAction;
QAction *m_addBookmarkAction; QAction *m_addBookmarkAction;
QComboBox *m_filterComboBox;
QAction *m_closeAction;
QAction *m_scaleUp; QAction *m_scaleUp;
QAction *m_scaleDown; QAction *m_scaleDown;
QAction *m_resetScale; QAction *m_resetScale;
QAction *m_printAction;
QAction *m_copy; QAction *m_copy;
HelpViewer *m_viewer; QStackedWidget *m_viewerStack;
WidgetStyle m_style; QPrinter *m_printer;
}; };
} // Internal } // Internal

View File

@@ -35,6 +35,7 @@
#include <app/app_version.h> #include <app/app_version.h>
#include <coreplugin/helpmanager.h> #include <coreplugin/helpmanager.h>
#include <utils/qtcassert.h>
#include <QMutexLocker> #include <QMutexLocker>
@@ -50,6 +51,10 @@ QHelpEngine* LocalHelpManager::m_guiEngine = 0;
QMutex LocalHelpManager::m_bkmarkMutex; QMutex LocalHelpManager::m_bkmarkMutex;
BookmarkManager* LocalHelpManager::m_bookmarkManager = 0; BookmarkManager* LocalHelpManager::m_bookmarkManager = 0;
QStandardItemModel *LocalHelpManager::m_filterModel = 0;
QString LocalHelpManager::m_currentFilter = QString();
int LocalHelpManager::m_currentFilterIndex = -1;
LocalHelpManager::LocalHelpManager(QObject *parent) LocalHelpManager::LocalHelpManager(QObject *parent)
: QObject(parent) : QObject(parent)
, m_guiNeedsSetup(true) , m_guiNeedsSetup(true)
@@ -57,6 +62,7 @@ LocalHelpManager::LocalHelpManager(QObject *parent)
{ {
m_instance = this; m_instance = this;
qRegisterMetaType<Help::Internal::LocalHelpManager::HelpData>("Help::Internal::LocalHelpManager::HelpData"); qRegisterMetaType<Help::Internal::LocalHelpManager::HelpData>("Help::Internal::LocalHelpManager::HelpData");
m_filterModel = new QStandardItemModel(this);
} }
LocalHelpManager::~LocalHelpManager() LocalHelpManager::~LocalHelpManager()
@@ -227,3 +233,47 @@ LocalHelpManager::HelpData LocalHelpManager::helpData(const QUrl &url)
} }
return data; return data;
} }
QAbstractItemModel *LocalHelpManager::filterModel()
{
return m_filterModel;
}
void LocalHelpManager::setFilterIndex(int index)
{
if (index == m_currentFilterIndex)
return;
m_currentFilterIndex = index;
QStandardItem *item = m_filterModel->item(index);
if (!item) {
helpEngine().setCurrentFilter(QString());
return;
}
helpEngine().setCurrentFilter(item->text());
emit m_instance->filterIndexChanged(m_currentFilterIndex);
}
void LocalHelpManager::updateFilterModel()
{
const QHelpEngine &engine = helpEngine();
if (m_currentFilter.isEmpty())
m_currentFilter = engine.currentFilter();
m_filterModel->clear();
m_currentFilterIndex = -1;
int count = 0;
const QStringList &filters = engine.customFilters();
foreach (const QString &filterString, filters) {
m_filterModel->appendRow(new QStandardItem(filterString));
if (filterString == m_currentFilter)
m_currentFilterIndex = count;
count++;
}
if (filters.size() < 1)
return;
if (m_currentFilterIndex < 0) {
m_currentFilterIndex = 0;
m_currentFilter = filters.at(0);
}
emit m_instance->filterIndexChanged(m_currentFilterIndex);
}

View File

@@ -30,10 +30,11 @@
#ifndef LOCALHELPMANAGER_H #ifndef LOCALHELPMANAGER_H
#define LOCALHELPMANAGER_H #define LOCALHELPMANAGER_H
#include <QMetaType>
#include <QMutex> #include <QMutex>
#include <QObject> #include <QObject>
#include <QUrl> #include <QUrl>
#include <QMetaType> #include <QStandardItemModel>
QT_FORWARD_DECLARE_CLASS(QHelpEngine) QT_FORWARD_DECLARE_CLASS(QHelpEngine)
@@ -70,10 +71,22 @@ public:
static QByteArray loadErrorMessage(const QUrl &url, const QString &errorString); static QByteArray loadErrorMessage(const QUrl &url, const QString &errorString);
Q_INVOKABLE static Help::Internal::LocalHelpManager::HelpData helpData(const QUrl &url); Q_INVOKABLE static Help::Internal::LocalHelpManager::HelpData helpData(const QUrl &url);
static QAbstractItemModel *filterModel();
static void setFilterIndex(int index);
static void updateFilterModel();
signals:
void filterIndexChanged(int index);
private: private:
bool m_guiNeedsSetup; bool m_guiNeedsSetup;
bool m_needsCollectionFile; bool m_needsCollectionFile;
static QStandardItemModel *m_filterModel;
static QString m_currentFilter;
static int m_currentFilterIndex;
static QMutex m_guiMutex; static QMutex m_guiMutex;
static QHelpEngine *m_guiEngine; static QHelpEngine *m_guiEngine;

View File

@@ -173,7 +173,7 @@ void OpenPagesManager::setupInitialPages()
m_model->addPage(homePage); m_model->addPage(homePage);
for (int i = 0; i < m_model->rowCount(); ++i) for (int i = 0; i < m_model->rowCount(); ++i)
CentralWidget::instance()->addPage(m_model->pageAt(i)); CentralWidget::instance()->addViewer(m_model->pageAt(i));
emit pagesChanged(); emit pagesChanged();
setCurrentPage((initialPage >= m_model->rowCount()) setCurrentPage((initialPage >= m_model->rowCount())
@@ -202,7 +202,7 @@ HelpViewer *OpenPagesManager::createPage(const QUrl &url, bool fromSearch)
const int index = m_model->rowCount() - 1; const int index = m_model->rowCount() - 1;
HelpViewer * const page = m_model->pageAt(index); HelpViewer * const page = m_model->pageAt(index);
CentralWidget::instance()->addPage(page, fromSearch); CentralWidget::instance()->addViewer(page, fromSearch);
emit pagesChanged(); emit pagesChanged();
setCurrentPage(index); setCurrentPage(index);
@@ -212,7 +212,7 @@ HelpViewer *OpenPagesManager::createPage(const QUrl &url, bool fromSearch)
void OpenPagesManager::setCurrentPage(int index) void OpenPagesManager::setCurrentPage(int index)
{ {
CentralWidget::instance()->setCurrentPage(m_model->pageAt(index)); CentralWidget::instance()->setCurrentViewer(m_model->pageAt(index));
m_comboBox->setCurrentIndex(index); m_comboBox->setCurrentIndex(index);
if (m_openPagesWidget) if (m_openPagesWidget)
@@ -294,7 +294,7 @@ void OpenPagesManager::removePage(int index)
Q_ASSERT(m_model->rowCount() > 1); Q_ASSERT(m_model->rowCount() > 1);
m_model->removePage(index); m_model->removePage(index);
CentralWidget::instance()->removePage(index); CentralWidget::instance()->removeViewerAt(index);
emit pagesChanged(); emit pagesChanged();
if (m_openPagesWidget) if (m_openPagesWidget)

View File

@@ -162,7 +162,7 @@ void ContentWindow::itemClicked(const QModelIndex &index)
if (contentModel) { if (contentModel) {
if (QHelpContentItem *itm = contentModel->contentItemAt(index)) { if (QHelpContentItem *itm = contentModel->contentItemAt(index)) {
const QUrl &url = itm->url(); const QUrl &url = itm->url();
if (url != CentralWidget::instance()->currentHelpViewer()->source()) if (url != CentralWidget::instance()->currentViewer()->source())
emit linkActivated(itm->url()); emit linkActivated(itm->url());
} }
} }