Falkon Develop
Cross-platform Qt-based web browser
tabwidget.cpp
Go to the documentation of this file.
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#include "tabwidget.h"
19#include "tabbar.h"
20#include "tabbedwebview.h"
21#include "webpage.h"
22#include "browserwindow.h"
23#include "mainapplication.h"
24#include "clickablelabel.h"
25#include "closedtabsmanager.h"
26#include "locationbar.h"
27#include "settings.h"
28#include "datapaths.h"
29#include "qzsettings.h"
30#include "qztools.h"
31#include "tabicon.h"
32#include "pluginproxy.h"
33
34#include <QFile>
35#include <QTimer>
36#include <QMimeData>
37#include <QStackedWidget>
38#include <QMouseEvent>
39#include <QWebEngineHistory>
40#include <QClipboard>
41
43 : ToolButton(tabBar)
44 , m_tabBar(tabBar)
45 , m_tabWidget(tabWidget)
46{
47 setObjectName("tabwidget-button-addtab");
48 setAutoRaise(true);
49 setFocusPolicy(Qt::NoFocus);
50 setAcceptDrops(true);
51 setToolTip(TabWidget::tr("New Tab"));
52}
53
54void AddTabButton::wheelEvent(QWheelEvent* event)
55{
56 m_tabBar->wheelEvent(event);
57}
58
59void AddTabButton::mouseReleaseEvent(QMouseEvent* event)
60{
61 if (event->button() == Qt::MiddleButton && rect().contains(event->position().toPoint())) {
62 m_tabWidget->addTabFromClipboard();
63 }
64
66}
67
68void MenuTabs::mouseReleaseEvent(QMouseEvent* event)
69{
70 if (event->button() == Qt::MiddleButton) {
71 QAction* action = actionAt(event->position().toPoint());
72 if (action && action->isEnabled()) {
73 auto* tab = qobject_cast<WebTab*>(qvariant_cast<QWidget*>(action->data()));
74 if (tab) {
75 Q_EMIT closeTab(tab->tabIndex());
76 action->setEnabled(false);
77 event->accept();
78 }
79 }
80 }
81 QMenu::mouseReleaseEvent(event);
82}
83
84TabWidget::TabWidget(BrowserWindow *window, QWidget *parent)
85 : TabStackedWidget(parent)
86 , m_window(window)
87 , m_locationBars(new QStackedWidget)
88 , m_closedTabsManager(new ClosedTabsManager)
89{
90 setObjectName(QSL("tabwidget"));
91
92 m_tabBar = new TabBar(m_window, this);
93 setTabBar(m_tabBar);
94
97
99 connect(m_tabBar, &TabBar::tabMoved, this, &TabWidget::tabWasMoved);
100
101 connect(m_tabBar, &TabBar::moveAddTabButton, this, &TabWidget::moveAddTabButton);
102
103 connect(mApp, &MainApplication::settingsReloaded, this, &TabWidget::loadSettings);
104
105 m_menuTabs = new MenuTabs(this);
106 connect(m_menuTabs, &MenuTabs::closeTab, this, &TabWidget::requestCloseTab);
107
108 m_menuClosedTabs = new QMenu(this);
109
110 // AddTab button displayed next to last tab
111 m_buttonAddTab = new AddTabButton(this, m_tabBar);
112 m_buttonAddTab->setProperty("outside-tabbar", false);
113 connect(m_buttonAddTab, &QAbstractButton::clicked, m_window, &BrowserWindow::addTab);
114
115 // AddTab button displayed outside tabbar (as corner widget)
116 m_buttonAddTab2 = new AddTabButton(this, m_tabBar);
117 m_buttonAddTab2->setProperty("outside-tabbar", true);
118 m_buttonAddTab2->hide();
119 connect(m_buttonAddTab2, &QAbstractButton::clicked, m_window, &BrowserWindow::addTab);
120
121 // ClosedTabs button displayed as a permanent corner widget
122 m_buttonClosedTabs = new ToolButton(m_tabBar);
123 m_buttonClosedTabs->setObjectName("tabwidget-button-closedtabs");
124 m_buttonClosedTabs->setMenu(m_menuClosedTabs);
125 m_buttonClosedTabs->setPopupMode(QToolButton::InstantPopup);
126 m_buttonClosedTabs->setToolTip(tr("Closed tabs"));
127 m_buttonClosedTabs->setAutoRaise(true);
128 m_buttonClosedTabs->setFocusPolicy(Qt::NoFocus);
129 m_buttonClosedTabs->setShowMenuInside(true);
130 connect(m_buttonClosedTabs, &ToolButton::aboutToShowMenu, this, &TabWidget::aboutToShowClosedTabsMenu);
131
132 // ListTabs button is showed only when tabbar overflows
133 m_buttonListTabs = new ToolButton(m_tabBar);
134 m_buttonListTabs->setObjectName("tabwidget-button-opentabs");
135 m_buttonListTabs->setMenu(m_menuTabs);
136 m_buttonListTabs->setPopupMode(QToolButton::InstantPopup);
137 m_buttonListTabs->setToolTip(tr("List of tabs"));
138 m_buttonListTabs->setAutoRaise(true);
139 m_buttonListTabs->setFocusPolicy(Qt::NoFocus);
140 m_buttonListTabs->setShowMenuInside(true);
141 m_buttonListTabs->hide();
142 connect(m_buttonListTabs, &ToolButton::aboutToShowMenu, this, &TabWidget::aboutToShowTabsMenu);
143
144 m_tabBar->addCornerWidget(m_buttonAddTab2, Qt::TopRightCorner);
145 m_tabBar->addCornerWidget(m_buttonClosedTabs, Qt::TopRightCorner);
146 m_tabBar->addCornerWidget(m_buttonListTabs, Qt::TopRightCorner);
148
149 loadSettings();
150}
151
153{
154 return m_window;
155}
156
157void TabWidget::loadSettings()
158{
159 Settings settings;
160 settings.beginGroup(QSL("Browser-Tabs-Settings"));
161 m_dontCloseWithOneTab = settings.value(QSL("dontCloseWithOneTab"), false).toBool();
162 m_showClosedTabsButton = settings.value(QSL("showClosedTabsButton"), false).toBool();
163 m_newTabAfterActive = settings.value(QSL("newTabAfterActive"), true).toBool();
164 m_newEmptyTabAfterActive = settings.value(QSL("newEmptyTabAfterActive"), false).toBool();
165 settings.endGroup();
166
167 settings.beginGroup(QSL("Web-URL-Settings"));
168 m_urlOnNewTab = settings.value(QSL("newTabUrl"), QSL("falkon:speeddial")).toUrl();
169 settings.endGroup();
170
171 m_tabBar->loadSettings();
172
173 updateClosedTabsButton();
174}
175
176WebTab* TabWidget::weTab() const
177{
178 return weTab(currentIndex());
179}
180
181WebTab* TabWidget::weTab(int index) const
182{
183 return qobject_cast<WebTab*>(widget(index));
184}
185
186TabIcon* TabWidget::tabIcon(int index) const
187{
188 return weTab(index)->tabIcon();
189}
190
191bool TabWidget::validIndex(int index) const
192{
193 return index >= 0 && index < count();
194}
195
196void TabWidget::updateClosedTabsButton()
197{
198 m_buttonClosedTabs->setVisible(m_showClosedTabsButton && canRestoreTab());
199}
200
201void TabWidget::keyPressEvent(QKeyEvent *event)
202{
203 if (mApp->plugins()->processKeyPress(Qz::ON_TabWidget, this, event)) {
204 return;
205 }
206
208}
209
210void TabWidget::keyReleaseEvent(QKeyEvent *event)
211{
212 if (mApp->plugins()->processKeyRelease(Qz::ON_TabWidget, this, event)) {
213 return;
214 }
215
216 TabStackedWidget::keyReleaseEvent(event);
217}
218
220{
221 return m_currentTabFresh;
222}
223
224void TabWidget::setCurrentTabFresh(bool currentTabFresh)
225{
226 m_currentTabFresh = currentTabFresh;
227}
228
230{
231 // Show buttons inside tabbar
232 m_buttonAddTab->setVisible(!overflowed);
233
234 // Show buttons displayed outside tabbar (corner widgets)
235 m_buttonAddTab2->setVisible(overflowed);
236 m_buttonListTabs->setVisible(overflowed);
237}
238
240{
241 int posY = (m_tabBar->height() - m_buttonAddTab->height()) / 2;
242
243 if (QApplication::layoutDirection() == Qt::RightToLeft) {
244 posX = qMax(posX - m_buttonAddTab->width(), 0);
245 }
246 else {
247 posX = qMin(posX, m_tabBar->width() - m_buttonAddTab->width());
248 }
249
250 m_buttonAddTab->move(posX, posY);
251}
252
253void TabWidget::aboutToShowTabsMenu()
254{
255 m_menuTabs->clear();
256
257 for (int i = 0; i < count(); i++) {
258 WebTab* tab = weTab(i);
259 if (!tab || tab->isPinned()) {
260 continue;
261 }
262
263 auto* action = new QAction(this);
264 action->setIcon(tab->icon());
265
266 if (i == currentIndex()) {
267 QFont f = action->font();
268 f.setBold(true);
269 action->setFont(f);
270 }
271
272 QString title = tab->title();
273 title.replace(QLatin1Char('&'), QLatin1String("&&"));
274 action->setText(QzTools::truncatedText(title, 40));
275
276 action->setData(QVariant::fromValue(qobject_cast<QWidget*>(tab)));
277 connect(action, &QAction::triggered, this, &TabWidget::actionChangeIndex);
278 m_menuTabs->addAction(action);
279 }
280}
281
282void TabWidget::aboutToShowClosedTabsMenu()
283{
284 m_menuClosedTabs->clear();
285
286 const auto closedTabs = closedTabsManager()->closedTabs();
287 for (int i = 0; i < closedTabs.count(); ++i) {
288 const ClosedTabsManager::Tab tab = closedTabs.at(i);
289 const QString title = QzTools::truncatedText(tab.tabState.title, 40);
290 m_menuClosedTabs->addAction(tab.tabState.icon, title, this, SLOT(restoreClosedTab()))->setData(i);
291 }
292
293 if (m_menuClosedTabs->isEmpty()) {
294 m_menuClosedTabs->addAction(tr("Empty"))->setEnabled(false);
295 }
296 else {
297 m_menuClosedTabs->addSeparator();
298 m_menuClosedTabs->addAction(tr("Restore All Closed Tabs"), this, &TabWidget::restoreAllClosedTabs);
299 m_menuClosedTabs->addAction(QIcon::fromTheme(QSL("edit-clear")), tr("Clear list"), this, &TabWidget::clearClosedTabsList);
300 }
301}
302
303void TabWidget::actionChangeIndex()
304{
305 if (auto* action = qobject_cast<QAction*>(sender())) {
306 auto* tab = qobject_cast<WebTab*>(qvariant_cast<QWidget*>(action->data()));
307 if (tab) {
308 m_tabBar->ensureVisible(tab->tabIndex());
309 setCurrentIndex(tab->tabIndex());
310 }
311 }
312}
313
314int TabWidget::addView(const LoadRequest &req, const Qz::NewTabPositionFlags &openFlags, bool selectLine, bool pinned)
315{
316 return addView(req, QString(), openFlags, selectLine, -1, pinned);
317}
318
319int TabWidget::addView(const LoadRequest &req, const QString &title, const Qz::NewTabPositionFlags &openFlags, bool selectLine, int position, bool pinned)
320{
321 QUrl url = req.url();
322 m_currentTabFresh = false;
323
324 if (url.isEmpty() && !(openFlags & Qz::NT_CleanTab)) {
325 url = m_urlOnNewTab;
326 }
327
328 bool openAfterActive = m_newTabAfterActive && !(openFlags & Qz::NT_TabAtTheEnd);
329
330 if (openFlags == Qz::NT_SelectedNewEmptyTab && m_newEmptyTabAfterActive) {
331 openAfterActive = true;
332 }
333
334 if (openAfterActive && position == -1) {
335 // If we are opening newBgTab from pinned tab, make sure it won't be
336 // opened between other pinned tabs
337 if (openFlags & Qz::NT_NotSelectedTab && m_lastBackgroundTab) {
338 position = m_lastBackgroundTab->tabIndex() + 1;
339 }
340 else {
341 position = qMax(currentIndex() + 1, m_tabBar->pinnedTabsCount());
342 }
343 }
344
345 auto* webTab = new WebTab(m_window);
346 webTab->setPinned(pinned);
347 webTab->locationBar()->showUrl(url);
348 m_locationBars->addWidget(webTab->locationBar());
349
350 int index = insertTab(position == -1 ? count() : position, webTab, QString(), pinned);
351 webTab->attach(m_window);
352
353 if (!title.isEmpty()) {
354 m_tabBar->setTabText(index, title);
355 }
356
357 if (openFlags & Qz::NT_SelectedTab) {
358 setCurrentIndex(index);
359 } else {
360 m_lastBackgroundTab = webTab;
361 }
362
364 connect(webTab->webView(), &QWebEngineView::urlChanged, this, &TabWidget::changed);
365 connect(webTab->webView(), &TabbedWebView::ipChanged, m_window->ipLabel(), &QLabel::setText);
366 connect(webTab->webView(), &WebView::urlChanged, this, [this](const QUrl &url) {
367 if (url != m_urlOnNewTab)
368 m_currentTabFresh = false;
369 });
370
371 if (url.isValid() && url != req.url()) {
372 LoadRequest r(req);
373 r.setUrl(url);
374 webTab->webView()->load(r);
375 }
376 else if (req.url().isValid()) {
377 webTab->webView()->load(req);
378 }
379
380 if (selectLine && m_window->locationBar()->text().isEmpty()) {
381 m_window->locationBar()->setFocus();
382 }
383
384 // Make sure user notice opening new background tabs
385 if (!(openFlags & Qz::NT_SelectedTab)) {
386 m_tabBar->ensureVisible(index);
387 }
388
389 Q_EMIT changed();
390 Q_EMIT tabInserted(index);
391
392 return index;
393}
394
395int TabWidget::addView(WebTab *tab, const Qz::NewTabPositionFlags &openFlags)
396{
397 return insertView(count() + 1, tab, openFlags);
398}
399
400int TabWidget::insertView(int index, WebTab *tab, const Qz::NewTabPositionFlags &openFlags)
401{
402 m_locationBars->addWidget(tab->locationBar());
403 int newIndex = insertTab(index, tab, QString(), tab->isPinned());
404 tab->attach(m_window);
405
406 if (openFlags.testFlag(Qz::NT_SelectedTab)) {
407 setCurrentIndex(newIndex);
408 } else {
409 m_lastBackgroundTab = tab;
410 }
411
413 connect(tab->webView(), &QWebEngineView::urlChanged, this, &TabWidget::changed);
414 connect(tab->webView(), &TabbedWebView::ipChanged, m_window->ipLabel(), &QLabel::setText);
415
416 // Make sure user notice opening new background tabs
417 if (!(openFlags & Qz::NT_SelectedTab)) {
418 m_tabBar->ensureVisible(index);
419 }
420
421 Q_EMIT changed();
422 Q_EMIT tabInserted(newIndex);
423
424 return newIndex;
425}
426
428{
429 QString selectionClipboard = QApplication::clipboard()->text(QClipboard::Selection);
430 QUrl guessedUrl = QUrl::fromUserInput(selectionClipboard);
431
432 if (!guessedUrl.isEmpty()) {
434 }
435}
436
437void TabWidget::closeTab(int index)
438{
439 if (index == -1)
440 index = currentIndex();
441
442 WebTab *webTab = weTab(index);
443 if (!webTab || !validIndex(index))
444 return;
445
446 // This is already handled in requestCloseTab
447 if (count() <= 1) {
448 requestCloseTab(index);
449 return;
450 }
451
452 m_closedTabsManager->saveTab(webTab);
453
454 TabbedWebView *webView = webTab->webView();
455 m_locationBars->removeWidget(webView->webTab()->locationBar());
456 disconnect(webView, &TabbedWebView::wantsCloseTab, this, &TabWidget::closeTab);
457 disconnect(webView, &QWebEngineView::urlChanged, this, &TabWidget::changed);
458 disconnect(webView, &TabbedWebView::ipChanged, m_window->ipLabel(), &QLabel::setText);
459
460 m_lastBackgroundTab = nullptr;
461
462 webTab->detach();
463 webTab->deleteLater();
464
465 updateClosedTabsButton();
466
467 Q_EMIT changed();
468 Q_EMIT tabRemoved(index);
469}
470
472{
473 if (index == -1)
474 index = currentIndex();
475
476 WebTab *webTab = weTab(index);
477 if (!webTab || !validIndex(index))
478 return;
479
480 TabbedWebView *webView = webTab->webView();
481
482 // This would close last tab, so we close the window instead
483 if (count() <= 1) {
484 // If we are not closing window upon closing last tab, let's just load new-tab-url
485 if (m_dontCloseWithOneTab) {
486 // We don't want to accumulate more than one closed tab, if user tries
487 // to close the last tab multiple times
488 if (webView->url() != m_urlOnNewTab) {
489 m_closedTabsManager->saveTab(webTab);
490 }
491 webView->zoomReset();
492 webView->load(m_urlOnNewTab);
493 return;
494 }
495 m_window->close();
496 return;
497 }
498
499 webView->triggerPageAction(QWebEnginePage::RequestClose);
500}
501
503{
504 if (!validIndex(index))
505 return;
506
507 m_lastBackgroundTab = nullptr;
508 m_currentTabFresh = false;
509
510 if (!m_tabBar->isRestoring()) {
511 WebTab* webTab = weTab(index);
513
514 LocationBar* locBar = webTab->locationBar();
515
516 if (locBar && m_locationBars->indexOf(locBar) != -1) {
517 m_locationBars->setCurrentWidget(locBar);
518 }
519
520 m_window->currentTabChanged();
521 }
522
523 Q_EMIT changed();
524}
525
526void TabWidget::tabWasMoved(int before, int after)
527{
528 m_lastBackgroundTab = nullptr;
529
530 Q_EMIT changed();
531 if (!m_blockTabMovedSignal) {
532 Q_EMIT tabMoved(before, after);
533 }
534}
535
537{
539}
540
542{
544}
545
547{
548 setCurrentIndex(currentIndex() == 0 ? count() - 1 : currentIndex() - 1);
549}
550
552{
553 return m_tabBar->normalTabsCount();
554}
555
557{
558 return m_tabBar->pinnedTabsCount();
559}
560
561void TabWidget::reloadTab(int index)
562{
563 if (!validIndex(index)) {
564 return;
565 }
566
567 weTab(index)->reload();
568}
569
570WebTab *TabWidget::webTab(int index) const
571{
572 return index < 0 ? weTab() : weTab(index);
573}
574
576{
577 return m_buttonAddTab->width();
578}
579
581{
582 return m_tabBar;
583}
584
586{
587 return m_closedTabsManager;
588}
589
591{
592 for (int i = 0; i < count(); i++) {
593 reloadTab(i);
594 }
595}
596
597void TabWidget::stopTab(int index)
598{
599 if (!validIndex(index)) {
600 return;
601 }
602
603 weTab(index)->stop();
604}
605
607{
608 if (!validIndex(index)) {
609 return;
610 }
611
612 WebTab* akt = weTab(index);
613
614 const auto tabs = allTabs(false);
615 for (const WebTab* tab : tabs) {
616 int tabIndex = tab->tabIndex();
617 if (akt == widget(tabIndex)) {
618 continue;
619 }
620 requestCloseTab(tabIndex);
621 }
622}
623
625{
626 if (!validIndex(index)) {
627 return;
628 }
629
630 const auto tabs = allTabs(false);
631 for (const WebTab* tab : tabs) {
632 int tabIndex = tab->tabIndex();
633 if (index >= tabIndex) {
634 continue;
635 }
636 requestCloseTab(tabIndex);
637 }
638}
639
640
642{
643 if (!validIndex(index)) {
644 return;
645 }
646
647 const auto tabs = allTabs(false);
648 for (const WebTab* tab : tabs) {
649 int tabIndex = tab->tabIndex();
650 if (index <= tabIndex) {
651 continue;
652 }
653 requestCloseTab(tabIndex);
654 }
655}
656
657void TabWidget::moveTab(int from, int to)
658{
659 if (!validIndex(to) || from == to) {
660 return;
661 }
662 WebTab *tab = webTab(from);
663 if (!tab) {
664 return;
665 }
666 m_blockTabMovedSignal = true;
667 // (Un)pin tab when needed
668 if ((tab->isPinned() && to >= pinnedTabsCount()) || (!tab->isPinned() && to < pinnedTabsCount())) {
669 tab->togglePinned();
670 }
672 m_blockTabMovedSignal = false;
673 Q_EMIT tabMoved(from, to);
674}
675
676int TabWidget::pinUnPinTab(int index, const QString &title)
677{
678 const int newIndex = TabStackedWidget::pinUnPinTab(index, title);
679 if (index != newIndex && !m_blockTabMovedSignal) {
680 Q_EMIT tabMoved(index, newIndex);
681 }
682 return newIndex;
683}
684
686{
687 Q_ASSERT(tab);
688
689 if (count() == 1 && mApp->windowCount() == 1) {
690 return;
691 }
692
693 m_locationBars->removeWidget(tab->locationBar());
694 disconnect(tab->webView(), &TabbedWebView::wantsCloseTab, this, &TabWidget::closeTab);
695 disconnect(tab->webView(), &QWebEngineView::urlChanged, this, &TabWidget::changed);
696 disconnect(tab->webView(), &TabbedWebView::ipChanged, m_window->ipLabel(), &QLabel::setText);
697
698 const int index = tab->tabIndex();
699
700 tab->detach();
701 tab->setPinned(false);
702
703 Q_EMIT tabRemoved(index);
704
705 if (count() == 0) {
706 m_window->close();
707 }
708}
709
710void TabWidget::detachTab(int index)
711{
712 WebTab* tab = weTab(index);
713 Q_ASSERT(tab);
714
715 if (count() == 1 && mApp->windowCount() == 1) {
716 return;
717 }
718
719 detachTab(tab);
720
721 BrowserWindow* window = mApp->createWindow(Qz::BW_NewWindow);
722 window->setStartTab(tab);
723}
724
726{
727 if (!validIndex(index)) {
728 return -1;
729 }
730
731 WebTab* webTab = weTab(index);
732
733 int id = addView(QUrl(), webTab->title(), Qz::NT_CleanSelectedTab);
735 weTab(id)->setParentTab(webTab);
736
737 return id;
738}
739
740void TabWidget::loadTab(int index)
741{
742 if (!validIndex(index)) {
743 return;
744 }
745
746 weTab(index)->tabActivated();
747}
748
749void TabWidget::unloadTab(int index)
750{
751 if (!validIndex(index)) {
752 return;
753 }
754
755 weTab(index)->unload();
756}
757
759{
760 if (!obj) {
761 obj = sender();
762 }
763
764 if (!m_closedTabsManager->isClosedTabAvailable()) {
765 return;
766 }
767
769
770 auto* action = qobject_cast<QAction*>(obj);
771 if (action && action->data().toInt() != 0) {
772 tab = m_closedTabsManager->takeTabAt(action->data().toInt());
773 }
774 else {
775 tab = m_closedTabsManager->takeLastClosedTab();
776 }
777
778 if (tab.position < 0) {
779 return;
780 }
781
782 int index = addView(QUrl(), tab.tabState.title, Qz::NT_CleanSelectedTab, false, tab.position);
783 WebTab* webTab = weTab(index);
786
787 updateClosedTabsButton();
788}
789
791{
792 if (!m_closedTabsManager->isClosedTabAvailable()) {
793 return;
794 }
795
796 const auto closedTabs = m_closedTabsManager->closedTabs();
797 for (const ClosedTabsManager::Tab &tab : closedTabs) {
798 int index = addView(QUrl(), tab.tabState.title, Qz::NT_CleanSelectedTab);
799 WebTab* webTab = weTab(index);
802 }
803
805}
806
808{
809 m_closedTabsManager->clearClosedTabs();
810 updateClosedTabsButton();
811}
812
814{
815 return m_closedTabsManager->isClosedTabAvailable();
816}
817
818QStackedWidget* TabWidget::locationBars() const
819{
820 return m_locationBars;
821}
822
824{
825 return m_buttonClosedTabs;
826}
827
829{
830 return m_buttonAddTab;
831}
832
833QList<WebTab*> TabWidget::allTabs(bool withPinned)
834{
835 QList<WebTab*> allTabs;
836
837 for (int i = 0; i < count(); i++) {
838 WebTab* tab = weTab(i);
839 if (!tab || (!withPinned && tab->isPinned())) {
840 continue;
841 }
842 allTabs.append(tab);
843 }
844
845 return allTabs;
846}
847
848bool TabWidget::restoreState(const QVector<WebTab::SavedTab> &tabs, int currentTab)
849{
850 if (tabs.isEmpty()) {
851 return false;
852 }
853
854 m_tabBar->setIsRestoring(true);
855
856 QVector<QPair<WebTab*, QVector<int>>> childTabs;
857
858 for (int i = 0; i < tabs.size(); ++i) {
859 WebTab::SavedTab tab = tabs.at(i);
860 WebTab *webTab = weTab(addView(QUrl(), Qz::NT_CleanSelectedTab, false, tab.isPinned));
861 webTab->restoreTab(tab);
862 if (!tab.childTabs.isEmpty()) {
863 childTabs.append({webTab, tab.childTabs});
864 }
865 }
866
867 for (const auto &p : std::as_const(childTabs)) {
868 const auto indices = p.second;
869 for (int index : indices) {
870 WebTab *t = weTab(index);
871 if (t) {
872 p.first->addChildTab(t);
873 }
874 }
875 }
876
877 m_tabBar->setIsRestoring(false);
878
879 auto const l_allTabs = allTabs();
880 for (const WebTab* tab : l_allTabs) {
881 m_tabBar->setTabText(tab->tabIndex(), tab->title());
882 }
883
884 setCurrentIndex(currentTab);
885 currentTabChanged(currentTab);
886 QTimer::singleShot(0, m_tabBar, SLOT(ensureVisible(int,int)));
887
888 weTab()->tabActivated();
889
890 return true;
891}
892
894{
895 delete m_closedTabsManager;
896}
AddTabButton(TabWidget *tabWidget, TabBar *tabBar)
Definition: tabwidget.cpp:42
void setStartTab(WebTab *tab)
LocationBar * locationBar() const
QLabel * ipLabel() const
void currentTabChanged()
bool isClosedTabAvailable() const
Tab takeTabAt(int index)
void saveTab(WebTab *tab)
QVector< Tab > closedTabs() const
void tabCloseRequested(int index)
int normalTabsCount() const
void addCornerWidget(QWidget *widget, Qt::Corner corner)
void ensureVisible(int index=-1, int xmargin=-1)
int pinnedTabsCount() const
void overFlowChanged(bool overFlow)
void tabMoved(int from, int to)
QUrl url() const
Definition: loadrequest.cpp:44
void setUrl(const QUrl &url)
Definition: loadrequest.cpp:49
void showUrl(const QUrl &url)
void settingsReloaded()
void closeTab(int)
static QString truncatedText(const QString &text, int size)
Definition: qztools.cpp:458
void beginGroup(const QString &prefix)
Definition: settings.cpp:79
void endGroup()
Definition: settings.cpp:84
QVariant value(const QString &key, const QVariant &defaultValue=QVariant())
Definition: settings.cpp:74
Definition: tabbar.h:31
bool isRestoring()
Definition: tabbar.cpp:742
void wheelEvent(QWheelEvent *event) override
Definition: tabbar.cpp:595
void setTabText(int index, const QString &text)
Definition: tabbar.cpp:437
void loadSettings()
Definition: tabbar.cpp:126
void moveAddTabButton(int posX)
void setIsRestoring(bool restoring)
Definition: tabbar.cpp:737
int pinUnPinTab(int index, const QString &title=QString())
void keyPressEvent(QKeyEvent *event) override
int currentIndex() const
void setTabBar(ComboTabBar *tb)
void pinStateChanged(int index, bool pinned)
void setCurrentIndex(int index)
int insertTab(int index, QWidget *widget, const QString &label, bool pinned=false)
void moveTab(int from, int to)
QWidget * widget(int index) const
void requestCloseTab(int index=-1)
Definition: tabwidget.cpp:471
void setCurrentIndex(int index)
Definition: tabwidget.cpp:536
void restoreClosedTab(QObject *obj=nullptr)
Definition: tabwidget.cpp:758
WebTab * webTab(int index=-1) const
Definition: tabwidget.cpp:570
bool canRestoreTab() const
Definition: tabwidget.cpp:813
void changed()
void reloadAllTabs()
Definition: tabwidget.cpp:590
void unloadTab(int index)
Definition: tabwidget.cpp:749
~TabWidget() override
Definition: tabwidget.cpp:893
void previousTab()
Definition: tabwidget.cpp:546
TabBar * tabBar() const
Definition: tabwidget.cpp:580
void nextTab()
Definition: tabwidget.cpp:541
bool restoreState(const QVector< WebTab::SavedTab > &tabs, int currentTab)
Definition: tabwidget.cpp:848
void restoreAllClosedTabs()
Definition: tabwidget.cpp:790
int duplicateTab(int index)
Definition: tabwidget.cpp:725
void reloadTab(int index)
Definition: tabwidget.cpp:561
void closeToRight(int index)
Definition: tabwidget.cpp:624
int insertView(int index, WebTab *tab, const Qz::NewTabPositionFlags &openFlags)
Definition: tabwidget.cpp:400
void closeTab(int index=-1)
Definition: tabwidget.cpp:437
void currentTabChanged(int index)
Definition: tabwidget.cpp:502
void loadTab(int index)
Definition: tabwidget.cpp:740
void moveTab(int from, int to)
Definition: tabwidget.cpp:657
TabWidget(BrowserWindow *window, QWidget *parent=nullptr)
Definition: tabwidget.cpp:84
int pinUnPinTab(int index, const QString &title=QString())
Definition: tabwidget.cpp:676
void closeAllButCurrent(int index)
Definition: tabwidget.cpp:606
bool isCurrentTabFresh() const
Definition: tabwidget.cpp:219
void tabInserted(int index)
void tabRemoved(int index)
int addView(const LoadRequest &req, const Qz::NewTabPositionFlags &openFlags, bool selectLine=false, bool pinned=false)
Definition: tabwidget.cpp:314
int pinnedTabsCount() const
Definition: tabwidget.cpp:556
void clearClosedTabsList()
Definition: tabwidget.cpp:807
int normalTabsCount() const
Definition: tabwidget.cpp:551
QStackedWidget * locationBars() const
Definition: tabwidget.cpp:818
QList< WebTab * > allTabs(bool withPinned=true)
Definition: tabwidget.cpp:833
BrowserWindow * browserWindow() const
Definition: tabwidget.cpp:152
void closeToLeft(int index)
Definition: tabwidget.cpp:641
void tabBarOverFlowChanged(bool overflowed)
Definition: tabwidget.cpp:229
AddTabButton * buttonAddTab() const
Definition: tabwidget.cpp:828
void tabMoved(int from, int to)
void addTabFromClipboard()
Definition: tabwidget.cpp:427
void moveAddTabButton(int posX)
Definition: tabwidget.cpp:239
ClosedTabsManager * closedTabsManager() const
Definition: tabwidget.cpp:585
ToolButton * buttonClosedTabs() const
Definition: tabwidget.cpp:823
void setCurrentTabFresh(bool currentTabFresh)
Definition: tabwidget.cpp:224
void detachTab(WebTab *tab)
Definition: tabwidget.cpp:685
void stopTab(int index)
Definition: tabwidget.cpp:597
int extraReservedWidth() const
Definition: tabwidget.cpp:575
void ipChanged(const QString &)
void wantsCloseTab(int)
WebTab * webTab() const
void mouseReleaseEvent(QMouseEvent *e) override
Definition: toolbutton.cpp:203
void setMenu(QMenu *menu)
Definition: toolbutton.cpp:99
void setShowMenuInside(bool enable)
Definition: toolbutton.cpp:115
void aboutToShowMenu()
Definition: webtab.h:40
TabIcon * tabIcon() const
Definition: webtab.cpp:464
void setPinned(bool state)
Definition: webtab.cpp:419
int tabIndex() const
Definition: webtab.cpp:710
LocationBar * locationBar() const
Definition: webtab.cpp:459
void setParentTab(WebTab *tab)
Definition: webtab.cpp:474
QUrl url() const
Definition: webtab.cpp:263
void p_restoreTab(const SavedTab &tab)
Definition: webtab.cpp:597
void reload()
Definition: webtab.cpp:386
QString title(bool allowEmpty=false) const
Definition: webtab.cpp:276
void tabActivated()
Definition: webtab.cpp:630
void unload()
Definition: webtab.cpp:401
bool isPinned() const
Definition: webtab.cpp:414
TabbedWebView * webView() const
Definition: webtab.cpp:209
void togglePinned()
Definition: webtab.cpp:715
int zoomLevel() const
Definition: webtab.cpp:304
void stop()
Definition: webtab.cpp:381
void attach(BrowserWindow *window)
Definition: webtab.cpp:345
QIcon icon(bool allowNull=false) const
Definition: webtab.cpp:286
void restoreTab(const SavedTab &tab)
Definition: webtab.cpp:553
void detach()
Definition: webtab.cpp:314
QByteArray historyData() const
Definition: webtab.cpp:368
void zoomReset()
Definition: webview.cpp:314
void load(const QUrl &url)
Definition: webview.cpp:177
#define mApp
@ ON_TabWidget
Definition: qzcommon.h:92
@ BW_NewWindow
Definition: qzcommon.h:67
@ NT_CleanSelectedTab
Definition: qzcommon.h:107
@ NT_SelectedTab
Definition: qzcommon.h:97
@ NT_SelectedNewEmptyTab
Definition: qzcommon.h:103
@ NT_TabAtTheEnd
Definition: qzcommon.h:100
@ NT_CleanTab
Definition: qzcommon.h:99
@ NT_NotSelectedTab
Definition: qzcommon.h:98
t
Definition: i18n.py:27
i
Definition: i18n.py:23
#define QSL(x)
Definition: qzcommon.h:40
QPointer< WebTab > parentTab
WebTab::SavedTab tabState
QVector< int > childTabs
Definition: webtab.h:51
QString title
Definition: webtab.h:44
QIcon icon
Definition: webtab.h:46
bool isPinned
Definition: webtab.h:48