diff --git a/UI/Qt/ChromeStyle.cpp b/UI/Qt/ChromeStyle.cpp index 6adfdbb606..c4cba6ab8e 100644 --- a/UI/Qt/ChromeStyle.cpp +++ b/UI/Qt/ChromeStyle.cpp @@ -785,12 +785,6 @@ QWidget#LadybirdVerticalTabsContentSeparator {{ max-height: 1px; }} -QWidget#LadybirdVerticalTabsSeparator {{ - background: {8}; - min-height: 1px; - max-height: 1px; -}} - QPushButton#LadybirdAudioState, QToolButton#LadybirdNewTabButton, QPushButton#LadybirdTabButton {{ diff --git a/UI/Qt/Tab.cpp b/UI/Qt/Tab.cpp index 724254bc48..8651c384b2 100644 --- a/UI/Qt/Tab.cpp +++ b/UI/Qt/Tab.cpp @@ -155,7 +155,6 @@ Tab::Tab(BrowserWindow* window, RefPtr parent_client, toolbar_container_layout->addWidget(m_toolbar); toolbar_container_layout->addWidget(m_bookmarks_bar); - tab_layout->addWidget(m_toolbar_container); tab_layout->addWidget(m_view); tab_layout->addWidget(m_find_in_page); diff --git a/UI/Qt/TabBar.cpp b/UI/Qt/TabBar.cpp index 4564ae6503..b3282340df 100644 --- a/UI/Qt/TabBar.cpp +++ b/UI/Qt/TabBar.cpp @@ -65,7 +65,6 @@ static constexpr int VERTICAL_TABS_RESIZE_HIT_AREA_WIDTH = 5; static constexpr int VERTICAL_TABS_COLLAPSED_SIDE_MARGIN = 6; static constexpr int VERTICAL_TABS_EXPANDED_SIDE_MARGIN = 5; static constexpr int VERTICAL_TABS_TOP_MARGIN = 8; -static constexpr int VERTICAL_TABS_MACOS_TRAFFIC_LIGHTS_LEFT_MARGIN = 12; static constexpr int TAB_CARD_SHAPE_HORIZONTAL_INSET = 5; static constexpr int TAB_CARD_SHAPE_VERTICAL_INSET = 3; static constexpr int VERTICAL_TAB_CONTENT_HORIZONTAL_INSET = 8; @@ -116,19 +115,9 @@ static constexpr int vertical_tabs_side_margin(bool expanded) return expanded ? VERTICAL_TABS_EXPANDED_SIDE_MARGIN : VERTICAL_TABS_COLLAPSED_SIDE_MARGIN; } -static constexpr int vertical_tabs_left_margin(TabLayout tab_layout) -{ - return vertical_tabs_side_margin(tab_layout != TabLayout::VerticalCollapsed); -} - -static constexpr int vertical_tabs_right_margin(TabLayout tab_layout) -{ - return vertical_tabs_side_margin(tab_layout != TabLayout::VerticalCollapsed); -} - static constexpr int vertical_tabs_horizontal_margin_width(TabLayout tab_layout) { - return vertical_tabs_left_margin(tab_layout) + vertical_tabs_right_margin(tab_layout); + return vertical_tabs_side_margin(tab_layout != TabLayout::VerticalCollapsed) * 2; } static constexpr int vertical_tab_width(int available_width, TabLayout tab_layout) @@ -149,11 +138,6 @@ static QRectF tab_card_shape_rect(QRectF const& rect) return rect.adjusted(TAB_CARD_SHAPE_HORIZONTAL_INSET, TAB_CARD_SHAPE_VERTICAL_INSET, -TAB_CARD_SHAPE_HORIZONTAL_INSET, -TAB_CARD_SHAPE_VERTICAL_INSET); } -static QRectF horizontal_tab_card_shape_rect(QRectF const& rect) -{ - return rect.adjusted(TAB_CARD_SHAPE_HORIZONTAL_INSET, TAB_CARD_SHAPE_VERTICAL_INSET, -TAB_CARD_SHAPE_HORIZONTAL_INSET, -TAB_CARD_SHAPE_VERTICAL_INSET); -} - static QRect tab_card_shape_rect(QRect const& rect) { return rect.adjusted(TAB_CARD_SHAPE_HORIZONTAL_INSET, TAB_CARD_SHAPE_VERTICAL_INSET, -TAB_CARD_SHAPE_HORIZONTAL_INSET, -TAB_CARD_SHAPE_VERTICAL_INSET); @@ -647,8 +631,7 @@ void TabBar::mousePressEvent(QMouseEvent* event) void TabBar::mouseMoveEvent(QMouseEvent* event) { - auto hovered_tab = tab_index_at(event->pos()); - set_hovered_tab_index(hovered_tab); + set_hovered_tab_index(tab_index_at(event->pos())); if (count() == 0) { if (tab_layout() == TabLayout::Horizontal) @@ -1094,6 +1077,10 @@ TabWidget::TabWidget(QWidget* parent) m_toolbar_container = new QStackedWidget(this); m_toolbar_container->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); m_stacked_widget = new QStackedWidget(this); + m_page_column = new QWidget(this); + m_page_column_layout = new QVBoxLayout(m_page_column); + m_page_column_layout->setSpacing(0); + m_page_column_layout->setContentsMargins(0, 0, 0, 0); m_new_tab_button = new NewTabButton(*m_tab_bar, this); m_new_tab_button->setObjectName("LadybirdNewTabButton"); @@ -1109,12 +1096,6 @@ TabWidget::TabWidget(QWidget* parent) m_maximize_window_button = window_control_buttons.maximize; m_close_window_button = window_control_buttons.close; - m_vertical_tabs_new_tab_separator = new QWidget(this); - m_vertical_tabs_new_tab_separator->setObjectName("LadybirdVerticalTabsSeparator"); - m_vertical_tabs_new_tab_separator->setFixedHeight(1); - m_vertical_tabs_new_tab_separator->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - m_vertical_tabs_new_tab_separator->installEventFilter(this); - recreate_icons(); m_tab_bar_row = new QWidget(this); @@ -1211,6 +1192,7 @@ void TabWidget::insert_tab(int index, Tab* widget, QString const& label) { m_stacked_widget->insertWidget(index, widget); m_tab_bar->insertTab(index, label); + widget->set_toolbar_container_in_tab_layout(false); m_toolbar_container->insertWidget(index, widget->toolbar_container()); widget->set_vertical_tabs_enabled(m_vertical_tabs_enabled); @@ -1414,8 +1396,7 @@ bool TabWidget::eventFilter(QObject* watched, QEvent* event) auto is_vertical_tabs_hover_target = watched == m_vertical_tab_bar_column || watched == m_tab_bar - || watched == m_new_tab_button - || watched == m_vertical_tabs_new_tab_separator; + || watched == m_new_tab_button; if (is_vertical_tabs_hover_target) { if (event->type() == QEvent::Enter) { @@ -1429,7 +1410,7 @@ bool TabWidget::eventFilter(QObject* watched, QEvent* event) auto is_empty_chrome_area = [this, watched](QMouseEvent const& mouse_event) { if (watched == m_vertical_tab_bar_column) { auto* child = m_vertical_tab_bar_column->childAt(mouse_event.pos()); - return child == nullptr || child == m_vertical_tabs_new_tab_separator; + return child == nullptr; } return m_tab_bar_row->childAt(mouse_event.pos()) == nullptr; @@ -1565,19 +1546,8 @@ void TabWidget::update_toolbar_placement() toolbar->style()->unpolish(toolbar); toolbar->style()->polish(toolbar); toolbar->update(); - - if (use_full_width_toolbar) { - current_tab->set_toolbar_container_in_tab_layout(false); - if (m_toolbar_container->indexOf(toolbar) == -1) - m_toolbar_container->insertWidget(index, toolbar); - } else { - if (m_toolbar_container->indexOf(toolbar) != -1) - m_toolbar_container->removeWidget(toolbar); - current_tab->set_toolbar_container_in_tab_layout(true); - } } - m_toolbar_container->setVisible(use_full_width_toolbar); m_toolbar_container->setCurrentIndex(m_tab_bar->currentIndex()); update_tab_toolbar_window_controls_visibility(); } @@ -1593,6 +1563,7 @@ void TabWidget::rebuild_layout() { clear_layout(*m_main_layout); clear_layout(*m_tab_bar_row_layout); + clear_layout(*m_page_column_layout); clear_layout(*m_vertical_tab_bar_column_layout); clear_layout(*m_vertical_tabs_content_layout); @@ -1601,18 +1572,27 @@ void TabWidget::rebuild_layout() if (m_tab_bar->tab_layout() != TabLayout::Horizontal) { rebuild_layout_for_vertical_tabs(); + auto use_full_width_toolbar = uses_full_width_toolbar_for_current_layout(); - if (uses_full_width_toolbar_for_current_layout()) + if (use_full_width_toolbar) { m_main_layout->addWidget(m_toolbar_container); + m_page_column->hide(); + } else { + rebuild_page_column(); + m_page_column->show(); + } + m_vertical_tabs_content_layout->addWidget(m_vertical_tabs_reserved_space); - m_vertical_tabs_content_layout->addWidget(m_stacked_widget, 1); + m_vertical_tabs_content_layout->addWidget(use_full_width_toolbar ? static_cast(m_stacked_widget) : m_page_column, 1); m_main_layout->addWidget(m_vertical_tabs_content, 1); m_vertical_tabs_content->show(); } else { rebuild_layout_for_horizontal_tabs(); + rebuild_page_column(); m_main_layout->addWidget(m_tab_bar_row); - m_main_layout->addWidget(m_stacked_widget, 1); + m_main_layout->addWidget(m_page_column, 1); + m_page_column->show(); m_vertical_tabs_content->hide(); } @@ -1653,54 +1633,30 @@ void TabWidget::rebuild_layout_for_horizontal_tabs() void TabWidget::rebuild_layout_for_vertical_tabs() { - auto expanded = vertical_tabs_effectively_expanded(); auto reserved_width = vertical_tabs_layout_width(); - auto const chrome_layout_policy = browser_chrome_layout_policy(); auto side_bar_width = current_vertical_tabs_width(); m_vertical_tabs_reserved_space->setFixedWidth(reserved_width); m_vertical_tab_bar_column->setFixedWidth(side_bar_width); m_vertical_tab_bar_column_layout->setSpacing(0); auto tab_layout = m_tab_bar->tab_layout(); - auto left_margin = vertical_tabs_left_margin(tab_layout); - auto right_margin = vertical_tabs_right_margin(tab_layout); - auto tab_width = max(0, side_bar_width - vertical_tabs_horizontal_margin_width(tab_layout)); - auto top_margin = VERTICAL_TABS_TOP_MARGIN; - auto window_controls_bottom_spacing = 0; - auto show_sidebar_traffic_lights = chrome_layout_policy.controls_placement == WindowControlsPlacement::LeftTrafficLights - && m_vertical_tabs_expanded - && !uses_full_width_toolbar_for_current_layout(); - if (show_sidebar_traffic_lights) { - auto window_controls_height = WindowControlButton::default_size({ 40, 40 }).height(); - top_margin = max(0, (chrome_layout_policy.toolbar_height - window_controls_height) / 2); - window_controls_bottom_spacing = max(0, chrome_layout_policy.toolbar_height - window_controls_height - top_margin) + VERTICAL_TABS_TOP_MARGIN; - auto window_controls_left_padding = max(0, VERTICAL_TABS_MACOS_TRAFFIC_LIGHTS_LEFT_MARGIN - left_margin); - m_window_controls->layout()->setContentsMargins(window_controls_left_padding, 0, 0, 0); - } else { - m_window_controls->layout()->setContentsMargins(0, 0, 0, 0); - } - m_vertical_tab_bar_column_layout->setContentsMargins(left_margin, top_margin, right_margin, 8); + auto side_margin = vertical_tabs_side_margin(tab_layout != TabLayout::VerticalCollapsed); + m_window_controls->layout()->setContentsMargins(0, 0, 0, 0); + m_vertical_tab_bar_column_layout->setContentsMargins(side_margin, VERTICAL_TABS_TOP_MARGIN, side_margin, 8); - if (show_sidebar_traffic_lights) { - m_vertical_tab_bar_column_layout->addWidget(m_window_controls, 0, Qt::AlignLeft); - if (window_controls_bottom_spacing > 0) - m_vertical_tab_bar_column_layout->addSpacing(window_controls_bottom_spacing); - } - - m_new_tab_button->setToolButtonStyle(expanded ? Qt::ToolButtonTextBesideIcon : Qt::ToolButtonIconOnly); - update_vertical_tabs_action_labels(); - m_new_tab_button->setProperty(VERTICAL_TABS_BUTTON_PROPERTY, true); - m_new_tab_button->setProperty(VERTICAL_TABS_EXPANDED_PROPERTY, expanded); - m_new_tab_button->style()->unpolish(m_new_tab_button); - m_new_tab_button->style()->polish(m_new_tab_button); - m_vertical_tabs_new_tab_separator->hide(); - update_vertical_new_tab_button_geometry(tab_width); + update_vertical_tabs_button_layout(); m_vertical_tab_bar_column_layout->addWidget(m_tab_bar); m_vertical_tab_bar_column_layout->addWidget(m_new_tab_button); m_vertical_tab_bar_column_layout->addStretch(1); } +void TabWidget::rebuild_page_column() +{ + m_page_column_layout->addWidget(m_toolbar_container); + m_page_column_layout->addWidget(m_stacked_widget, 1); +} + int TabWidget::current_vertical_tabs_width() const { return vertical_tabs_effectively_expanded() ? m_vertical_tabs_expanded_width : VERTICAL_TABS_COLLAPSED_WIDTH; @@ -1775,27 +1731,30 @@ void TabWidget::update_vertical_tabs_hover_layout() m_tab_bar->set_tab_layout(current_tab_layout()); auto tab_layout = m_tab_bar->tab_layout(); - auto left_margin = vertical_tabs_left_margin(tab_layout); - auto right_margin = vertical_tabs_right_margin(tab_layout); - auto side_bar_width = current_vertical_tabs_width(); - auto tab_width = max(0, side_bar_width - vertical_tabs_horizontal_margin_width(tab_layout)); - auto expanded = vertical_tabs_effectively_expanded(); + auto side_margin = vertical_tabs_side_margin(tab_layout != TabLayout::VerticalCollapsed); - m_vertical_tab_bar_column_layout->setContentsMargins(left_margin, VERTICAL_TABS_TOP_MARGIN, right_margin, 8); + m_vertical_tab_bar_column_layout->setContentsMargins(side_margin, VERTICAL_TABS_TOP_MARGIN, side_margin, 8); + update_vertical_tabs_button_layout(); + + update_tab_button_visibility(); + update_tab_layout(); +} + +int TabWidget::vertical_tabs_tab_width() const +{ + return max(0, current_vertical_tabs_width() - vertical_tabs_horizontal_margin_width(m_tab_bar->tab_layout())); +} + +void TabWidget::update_vertical_tabs_button_layout() +{ + auto expanded = vertical_tabs_effectively_expanded(); m_new_tab_button->setToolButtonStyle(expanded ? Qt::ToolButtonTextBesideIcon : Qt::ToolButtonIconOnly); update_vertical_tabs_action_labels(); m_new_tab_button->setProperty(VERTICAL_TABS_BUTTON_PROPERTY, true); m_new_tab_button->setProperty(VERTICAL_TABS_EXPANDED_PROPERTY, expanded); m_new_tab_button->style()->unpolish(m_new_tab_button); m_new_tab_button->style()->polish(m_new_tab_button); - update_vertical_new_tab_button_geometry(tab_width); - - update_tab_button_visibility(); - update_tab_layout(); -} - -void TabWidget::update_vertical_new_tab_button_geometry(int tab_width) -{ + auto tab_width = vertical_tabs_tab_width(); m_new_tab_button->setFixedSize(tab_width, VERTICAL_TAB_HEIGHT); m_new_tab_button->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); } @@ -1805,13 +1764,12 @@ void TabWidget::update_tab_layout() if (m_tab_bar->tab_layout() != TabLayout::Horizontal) { auto reserved_width = vertical_tabs_layout_width(); auto side_bar_width = current_vertical_tabs_width(); - auto tab_width = max(0, side_bar_width - vertical_tabs_horizontal_margin_width(m_tab_bar->tab_layout())); m_vertical_tabs_reserved_space->setFixedWidth(reserved_width); m_vertical_tab_bar_column->setFixedWidth(side_bar_width); - update_vertical_new_tab_button_geometry(tab_width); + update_vertical_tabs_button_layout(); update_vertical_tabs_overlay_geometry(); m_vertical_tabs_content_layout->activate(); - m_tab_bar->set_available_width(tab_width); + m_tab_bar->set_available_width(vertical_tabs_tab_width()); update_vertical_tabs_resize_handle(); update_vertical_tabs_content_separator(); return; diff --git a/UI/Qt/TabBar.h b/UI/Qt/TabBar.h index d0559cd439..dd69b0f611 100644 --- a/UI/Qt/TabBar.h +++ b/UI/Qt/TabBar.h @@ -178,6 +178,7 @@ private: void rebuild_layout(); void rebuild_layout_for_horizontal_tabs(); void rebuild_layout_for_vertical_tabs(); + void rebuild_page_column(); void update_toolbar_placement(); void update_tab_toolbar_window_controls_visibility(); int current_vertical_tabs_width() const; @@ -188,7 +189,8 @@ private: void set_resize_handle_property(char const* property, bool enabled); void update_vertical_tabs_action_labels(); void update_vertical_tabs_hover_layout(); - void update_vertical_new_tab_button_geometry(int tab_width); + int vertical_tabs_tab_width() const; + void update_vertical_tabs_button_layout(); void update_tab_layout(); void update_tab_chrome_visibility(); void recreate_icons(); @@ -210,8 +212,8 @@ private: QToolButton* m_close_window_button { nullptr }; QWidget* m_window_controls { nullptr }; QStackedWidget* m_toolbar_container { nullptr }; + QWidget* m_page_column { nullptr }; QWidget* m_tab_bar_row { nullptr }; - QWidget* m_vertical_tabs_new_tab_separator { nullptr }; QWidget* m_vertical_tabs_reserved_space { nullptr }; QWidget* m_vertical_tab_bar_column { nullptr }; QWidget* m_vertical_tabs_content_separator { nullptr }; @@ -220,6 +222,7 @@ private: QTimer* m_vertical_tabs_hover_collapse_timer { nullptr }; QBoxLayout* m_main_layout { nullptr }; QBoxLayout* m_tab_bar_row_layout { nullptr }; + QBoxLayout* m_page_column_layout { nullptr }; QBoxLayout* m_vertical_tab_bar_column_layout { nullptr }; QBoxLayout* m_vertical_tabs_content_layout { nullptr }; bool m_tab_bar_visible { true }; diff --git a/UI/Qt/WindowControlButton.cpp b/UI/Qt/WindowControlButton.cpp index 45cf70c43d..6ec9de4491 100644 --- a/UI/Qt/WindowControlButton.cpp +++ b/UI/Qt/WindowControlButton.cpp @@ -71,7 +71,7 @@ static bool window_control_group_hovered(QWidget const* widget) } #endif -QSize WindowControlButton::default_size(QSize non_macos_size) +static QSize default_window_control_button_size(QSize non_macos_size) { #if defined(AK_OS_MACOS) Q_UNUSED(non_macos_size); @@ -81,7 +81,7 @@ QSize WindowControlButton::default_size(QSize non_macos_size) #endif } -int WindowControlButton::default_spacing() +static int default_window_control_button_spacing() { #if defined(AK_OS_MACOS) return 7; @@ -142,10 +142,10 @@ WindowControlButtons create_window_control_buttons(QWidget& parent, char const* container->setObjectName(object_name); auto* layout = new QHBoxLayout(container); - layout->setSpacing(WindowControlButton::default_spacing()); + layout->setSpacing(default_window_control_button_spacing()); layout->setContentsMargins(0, 0, 0, 0); - auto const button_size = WindowControlButton::default_size(non_macos_button_size); + auto const button_size = default_window_control_button_size(non_macos_button_size); auto* minimize = new WindowControlButton(WindowControlButtonType::Minimize, "Minimize", icon_size, button_size, container); auto* maximize = new WindowControlButton(WindowControlButtonType::Maximize, "Maximize", icon_size, button_size, container); auto* close = new WindowControlButton(WindowControlButtonType::Close, "Close", icon_size, button_size, container); diff --git a/UI/Qt/WindowControlButton.h b/UI/Qt/WindowControlButton.h index 46a17158be..b9aa8ae16c 100644 --- a/UI/Qt/WindowControlButton.h +++ b/UI/Qt/WindowControlButton.h @@ -29,9 +29,6 @@ class WindowControlButton final : public QToolButton { public: WindowControlButton(WindowControlButtonType, QString const& tool_tip, QSize icon_size, QSize button_size, QWidget* parent = nullptr); - static QSize default_size(QSize non_macos_size); - static int default_spacing(); - private: virtual void paintEvent(QPaintEvent*) override; virtual void enterEvent(QEnterEvent*) override;