37#include <QStackedWidget>
39#include <QWebEngineHistory>
45 , m_tabWidget(tabWidget)
47 setObjectName(
"tabwidget-button-addtab");
49 setFocusPolicy(Qt::NoFocus);
51 setToolTip(TabWidget::tr(
"New Tab"));
54void AddTabButton::wheelEvent(QWheelEvent* event)
59void AddTabButton::mouseReleaseEvent(QMouseEvent* event)
61 if (event->button() == Qt::MiddleButton && rect().contains(event->position().toPoint())) {
68void MenuTabs::mouseReleaseEvent(QMouseEvent* event)
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()));
76 action->setEnabled(
false);
81 QMenu::mouseReleaseEvent(event);
87 , m_locationBars(new QStackedWidget)
90 setObjectName(
QSL(
"tabwidget"));
92 m_tabBar =
new TabBar(m_window,
this);
108 m_menuClosedTabs =
new QMenu(
this);
112 m_buttonAddTab->setProperty(
"outside-tabbar",
false);
117 m_buttonAddTab2->setProperty(
"outside-tabbar",
true);
118 m_buttonAddTab2->hide();
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);
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);
141 m_buttonListTabs->hide();
157void TabWidget::loadSettings()
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();
168 m_urlOnNewTab = settings.
value(
QSL(
"newTabUrl"),
QSL(
"falkon:speeddial")).toUrl();
173 updateClosedTabsButton();
176WebTab* TabWidget::weTab()
const
181WebTab* TabWidget::weTab(
int index)
const
183 return qobject_cast<WebTab*>(
widget(index));
186TabIcon* TabWidget::tabIcon(
int index)
const
188 return weTab(index)->
tabIcon();
191bool TabWidget::validIndex(
int index)
const
193 return index >= 0 && index <
count();
196void TabWidget::updateClosedTabsButton()
198 m_buttonClosedTabs->setVisible(m_showClosedTabsButton &&
canRestoreTab());
201void TabWidget::keyPressEvent(QKeyEvent *event)
210void TabWidget::keyReleaseEvent(QKeyEvent *event)
216 TabStackedWidget::keyReleaseEvent(event);
221 return m_currentTabFresh;
226 m_currentTabFresh = currentTabFresh;
232 m_buttonAddTab->setVisible(!overflowed);
235 m_buttonAddTab2->setVisible(overflowed);
236 m_buttonListTabs->setVisible(overflowed);
241 int posY = (m_tabBar->height() - m_buttonAddTab->height()) / 2;
243 if (QApplication::layoutDirection() == Qt::RightToLeft) {
244 posX = qMax(posX - m_buttonAddTab->width(), 0);
247 posX = qMin(posX, m_tabBar->width() - m_buttonAddTab->width());
250 m_buttonAddTab->move(posX, posY);
253void TabWidget::aboutToShowTabsMenu()
263 auto* action =
new QAction(
this);
264 action->setIcon(tab->
icon());
267 QFont f = action->font();
272 QString title = tab->
title();
273 title.replace(QLatin1Char(
'&'), QLatin1String(
"&&"));
276 action->setData(QVariant::fromValue(qobject_cast<QWidget*>(tab)));
277 connect(action, &QAction::triggered,
this, &TabWidget::actionChangeIndex);
278 m_menuTabs->addAction(action);
282void TabWidget::aboutToShowClosedTabsMenu()
284 m_menuClosedTabs->clear();
287 for (
int i = 0;
i < closedTabs.count(); ++
i) {
293 if (m_menuClosedTabs->isEmpty()) {
294 m_menuClosedTabs->addAction(tr(
"Empty"))->setEnabled(
false);
297 m_menuClosedTabs->addSeparator();
303void TabWidget::actionChangeIndex()
305 if (
auto* action = qobject_cast<QAction*>(sender())) {
306 auto* tab = qobject_cast<WebTab*>(qvariant_cast<QWidget*>(action->data()));
316 return addView(req, QString(), openFlags, selectLine, -1, pinned);
321 QUrl url = req.
url();
322 m_currentTabFresh =
false;
331 openAfterActive =
true;
334 if (openAfterActive && position == -1) {
338 position = m_lastBackgroundTab->tabIndex() + 1;
353 if (!title.isEmpty()) {
360 m_lastBackgroundTab =
webTab;
366 connect(
webTab->
webView(), &WebView::urlChanged,
this, [
this](
const QUrl &url) {
367 if (url != m_urlOnNewTab)
368 m_currentTabFresh = false;
371 if (url.isValid() && url != req.
url()) {
376 else if (req.
url().isValid()) {
380 if (selectLine && m_window->
locationBar()->text().isEmpty()) {
409 m_lastBackgroundTab = tab;
429 QString selectionClipboard = QApplication::clipboard()->text(QClipboard::Selection);
430 QUrl guessedUrl = QUrl::fromUserInput(selectionClipboard);
432 if (!guessedUrl.isEmpty()) {
443 if (!
webTab || !validIndex(index))
460 m_lastBackgroundTab =
nullptr;
465 updateClosedTabsButton();
477 if (!
webTab || !validIndex(index))
485 if (m_dontCloseWithOneTab) {
488 if (webView->url() != m_urlOnNewTab) {
492 webView->
load(m_urlOnNewTab);
499 webView->triggerPageAction(QWebEnginePage::RequestClose);
504 if (!validIndex(index))
507 m_lastBackgroundTab =
nullptr;
508 m_currentTabFresh =
false;
516 if (locBar && m_locationBars->indexOf(locBar) != -1) {
517 m_locationBars->setCurrentWidget(locBar);
526void TabWidget::tabWasMoved(
int before,
int after)
528 m_lastBackgroundTab =
nullptr;
531 if (!m_blockTabMovedSignal) {
563 if (!validIndex(index)) {
572 return index < 0 ? weTab() : weTab(index);
577 return m_buttonAddTab->width();
587 return m_closedTabsManager;
599 if (!validIndex(index)) {
603 weTab(index)->
stop();
608 if (!validIndex(index)) {
612 WebTab* akt = weTab(index);
614 const auto tabs =
allTabs(
false);
615 for (
const WebTab* tab : tabs) {
616 int tabIndex = tab->tabIndex();
617 if (akt ==
widget(tabIndex)) {
626 if (!validIndex(index)) {
630 const auto tabs =
allTabs(
false);
631 for (
const WebTab* tab : tabs) {
632 int tabIndex = tab->tabIndex();
633 if (index >= tabIndex) {
643 if (!validIndex(index)) {
647 const auto tabs =
allTabs(
false);
648 for (
const WebTab* tab : tabs) {
649 int tabIndex = tab->tabIndex();
650 if (index <= tabIndex) {
659 if (!validIndex(to) || from == to) {
666 m_blockTabMovedSignal =
true;
672 m_blockTabMovedSignal =
false;
679 if (index != newIndex && !m_blockTabMovedSignal) {
689 if (
count() == 1 &&
mApp->windowCount() == 1) {
712 WebTab* tab = weTab(index);
715 if (
count() == 1 &&
mApp->windowCount() == 1) {
727 if (!validIndex(index)) {
742 if (!validIndex(index)) {
751 if (!validIndex(index)) {
770 auto* action = qobject_cast<QAction*>(obj);
771 if (action && action->data().toInt() != 0) {
772 tab = m_closedTabsManager->
takeTabAt(action->data().toInt());
787 updateClosedTabsButton();
796 const auto closedTabs = m_closedTabsManager->
closedTabs();
810 updateClosedTabsButton();
820 return m_locationBars;
825 return m_buttonClosedTabs;
830 return m_buttonAddTab;
839 if (!tab || (!withPinned && tab->
isPinned())) {
850 if (tabs.isEmpty()) {
856 QVector<QPair<WebTab*, QVector<int>>> childTabs;
858 for (
int i = 0;
i < tabs.size(); ++
i) {
867 for (
const auto &p : std::as_const(childTabs)) {
868 const auto indices = p.second;
869 for (
int index : indices) {
872 p.first->addChildTab(
t);
879 auto const l_allTabs =
allTabs();
880 for (
const WebTab* tab : l_allTabs) {
881 m_tabBar->
setTabText(tab->tabIndex(), tab->title());
886 QTimer::singleShot(0, m_tabBar, SLOT(ensureVisible(
int,
int)));
895 delete m_closedTabsManager;
void setStartTab(WebTab *tab)
LocationBar * locationBar() const
bool isClosedTabAvailable() const
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)
void setUrl(const QUrl &url)
void showUrl(const QUrl &url)
void beginGroup(const QString &prefix)
QVariant value(const QString &key, const QVariant &defaultValue=QVariant())
void wheelEvent(QWheelEvent *event) override
void setTabText(int index, const QString &text)
void moveAddTabButton(int posX)
void setIsRestoring(bool restoring)
void ipChanged(const QString &)
TabIcon * tabIcon() const
void setPinned(bool state)
LocationBar * locationBar() const
void setParentTab(WebTab *tab)
void p_restoreTab(const SavedTab &tab)
QString title(bool allowEmpty=false) const
TabbedWebView * webView() const
void attach(BrowserWindow *window)
QIcon icon(bool allowNull=false) const
void restoreTab(const SavedTab &tab)
QByteArray historyData() const
void load(const QUrl &url)
QPointer< WebTab > parentTab
WebTab::SavedTab tabState