diff options
-rw-r--r-- | src/plugins/help/centralwidget.cpp | 296 | ||||
-rw-r--r-- | src/plugins/help/centralwidget.h | 70 | ||||
-rw-r--r-- | src/plugins/help/generalsettingspage.cpp | 4 | ||||
-rw-r--r-- | src/plugins/help/helpplugin.cpp | 248 | ||||
-rw-r--r-- | src/plugins/help/helpplugin.h | 16 | ||||
-rw-r--r-- | src/plugins/help/helpwidget.cpp | 288 | ||||
-rw-r--r-- | src/plugins/help/helpwidget.h | 41 | ||||
-rw-r--r-- | src/plugins/help/localhelpmanager.cpp | 50 | ||||
-rw-r--r-- | src/plugins/help/localhelpmanager.h | 15 | ||||
-rw-r--r-- | src/plugins/help/openpagesmanager.cpp | 8 | ||||
-rw-r--r-- | src/shared/help/contentwindow.cpp | 2 |
11 files changed, 390 insertions, 648 deletions
diff --git a/src/plugins/help/centralwidget.cpp b/src/plugins/help/centralwidget.cpp index 94deeb15a5..23e4d98292 100644 --- a/src/plugins/help/centralwidget.cpp +++ b/src/plugins/help/centralwidget.cpp @@ -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); -} diff --git a/src/plugins/help/centralwidget.h b/src/plugins/help/centralwidget.h index 8fa96d0e19..37d310459e 100644 --- a/src/plugins/help/centralwidget.h +++ b/src/plugins/help/centralwidget.h @@ -30,90 +30,32 @@ #ifndef CENTRALWIDGET_H #define CENTRALWIDGET_H -#include <coreplugin/find/ifindsupport.h> - -#include <QWidget> +#include "helpwidget.h" -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) +#include <coreplugin/find/ifindsupport.h> 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 diff --git a/src/plugins/help/generalsettingspage.cpp b/src/plugins/help/generalsettingspage.cpp index f60a65dbe6..ddebe0714b 100644 --- a/src/plugins/help/generalsettingspage.cpp +++ b/src/plugins/help/generalsettingspage.cpp @@ -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()); } diff --git a/src/plugins/help/helpplugin.cpp b/src/plugins/help/helpplugin.cpp index b7a8c007bf..1bc33d7a29 100644 --- a/src/plugins/help/helpplugin.cpp +++ b/src/plugins/help/helpplugin.cpp @@ -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); -} diff --git a/src/plugins/help/helpplugin.h b/src/plugins/help/helpplugin.h index 17b8abd286..a0e7d644f1 100644 --- a/src/plugins/help/helpplugin.h +++ b/src/plugins/help/helpplugin.h @@ -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; }; diff --git a/src/plugins/help/helpwidget.cpp b/src/plugins/help/helpwidget.cpp index 53b2bebbcc..83ed2558f3 100644 --- a/src/plugins/help/helpwidget.cpp +++ b/src/plugins/help/helpwidget.cpp @@ -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; - 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)); + 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(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(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 == 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,7 +223,8 @@ HelpWidget::~HelpWidget() { Core::ICore::removeContextObject(m_context); Core::ActionManager::unregisterAction(m_copy, Core::Constants::COPY); - Core::ActionManager::unregisterAction(m_switchToHelp, Constants::CONTEXT_HELP); + 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); Core::ActionManager::unregisterAction(m_backAction, Constants::HELP_PREVIOUS); @@ -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 diff --git a/src/plugins/help/helpwidget.h b/src/plugins/help/helpwidget.h index 12788746f7..bd00034881 100644 --- a/src/plugins/help/helpwidget.h +++ b/src/plugins/help/helpwidget.h @@ -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(); + +private: void goHome(); void addBookmark(); + void copy(); + void forward(); + void backward(); + void scaleUp(); + void scaleDown(); + void resetScale(); + void print(HelpViewer *viewer); + void highlightSearchTerms(); -private: 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 diff --git a/src/plugins/help/localhelpmanager.cpp b/src/plugins/help/localhelpmanager.cpp index d99cdce10a..80b0fcd293 100644 --- a/src/plugins/help/localhelpmanager.cpp +++ b/src/plugins/help/localhelpmanager.cpp @@ -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); +} diff --git a/src/plugins/help/localhelpmanager.h b/src/plugins/help/localhelpmanager.h index 2f84c39c44..f1eefe42dd 100644 --- a/src/plugins/help/localhelpmanager.h +++ b/src/plugins/help/localhelpmanager.h @@ -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; diff --git a/src/plugins/help/openpagesmanager.cpp b/src/plugins/help/openpagesmanager.cpp index 2a55055af7..019c9dd613 100644 --- a/src/plugins/help/openpagesmanager.cpp +++ b/src/plugins/help/openpagesmanager.cpp @@ -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) diff --git a/src/shared/help/contentwindow.cpp b/src/shared/help/contentwindow.cpp index b29e648005..7b5504896b 100644 --- a/src/shared/help/contentwindow.cpp +++ b/src/shared/help/contentwindow.cpp @@ -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()); } } |