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 "localhelpmanager.h"
#include "topicchooser.h"
#include <topicchooser.h>
#include <QEvent>
#include <QTimer>
#include <QKeyEvent>
#include <QLayout>
#include <QPageSetupDialog>
#include <QPrinter>
#include <QPrintDialog>
#include <QPrintPreviewDialog>
#include <QStackedWidget>
#include <utils/qtcassert.h>
#include <QHelpEngine>
#include <QHelpSearchEngine>
using namespace Help::Internal;
@@ -54,29 +43,19 @@ CentralWidget *gStaticCentralWidget = 0;
// -- CentralWidget
CentralWidget::CentralWidget(QWidget *parent)
: QWidget(parent)
, printer(0)
, m_stackedWidget(0)
CentralWidget::CentralWidget(const Core::Context &context, QWidget *parent)
: HelpWidget(context, HelpWidget::ModeWidget, parent)
{
Q_ASSERT(!gStaticCentralWidget);
QTC_CHECK(!gStaticCentralWidget);
gStaticCentralWidget = this;
QVBoxLayout *vboxLayout = new QVBoxLayout(this);
vboxLayout->setMargin(0);
m_stackedWidget = new QStackedWidget(this);
vboxLayout->addWidget(m_stackedWidget);
}
CentralWidget::~CentralWidget()
{
#ifndef QT_NO_PRINTER
delete printer;
#endif
// TODO: this shouldn't be done here
QString zoomFactors;
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 QUrl &source = viewer->source();
if (source.isValid()) {
@@ -97,171 +76,6 @@ CentralWidget *CentralWidget::instance()
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,
const QString &keyword)
{
@@ -269,99 +83,3 @@ void CentralWidget::showTopicChooser(const QMap<QString, QUrl> &links,
if (tc.exec() == QDialog::Accepted)
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,90 +30,32 @@
#ifndef CENTRALWIDGET_H
#define CENTRALWIDGET_H
#include "helpwidget.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 Internal {
namespace Internal {
class HelpViewer;
class PrintHelper;
class CentralWidget : public QWidget
class CentralWidget : public HelpWidget
{
Q_OBJECT
public:
CentralWidget(QWidget *parent = 0);
CentralWidget(const Core::Context &context, QWidget *parent = 0);
~CentralWidget();
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:
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);
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
} // namespace Help
#endif // CENTRALWIDGET_H

View File

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

View File

@@ -107,18 +107,6 @@ static const char kExternalWindowStateKey[] = "Help/ExternalWindowState";
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()
: m_mode(0),
m_centralWidget(0),
@@ -131,8 +119,6 @@ HelpPlugin::HelpPlugin()
m_firstModeChange(true),
m_helpManager(0),
m_openPagesManager(0),
m_backMenu(0),
m_nextMenu(0),
m_isSidebarVisible(true)
{
}
@@ -175,9 +161,15 @@ 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);
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,
SLOT(fontChanged()));
connect(m_generalSettingsPage, SIGNAL(returnOnCloseChanged()), this,
connect(m_generalSettingsPage, SIGNAL(returnOnCloseChanged()), m_centralWidget,
SLOT(updateCloseButton()));
connect(HelpManager::instance(), SIGNAL(helpRequested(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,
SLOT(unregisterOldQtCreatorDocumentation()));
auto helpButtonBar = new Utils::StyledBar;
auto helpButtonLayout = new QHBoxLayout(helpButtonBar);
helpButtonLayout->setMargin(0);
helpButtonLayout->setSpacing(0);
m_splitter = new MiniSplitter;
Command *cmd;
m_centralWidget = new Help::Internal::CentralWidget();
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));
QAction *action;
// Add Contents, Index, and Context menu items
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);
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)) {
// reuse EditorManager constants to avoid a second pair of menu actions
// Goto Previous In History Action
@@ -315,27 +236,7 @@ bool HelpPlugin::initialize(const QStringList &arguments, QString *error)
SLOT(gotoNextPage()));
}
QWidget *toolBarWidget = new QWidget;
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);
}
m_splitter->addWidget(m_centralWidget);
HelpIndexFilter *helpIndexFilter = new HelpIndexFilter();
addAutoReleasedObject(helpIndexFilter);
@@ -516,8 +417,9 @@ void HelpPlugin::resetFilter()
engine->setCustomValue(Help::Constants::PreviousFilterNameKey, filterName);
engine->setCurrentFilter(filterName);
updateFilterComboBox();
connect(engine, SIGNAL(setupFinished()), this, SLOT(updateFilterComboBox()));
LocalHelpManager::updateFilterModel();
connect(engine, &QHelpEngineCore::setupFinished,
LocalHelpManager::instance(), &LocalHelpManager::updateFilterModel);
}
void HelpPlugin::saveExternalWindowSettings()
@@ -647,7 +549,7 @@ void HelpPlugin::modeChanged(IMode *mode, IMode *old)
void HelpPlugin::updateSideBarSource()
{
if (HelpViewer *viewer = m_centralWidget->currentHelpViewer()) {
if (HelpViewer *viewer = m_centralWidget->currentViewer()) {
const QUrl &url = viewer->source();
if (url.isValid())
updateSideBarSource(url);
@@ -660,14 +562,6 @@ void HelpPlugin::updateSideBarSource(const QUrl &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()
{
if (!m_rightPaneSideBarWidget)
@@ -677,23 +571,8 @@ void HelpPlugin::fontChanged()
QFont font = fontSetting.isValid() ? fontSetting.value<QFont>()
: m_rightPaneSideBarWidget->currentViewer()->viewerFont();
m_rightPaneSideBarWidget->currentViewer()->setViewerFont(font);
const int count = OpenPagesManager::instance().pageCount();
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;
m_rightPaneSideBarWidget->setViewerFont(font);
CentralWidget::instance()->setViewerFont(font);
}
void HelpPlugin::setupHelpEngineIfNeeded()
@@ -743,7 +622,7 @@ HelpViewer *HelpPlugin::viewerForHelpViewerLocation(Core::HelpManager::HelpViewe
QTC_CHECK(actualLocation == Core::HelpManager::HelpModeAlways);
activateHelpMode(); // should trigger an createPage...
HelpViewer *viewer = m_centralWidget->currentHelpViewer();
HelpViewer *viewer = m_centralWidget->currentViewer();
if (!viewer)
viewer = OpenPagesManager::instance().createPage();
return viewer;
@@ -850,69 +729,6 @@ void HelpPlugin::activateBookmarks()
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()
{
if (m_contextHelpHighlightId.isEmpty())
@@ -950,20 +766,6 @@ void HelpPlugin::handleHelpRequest(const QUrl &url, Core::HelpManager::HelpViewe
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()
{
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"),
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
class QAction;
class QComboBox;
class QMenu;
class QToolButton;
class QUrl;
@@ -96,10 +95,6 @@ private slots:
void activateOpenPages();
void activateBookmarks();
void addBookmark();
void updateFilterComboBox();
void filterDocumentation(const QString &customFilter);
void saveExternalWindowSettings();
void switchToHelpMode(const QUrl &source);
void slotHideRightPane();
@@ -110,14 +105,11 @@ private slots:
void fontChanged();
void updateCloseButton();
void setupHelpEngineIfNeeded();
void highlightSearchTermsInContextHelp();
void handleHelpRequest(const QUrl &url, Core::HelpManager::HelpViewerLocation location);
void slotAboutToShowBackMenu();
void slotAboutToShowNextMenu();
void slotOpenSupportPage();
void slotReportBug();
@@ -127,7 +119,6 @@ private:
void setupUi();
void resetFilter();
void activateHelpMode();
Utils::StyledBar *createWidgetToolBar();
bool canShowHelpSideBySide() const;
HelpViewer *viewerForHelpViewerLocation(Core::HelpManager::HelpViewerLocation location);
HelpViewer *viewerForContextHelp();
@@ -137,7 +128,6 @@ private:
void doSetupIfNeeded();
Core::HelpManager::HelpViewerLocation contextHelpOption() const;
void setupNavigationMenus(QAction *back, QAction *next, QWidget *parent);
private:
HelpMode *m_mode;
@@ -155,7 +145,6 @@ private:
GeneralSettingsPage *m_generalSettingsPage;
SearchTaskHandler *m_searchTaskHandler;
QComboBox *m_filterComboBox;
Core::SideBar *m_sideBar;
bool m_firstModeChange;
@@ -163,16 +152,11 @@ private:
OpenPagesManager *m_openPagesManager;
Core::MiniSplitter *m_splitter;
QToolButton *m_closeButton;
QString m_contextHelpHighlightId;
QPointer<HelpWidget> m_externalWindow;
QRect m_externalWindowState;
QMenu *m_backMenu;
QMenu *m_nextMenu;
bool m_isSidebarVisible;
QAction *m_toggleSideBarAction;
};

View File

@@ -34,18 +34,26 @@
#include "helpplugin.h"
#include "helpviewer.h"
#include "localhelpmanager.h"
#include "openpagesmanager.h"
#include <coreplugin/actionmanager/actioncontainer.h>
#include <coreplugin/actionmanager/actionmanager.h>
#include <coreplugin/coreconstants.h>
#include <coreplugin/icore.h>
#include <coreplugin/findplaceholder.h>
#include <coreplugin/helpmanager.h>
#include <texteditor/texteditorconstants.h>
#include <utils/qtcassert.h>
#include <utils/styledbar.h>
#include <QHBoxLayout>
#include <QHelpEngine>
#include <QHelpSearchEngine>
#include <QHelpSearchQuery>
#include <QMenu>
#include <QPrinter>
#include <QPrintDialog>
#include <QStackedWidget>
#include <QToolButton>
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) :
QWidget(parent),
m_style(style),
m_switchToHelp(0),
m_filterComboBox(0),
m_closeAction(0),
m_scaleUp(0),
m_scaleDown(0),
m_resetScale(0),
m_style(style)
m_printer(0)
{
Utils::StyledBar *toolBar = new Utils::StyledBar();
QHBoxLayout *layout = new QHBoxLayout(toolBar);
@@ -78,10 +90,12 @@ HelpWidget::HelpWidget(const Core::Context &context, WidgetStyle style, QWidget
layout->setMargin(0);
Core::Command *cmd;
if (style != ModeWidget) {
m_switchToHelp = new QAction(tr("Go to Help Mode"), toolBar);
cmd = Core::ActionManager::registerAction(m_switchToHelp, Constants::CONTEXT_HELP, context);
connect(m_switchToHelp, SIGNAL(triggered()), this, SLOT(helpModeButtonClicked()));
layout->addWidget(toolButton(m_switchToHelp, cmd));
}
m_homeAction = new QAction(QIcon(QLatin1String(":/help/images/home.png")),
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")),
tr("Back"), toolBar);
connect(m_backAction, &QAction::triggered, this, &HelpWidget::backward);
m_backMenu = new QMenu(toolBar);
connect(m_backMenu, SIGNAL(aboutToShow()), this, SLOT(updateBackMenu()));
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")),
tr("Forward"), toolBar);
connect(m_forwardAction, &QAction::triggered, this, &HelpWidget::forward);
m_forwardMenu = new QMenu(toolBar);
connect(m_forwardMenu, SIGNAL(aboutToShow()), this, SLOT(updateForwardMenu()));
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(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();
m_viewer = HelpPlugin::createHelpViewer(qreal(0.0));
m_viewerStack = new QStackedWidget;
QVBoxLayout *vLayout = new QVBoxLayout(this);
vLayout->setMargin(0);
vLayout->setSpacing(0);
vLayout->addWidget(toolBar);
vLayout->addWidget(m_viewer);
vLayout->addWidget(m_viewerStack);
Core::FindToolBarPlaceHolder *fth = new Core::FindToolBarPlaceHolder(this);
vLayout->addWidget(fth);
setFocusProxy(m_viewer);
setFocusProxy(m_viewerStack);
m_context = new Core::IContext(this);
m_context->setContext(context);
m_context->setWidget(m_viewer);
m_context->setWidget(m_viewerStack);
Core::ICore::addContextObject(m_context);
m_backAction->setEnabled(m_viewer->isBackwardAvailable());
connect(m_backAction, SIGNAL(triggered()), m_viewer, SLOT(backward()));
connect(m_viewer, SIGNAL(backwardAvailable(bool)), m_backAction,
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_printAction = new QAction(this);
Core::ActionManager::registerAction(m_printAction, Core::Constants::PRINT, context);
connect(m_printAction, &QAction::triggered, this, [this]() { print(currentViewer()); });
m_copy = new QAction(this);
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);
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);
cmd = Core::ActionManager::registerAction(m_scaleUp, TextEditor::Constants::INCREASE_FONT_SIZE,
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);
m_scaleDown = new QAction(tr("Decrease Font Size"), this);
cmd = Core::ActionManager::registerAction(m_scaleDown, TextEditor::Constants::DECREASE_FONT_SIZE,
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);
m_resetScale = new QAction(tr("Reset Font Size"), this);
cmd = Core::ActionManager::registerAction(m_resetScale, TextEditor::Constants::RESET_FONT_SIZE,
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);
}
if (style == SideBarWidget) {
QAction *close = new QAction(QIcon(QLatin1String(Core::Constants::ICON_BUTTON_CLOSE)),
if (style == ModeWidget) {
m_closeAction = new QAction(QIcon(QLatin1String(Core::Constants::ICON_BUTTON_CLOSE)),
QString(), toolBar);
connect(close, SIGNAL(triggered()), this, SIGNAL(closeButtonClicked()));
layout->addWidget(toolButton(close));
m_viewer->setOpenInNewPageActionVisible(false);
connect(m_closeAction, SIGNAL(triggered()), this, SIGNAL(closeButtonClicked()));
layout->addWidget(toolButton(m_closeAction));
} 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) {
static int windowId = 0;
Core::ICore::registerWindow(this,
Core::Context(Core::Id("Help.Window.").withSuffix(++windowId)));
setAttribute(Qt::WA_DeleteOnClose);
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::ActionManager::unregisterAction(m_copy, Core::Constants::COPY);
if (m_switchToHelp)
Core::ActionManager::unregisterAction(m_switchToHelp, Constants::CONTEXT_HELP);
Core::ActionManager::unregisterAction(m_homeAction, Constants::HELP_HOME);
Core::ActionManager::unregisterAction(m_forwardAction, Constants::HELP_NEXT);
@@ -208,7 +239,100 @@ HelpWidget::~HelpWidget()
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 *)
@@ -219,18 +343,21 @@ void HelpWidget::closeEvent(QCloseEvent *)
void HelpWidget::updateBackMenu()
{
m_backMenu->clear();
m_viewer->addBackHistoryItems(m_backMenu);
QTC_ASSERT(currentViewer(), return);
currentViewer()->addBackHistoryItems(m_backMenu);
}
void HelpWidget::updateForwardMenu()
{
m_forwardMenu->clear();
m_viewer->addForwardHistoryItems(m_forwardMenu);
QTC_ASSERT(currentViewer(), return);
currentViewer()->addForwardHistoryItems(m_forwardMenu);
}
void HelpWidget::updateWindowTitle()
{
const QString pageTitle = m_viewer->title();
QTC_ASSERT(currentViewer(), return);
const QString pageTitle = currentViewer()->title();
if (pageTitle.isEmpty())
setWindowTitle(tr("Help"));
else
@@ -239,11 +366,21 @@ void HelpWidget::updateWindowTitle()
void HelpWidget::helpModeButtonClicked()
{
emit openHelpMode(m_viewer->source());
QTC_ASSERT(currentViewer(), return);
emit openHelpMode(currentViewer()->source());
if (m_style == ExternalWindow)
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()
{
if (HelpViewer *viewer = currentViewer())
@@ -263,5 +400,84 @@ void HelpWidget::addBookmark()
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
} // Help

View File

@@ -37,7 +37,11 @@
QT_BEGIN_NAMESPACE
class QAction;
class QComboBox;
class QFont;
class QMenu;
class QPrinter;
class QStackedWidget;
QT_END_NAMESPACE
namespace Help {
@@ -50,6 +54,7 @@ class HelpWidget : public QWidget
Q_OBJECT
public:
enum WidgetStyle {
ModeWidget,
SideBarWidget,
ExternalWindow
};
@@ -58,6 +63,21 @@ public:
~HelpWidget();
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:
void closeEvent(QCloseEvent *);
@@ -66,17 +86,29 @@ signals:
void openHelpMode(const QUrl &url);
void closeButtonClicked();
void aboutToClose();
void sourceChanged(const QUrl &url);
void filterActivated(const QString &name);
private slots:
void updateBackMenu();
void updateForwardMenu();
void updateWindowTitle();
void helpModeButtonClicked();
void goHome();
void addBookmark();
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;
WidgetStyle m_style;
QAction *m_switchToHelp;
QAction *m_homeAction;
QMenu *m_backMenu;
@@ -84,13 +116,16 @@ private:
QAction *m_backAction;
QAction *m_forwardAction;
QAction *m_addBookmarkAction;
QComboBox *m_filterComboBox;
QAction *m_closeAction;
QAction *m_scaleUp;
QAction *m_scaleDown;
QAction *m_resetScale;
QAction *m_printAction;
QAction *m_copy;
HelpViewer *m_viewer;
WidgetStyle m_style;
QStackedWidget *m_viewerStack;
QPrinter *m_printer;
};
} // Internal

View File

@@ -35,6 +35,7 @@
#include <app/app_version.h>
#include <coreplugin/helpmanager.h>
#include <utils/qtcassert.h>
#include <QMutexLocker>
@@ -50,6 +51,10 @@ QHelpEngine* LocalHelpManager::m_guiEngine = 0;
QMutex LocalHelpManager::m_bkmarkMutex;
BookmarkManager* LocalHelpManager::m_bookmarkManager = 0;
QStandardItemModel *LocalHelpManager::m_filterModel = 0;
QString LocalHelpManager::m_currentFilter = QString();
int LocalHelpManager::m_currentFilterIndex = -1;
LocalHelpManager::LocalHelpManager(QObject *parent)
: QObject(parent)
, m_guiNeedsSetup(true)
@@ -57,6 +62,7 @@ LocalHelpManager::LocalHelpManager(QObject *parent)
{
m_instance = this;
qRegisterMetaType<Help::Internal::LocalHelpManager::HelpData>("Help::Internal::LocalHelpManager::HelpData");
m_filterModel = new QStandardItemModel(this);
}
LocalHelpManager::~LocalHelpManager()
@@ -227,3 +233,47 @@ LocalHelpManager::HelpData LocalHelpManager::helpData(const QUrl &url)
}
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
#define LOCALHELPMANAGER_H
#include <QMetaType>
#include <QMutex>
#include <QObject>
#include <QUrl>
#include <QMetaType>
#include <QStandardItemModel>
QT_FORWARD_DECLARE_CLASS(QHelpEngine)
@@ -70,10 +71,22 @@ public:
static QByteArray loadErrorMessage(const QUrl &url, const QString &errorString);
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:
bool m_guiNeedsSetup;
bool m_needsCollectionFile;
static QStandardItemModel *m_filterModel;
static QString m_currentFilter;
static int m_currentFilterIndex;
static QMutex m_guiMutex;
static QHelpEngine *m_guiEngine;

View File

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

View File

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