diff --git a/Ladybird/Qt/BrowserWindow.cpp b/Ladybird/Qt/BrowserWindow.cpp index 4d9efc66eca..a2a097e49bb 100644 --- a/Ladybird/Qt/BrowserWindow.cpp +++ b/Ladybird/Qt/BrowserWindow.cpp @@ -3,6 +3,7 @@ * Copyright (c) 2022, Matthew Costa * Copyright (c) 2022, Filiph Sandström * Copyright (c) 2023, Linus Groh + * Copyright (c) 2024, Sam Atkins * * SPDX-License-Identifier: BSD-2-Clause */ @@ -679,6 +680,7 @@ BrowserWindow::BrowserWindow(Vector const& initial_urls, WebView::Cook m_new_tab_button_toolbar->setMovable(false); m_new_tab_button_toolbar->setStyleSheet("QToolBar { background: transparent; }"); m_new_tab_button_toolbar->setIconSize(QSize(16, 16)); + m_tabs_container->setCornerWidget(m_new_tab_button_toolbar, Qt::TopRightCorner); setCentralWidget(m_tabs_container); setContextMenuPolicy(Qt::PreventContextMenu); @@ -693,20 +695,6 @@ void BrowserWindow::set_current_tab(Tab* tab) } } -void BrowserWindow::update_new_tab_button() -{ - if (m_new_tab_button_toolbar == nullptr || m_tabs_container == nullptr || m_tabs_container->count() < 1) - return; - QSize tab_bar_size = m_tabs_container->tabBar()->sizeHint(); - int window_width = this->rect().width(); - QRect new_rect; - new_rect.setX(qMin(tab_bar_size.width(), window_width - 32)); - new_rect.setWidth(32); - new_rect.setHeight(32); - m_tabs_container->tabBar()->setMaximumWidth(window_width - 32); - m_new_tab_button_toolbar->setGeometry(new_rect); -} - void BrowserWindow::debug_request(ByteString const& request, ByteString const& argument) { if (!m_current_tab) @@ -854,8 +842,6 @@ void BrowserWindow::initialize_tab(Tab* tab) tab->set_navigator_compatibility_mode(navigator_compatibility_mode()); tab->set_enable_do_not_track(Settings::the()->enable_do_not_track()); tab->view().set_preferred_color_scheme(m_preferred_color_scheme); - - update_new_tab_button(); } void BrowserWindow::activate_tab(int index) @@ -869,8 +855,6 @@ void BrowserWindow::close_tab(int index) m_tabs_container->removeTab(index); tab->deleteLater(); - update_new_tab_button(); - if (m_tabs_container->count() == 0) close(); } @@ -1197,7 +1181,6 @@ void BrowserWindow::resizeEvent(QResizeEvent* event) for_each_tab([&](auto& tab) { tab.view().set_window_size({ frameSize().width() * m_device_pixel_ratio, frameSize().height() * m_device_pixel_ratio }); }); - update_new_tab_button(); } void BrowserWindow::moveEvent(QMoveEvent* event) diff --git a/Ladybird/Qt/BrowserWindow.h b/Ladybird/Qt/BrowserWindow.h index b4cab8c0f83..2678b674030 100644 --- a/Ladybird/Qt/BrowserWindow.h +++ b/Ladybird/Qt/BrowserWindow.h @@ -184,8 +184,6 @@ private: Web::CSS::PreferredColorScheme m_preferred_color_scheme; void set_preferred_color_scheme(Web::CSS::PreferredColorScheme color_scheme); - void update_new_tab_button(); - QTabWidget* m_tabs_container { nullptr }; Tab* m_current_tab { nullptr }; QMenu* m_zoom_menu { nullptr }; diff --git a/Ladybird/Qt/TabBar.cpp b/Ladybird/Qt/TabBar.cpp index bbcf1eb9b93..634a82c723b 100644 --- a/Ladybird/Qt/TabBar.cpp +++ b/Ladybird/Qt/TabBar.cpp @@ -1,6 +1,7 @@ /* * Copyright (c) 2024, Tim Flynn * Copyright (c) 2024, Jamie Mansfield + * Copyright (c) 2024, Sam Atkins * * SPDX-License-Identifier: BSD-2-Clause */ @@ -12,6 +13,7 @@ #include #include #include +#include namespace Ladybird { @@ -50,6 +52,8 @@ TabWidget::TabWidget(QWidget* parent) setMovable(true); setTabsClosable(true); + setStyle(new TabStyle(this)); + installEventFilter(parent); } @@ -70,4 +74,27 @@ bool TabBarButton::event(QEvent* event) return QPushButton::event(event); } +TabStyle::TabStyle(QObject* parent) +{ + setParent(parent); +} + +QRect TabStyle::subElementRect(QStyle::SubElement sub_element, QStyleOption const* option, QWidget const* widget) const +{ + // Place our add-tab button (set as the top-right corner widget) directly after the last tab + if (sub_element == QStyle::SE_TabWidgetRightCorner) { + auto* tab_widget = verify_cast(widget); + auto tab_bar_size = tab_widget->tabBar()->sizeHint(); + auto new_tab_button_size = tab_bar_size.height(); + return QRect { + qMin(tab_bar_size.width(), tab_widget->width() - new_tab_button_size), + 0, + new_tab_button_size, + new_tab_button_size + }; + } + + return QProxyStyle::subElementRect(sub_element, option, widget); +} + } diff --git a/Ladybird/Qt/TabBar.h b/Ladybird/Qt/TabBar.h index dfff7e66e72..17bf74beac5 100644 --- a/Ladybird/Qt/TabBar.h +++ b/Ladybird/Qt/TabBar.h @@ -1,12 +1,14 @@ /* * Copyright (c) 2024, Tim Flynn * Copyright (c) 2024, Jamie Mansfield + * Copyright (c) 2024, Sam Atkins * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once +#include #include #include #include @@ -45,4 +47,13 @@ protected: virtual bool event(QEvent* event) override; }; +class TabStyle : public QProxyStyle { + Q_OBJECT + +public: + explicit TabStyle(QObject* parent = nullptr); + + virtual QRect subElementRect(QStyle::SubElement, QStyleOption const*, QWidget const*) const override; +}; + }