Help: Option to open links in window

Task-number: QTCREATORBUG-16842
Change-Id: I420f48a00c56ebc89bade7e91ceb8ec391316e36
Reviewed-by: David Schulz <david.schulz@qt.io>
Reviewed-by: Leena Miettinen <riitta-leena.miettinen@qt.io>
This commit is contained in:
Eike Ziller
2016-09-09 15:37:01 +02:00
parent 2cd307a7b0
commit a416a5b6e3
12 changed files with 153 additions and 95 deletions

View File

@@ -63,5 +63,8 @@ static const char SB_BOOKMARKS[] = QT_TRANSLATE_NOOP("Help::Internal::HelpPlugin
static const char SB_OPENPAGES[] = QT_TRANSLATE_NOOP("Help::Internal::HelpPlugin", "Open Pages"); static const char SB_OPENPAGES[] = QT_TRANSLATE_NOOP("Help::Internal::HelpPlugin", "Open Pages");
static const char SB_SEARCH[] = QT_TRANSLATE_NOOP("Help::Internal::HelpPlugin", "Search"); static const char SB_SEARCH[] = QT_TRANSLATE_NOOP("Help::Internal::HelpPlugin", "Search");
static const char TR_OPEN_LINK_AS_NEW_PAGE[] = QT_TRANSLATE_NOOP("HelpViewer", "Open Link as New Page");
static const char TR_OPEN_LINK_IN_WINDOW[] = QT_TRANSLATE_NOOP("HelpViewer", "Open Link in Window");
} // Constants } // Constants
} // Help } // Help

View File

@@ -108,6 +108,8 @@ static const char kToolTipHelpContext[] = "Help.ToolTip";
using namespace Core; using namespace Core;
using namespace Utils; using namespace Utils;
static HelpPlugin *m_instance = nullptr;
HelpPlugin::HelpPlugin() HelpPlugin::HelpPlugin()
: m_mode(0), : m_mode(0),
m_centralWidget(0), m_centralWidget(0),
@@ -116,6 +118,7 @@ HelpPlugin::HelpPlugin()
m_helpManager(0), m_helpManager(0),
m_openPagesManager(0) m_openPagesManager(0)
{ {
m_instance = this;
} }
HelpPlugin::~HelpPlugin() HelpPlugin::~HelpPlugin()
@@ -476,7 +479,7 @@ void HelpPlugin::setupHelpEngineIfNeeded()
LocalHelpManager::setupGuiHelpEngine(); LocalHelpManager::setupGuiHelpEngine();
} }
bool HelpPlugin::canShowHelpSideBySide() const bool HelpPlugin::canShowHelpSideBySide()
{ {
RightPanePlaceHolder *placeHolder = RightPanePlaceHolder::current(); RightPanePlaceHolder *placeHolder = RightPanePlaceHolder::current();
if (!placeHolder) if (!placeHolder)
@@ -503,19 +506,19 @@ HelpViewer *HelpPlugin::viewerForHelpViewerLocation(HelpManager::HelpViewerLocat
: HelpManager::HelpModeAlways; : HelpManager::HelpModeAlways;
if (actualLocation == HelpManager::ExternalHelpAlways) if (actualLocation == HelpManager::ExternalHelpAlways)
return externalHelpViewer(); return m_instance->externalHelpViewer();
if (actualLocation == HelpManager::SideBySideAlways) { if (actualLocation == HelpManager::SideBySideAlways) {
createRightPaneContextViewer(); m_instance->createRightPaneContextViewer();
RightPaneWidget::instance()->setWidget(m_rightPaneSideBarWidget); RightPaneWidget::instance()->setWidget(m_instance->m_rightPaneSideBarWidget);
RightPaneWidget::instance()->setShown(true); RightPaneWidget::instance()->setShown(true);
return m_rightPaneSideBarWidget->currentViewer(); return m_instance->m_rightPaneSideBarWidget->currentViewer();
} }
QTC_CHECK(actualLocation == HelpManager::HelpModeAlways); QTC_CHECK(actualLocation == HelpManager::HelpModeAlways);
activateHelpMode(); // should trigger an createPage... activateHelpMode(); // should trigger an createPage...
HelpViewer *viewer = m_centralWidget->currentViewer(); HelpViewer *viewer = m_instance->m_centralWidget->currentViewer();
if (!viewer) if (!viewer)
viewer = OpenPagesManager::instance().createPage(); viewer = OpenPagesManager::instance().createPage();
return viewer; return viewer;

View File

@@ -75,6 +75,8 @@ public:
void extensionsInitialized(); void extensionsInitialized();
ShutdownFlag aboutToShutdown(); ShutdownFlag aboutToShutdown();
static HelpViewer *viewerForHelpViewerLocation(Core::HelpManager::HelpViewerLocation location);
static HelpViewer *createHelpViewer(qreal zoom); static HelpViewer *createHelpViewer(qreal zoom);
private: private:
@@ -101,9 +103,8 @@ private:
void slotSystemInformation(); void slotSystemInformation();
void resetFilter(); void resetFilter();
void activateHelpMode(); static void activateHelpMode();
bool canShowHelpSideBySide() const; static bool canShowHelpSideBySide();
HelpViewer *viewerForHelpViewerLocation(Core::HelpManager::HelpViewerLocation location);
HelpViewer *viewerForContextHelp(); HelpViewer *viewerForContextHelp();
HelpWidget *createHelpWidget(const Core::Context &context, HelpWidget::WidgetStyle style); HelpWidget *createHelpWidget(const Core::Context &context, HelpWidget::WidgetStyle style);
void createRightPaneContextViewer(); void createRightPaneContextViewer();

View File

@@ -86,6 +86,19 @@ HelpViewer::HelpViewer(QWidget *parent)
{ {
} }
void HelpViewer::setActionVisible(Action action, bool visible)
{
if (visible)
m_visibleActions |= Actions(action);
else
m_visibleActions &= ~Actions(action);
}
bool HelpViewer::isActionVisible(HelpViewer::Action action)
{
return (m_visibleActions & Actions(action)) != 0;
}
bool HelpViewer::isLocalUrl(const QUrl &url) bool HelpViewer::isLocalUrl(const QUrl &url)
{ {
return url.scheme() == "about" // "No documenation available" return url.scheme() == "about" // "No documenation available"

View File

@@ -42,6 +42,12 @@ class HelpViewer : public QWidget
Q_OBJECT Q_OBJECT
public: public:
enum class Action {
NewPage = 0x01,
ExternalWindow = 0x02
};
Q_DECLARE_FLAGS(Actions, Action)
explicit HelpViewer(QWidget *parent = 0); explicit HelpViewer(QWidget *parent = 0);
~HelpViewer() { } ~HelpViewer() { }
@@ -65,7 +71,8 @@ public:
virtual bool isBackwardAvailable() const = 0; virtual bool isBackwardAvailable() const = 0;
virtual void addBackHistoryItems(QMenu *backMenu) = 0; virtual void addBackHistoryItems(QMenu *backMenu) = 0;
virtual void addForwardHistoryItems(QMenu *forwardMenu) = 0; virtual void addForwardHistoryItems(QMenu *forwardMenu) = 0;
virtual void setOpenInNewPageActionVisible(bool visible) = 0; void setActionVisible(Action action, bool visible);
bool isActionVisible(Action action);
virtual bool findText(const QString &text, Core::FindFlags flags, virtual bool findText(const QString &text, Core::FindFlags flags,
bool incremental, bool fromSearch, bool *wrapped = 0) = 0; bool incremental, bool fromSearch, bool *wrapped = 0) = 0;
@@ -95,10 +102,14 @@ signals:
void forwardAvailable(bool); void forwardAvailable(bool);
void backwardAvailable(bool); void backwardAvailable(bool);
void loadFinished(); void loadFinished();
void newPageRequested(const QUrl &url);
void externalPageRequested(const QUrl &url);
protected: protected:
void slotLoadStarted(); void slotLoadStarted();
void slotLoadFinished(); void slotLoadFinished();
Actions m_visibleActions = 0;
}; };
} // namespace Internal } // namespace Internal

View File

@@ -417,8 +417,8 @@ void HelpWidget::addViewer(HelpViewer *viewer)
{ {
m_viewerStack->addWidget(viewer); m_viewerStack->addWidget(viewer);
viewer->setFocus(Qt::OtherFocusReason); viewer->setFocus(Qt::OtherFocusReason);
if (m_style == SideBarWidget || m_style == ExternalWindow) viewer->setActionVisible(HelpViewer::Action::NewPage, m_style == ModeWidget);
viewer->setOpenInNewPageActionVisible(false); viewer->setActionVisible(HelpViewer::Action::ExternalWindow, m_style != ExternalWindow);
connect(viewer, &HelpViewer::sourceChanged, this, [viewer, this](const QUrl &url) { connect(viewer, &HelpViewer::sourceChanged, this, [viewer, this](const QUrl &url) {
if (currentViewer() == viewer) if (currentViewer() == viewer)
emit sourceChanged(url); emit sourceChanged(url);
@@ -438,6 +438,15 @@ void HelpWidget::addViewer(HelpViewer *viewer)
connect(viewer, &HelpViewer::titleChanged, this, &HelpWidget::updateWindowTitle); connect(viewer, &HelpViewer::titleChanged, this, &HelpWidget::updateWindowTitle);
connect(viewer, &HelpViewer::loadFinished, this, &HelpWidget::highlightSearchTerms); connect(viewer, &HelpViewer::loadFinished, this, &HelpWidget::highlightSearchTerms);
connect(viewer, &HelpViewer::newPageRequested, [](const QUrl &url) {
OpenPagesManager::instance().createPage(url);
});
connect(viewer, &HelpViewer::externalPageRequested, [](const QUrl &url) {
HelpViewer *viewer = HelpPlugin::viewerForHelpViewerLocation(Core::HelpManager::ExternalHelpAlways);
if (QTC_GUARD(viewer))
viewer->setSource(url);
Core::ICore::raiseWindow(viewer);
});
updateCloseButton(); updateCloseButton();
} }

View File

@@ -59,11 +59,10 @@ public:
MacWebKitHelpWidget(MacWebKitHelpViewer *parent); MacWebKitHelpWidget(MacWebKitHelpViewer *parent);
~MacWebKitHelpWidget(); ~MacWebKitHelpWidget();
void setOpenInNewPageActionVisible(bool visible);
WebView *webView() const; WebView *webView() const;
void startToolTipTimer(const QPoint &pos, const QString &text); void startToolTipTimer(const QPoint &pos, const QString &text);
void hideToolTip(); void hideToolTip();
MacWebKitHelpViewer *viewer() const;
protected: protected:
void hideEvent(QHideEvent *); void hideEvent(QHideEvent *);
@@ -102,7 +101,7 @@ public:
bool isBackwardAvailable() const; bool isBackwardAvailable() const;
void addBackHistoryItems(QMenu *backMenu); void addBackHistoryItems(QMenu *backMenu);
void addForwardHistoryItems(QMenu *forwardMenu); void addForwardHistoryItems(QMenu *forwardMenu);
void setOpenInNewPageActionVisible(bool visible); void setActionVisible(bool visible);
bool findText(const QString &text, Core::FindFlags flags, bool findText(const QString &text, Core::FindFlags flags,
bool incremental, bool fromSearch, bool *wrapped = 0); bool incremental, bool fromSearch, bool *wrapped = 0);

View File

@@ -25,6 +25,7 @@
#include "macwebkithelpviewer.h" #include "macwebkithelpviewer.h"
#include "helpconstants.h"
#include "localhelpmanager.h" #include "localhelpmanager.h"
#include "openpagesmanager.h" #include "openpagesmanager.h"
@@ -280,15 +281,15 @@ static void ensureProtocolHandler()
Help::Internal::MacWebKitHelpWidget *widget; Help::Internal::MacWebKitHelpWidget *widget;
} }
@property (assign) BOOL openInNewPageActionVisible;
- (id)initWithWidget:(Help::Internal::MacWebKitHelpWidget *)theWidget; - (id)initWithWidget:(Help::Internal::MacWebKitHelpWidget *)theWidget;
- (void)webView:(WebView *)sender makeFirstResponder:(NSResponder *)responder; - (void)webView:(WebView *)sender makeFirstResponder:(NSResponder *)responder;
- (NSArray *)webView:(WebView *)sender contextMenuItemsForElement:(NSDictionary *)element - (NSArray *)webView:(WebView *)sender contextMenuItemsForElement:(NSDictionary *)element
defaultMenuItems:(NSArray *)defaultMenuItems; defaultMenuItems:(NSArray *)defaultMenuItems;
- (WebView *)webView:(WebView *)sender createWebViewWithRequest:(NSURLRequest *)request;
- (void)webView:(WebView *)sender mouseDidMoveOverElement:(NSDictionary *)elementInformation - (void)webView:(WebView *)sender mouseDidMoveOverElement:(NSDictionary *)elementInformation
modifierFlags:(NSUInteger)modifierFlags; modifierFlags:(NSUInteger)modifierFlags;
- (void)openAsNewPage:(id)sender;
- (void)openInWindow:(id)sender;
@end @end
@implementation UIDelegate @implementation UIDelegate
@@ -298,7 +299,6 @@ static void ensureProtocolHandler()
self = [super init]; self = [super init];
if (self) { if (self) {
widget = theWidget; widget = theWidget;
self.openInNewPageActionVisible = YES;
} }
return self; return self;
} }
@@ -312,6 +312,16 @@ static void ensureProtocolHandler()
} }
} }
static NSMenuItem *menuItem(NSURL *url, id target, SEL action, const QString &title)
{
NSMenuItem *openItem = [[NSMenuItem alloc] initWithTitle:title.toNSString()
action:action
keyEquivalent:@""];
openItem.representedObject = url;
openItem.target = target;
return [openItem autorelease];
}
- (NSArray *)webView:(WebView *)sender contextMenuItemsForElement:(NSDictionary *)element - (NSArray *)webView:(WebView *)sender contextMenuItemsForElement:(NSDictionary *)element
defaultMenuItems:(NSArray *)defaultMenuItems defaultMenuItems:(NSArray *)defaultMenuItems
{ {
@@ -335,10 +345,17 @@ static void ensureProtocolHandler()
[ret addObject:item]; [ret addObject:item];
break; break;
case WebMenuItemTagOpenLinkInNewWindow: case WebMenuItemTagOpenLinkInNewWindow:
case WebMenuItemTagOpenImageInNewWindow: case WebMenuItemTagOpenImageInNewWindow: {
if (self.openInNewPageActionVisible) { NSURL *url = [element objectForKey:WebElementLinkURLKey];
item.title = QCoreApplication::translate("HelpViewer", "Open Link as New Page").toNSString(); if (QTC_GUARD(url)) {
[ret addObject:item]; if (widget->viewer()->isActionVisible(Help::Internal::HelpViewer::Action::NewPage))
[ret addObject:menuItem(url, self, @selector(openAsNewPage:),
QCoreApplication::translate("HelpViewer", Help::Constants::TR_OPEN_LINK_AS_NEW_PAGE))];
if (widget->viewer()->isActionVisible(Help::Internal::HelpViewer::Action::ExternalWindow))
[ret addObject:menuItem(url, self, @selector(openInWindow:),
QCoreApplication::translate("HelpViewer", Help::Constants::TR_OPEN_LINK_IN_WINDOW))];
}
break;
} }
default: default:
break; break;
@@ -347,16 +364,6 @@ static void ensureProtocolHandler()
return [ret autorelease]; return [ret autorelease];
} }
- (WebView *)webView:(WebView *)sender createWebViewWithRequest:(NSURLRequest *)request
{
Q_UNUSED(sender)
Q_UNUSED(request)
Help::Internal::MacWebKitHelpViewer* viewer
= static_cast<Help::Internal::MacWebKitHelpViewer *>(
Help::Internal::OpenPagesManager::instance().createPage(QUrl()));
return viewer->widget()->webView();
}
- (void)webView:(WebView *)sender mouseDidMoveOverElement:(NSDictionary *)elementInformation - (void)webView:(WebView *)sender mouseDidMoveOverElement:(NSDictionary *)elementInformation
modifierFlags:(NSUInteger)modifierFlags modifierFlags:(NSUInteger)modifierFlags
{ {
@@ -374,6 +381,16 @@ static void ensureProtocolHandler()
QString::fromNSString(url.absoluteString)); QString::fromNSString(url.absoluteString));
} }
- (void)openAsNewPage:(id)item
{
widget->viewer()->newPageRequested(QUrl::fromNSURL([item representedObject]));
}
- (void)openInWindow:(id)item
{
widget->viewer()->externalPageRequested(QUrl::fromNSURL([item representedObject]));
}
@end @end
// #pragma mark -- MyWebView // #pragma mark -- MyWebView
@@ -420,8 +437,9 @@ namespace Internal {
class MacWebKitHelpWidgetPrivate class MacWebKitHelpWidgetPrivate
{ {
public: public:
MacWebKitHelpWidgetPrivate() MacWebKitHelpWidgetPrivate(MacWebKitHelpViewer *parent)
: m_savedResponder(nil) : m_viewer(parent),
m_savedResponder(nil)
{ {
} }
@@ -432,6 +450,7 @@ public:
[m_uiDelegate release]; [m_uiDelegate release];
} }
MacWebKitHelpViewer *m_viewer;
WebView *m_webView; WebView *m_webView;
FrameLoadDelegate *m_frameLoadDelegate; FrameLoadDelegate *m_frameLoadDelegate;
UIDelegate *m_uiDelegate; UIDelegate *m_uiDelegate;
@@ -445,7 +464,7 @@ public:
MacWebKitHelpWidget::MacWebKitHelpWidget(MacWebKitHelpViewer *parent) MacWebKitHelpWidget::MacWebKitHelpWidget(MacWebKitHelpViewer *parent)
: QMacCocoaViewContainer(0, parent), : QMacCocoaViewContainer(0, parent),
d(new MacWebKitHelpWidgetPrivate) d(new MacWebKitHelpWidgetPrivate(parent))
{ {
d->m_toolTipTimer.setSingleShot(true); d->m_toolTipTimer.setSingleShot(true);
connect(&d->m_toolTipTimer, &QTimer::timeout, this, &MacWebKitHelpWidget::showToolTip); connect(&d->m_toolTipTimer, &QTimer::timeout, this, &MacWebKitHelpWidget::showToolTip);
@@ -462,6 +481,7 @@ MacWebKitHelpWidget::MacWebKitHelpWidget(MacWebKitHelpViewer *parent)
setCocoaView(d->m_webView); setCocoaView(d->m_webView);
} }
} }
MacWebKitHelpWidget::~MacWebKitHelpWidget() MacWebKitHelpWidget::~MacWebKitHelpWidget()
@@ -469,9 +489,9 @@ MacWebKitHelpWidget::~MacWebKitHelpWidget()
delete d; delete d;
} }
void MacWebKitHelpWidget::setOpenInNewPageActionVisible(bool visible) MacWebKitHelpViewer *MacWebKitHelpWidget::viewer() const
{ {
d->m_uiDelegate.openInNewPageActionVisible = visible; return d->m_viewer;
} }
WebView *MacWebKitHelpWidget::webView() const WebView *MacWebKitHelpWidget::webView() const
@@ -679,11 +699,6 @@ void MacWebKitHelpViewer::addForwardHistoryItems(QMenu *forwardMenu)
} }
} }
void MacWebKitHelpViewer::setOpenInNewPageActionVisible(bool visible)
{
m_widget->setOpenInNewPageActionVisible(visible);
}
DOMRange *MacWebKitHelpViewer::findText(NSString *text, bool forward, bool caseSensitive, DOMNode *startNode, int startOffset) DOMRange *MacWebKitHelpViewer::findText(NSString *text, bool forward, bool caseSensitive, DOMNode *startNode, int startOffset)
{ {
QTC_ASSERT(text, return nil); QTC_ASSERT(text, return nil);

View File

@@ -198,11 +198,6 @@ void TextBrowserHelpViewer::addForwardHistoryItems(QMenu *forwardMenu)
} }
} }
void TextBrowserHelpViewer::setOpenInNewPageActionVisible(bool visible)
{
m_textBrowser->m_openInNewPageActionVisible = visible;
}
bool TextBrowserHelpViewer::findText(const QString &text, Core::FindFlags flags, bool TextBrowserHelpViewer::findText(const QString &text, Core::FindFlags flags,
bool incremental, bool fromSearch, bool *wrapped) bool incremental, bool fromSearch, bool *wrapped)
{ {
@@ -305,7 +300,6 @@ TextBrowserHelpWidget::TextBrowserHelpWidget(TextBrowserHelpViewer *parent)
: QTextBrowser(parent) : QTextBrowser(parent)
, zoomCount(0) , zoomCount(0)
, forceFont(false) , forceFont(false)
, m_openInNewPageActionVisible(true)
, m_parent(parent) , m_parent(parent)
{ {
installEventFilter(this); installEventFilter(this);
@@ -334,16 +328,6 @@ QString TextBrowserHelpWidget::linkAt(const QPoint &pos)
return anchor; return anchor;
} }
void TextBrowserHelpWidget::openLink(const QUrl &url, bool newPage)
{
if (url.isEmpty() || !url.isValid())
return;
if (newPage)
OpenPagesManager::instance().createPage(url);
else
setSource(url);
}
void TextBrowserHelpWidget::scaleUp() void TextBrowserHelpWidget::scaleUp()
{ {
if (zoomCount < 10) { if (zoomCount < 10) {
@@ -373,13 +357,18 @@ void TextBrowserHelpWidget::contextMenuEvent(QContextMenuEvent *event)
if (!link.isEmpty() && link.isValid()) { if (!link.isEmpty() && link.isValid()) {
QAction *action = menu.addAction(tr("Open Link")); QAction *action = menu.addAction(tr("Open Link"));
connect(action, &QAction::triggered, this, [this, link]() { connect(action, &QAction::triggered, this, [this, link]() {
openLink(link, false/*newPage*/); setSource(link);
}); });
if (m_openInNewPageActionVisible) { if (m_parent->isActionVisible(HelpViewer::Action::NewPage)) {
action = menu.addAction(QCoreApplication::translate("HelpViewer", action = menu.addAction(QCoreApplication::translate("HelpViewer", Constants::TR_OPEN_LINK_AS_NEW_PAGE));
"Open Link as New Page"));
connect(action, &QAction::triggered, this, [this, link]() { connect(action, &QAction::triggered, this, [this, link]() {
openLink(link, true/*newPage*/); emit m_parent->newPageRequested(link);
});
}
if (m_parent->isActionVisible(HelpViewer::Action::ExternalWindow)) {
action = menu.addAction(QCoreApplication::translate("HelpViewer", Constants::TR_OPEN_LINK_IN_WINDOW));
connect(action, &QAction::triggered, this, [this, link]() {
emit m_parent->externalPageRequested(link);
}); });
} }
copyAnchorAction = menu.addAction(tr("Copy Link")); copyAnchorAction = menu.addAction(tr("Copy Link"));
@@ -440,7 +429,7 @@ void TextBrowserHelpWidget::mouseReleaseEvent(QMouseEvent *e)
bool controlPressed = e->modifiers() & Qt::ControlModifier; bool controlPressed = e->modifiers() & Qt::ControlModifier;
const QString link = linkAt(e->pos()); const QString link = linkAt(e->pos());
if ((controlPressed || e->button() == Qt::MidButton) && link.isEmpty()) { if ((controlPressed || e->button() == Qt::MidButton) && link.isEmpty()) {
openLink(link, true/*newPage*/); emit m_parent->newPageRequested(QUrl(link));
return; return;
} }

View File

@@ -62,7 +62,6 @@ public:
bool isBackwardAvailable() const; bool isBackwardAvailable() const;
void addBackHistoryItems(QMenu *backMenu); void addBackHistoryItems(QMenu *backMenu);
void addForwardHistoryItems(QMenu *forwardMenu); void addForwardHistoryItems(QMenu *forwardMenu);
void setOpenInNewPageActionVisible(bool visible);
bool findText(const QString &text, Core::FindFlags flags, bool findText(const QString &text, Core::FindFlags flags,
bool incremental, bool fromSearch, bool *wrapped = 0); bool incremental, bool fromSearch, bool *wrapped = 0);
@@ -105,11 +104,9 @@ protected:
private: private:
QString linkAt(const QPoint& pos); QString linkAt(const QPoint& pos);
void openLink(const QUrl &url, bool newPage);
int zoomCount; int zoomCount;
bool forceFont; bool forceFont;
bool m_openInNewPageActionVisible;
TextBrowserHelpViewer *m_parent; TextBrowserHelpViewer *m_parent;
friend class Help::Internal::TextBrowserHelpViewer; friend class Help::Internal::TextBrowserHelpViewer;
}; };

View File

@@ -25,6 +25,7 @@
#include "webenginehelpviewer.h" #include "webenginehelpviewer.h"
#include "helpconstants.h"
#include "localhelpmanager.h" #include "localhelpmanager.h"
#include "openpagesmanager.h" #include "openpagesmanager.h"
@@ -34,6 +35,7 @@
#include <QContextMenuEvent> #include <QContextMenuEvent>
#include <QCoreApplication> #include <QCoreApplication>
#include <QVBoxLayout> #include <QVBoxLayout>
#include <QWebEngineContextMenuData>
#include <QWebEngineHistory> #include <QWebEngineHistory>
#include <QWebEngineProfile> #include <QWebEngineProfile>
#include <QWebEngineSettings> #include <QWebEngineSettings>
@@ -98,7 +100,7 @@ WebEngineHelpViewer::WebEngineHelpViewer(QWidget *parent) :
QAction* action = m_widget->pageAction(QWebEnginePage::OpenLinkInNewTab); QAction* action = m_widget->pageAction(QWebEnginePage::OpenLinkInNewTab);
action->setText(QCoreApplication::translate("HelpViewer", action->setText(QCoreApplication::translate("HelpViewer",
"Open Link as New Page")); Constants::TR_OPEN_LINK_AS_NEW_PAGE));
QWebEnginePage *viewPage = m_widget->page(); QWebEnginePage *viewPage = m_widget->page();
QTC_ASSERT(viewPage, return); QTC_ASSERT(viewPage, return);
@@ -202,11 +204,6 @@ void WebEngineHelpViewer::addForwardHistoryItems(QMenu *forwardMenu)
} }
} }
void WebEngineHelpViewer::setOpenInNewPageActionVisible(bool visible)
{
m_widget->setOpenInNewPageActionVisible(visible);
}
bool WebEngineHelpViewer::findText(const QString &text, Core::FindFlags flags, bool incremental, bool WebEngineHelpViewer::findText(const QString &text, Core::FindFlags flags, bool incremental,
bool fromSearch, bool *wrapped) bool fromSearch, bool *wrapped)
{ {
@@ -276,35 +273,55 @@ WebEngineHelpPage::WebEngineHelpPage(QObject *parent)
{ {
} }
#if QT_VERSION < QT_VERSION_CHECK(5, 7, 0)
QWebEnginePage *WebEngineHelpPage::createWindow(QWebEnginePage::WebWindowType) QWebEnginePage *WebEngineHelpPage::createWindow(QWebEnginePage::WebWindowType)
{ {
auto viewer = static_cast<WebEngineHelpViewer *>(OpenPagesManager::instance().createPage()); auto viewer = static_cast<WebEngineHelpViewer *>(OpenPagesManager::instance().createPage());
return viewer->page(); return viewer->page();
} }
#endif
WebView::WebView(QWidget *parent) WebView::WebView(WebEngineHelpViewer *viewer)
: QWebEngineView(parent) : QWebEngineView(viewer),
m_viewer(viewer)
{ {
} }
void WebView::setOpenInNewPageActionVisible(bool visible)
{
m_openInNewPageActionVisible = visible;
}
void WebView::contextMenuEvent(QContextMenuEvent *event) void WebView::contextMenuEvent(QContextMenuEvent *event)
{ {
QMenu *menu = page()->createStandardContextMenu(); QMenu *menu = page()->createStandardContextMenu();
if (m_openInNewPageActionVisible) { // insert Open as New Page etc if OpenLinkInThisWindow is also there
// insert Open In New Tab if OpenLinkInThisWindow is also there
const QList<QAction*> actions = menu->actions(); const QList<QAction*> actions = menu->actions();
auto it = std::find(actions.cbegin(), actions.cend(), page()->action(QWebEnginePage::OpenLinkInThisWindow)); auto it = std::find(actions.cbegin(), actions.cend(),
page()->action(QWebEnginePage::OpenLinkInThisWindow));
if (it != actions.cend()) { if (it != actions.cend()) {
// insert after // insert after
++it; ++it;
QAction *before = (it == actions.cend() ? 0 : *it); QAction *before = (it == actions.cend() ? 0 : *it);
menu->insertAction(before, page()->action(QWebEnginePage::OpenLinkInNewTab)); #if QT_VERSION < QT_VERSION_CHECK(5, 7, 0)
if (m_viewer->isActionVisible(HelpViewer::Action::NewPage)) {
QAction *openLinkInNewTab = page()->action(QWebEnginePage::OpenLinkInNewTab);
menu->insertAction(before, openLinkInNewTab);
} }
#else
QUrl url = page()->contextMenuData().linkUrl();
if (m_viewer->isActionVisible(HelpViewer::Action::NewPage)) {
auto openLink = new QAction(QCoreApplication::translate("HelpViewer",
Constants::TR_OPEN_LINK_IN_NEW_PAGE), menu);
connect(openLink, &QAction::triggered, m_viewer, [this, url] {
m_viewer->newPageRequested(url);
});
menu->insertAction(before, openLink);
}
if (m_viewer->isActionVisible(HelpViewer::Action::ExternalWindow)) {
auto openLink = new QAction(QCoreApplication::translate("HelpViewer",
Constants::TR_OPEN_LINK_IN_WINDOW), menu);
connect(openLink, &QAction::triggered, m_viewer, [this, url] {
m_viewer->externalPageRequested(url);
});
menu->insertAction(before, openLink);
}
#endif
} }
connect(menu, &QMenu::aboutToHide, menu, &QObject::deleteLater); connect(menu, &QMenu::aboutToHide, menu, &QObject::deleteLater);

View File

@@ -33,6 +33,8 @@
namespace Help { namespace Help {
namespace Internal { namespace Internal {
class WebEngineHelpViewer;
class HelpUrlSchemeHandler : public QWebEngineUrlSchemeHandler class HelpUrlSchemeHandler : public QWebEngineUrlSchemeHandler
{ {
public: public:
@@ -44,21 +46,21 @@ class WebEngineHelpPage : public QWebEnginePage
{ {
public: public:
explicit WebEngineHelpPage(QObject *parent = 0); explicit WebEngineHelpPage(QObject *parent = 0);
#if QT_VERSION < QT_VERSION_CHECK(5, 7, 0)
QWebEnginePage *createWindow(QWebEnginePage::WebWindowType) override; QWebEnginePage *createWindow(QWebEnginePage::WebWindowType) override;
#endif
}; };
class WebView : public QWebEngineView class WebView : public QWebEngineView
{ {
public: public:
explicit WebView(QWidget *parent = 0); explicit WebView(WebEngineHelpViewer *viewer);
void setOpenInNewPageActionVisible(bool visible);
protected: protected:
void contextMenuEvent(QContextMenuEvent *event) override; void contextMenuEvent(QContextMenuEvent *event) override;
private: private:
bool m_openInNewPageActionVisible = true; WebEngineHelpViewer *m_viewer;
}; };
class WebEngineHelpViewer : public HelpViewer class WebEngineHelpViewer : public HelpViewer
@@ -80,7 +82,6 @@ public:
bool isBackwardAvailable() const override; bool isBackwardAvailable() const override;
void addBackHistoryItems(QMenu *backMenu) override; void addBackHistoryItems(QMenu *backMenu) override;
void addForwardHistoryItems(QMenu *forwardMenu) override; void addForwardHistoryItems(QMenu *forwardMenu) override;
void setOpenInNewPageActionVisible(bool visible) override;
bool findText(const QString &text, Core::FindFlags flags, bool incremental, bool fromSearch, bool *wrapped) override; bool findText(const QString &text, Core::FindFlags flags, bool incremental, bool fromSearch, bool *wrapped) override;
WebEngineHelpPage *page() const; WebEngineHelpPage *page() const;