/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the examples of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef TABWIDGET_H#define TABWIDGET_H#include <QtWebEngineWidgets/QWebEngineFullScreenRequest>#include <QtWidgets/QTabBar>#include <QtWidgets/QShortcut>classQWebEngineDownloadItem;
classQWebEngineProfile;
classQWebEngineView;
/*
Tab bar with a few more features such as a context menu and shortcuts
*/class TabBar : publicQTabBar
{
Q_OBJECT
signals:
void newTab();
void cloneTab(int index);
void closeTab(int index);
void closeOtherTabs(int index);
void reloadTab(int index);
void muteTab(int index, bool mute);
void reloadAllTabs();
void tabMoveRequested(int fromIndex,int toIndex);
public:
TabBar(QWidget*parent =0);
protected:
void mousePressEvent(QMouseEvent* event);
void mouseMoveEvent(QMouseEvent* event);
privateslots:
void selectTabAction();
void cloneTab();
void closeTab();
void closeOtherTabs();
void reloadTab();
void muteTab();
void unmuteTab();
void contextMenuRequested(constQPoint&position);
private:
QList<QShortcut*> m_tabShortcuts;
friendclass TabWidget;
QPoint m_dragStartPos;
int m_dragCurrentIndex;
};
#include <QWebEnginePage>classQAction;
class WebView;
/*!
A proxy object that connects a single browser action
to one child webpage action at a time.
Example usage: used to keep the main window stop action in sync with
the current tabs webview's stop action.
*/class WebActionMapper : publicQObject
{
Q_OBJECT
public:
WebActionMapper(QAction*root,QWebEnginePage::WebAction webAction,QObject*parent);
QWebEnginePage::WebAction webAction() const;
void addChild(QAction*action);
void updateCurrent(QWebEnginePage*currentParent);
privateslots:
void rootTriggered();
void childChanged();
void rootDestroyed();
void currentDestroyed();
private:
QWebEnginePage*m_currentParent;
QAction*m_root;
QWebEnginePage::WebAction m_webAction;
};
#include <QtCore/QUrl>#include <QtWidgets/QTabWidget>class FullScreenNotification;
classQCompleter;
classQLineEdit;
classQMenu;
classQStackedWidget;
/*!
TabWidget that contains WebViews and a stack widget of associated line edits.
Connects up the current tab's signals to this class's signal and uses WebActionMapper
to proxy the actions.
*/class TabWidget : publicQTabWidget
{
Q_OBJECT
signals:
// tab widget signalsvoid loadPage(constQString&url);
void tabsChanged();
void lastTabClosed();
// current tab signalsvoid setCurrentTitle(constQString&url);
void showStatusBarMessage(constQString&message);
void linkHovered(constQString&link);
void loadProgress(int progress);
void geometryChangeRequested(constQRect&geometry);
void menuBarVisibilityChangeRequested(bool visible);
void statusBarVisibilityChangeRequested(bool visible);
void toolBarVisibilityChangeRequested(bool visible);
#if defined(QWEBENGINEPAGE_PRINTREQUESTED)void printRequested(QWebEngineFrame*frame);
#endifpublic:
TabWidget(QWidget*parent =0);
~TabWidget();
void clear();
void addWebAction(QAction*action,QWebEnginePage::WebAction webAction);
QAction*newTabAction() const;
QAction*closeTabAction() const;
QAction*recentlyClosedTabsAction() const;
QAction*nextTabAction() const;
QAction*previousTabAction() const;
QWidget*lineEditStack() const;
QLineEdit*currentLineEdit() const;
WebView *currentWebView() const;
WebView *webView(int index) const;
QLineEdit*lineEdit(int index) const;
int webViewIndex(WebView *webView) const;
QByteArray saveState() const;
bool restoreState(constQByteArray&state);
void setProfile(QWebEngineProfile*profile);
protected:
void mouseDoubleClickEvent(QMouseEvent*event);
void contextMenuEvent(QContextMenuEvent*event);
void mouseReleaseEvent(QMouseEvent*event);
publicslots:
void loadUrlInCurrentTab(constQUrl&url);
WebView *newTab(bool makeCurrent =true);
void cloneTab(int index =-1);
void requestCloseTab(int index =-1);
void closeTab(int index);
void closeOtherTabs(int index);
void reloadTab(int index =-1);
void reloadAllTabs();
void nextTab();
void previousTab();
void setAudioMutedForTab(int index, bool mute);
privateslots:
void currentChanged(int index);
void aboutToShowRecentTabsMenu();
void aboutToShowRecentTriggeredAction(QAction*action);
void downloadRequested(QWebEngineDownloadItem*download);
void webViewLoadStarted();
void webViewIconChanged(constQIcon&icon);
void webViewTitleChanged(constQString&title);
void webViewUrlChanged(constQUrl&url);
void lineEditReturnPressed();
void windowCloseRequested();
void moveTab(int fromIndex,int toIndex);
void fullScreenRequested(QWebEngineFullScreenRequest request);
void handleTabBarDoubleClicked(int index);
void webPageMutedOrAudibleChanged();
private:
void setupPage(QWebEnginePage* page);
QAction*m_recentlyClosedTabsAction;
QAction*m_newTabAction;
QAction*m_closeTabAction;
QAction*m_nextTabAction;
QAction*m_previousTabAction;
QMenu*m_recentlyClosedTabsMenu;
staticconstint m_recentlyClosedTabsSize =10;
QList<QUrl> m_recentlyClosedTabs;
QList<WebActionMapper*> m_actions;
QCompleter*m_lineEditCompleter;
QStackedWidget*m_lineEdits;
TabBar *m_tabBar;
QWebEngineProfile*m_profile;
QWebEngineView*m_fullScreenView;
FullScreenNotification *m_fullScreenNotification;
QRect m_oldWindowGeometry;
};
#endif // TABWIDGET_H