1 /* ============================================================ 2 * Falkon - Qt web browser 3 * Copyright (C) 2010-2018 David Rosca <nowrep@gmail.com> 4 * 5 * This program is free software: you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation, either version 3 of the License, or 8 * (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program. If not, see <http://www.gnu.org/licenses/>. 17 * ============================================================ */ 18 #ifndef TABWIDGET_H 19 #define TABWIDGET_H 20 21 #include <QMenu> 22 #include <QPointer> 23 24 #include "tabstackedwidget.h" 25 #include "toolbutton.h" 26 #include "loadrequest.h" 27 #include "webtab.h" 28 #include "qzcommon.h" 29 30 class QMenu; 31 32 class TabBar; 33 class TabIcon; 34 class TabWidget; 35 class BrowserWindow; 36 class TabbedWebView; 37 class ClosedTabsManager; 38 39 class FALKON_EXPORT AddTabButton : public ToolButton 40 { 41 public: 42 explicit AddTabButton(TabWidget* tabWidget, TabBar* tabBar); 43 44 private: 45 void wheelEvent(QWheelEvent* event) override; 46 void mouseReleaseEvent(QMouseEvent* event) override; 47 48 TabBar* m_tabBar; 49 TabWidget* m_tabWidget; 50 }; 51 52 class FALKON_EXPORT MenuTabs : public QMenu 53 { 54 Q_OBJECT 55 public: QMenu(parent)56 explicit MenuTabs(QWidget* parent = 0) : QMenu(parent) {} 57 58 Q_SIGNALS: 59 void closeTab(int); 60 61 private: 62 void mouseReleaseEvent(QMouseEvent* event) override; 63 }; 64 65 class FALKON_EXPORT TabWidget : public TabStackedWidget 66 { 67 Q_OBJECT 68 public: 69 explicit TabWidget(BrowserWindow *window, QWidget *parent = nullptr); 70 ~TabWidget(); 71 72 BrowserWindow *browserWindow() const; 73 74 bool restoreState(const QVector<WebTab::SavedTab> &tabs, int currentTab); 75 76 void setCurrentIndex(int index); 77 78 void nextTab(); 79 void previousTab(); 80 void currentTabChanged(int index); 81 82 int normalTabsCount() const; 83 int pinnedTabsCount() const; 84 int extraReservedWidth() const; 85 86 WebTab *webTab(int index = -1) const; 87 88 TabBar* tabBar() const; 89 ClosedTabsManager* closedTabsManager() const; 90 QList<WebTab*> allTabs(bool withPinned = true); 91 bool canRestoreTab() const; 92 bool isCurrentTabFresh() const; 93 void setCurrentTabFresh(bool currentTabFresh); 94 95 QStackedWidget* locationBars() const; 96 ToolButton* buttonClosedTabs() const; 97 AddTabButton* buttonAddTab() const; 98 99 void moveTab(int from, int to); 100 int pinUnPinTab(int index, const QString &title = QString()); 101 102 void detachTab(WebTab* tab); 103 104 public Q_SLOTS: 105 int addView(const LoadRequest &req, const Qz::NewTabPositionFlags &openFlags, bool selectLine = false, bool pinned = false); 106 int addView(const LoadRequest &req, const QString &title = tr("New tab"), const Qz::NewTabPositionFlags &openFlags = Qz::NT_SelectedTab, bool selectLine = false, int position = -1, bool pinned = false); 107 int addView(WebTab *tab, const Qz::NewTabPositionFlags &openFlags); 108 int insertView(int index, WebTab *tab, const Qz::NewTabPositionFlags &openFlags); 109 110 void addTabFromClipboard(); 111 int duplicateTab(int index); 112 113 // Force close tab 114 void closeTab(int index = -1); 115 // Request close tab (may be rejected) 116 void requestCloseTab(int index = -1); 117 118 void reloadTab(int index); 119 void reloadAllTabs(); 120 void stopTab(int index); 121 void closeAllButCurrent(int index); 122 void closeToRight(int index); 123 void closeToLeft(int index); 124 void detachTab(int index); 125 void loadTab(int index); 126 void unloadTab(int index); 127 void restoreClosedTab(QObject* obj = 0); 128 void restoreAllClosedTabs(); 129 void clearClosedTabsList(); 130 131 void moveAddTabButton(int posX); 132 133 void tabBarOverFlowChanged(bool overflowed); 134 135 Q_SIGNALS: 136 void changed(); 137 void tabInserted(int index); 138 void tabRemoved(int index); 139 void tabMoved(int from, int to); 140 141 private Q_SLOTS: 142 void loadSettings(); 143 144 void aboutToShowTabsMenu(); 145 void aboutToShowClosedTabsMenu(); 146 147 void actionChangeIndex(); 148 void tabWasMoved(int before, int after); 149 150 private: 151 WebTab* weTab() const; 152 WebTab* weTab(int index) const; 153 TabIcon* tabIcon(int index) const; 154 155 bool validIndex(int index) const; 156 void updateClosedTabsButton(); 157 158 void keyPressEvent(QKeyEvent *event) override; 159 void keyReleaseEvent(QKeyEvent *event) override; 160 161 BrowserWindow* m_window; 162 TabBar* m_tabBar; 163 QStackedWidget* m_locationBars; 164 ClosedTabsManager* m_closedTabsManager; 165 166 MenuTabs* m_menuTabs; 167 ToolButton* m_buttonListTabs; 168 QMenu* m_menuClosedTabs; 169 ToolButton* m_buttonClosedTabs; 170 AddTabButton* m_buttonAddTab; 171 AddTabButton* m_buttonAddTab2; 172 173 QPointer<WebTab> m_lastBackgroundTab; 174 175 bool m_dontCloseWithOneTab; 176 bool m_showClosedTabsButton; 177 bool m_newTabAfterActive; 178 bool m_newEmptyTabAfterActive; 179 QUrl m_urlOnNewTab; 180 181 bool m_currentTabFresh; 182 bool m_blockTabMovedSignal = false; 183 }; 184 185 #endif // TABWIDGET_H 186