/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** 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 #include #include QT_BEGIN_NAMESPACE class QWebEngineDownloadItem; class QWebEngineProfile; class QWebEngineView; QT_END_NAMESPACE /* Tab bar with a few more features such as a context menu and shortcuts */ class TabBar : public QTabBar { Q_OBJECT signals: void newTab(); void cloneTab(int index); void closeTab(int index); void closeOtherTabs(int index); void reloadTab(int index); void reloadAllTabs(); void tabMoveRequested(int fromIndex, int toIndex); public: TabBar(QWidget *parent = 0); protected: void mousePressEvent(QMouseEvent* event); void mouseMoveEvent(QMouseEvent* event); private slots: void selectTabAction(); void cloneTab(); void closeTab(); void closeOtherTabs(); void reloadTab(); void contextMenuRequested(const QPoint &position); private: QList m_tabShortcuts; friend class TabWidget; QPoint m_dragStartPos; int m_dragCurrentIndex; }; #include QT_BEGIN_NAMESPACE class QAction; QT_END_NAMESPACE 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 : public QObject { Q_OBJECT public: WebActionMapper(QAction *root, QWebEnginePage::WebAction webAction, QObject *parent); QWebEnginePage::WebAction webAction() const; void addChild(QAction *action); void updateCurrent(QWebEnginePage *currentParent); private slots: void rootTriggered(); void childChanged(); void rootDestroyed(); void currentDestroyed(); private: QWebEnginePage *m_currentParent; QAction *m_root; QWebEnginePage::WebAction m_webAction; }; #include #include class FullScreenNotification; QT_BEGIN_NAMESPACE class QCompleter; class QLineEdit; class QMenu; class QStackedWidget; QT_END_NAMESPACE /*! 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 : public QTabWidget { Q_OBJECT signals: // tab widget signals void loadPage(const QString &url); void tabsChanged(); void lastTabClosed(); // current tab signals void setCurrentTitle(const QString &url); void showStatusBarMessage(const QString &message); void linkHovered(const QString &link); void loadProgress(int progress); void geometryChangeRequested(const QRect &geometry); void menuBarVisibilityChangeRequested(bool visible); void statusBarVisibilityChangeRequested(bool visible); void toolBarVisibilityChangeRequested(bool visible); #if defined(QWEBENGINEPAGE_PRINTREQUESTED) void printRequested(QWebEngineFrame *frame); #endif public: 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(const QByteArray &state); void setProfile(QWebEngineProfile *profile); protected: void mouseDoubleClickEvent(QMouseEvent *event); void contextMenuEvent(QContextMenuEvent *event); void mouseReleaseEvent(QMouseEvent *event); public slots: void loadUrlInCurrentTab(const QUrl &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(); private slots: void currentChanged(int index); void aboutToShowRecentTabsMenu(); void aboutToShowRecentTriggeredAction(QAction *action); void downloadRequested(QWebEngineDownloadItem *download); void webViewLoadStarted(); void webViewIconChanged(); void webViewTitleChanged(const QString &title); void webViewUrlChanged(const QUrl &url); void lineEditReturnPressed(); void windowCloseRequested(); void moveTab(int fromIndex, int toIndex); void fullScreenRequested(QWebEngineFullScreenRequest request); void handleTabBarDoubleClicked(int index); private: void setupPage(QWebEnginePage* page); QAction *m_recentlyClosedTabsAction; QAction *m_newTabAction; QAction *m_closeTabAction; QAction *m_nextTabAction; QAction *m_previousTabAction; QMenu *m_recentlyClosedTabsMenu; static const int m_recentlyClosedTabsSize = 10; QList m_recentlyClosedTabs; QList m_actions; QCompleter *m_lineEditCompleter; QStackedWidget *m_lineEdits; TabBar *m_tabBar; QWebEngineProfile *m_profile; QWebEngineView *m_fullScreenView; FullScreenNotification *m_fullScreenNotification; }; #endif // TABWIDGET_H