/**************************************************************************** ** ** Copyright (C) 2015 The Qt Company Ltd. ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the demonstration applications of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** 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 http://www.qt.io/terms-conditions. For further ** information use the contact form at http://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** As a special exception, The Qt Company gives you certain additional ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $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 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); private slots: void selectTabAction(); void cloneTab(); void closeTab(); void closeOtherTabs(); void reloadTab(); void muteTab(); void unmuteTab(); 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 QT_BEGIN_NAMESPACE class FullScreenNotification; 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(); void setAudioMutedForTab(int index, bool mute); 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 webPageMutedOrAudibleChanged(); private: 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