Merge pull request #20044 from brave/ksmith-h-tabs
Update horizontal tabs styling
This commit is contained in:
+18
-10
@@ -361,16 +361,24 @@
|
||||
#endif // BUILDFLAG(IS_ANDROID)
|
||||
|
||||
#if !BUILDFLAG(IS_ANDROID)
|
||||
#define BRAVE_SHARED_PINNED_TABS \
|
||||
EXPAND_FEATURE_ENTRIES({ \
|
||||
"brave-shared-pinned-tabs", \
|
||||
"Shared pinned tab", \
|
||||
"Pinned tabs are shared across windows", \
|
||||
kOsWin | kOsMac | kOsLinux, \
|
||||
FEATURE_VALUE_TYPE(tabs::features::kBraveSharedPinnedTabs), \
|
||||
})
|
||||
#define BRAVE_TABS_FEATURE_ENTRIES \
|
||||
EXPAND_FEATURE_ENTRIES( \
|
||||
{ \
|
||||
"brave-shared-pinned-tabs", \
|
||||
"Shared pinned tab", \
|
||||
"Pinned tabs are shared across windows", \
|
||||
kOsWin | kOsMac | kOsLinux, \
|
||||
FEATURE_VALUE_TYPE(tabs::features::kBraveSharedPinnedTabs), \
|
||||
}, \
|
||||
{ \
|
||||
"brave-horizontal-tabs-update", \
|
||||
"Updated horizontal tabs design", \
|
||||
"Updates the look and feel or horizontal tabs", \
|
||||
kOsWin | kOsMac | kOsLinux, \
|
||||
FEATURE_VALUE_TYPE(tabs::features::kBraveHorizontalTabsUpdate), \
|
||||
})
|
||||
#else
|
||||
#define BRAVE_SHARED_PINNED_TABS
|
||||
#define BRAVE_TABS_FEATURE_ENTRIES
|
||||
#endif
|
||||
|
||||
#if BUILDFLAG(ENABLE_AI_CHAT)
|
||||
@@ -887,7 +895,7 @@
|
||||
BRAVE_BACKGROUND_VIDEO_PLAYBACK_ANDROID \
|
||||
BRAVE_SAFE_BROWSING_ANDROID \
|
||||
BRAVE_CHANGE_ACTIVE_TAB_ON_SCROLL_EVENT_FEATURE_ENTRIES \
|
||||
BRAVE_SHARED_PINNED_TABS \
|
||||
BRAVE_TABS_FEATURE_ENTRIES \
|
||||
BRAVE_AI_CHAT \
|
||||
BRAVE_AI_CHAT_HISTORY \
|
||||
LAST_BRAVE_FEATURE_ENTRIES_ITEM // Keep it as the last item.
|
||||
|
||||
@@ -5,9 +5,12 @@
|
||||
|
||||
#include "brave/browser/ui/brave_layout_constants.h"
|
||||
|
||||
#include "brave/browser/ui/tabs/features.h"
|
||||
#include "chrome/browser/ui/layout_constants.h"
|
||||
#include "ui/base/pointer/touch_ui_controller.h"
|
||||
|
||||
using tabs::features::HorizontalTabsUpdateEnabled;
|
||||
|
||||
// Returns a |nullopt| if the UI color is not handled by Brave.
|
||||
absl::optional<int> GetBraveLayoutConstant(LayoutConstant constant) {
|
||||
const bool touch = ui::TouchUiController::Get()->touch_ui();
|
||||
@@ -18,7 +21,15 @@ absl::optional<int> GetBraveLayoutConstant(LayoutConstant constant) {
|
||||
// ui::MaterialDesignController::IsNewerMaterialUi();
|
||||
switch (constant) {
|
||||
case TAB_HEIGHT: {
|
||||
return (touch ? 41 : 30) + GetLayoutConstant(TABSTRIP_TOOLBAR_OVERLAP);
|
||||
const int tab_height = HorizontalTabsUpdateEnabled() ? 36 : 30;
|
||||
return (touch ? 41 : tab_height) +
|
||||
GetLayoutConstant(TABSTRIP_TOOLBAR_OVERLAP);
|
||||
}
|
||||
case TABSTRIP_TOOLBAR_OVERLAP: {
|
||||
if (!HorizontalTabsUpdateEnabled()) {
|
||||
return absl::nullopt;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
case TAB_SEPARATOR_HEIGHT: {
|
||||
return 24;
|
||||
|
||||
@@ -185,6 +185,8 @@ void AddChromeLightThemeColorMixer(ui::ColorProvider* provider,
|
||||
mixer[kColorTabForegroundActiveFrameActive] = {kLightToolbarIcon};
|
||||
mixer[kColorTabForegroundInactiveFrameActive] = {
|
||||
kColorTabForegroundActiveFrameActive};
|
||||
mixer[kColorTabStrokeFrameActive] = {SkColorSetA(SK_ColorBLACK, 0.07 * 255)};
|
||||
mixer[kColorTabStrokeFrameInactive] = {kColorTabStrokeFrameActive};
|
||||
mixer[kColorToolbar] = {kLightToolbar};
|
||||
mixer[kColorToolbarButtonIcon] = {kColorTabForegroundActiveFrameActive};
|
||||
mixer[kColorToolbarButtonIconInactive] = {
|
||||
|
||||
@@ -12,12 +12,14 @@ source_set("tabs") {
|
||||
|
||||
if (!is_android) {
|
||||
sources = [
|
||||
"brave_tab_layout_constants.h",
|
||||
"brave_tab_menu_model.cc",
|
||||
"brave_tab_menu_model.h",
|
||||
"brave_tab_prefs.cc",
|
||||
"brave_tab_prefs.h",
|
||||
"brave_tab_strip_model.cc",
|
||||
"brave_tab_strip_model.h",
|
||||
"brave_tab_style.h",
|
||||
"brave_vertical_tab_color_mixer.cc",
|
||||
"brave_vertical_tab_color_mixer.h",
|
||||
"features.cc",
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
/* Copyright (c) 2023 The Brave Authors. All rights reserved.
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||
* You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
#ifndef BRAVE_BROWSER_UI_TABS_BRAVE_TAB_LAYOUT_CONSTANTS_H_
|
||||
#define BRAVE_BROWSER_UI_TABS_BRAVE_TAB_LAYOUT_CONSTANTS_H_
|
||||
|
||||
namespace brave_tabs {
|
||||
|
||||
// Horizontal tab layout:
|
||||
//
|
||||
// The upstream tab implemenation assumes that tab view bounds overlap. In order
|
||||
// to create a gap between tabs without violating these assumptions, tabs views
|
||||
// are given a small overlap. Rounded tab rectangles are drawn centered and
|
||||
// inset horizontally by an amount that will create the required visual gap.
|
||||
|
||||
// The amount of space before the first tab.
|
||||
constexpr int kHorizontalTabStripLeftMargin = 8;
|
||||
|
||||
// The amount of vertical spacing between the top and bottom of tabs and the
|
||||
// bounds of the tab strip region. The portion of this space below tabs will be
|
||||
// occupied by tab group underlines.
|
||||
constexpr int kHorizontalTabStripVerticalSpacing = 4;
|
||||
|
||||
// The visual gap between tabs.
|
||||
constexpr int kHorizontalTabGap = 4;
|
||||
|
||||
// The amount of overlap between tabs. Based on upstream assumptions, tab views
|
||||
// must have a non-negative overlap. Furthermore, tab separators will not render
|
||||
// correctly if the tab overlap is zero.
|
||||
constexpr int kHorizontalTabOverlap = 2;
|
||||
|
||||
// The horizontal difference between the edge of the tab view and the visual
|
||||
// edge of the rendered tab.
|
||||
constexpr int kHorizontalTabInset =
|
||||
(kHorizontalTabGap + kHorizontalTabOverlap) / 2;
|
||||
|
||||
// The content padding within a tab.
|
||||
constexpr int kHorizontalTabPadding = 6;
|
||||
|
||||
// The horizontal difference between the visual edge of a tab group and the
|
||||
// bounds of the group underline.
|
||||
constexpr int kHorizontalGroupUnderlineInset = 2;
|
||||
|
||||
// The tab border radius.
|
||||
constexpr int kTabBorderRadius = 8;
|
||||
|
||||
// The size of the group header slot when the title is empty.
|
||||
constexpr int kEmptyGroupTitleSize = 22;
|
||||
|
||||
} // namespace brave_tabs
|
||||
|
||||
#endif // BRAVE_BROWSER_UI_TABS_BRAVE_TAB_LAYOUT_CONSTANTS_H_
|
||||
@@ -0,0 +1,57 @@
|
||||
/* Copyright (c) 2023 The Brave Authors. All rights reserved.
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||
* You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
#ifndef BRAVE_BROWSER_UI_TABS_BRAVE_TAB_STYLE_H_
|
||||
#define BRAVE_BROWSER_UI_TABS_BRAVE_TAB_STYLE_H_
|
||||
|
||||
#include "brave/browser/ui/tabs/brave_tab_layout_constants.h"
|
||||
#include "brave/browser/ui/tabs/features.h"
|
||||
#include "chrome/browser/ui/layout_constants.h"
|
||||
#include "ui/gfx/geometry/insets.h"
|
||||
|
||||
// A subclass of TabStyle used to customize tab layout and visuals. It is
|
||||
// implemented as a template because it must be included in the source file
|
||||
// override before the base class definition.
|
||||
template <typename TabStyleBase>
|
||||
class BraveTabStyle : public TabStyleBase {
|
||||
public:
|
||||
int GetTabOverlap() const override {
|
||||
if (!tabs::features::HorizontalTabsUpdateEnabled()) {
|
||||
return TabStyleBase::GetTabOverlap();
|
||||
}
|
||||
return brave_tabs::kHorizontalTabOverlap;
|
||||
}
|
||||
|
||||
int GetTopCornerRadius() const override {
|
||||
if (!tabs::features::HorizontalTabsUpdateEnabled()) {
|
||||
return TabStyleBase::GetTopCornerRadius();
|
||||
}
|
||||
return brave_tabs::kTabBorderRadius;
|
||||
}
|
||||
|
||||
int GetBottomCornerRadius() const override {
|
||||
if (!tabs::features::HorizontalTabsUpdateEnabled()) {
|
||||
return TabStyleBase::GetBottomCornerRadius();
|
||||
}
|
||||
return brave_tabs::kTabBorderRadius;
|
||||
}
|
||||
|
||||
gfx::Insets GetContentsInsets() const override {
|
||||
if (!tabs::features::HorizontalTabsUpdateEnabled()) {
|
||||
return TabStyleBase::GetContentsInsets();
|
||||
}
|
||||
return gfx::Insets::VH(
|
||||
0, brave_tabs::kHorizontalTabPadding + brave_tabs::kHorizontalTabInset);
|
||||
}
|
||||
|
||||
int GetPinnedWidth() const override {
|
||||
if (!tabs::features::HorizontalTabsUpdateEnabled()) {
|
||||
return TabStyleBase::GetPinnedWidth();
|
||||
}
|
||||
return GetLayoutConstant(TAB_HEIGHT) + brave_tabs::kHorizontalTabInset * 2;
|
||||
}
|
||||
};
|
||||
|
||||
#endif // BRAVE_BROWSER_UI_TABS_BRAVE_TAB_STYLE_H_
|
||||
@@ -17,4 +17,12 @@ BASE_FEATURE(kBraveSharedPinnedTabs,
|
||||
"BraveSharedPinnedTabs",
|
||||
base::FEATURE_DISABLED_BY_DEFAULT);
|
||||
|
||||
BASE_FEATURE(kBraveHorizontalTabsUpdate,
|
||||
"BraveHorizontalTabsUpdate",
|
||||
base::FEATURE_DISABLED_BY_DEFAULT);
|
||||
|
||||
bool HorizontalTabsUpdateEnabled() {
|
||||
return base::FeatureList::IsEnabled(kBraveHorizontalTabsUpdate);
|
||||
}
|
||||
|
||||
} // namespace tabs::features
|
||||
|
||||
@@ -17,6 +17,10 @@ BASE_DECLARE_FEATURE(kBraveChangeActiveTabOnScrollEvent);
|
||||
|
||||
BASE_DECLARE_FEATURE(kBraveSharedPinnedTabs);
|
||||
|
||||
BASE_DECLARE_FEATURE(kBraveHorizontalTabsUpdate);
|
||||
|
||||
bool HorizontalTabsUpdateEnabled();
|
||||
|
||||
} // namespace tabs::features
|
||||
|
||||
#endif // BRAVE_BROWSER_UI_TABS_FEATURES_H_
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#include "brave/browser/ui/views/frame/brave_browser_non_client_frame_view_mac.h"
|
||||
|
||||
#include "brave/browser/ui/tabs/brave_tab_prefs.h"
|
||||
#include "brave/browser/ui/tabs/features.h"
|
||||
#include "brave/browser/ui/views/frame/brave_non_client_hit_test_helper.h"
|
||||
#include "brave/browser/ui/views/frame/brave_window_frame_graphic.h"
|
||||
#include "brave/browser/ui/views/tabs/vertical_tab_utils.h"
|
||||
@@ -66,7 +67,13 @@ int BraveBrowserNonClientFrameViewMac::GetTopInset(bool restored) const {
|
||||
return 30;
|
||||
}
|
||||
|
||||
return BrowserNonClientFrameViewMac::GetTopInset(restored);
|
||||
if (!tabs::features::HorizontalTabsUpdateEnabled()) {
|
||||
return BrowserNonClientFrameViewMac::GetTopInset(restored);
|
||||
}
|
||||
|
||||
// The tab region view maintains its own padding, but insert a small gap to
|
||||
// give a bit more room for the frame resize handle.
|
||||
return 2;
|
||||
}
|
||||
|
||||
bool BraveBrowserNonClientFrameViewMac::ShouldShowWindowTitleForVerticalTabs()
|
||||
|
||||
@@ -309,7 +309,7 @@ class VerticalTabNewTabButton : public BraveNewTabButton {
|
||||
float scale,
|
||||
bool extend_to_top) const override {
|
||||
auto contents_bounds = GetContentsBounds();
|
||||
const float radius = tabs::kUnpinnedTabBorderRadius * scale;
|
||||
const float radius = GetCornerRadius() * scale;
|
||||
SkPath path;
|
||||
const gfx::Rect path_rect(origin.x(), origin.y(),
|
||||
contents_bounds.width() * scale,
|
||||
|
||||
@@ -138,6 +138,7 @@ void BraveCompoundTabContainer::SetScrollEnabled(bool enabled) {
|
||||
|
||||
if (enabled) {
|
||||
scroll_view_ = AddChildView(std::make_unique<CustomScrollView>());
|
||||
scroll_view_->SetBackgroundThemeColorId(kColorToolbar);
|
||||
auto* contents_view =
|
||||
scroll_view_->SetContents(std::make_unique<ContentsView>(this));
|
||||
contents_view->AddChildView(base::to_address(unpinned_tab_container_));
|
||||
|
||||
@@ -6,19 +6,26 @@
|
||||
#include "brave/browser/ui/views/tabs/brave_new_tab_button.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <memory>
|
||||
#include <utility>
|
||||
|
||||
#include "brave/browser/ui/color/brave_color_id.h"
|
||||
#include "chrome/app/chrome_command_ids.h"
|
||||
#include "chrome/browser/ui/layout_constants.h"
|
||||
#include "brave/browser/ui/tabs/features.h"
|
||||
#include "brave/components/vector_icons/vector_icons.h"
|
||||
#include "chrome/browser/ui/views/tabs/new_tab_button.h"
|
||||
#include "chrome/browser/ui/views/tabs/tab_strip.h"
|
||||
#include "ui/gfx/geometry/skia_conversions.h"
|
||||
#include "ui/gfx/paint_vector_icon.h"
|
||||
#include "ui/gfx/scoped_canvas.h"
|
||||
#include "ui/views/view_class_properties.h"
|
||||
|
||||
using tabs::features::HorizontalTabsUpdateEnabled;
|
||||
|
||||
// static
|
||||
const gfx::Size BraveNewTabButton::kButtonSize{24, 24};
|
||||
gfx::Size BraveNewTabButton::GetButtonSize() {
|
||||
if (!HorizontalTabsUpdateEnabled()) {
|
||||
return {24, 24};
|
||||
}
|
||||
return {28, 28};
|
||||
}
|
||||
|
||||
// static
|
||||
SkPath BraveNewTabButton::GetBorderPath(const gfx::Point& origin,
|
||||
@@ -44,7 +51,7 @@ SkPath BraveNewTabButton::GetBorderPath(const gfx::Point& origin,
|
||||
|
||||
gfx::Size BraveNewTabButton::CalculatePreferredSize() const {
|
||||
// Overriden so that we use Brave's custom button size
|
||||
gfx::Size size = kButtonSize;
|
||||
gfx::Size size = GetButtonSize();
|
||||
const auto insets = GetInsets();
|
||||
size.Enlarge(insets.width(), insets.height());
|
||||
return size;
|
||||
@@ -59,12 +66,31 @@ SkPath BraveNewTabButton::GetBorderPath(const gfx::Point& origin,
|
||||
|
||||
BraveNewTabButton::BraveNewTabButton(TabStrip* tab_strip,
|
||||
PressedCallback callback)
|
||||
: NewTabButton(tab_strip, std::move(callback)) {}
|
||||
: NewTabButton(tab_strip, std::move(callback)) {
|
||||
if (HorizontalTabsUpdateEnabled()) {
|
||||
// Ensure that the new tab button is vertically centered within its flex
|
||||
// layout container.
|
||||
SetProperty(views::kCrossAxisAlignmentKey, views::LayoutAlignment::kCenter);
|
||||
}
|
||||
}
|
||||
|
||||
BraveNewTabButton::~BraveNewTabButton() = default;
|
||||
|
||||
void BraveNewTabButton::PaintIcon(gfx::Canvas* canvas) {
|
||||
gfx::ScopedCanvas scoped_canvas(canvas);
|
||||
|
||||
if (HorizontalTabsUpdateEnabled()) {
|
||||
// Instead of letting `NewTabButton` draw a "plus", paint a vector icon to
|
||||
// the canvas in the center of the view.
|
||||
constexpr int kIconSize = 16;
|
||||
gfx::Rect bounds = GetContentsBounds();
|
||||
canvas->Translate(gfx::Vector2d((bounds.width() - kIconSize) / 2,
|
||||
(bounds.height() - kIconSize) / 2));
|
||||
gfx::PaintVectorIcon(canvas, kLeoPlusAddIcon, kIconSize,
|
||||
GetForegroundColor());
|
||||
return;
|
||||
}
|
||||
|
||||
// Shim base implementation's painting
|
||||
// Overriden to fix chromium assumption that border radius
|
||||
// will be 50% of width.
|
||||
|
||||
@@ -21,15 +21,14 @@ class BraveNewTabButton : public NewTabButton {
|
||||
// These static members are shared with BraveTabSearchButton
|
||||
// TODO(sko) If we could make TabSearchButton inherit BraveNewTabButton,
|
||||
// we might not need these any more.
|
||||
static const gfx::Size kButtonSize;
|
||||
static gfx::Size GetButtonSize();
|
||||
static SkPath GetBorderPath(const gfx::Point& origin,
|
||||
float scale,
|
||||
bool extend_to_top,
|
||||
int border_radius,
|
||||
const gfx::Size& contents_bounds);
|
||||
|
||||
BraveNewTabButton(TabStrip* tab_strip, PressedCallback callback);
|
||||
BraveNewTabButton(const BraveNewTabButton&) = delete;
|
||||
BraveNewTabButton& operator=(const BraveNewTabButton&) = delete;
|
||||
~BraveNewTabButton() override;
|
||||
|
||||
protected:
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#include <algorithm>
|
||||
|
||||
#include "brave/browser/ui/tabs/brave_tab_prefs.h"
|
||||
#include "brave/browser/ui/tabs/features.h"
|
||||
#include "brave/browser/ui/views/frame/brave_browser_view.h"
|
||||
#include "brave/browser/ui/views/frame/vertical_tab_strip_region_view.h"
|
||||
#include "brave/browser/ui/views/frame/vertical_tab_strip_widget_delegate_view.h"
|
||||
@@ -90,10 +91,8 @@ class ShadowLayer : public ui::Layer, public ui::LayerDelegate {
|
||||
// bounds.
|
||||
gfx::Rect shadow_bounds(size());
|
||||
shadow_bounds.Inset(GetBlurRegionInsets());
|
||||
const int kCornerRadius =
|
||||
(tab_->data().pinned ? tabs::kPinnedTabBorderRadius
|
||||
: tabs::kUnpinnedTabBorderRadius);
|
||||
recorder.canvas()->DrawRoundRect(shadow_bounds, kCornerRadius, flags);
|
||||
const int radius = tabs::GetTabCornerRadius(*tab_);
|
||||
recorder.canvas()->DrawRoundRect(shadow_bounds, radius, flags);
|
||||
}
|
||||
|
||||
void OnDeviceScaleFactorChanged(float old_device_scale_factor,
|
||||
@@ -160,7 +159,12 @@ absl::optional<SkColor> BraveTab::GetGroupColor() const {
|
||||
return {};
|
||||
}
|
||||
|
||||
return Tab::GetGroupColor();
|
||||
if (!tabs::features::HorizontalTabsUpdateEnabled()) {
|
||||
return Tab::GetGroupColor();
|
||||
}
|
||||
|
||||
// Unlike upstream, tabs that are within a group are not given a border color.
|
||||
return {};
|
||||
}
|
||||
|
||||
void BraveTab::UpdateIconVisibility() {
|
||||
@@ -288,8 +292,11 @@ bool BraveTab::IsAtMinWidthForVerticalTabStrip() const {
|
||||
}
|
||||
|
||||
void BraveTab::UpdateShadowForActiveTab() {
|
||||
if (IsActive() &&
|
||||
tabs::utils::ShouldShowVerticalTabs(controller()->GetBrowser())) {
|
||||
bool can_render_shadows =
|
||||
tabs::features::HorizontalTabsUpdateEnabled() ||
|
||||
tabs::utils::ShouldShowVerticalTabs(controller()->GetBrowser());
|
||||
|
||||
if (IsActive() && can_render_shadows) {
|
||||
shadow_layer_ = CreateShadowLayer();
|
||||
AddLayerToBelowThis();
|
||||
LayoutShadowLayer();
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
|
||||
#include "base/check_is_test.h"
|
||||
#include "base/containers/flat_map.h"
|
||||
#include "brave/browser/ui/tabs/brave_tab_layout_constants.h"
|
||||
#include "brave/browser/ui/tabs/brave_tab_prefs.h"
|
||||
#include "brave/browser/ui/tabs/features.h"
|
||||
#include "brave/browser/ui/views/frame/brave_browser_view.h"
|
||||
@@ -32,6 +33,20 @@
|
||||
#include "ui/gfx/skbitmap_operations.h"
|
||||
#include "ui/views/view_utils.h"
|
||||
|
||||
namespace {
|
||||
|
||||
gfx::Size AddHorizontalTabStripSpacing(gfx::Size size) {
|
||||
if (!tabs::features::HorizontalTabsUpdateEnabled()) {
|
||||
return size;
|
||||
}
|
||||
// Allow for a small space at the top and bottom of the tab strip. Tab group
|
||||
// underlines will partially occupy the space below tabs.
|
||||
size.Enlarge(0, brave_tabs::kHorizontalTabStripVerticalSpacing * 2);
|
||||
return size;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
BraveTabContainer::BraveTabContainer(
|
||||
TabContainerController& controller,
|
||||
TabHoverCardController* hover_card_controller,
|
||||
@@ -91,6 +106,14 @@ base::OnceClosure BraveTabContainer::LockLayout() {
|
||||
base::Unretained(this));
|
||||
}
|
||||
|
||||
gfx::Size BraveTabContainer::GetMinimumSize() const {
|
||||
gfx::Size size = TabContainerImpl::GetMinimumSize();
|
||||
if (tabs::utils::ShouldShowVerticalTabs(tab_slot_controller_->GetBrowser())) {
|
||||
return size;
|
||||
}
|
||||
return AddHorizontalTabStripSpacing(size);
|
||||
}
|
||||
|
||||
gfx::Size BraveTabContainer::CalculatePreferredSize() const {
|
||||
// Note that we check this before checking currently we're in vertical tab
|
||||
// strip mode. We might be in the middle of changing orientation.
|
||||
@@ -100,7 +123,8 @@ gfx::Size BraveTabContainer::CalculatePreferredSize() const {
|
||||
|
||||
if (!tabs::utils::ShouldShowVerticalTabs(
|
||||
tab_slot_controller_->GetBrowser())) {
|
||||
return TabContainerImpl::CalculatePreferredSize();
|
||||
return AddHorizontalTabStripSpacing(
|
||||
TabContainerImpl::CalculatePreferredSize());
|
||||
}
|
||||
|
||||
const int tab_count = tabs_view_model_.view_size();
|
||||
@@ -277,16 +301,6 @@ void BraveTabContainer::CompleteAnimationAndLayout() {
|
||||
base::ranges::for_each(children(), &views::View::Layout);
|
||||
}
|
||||
|
||||
void BraveTabContainer::OnPaintBackground(gfx::Canvas* canvas) {
|
||||
if (!tabs::utils::ShouldShowVerticalTabs(
|
||||
tab_slot_controller_->GetBrowser())) {
|
||||
TabContainerImpl::OnPaintBackground(canvas);
|
||||
return;
|
||||
}
|
||||
|
||||
canvas->DrawColor(GetColorProvider()->GetColor(kColorToolbar));
|
||||
}
|
||||
|
||||
void BraveTabContainer::PaintChildren(const views::PaintInfo& paint_info) {
|
||||
// Exclude tabs that own layer.
|
||||
std::vector<ZOrderableTabContainerElement> orderable_children;
|
||||
|
||||
@@ -32,6 +32,7 @@ class BraveTabContainer : public TabContainerImpl {
|
||||
base::OnceClosure LockLayout();
|
||||
|
||||
// TabContainerImpl:
|
||||
gfx::Size GetMinimumSize() const override;
|
||||
gfx::Size CalculatePreferredSize() const override;
|
||||
void UpdateClosingModeOnRemovedTab(int model_index, bool was_active) override;
|
||||
gfx::Rect GetTargetBoundsForClosingTab(Tab* tab,
|
||||
@@ -43,7 +44,6 @@ class BraveTabContainer : public TabContainerImpl {
|
||||
void RemoveTab(int index, bool was_active) override;
|
||||
void OnTabCloseAnimationCompleted(Tab* tab) override;
|
||||
void CompleteAnimationAndLayout() override;
|
||||
void OnPaintBackground(gfx::Canvas* canvas) override;
|
||||
void PaintChildren(const views::PaintInfo& paint_info) override;
|
||||
|
||||
// BrowserRootView::DropTarget
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
|
||||
#include "brave/browser/ui/views/tabs/brave_tab_group_header.h"
|
||||
|
||||
#include "brave/browser/ui/tabs/features.h"
|
||||
#include "brave/browser/ui/views/tabs/vertical_tab_utils.h"
|
||||
#include "chrome/browser/ui/browser.h"
|
||||
#include "chrome/browser/ui/tabs/tab_group_model.h"
|
||||
@@ -20,9 +21,8 @@
|
||||
|
||||
namespace {
|
||||
|
||||
SkColor GetGroupBackgroundColorForVerticalTabs(
|
||||
const tab_groups::TabGroupId& group_id,
|
||||
TabSlotController* controller) {
|
||||
SkColor GetGroupBackgroundColor(const tab_groups::TabGroupId& group_id,
|
||||
TabSlotController* controller) {
|
||||
if (!controller->GetBrowser()
|
||||
->tab_strip_model()
|
||||
->group_model()
|
||||
@@ -60,11 +60,13 @@ void BraveTabGroupHeader::AddedToWidget() {
|
||||
|
||||
void BraveTabGroupHeader::VisualsChanged() {
|
||||
TabGroupHeader::VisualsChanged();
|
||||
if (!ShouldShowVerticalTabs()) {
|
||||
|
||||
if (!tabs::features::HorizontalTabsUpdateEnabled() &&
|
||||
!ShouldShowVerticalTabs()) {
|
||||
return;
|
||||
}
|
||||
|
||||
title_->SetEnabledColor(GetGroupBackgroundColorForVerticalTabs(
|
||||
title_->SetEnabledColor(GetGroupBackgroundColor(
|
||||
group().value(), base::to_address(tab_slot_controller_)));
|
||||
title_->SetSubpixelRenderingEnabled(false);
|
||||
|
||||
@@ -72,19 +74,18 @@ void BraveTabGroupHeader::VisualsChanged() {
|
||||
title_->SetFontList(font_list.DeriveWithWeight(gfx::Font::Weight::MEDIUM)
|
||||
.DeriveWithSizeDelta(13 - font_list.GetFontSize()));
|
||||
|
||||
// We don't draw background for vertical tabs.
|
||||
title_chip_->SetBackground(nullptr);
|
||||
|
||||
LayoutTitleChip();
|
||||
if (ShouldShowVerticalTabs()) {
|
||||
LayoutTitleChipForVerticalTabs();
|
||||
}
|
||||
}
|
||||
|
||||
void BraveTabGroupHeader::Layout() {
|
||||
TabGroupHeader::Layout();
|
||||
if (!ShouldShowVerticalTabs()) {
|
||||
return;
|
||||
if (ShouldShowVerticalTabs()) {
|
||||
LayoutTitleChipForVerticalTabs();
|
||||
}
|
||||
|
||||
LayoutTitleChip();
|
||||
}
|
||||
|
||||
bool BraveTabGroupHeader::ShouldShowVerticalTabs() const {
|
||||
@@ -92,7 +93,7 @@ bool BraveTabGroupHeader::ShouldShowVerticalTabs() const {
|
||||
tab_slot_controller_->GetBrowser());
|
||||
}
|
||||
|
||||
void BraveTabGroupHeader::LayoutTitleChip() {
|
||||
void BraveTabGroupHeader::LayoutTitleChipForVerticalTabs() {
|
||||
auto title_bounds = GetContentsBounds();
|
||||
title_bounds.Inset(gfx::Insets(kPaddingForGroup * 2));
|
||||
title_chip_->SetBoundsRect(title_bounds);
|
||||
|
||||
@@ -28,7 +28,7 @@ class BraveTabGroupHeader : public TabGroupHeader {
|
||||
|
||||
private:
|
||||
bool ShouldShowVerticalTabs() const;
|
||||
void LayoutTitleChip();
|
||||
void LayoutTitleChipForVerticalTabs();
|
||||
};
|
||||
|
||||
#endif // BRAVE_BROWSER_UI_VIEWS_TABS_BRAVE_TAB_GROUP_HEADER_H_
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
|
||||
#include "brave/browser/ui/views/tabs/brave_tab_group_highlight.h"
|
||||
|
||||
#include "brave/browser/ui/tabs/brave_tab_layout_constants.h"
|
||||
#include "brave/browser/ui/tabs/features.h"
|
||||
#include "brave/browser/ui/views/tabs/brave_tab_group_header.h"
|
||||
#include "brave/browser/ui/views/tabs/vertical_tab_utils.h"
|
||||
#include "chrome/browser/ui/views/tabs/tab_group_views.h"
|
||||
@@ -12,10 +14,24 @@
|
||||
BraveTabGroupHighlight::~BraveTabGroupHighlight() = default;
|
||||
|
||||
SkPath BraveTabGroupHighlight::GetPath() const {
|
||||
if (!tabs::utils::ShouldShowVerticalTabs(tab_group_views_->GetBrowser())) {
|
||||
// We don't have to paint a highlight for vertical tabs.
|
||||
if (tabs::utils::ShouldShowVerticalTabs(tab_group_views_->GetBrowser())) {
|
||||
return {};
|
||||
}
|
||||
|
||||
if (!tabs::features::HorizontalTabsUpdateEnabled()) {
|
||||
return TabGroupHighlight::GetPath();
|
||||
}
|
||||
|
||||
// We don't have to paint highlight for vertical tabs
|
||||
return {};
|
||||
// Draw a rounded rect that encloses the header and all tabs within the
|
||||
// group.
|
||||
float tab_top = 0;
|
||||
float tab_left = brave_tabs::kHorizontalTabInset;
|
||||
float tab_right = bounds().width() - brave_tabs::kHorizontalTabInset;
|
||||
float tab_bottom = bounds().height();
|
||||
float radius = brave_tabs::kTabBorderRadius;
|
||||
|
||||
SkPath path;
|
||||
path.addRoundRect({tab_left, tab_top, tab_right, tab_bottom}, radius, radius);
|
||||
return path;
|
||||
}
|
||||
|
||||
@@ -7,6 +7,8 @@
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
#include "brave/browser/ui/tabs/brave_tab_layout_constants.h"
|
||||
#include "brave/browser/ui/tabs/features.h"
|
||||
#include "brave/browser/ui/views/tabs/brave_tab_group_header.h"
|
||||
#include "brave/browser/ui/views/tabs/vertical_tab_utils.h"
|
||||
#include "cc/paint/paint_flags.h"
|
||||
@@ -14,6 +16,7 @@
|
||||
#include "chrome/browser/ui/views/tabs/tab_group_views.h"
|
||||
#include "ui/gfx/canvas.h"
|
||||
#include "ui/gfx/geometry/skia_conversions.h"
|
||||
#include "ui/views/view_utils.h"
|
||||
|
||||
BraveTabGroupUnderline::BraveTabGroupUnderline(
|
||||
TabGroupViews* tab_group_views,
|
||||
@@ -44,10 +47,21 @@ void BraveTabGroupUnderline::UpdateBounds(const views::View* leading_view,
|
||||
|
||||
gfx::Insets BraveTabGroupUnderline::GetInsetsForUnderline(
|
||||
const views::View* sibling_view) const {
|
||||
if (!ShouldShowVerticalTabs())
|
||||
return TabGroupUnderline::GetInsetsForUnderline(sibling_view);
|
||||
if (ShouldShowVerticalTabs()) {
|
||||
return {};
|
||||
}
|
||||
|
||||
return {};
|
||||
if (!tabs::features::HorizontalTabsUpdateEnabled()) {
|
||||
return TabGroupUnderline::GetInsetsForUnderline(sibling_view);
|
||||
}
|
||||
|
||||
// For horizontal tabs, the underline should be inset slightly within the
|
||||
// visual edges of the tab.
|
||||
int horizontal_inset = TabGroupUnderline::kStrokeThickness +
|
||||
brave_tabs::kHorizontalTabInset +
|
||||
brave_tabs::kHorizontalGroupUnderlineInset;
|
||||
|
||||
return gfx::Insets::VH(0, horizontal_inset);
|
||||
}
|
||||
|
||||
gfx::Rect BraveTabGroupUnderline::CalculateTabGroupUnderlineBounds(
|
||||
@@ -55,8 +69,17 @@ gfx::Rect BraveTabGroupUnderline::CalculateTabGroupUnderlineBounds(
|
||||
const views::View* const leading_view,
|
||||
const views::View* const trailing_view) const {
|
||||
if (!ShouldShowVerticalTabs()) {
|
||||
return TabGroupUnderline::CalculateTabGroupUnderlineBounds(
|
||||
auto bounds = TabGroupUnderline::CalculateTabGroupUnderlineBounds(
|
||||
underline_view, leading_view, trailing_view);
|
||||
|
||||
if (tabs::features::HorizontalTabsUpdateEnabled()) {
|
||||
// Upstream places the underline at the bottom tab border. Push the
|
||||
// underline down to the bottom of the tab strip, so that it will appear
|
||||
// below the tabs.
|
||||
bounds.Offset(0, brave_tabs::kHorizontalTabStripVerticalSpacing);
|
||||
}
|
||||
|
||||
return bounds;
|
||||
}
|
||||
|
||||
// override bounds for vertical tabs mode.
|
||||
|
||||
@@ -5,11 +5,12 @@
|
||||
|
||||
#include "brave/browser/ui/views/tabs/brave_tab_search_button.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <memory>
|
||||
|
||||
#include "brave/browser/ui/tabs/features.h"
|
||||
#include "brave/browser/ui/views/brave_tab_search_bubble_host.h"
|
||||
#include "brave/browser/ui/views/tabs/brave_new_tab_button.h"
|
||||
#include "brave/components/vector_icons/vector_icons.h"
|
||||
#include "chrome/browser/ui/views/chrome_layout_provider.h"
|
||||
#include "chrome/browser/ui/views/tabs/new_tab_button.h"
|
||||
#include "chrome/browser/ui/views/tabs/tab_strip_controller.h"
|
||||
@@ -29,7 +30,12 @@ BraveTabSearchButton::BraveTabSearchButton(TabStrip* tab_strip)
|
||||
BraveTabSearchButton::~BraveTabSearchButton() = default;
|
||||
|
||||
gfx::Size BraveTabSearchButton::CalculatePreferredSize() const {
|
||||
return BraveNewTabButton::kButtonSize;
|
||||
auto size = BraveNewTabButton::GetButtonSize();
|
||||
if (tabs::features::HorizontalTabsUpdateEnabled()) {
|
||||
auto insets = GetInsets();
|
||||
size.Enlarge(insets.width(), insets.height());
|
||||
}
|
||||
return size;
|
||||
}
|
||||
|
||||
void BraveTabSearchButton::SetBubbleArrow(views::BubbleBorder::Arrow arrow) {
|
||||
@@ -37,6 +43,26 @@ void BraveTabSearchButton::SetBubbleArrow(views::BubbleBorder::Arrow arrow) {
|
||||
->SetBubbleArrow(arrow);
|
||||
}
|
||||
|
||||
void BraveTabSearchButton::UpdateColors() {
|
||||
TabSearchButton::UpdateColors();
|
||||
|
||||
if (!tabs::features::HorizontalTabsUpdateEnabled()) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Use a custom icon for tab search.
|
||||
constexpr int kIconSize = 16;
|
||||
SetImageModel(views::Button::STATE_NORMAL,
|
||||
ui::ImageModel::FromVectorIcon(
|
||||
kLeoSearchIcon, GetForegroundColor(), kIconSize));
|
||||
SetImageModel(views::Button::STATE_HOVERED, ui::ImageModel());
|
||||
SetImageModel(views::Button::STATE_PRESSED, ui::ImageModel());
|
||||
|
||||
// Unset any backgrounds or borders.
|
||||
SetBorder(nullptr);
|
||||
SetBackground(nullptr);
|
||||
}
|
||||
|
||||
int BraveTabSearchButton::GetCornerRadius() const {
|
||||
return ChromeLayoutProvider::Get()->GetCornerRadiusMetric(
|
||||
views::Emphasis::kMaximum, GetContentsBounds().size());
|
||||
|
||||
@@ -21,7 +21,8 @@ class BraveTabSearchButton : public TabSearchButton {
|
||||
|
||||
void SetBubbleArrow(views::BubbleBorder::Arrow arrow);
|
||||
|
||||
// TabSearchButton overrides:
|
||||
// TabSearchButton:
|
||||
void UpdateColors() override;
|
||||
gfx::Size CalculatePreferredSize() const override;
|
||||
int GetCornerRadius() const override;
|
||||
};
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
#include "brave/browser/profiles/profile_util.h"
|
||||
#include "brave/browser/themes/brave_dark_mode_utils.h"
|
||||
#include "brave/browser/ui/color/brave_color_id.h"
|
||||
#include "brave/browser/ui/tabs/brave_tab_layout_constants.h"
|
||||
#include "brave/browser/ui/tabs/brave_tab_prefs.h"
|
||||
#include "brave/browser/ui/tabs/features.h"
|
||||
#include "brave/browser/ui/tabs/shared_pinned_tab_service.h"
|
||||
@@ -37,10 +38,20 @@
|
||||
#include "third_party/skia/include/core/SkColor.h"
|
||||
#include "ui/base/metadata/metadata_impl_macros.h"
|
||||
#include "ui/compositor/layer.h"
|
||||
#include "ui/gfx/canvas.h"
|
||||
#include "ui/views/layout/flex_layout.h"
|
||||
|
||||
using tabs::features::HorizontalTabsUpdateEnabled;
|
||||
|
||||
BraveTabStrip::BraveTabStrip(std::unique_ptr<TabStripController> controller)
|
||||
: TabStrip(std::move(controller)) {}
|
||||
: TabStrip(std::move(controller)) {
|
||||
if (HorizontalTabsUpdateEnabled()) {
|
||||
// In order for active tab shadow effects to be applied consistently across
|
||||
// platforms, an ancestor of the active tab and shadow need to be painted to
|
||||
// a layer.
|
||||
SetPaintToLayer();
|
||||
}
|
||||
}
|
||||
|
||||
BraveTabStrip::~BraveTabStrip() = default;
|
||||
|
||||
@@ -80,6 +91,12 @@ bool BraveTabStrip::ShouldDrawStrokes() const {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (HorizontalTabsUpdateEnabled()) {
|
||||
// We never automatically draw strokes around tabs. For pinned tabs, we draw
|
||||
// the stroke when generating the tab drawing path.
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!TabStrip::ShouldDrawStrokes()) {
|
||||
return false;
|
||||
}
|
||||
@@ -105,7 +122,7 @@ bool BraveTabStrip::ShouldDrawStrokes() const {
|
||||
}
|
||||
|
||||
int BraveTabStrip::GetStrokeThickness() const {
|
||||
if (ShouldShowVerticalTabs()) {
|
||||
if (ShouldShowVerticalTabs() || HorizontalTabsUpdateEnabled()) {
|
||||
// Bypass checking ShouldDrawStrokes().
|
||||
return 1;
|
||||
}
|
||||
@@ -163,6 +180,8 @@ void BraveTabStrip::MaybeStartDrag(
|
||||
void BraveTabStrip::AddedToWidget() {
|
||||
TabStrip::AddedToWidget();
|
||||
|
||||
UpdateTabStripMargins();
|
||||
|
||||
if (BrowserView::GetBrowserViewForBrowser(GetBrowser())) {
|
||||
UpdateTabContainer();
|
||||
} else {
|
||||
@@ -375,6 +394,29 @@ void BraveTabStrip::UpdateTabContainer() {
|
||||
}
|
||||
}
|
||||
|
||||
void BraveTabStrip::UpdateTabStripMargins() {
|
||||
if (!HorizontalTabsUpdateEnabled()) {
|
||||
return;
|
||||
}
|
||||
|
||||
gfx::Insets margins;
|
||||
|
||||
if (!ShouldShowVerticalTabs()) {
|
||||
// There should be a medium size gap between the left edge of the tabstrip
|
||||
// and the visual left edge of the first tab. Set a left margin that takes
|
||||
// into account the visual tab inset.
|
||||
margins.set_left(brave_tabs::kHorizontalTabStripLeftMargin -
|
||||
brave_tabs::kHorizontalTabInset);
|
||||
DCHECK_GE(margins.left(), 0);
|
||||
|
||||
// Set a top margin to match the space under tabs (where the group underline
|
||||
// is rendered), so that everything remains centered.
|
||||
margins.set_top(brave_tabs::kHorizontalTabStripVerticalSpacing);
|
||||
}
|
||||
|
||||
SetProperty(views::kMarginsKey, margins);
|
||||
}
|
||||
|
||||
bool BraveTabStrip::ShouldShowVerticalTabs() const {
|
||||
return tabs::utils::ShouldShowVerticalTabs(GetBrowser());
|
||||
}
|
||||
@@ -397,5 +439,17 @@ void BraveTabStrip::Layout() {
|
||||
TabStrip::Layout();
|
||||
}
|
||||
|
||||
void BraveTabStrip::OnPaintBackground(gfx::Canvas* canvas) {
|
||||
// Unlike upstream, we are painting this view to an opaque layer in order to
|
||||
// support layer-based shadows under the active tab. Paint a background so
|
||||
// that all pixels are painted appropriately.
|
||||
ui::ColorId color_id = ShouldShowVerticalTabs() ? kColorToolbar
|
||||
: GetWidget()->ShouldPaintAsActive()
|
||||
? kColorTabBackgroundInactiveFrameActive
|
||||
: kColorTabBackgroundInactiveFrameInactive;
|
||||
|
||||
canvas->DrawColor(GetColorProvider()->GetColor(color_id));
|
||||
}
|
||||
|
||||
BEGIN_METADATA(BraveTabStrip, TabStrip)
|
||||
END_METADATA
|
||||
|
||||
@@ -37,6 +37,7 @@ class BraveTabStrip : public TabStrip {
|
||||
FRIEND_TEST_ALL_PREFIXES(ColorPaletteTest, LightThemeMinimumContrast);
|
||||
|
||||
void UpdateTabContainer();
|
||||
void UpdateTabStripMargins();
|
||||
bool ShouldShowVerticalTabs() const;
|
||||
|
||||
// TabStrip overrides:
|
||||
@@ -44,6 +45,7 @@ class BraveTabStrip : public TabStrip {
|
||||
bool ShouldDrawStrokes() const override;
|
||||
int GetStrokeThickness() const override;
|
||||
void Layout() override;
|
||||
void OnPaintBackground(gfx::Canvas* canvas) override;
|
||||
|
||||
// Exposed for testing.
|
||||
static constexpr float kBraveMinimumContrastRatioForOutlines = 1.2797f;
|
||||
|
||||
@@ -7,6 +7,8 @@
|
||||
|
||||
#include <limits>
|
||||
|
||||
#include "brave/browser/ui/tabs/brave_tab_layout_constants.h"
|
||||
#include "brave/browser/ui/tabs/features.h"
|
||||
#include "brave/browser/ui/views/tabs/brave_tab_group_header.h"
|
||||
#include "brave/browser/ui/views/tabs/brave_tab_strip.h"
|
||||
#include "chrome/browser/ui/layout_constants.h"
|
||||
@@ -109,6 +111,14 @@ void CalculateVerticalLayout(const TabLayoutConstants& layout_constants,
|
||||
|
||||
} // namespace
|
||||
|
||||
int GetTabCornerRadius(const Tab& tab) {
|
||||
if (!tabs::features::HorizontalTabsUpdateEnabled()) {
|
||||
return tab.data().pinned ? 8 : 4;
|
||||
}
|
||||
|
||||
return brave_tabs::kTabBorderRadius;
|
||||
}
|
||||
|
||||
std::vector<gfx::Rect> CalculateVerticalTabBounds(
|
||||
const TabLayoutConstants& layout_constants,
|
||||
const std::vector<TabWidthConstraints>& tabs,
|
||||
@@ -127,6 +137,22 @@ std::vector<gfx::Rect> CalculateVerticalTabBounds(
|
||||
return bounds;
|
||||
}
|
||||
|
||||
std::vector<gfx::Rect> CalculateBoundsForHorizontalDraggedViews(
|
||||
const std::vector<TabSlotView*>& views,
|
||||
TabStrip* tab_strip) {
|
||||
// Chromium aligns the dragged tabs to the bottom of the tab strip, whereas we
|
||||
// need to keep the tabs aligned to the top.
|
||||
std::vector<gfx::Rect> bounds;
|
||||
const int overlap = TabStyle::Get()->GetTabOverlap();
|
||||
int x = 0;
|
||||
for (const TabSlotView* view : views) {
|
||||
const int width = view->width();
|
||||
bounds.emplace_back(x, 0, width, view->height());
|
||||
x += width - overlap;
|
||||
}
|
||||
return bounds;
|
||||
}
|
||||
|
||||
std::vector<gfx::Rect> CalculateBoundsForVerticalDraggedViews(
|
||||
const std::vector<TabSlotView*>& views,
|
||||
TabStrip* tab_strip) {
|
||||
|
||||
@@ -16,6 +16,7 @@ namespace gfx {
|
||||
class Rect;
|
||||
} // namespace gfx
|
||||
|
||||
class Tab;
|
||||
class TabStripLayoutHelper;
|
||||
class TabWidthConstraints;
|
||||
class TabStripController;
|
||||
@@ -31,8 +32,7 @@ constexpr int kVerticalTabMinWidth = kVerticalTabHeight;
|
||||
constexpr int kVerticalTabsSpacing = 4;
|
||||
constexpr int kMarginForVerticalTabContainers = kVerticalTabsSpacing;
|
||||
|
||||
constexpr int kUnpinnedTabBorderRadius = 4;
|
||||
constexpr int kPinnedTabBorderRadius = 8;
|
||||
int GetTabCornerRadius(const Tab& tab);
|
||||
|
||||
std::vector<gfx::Rect> CalculateVerticalTabBounds(
|
||||
const TabLayoutConstants& layout_constants,
|
||||
@@ -40,6 +40,10 @@ std::vector<gfx::Rect> CalculateVerticalTabBounds(
|
||||
absl::optional<int> width,
|
||||
bool is_floating_mode);
|
||||
|
||||
std::vector<gfx::Rect> CalculateBoundsForHorizontalDraggedViews(
|
||||
const std::vector<TabSlotView*>& views,
|
||||
TabStrip* tab_strip);
|
||||
|
||||
std::vector<gfx::Rect> CalculateBoundsForVerticalDraggedViews(
|
||||
const std::vector<TabSlotView*>& views,
|
||||
TabStrip* tab_strip);
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
|
||||
namespace {
|
||||
|
||||
using tabs::features::HorizontalTabsUpdateEnabled;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// BraveGM2TabStyle
|
||||
//
|
||||
@@ -21,9 +23,6 @@ class BraveGM2TabStyle : public GM2TabStyleViews {
|
||||
protected:
|
||||
TabStyle::TabColors CalculateTargetColors() const override;
|
||||
|
||||
Tab* tab() { return base::to_address(tab_); }
|
||||
const Tab* tab() const { return base::to_address(tab_); }
|
||||
|
||||
private:
|
||||
raw_ptr<Tab> tab_;
|
||||
};
|
||||
@@ -63,12 +62,14 @@ class BraveVerticalTabStyle : public BraveGM2TabStyle {
|
||||
bool force_active = false,
|
||||
TabStyle::RenderUnits render_units =
|
||||
TabStyle::RenderUnits::kPixels) const override;
|
||||
|
||||
gfx::Insets GetContentsInsets() const override;
|
||||
TabStyle::SeparatorBounds GetSeparatorBounds(float scale) const override;
|
||||
float GetSeparatorOpacity(bool for_layout, bool leading) const override;
|
||||
void PaintTab(gfx::Canvas* canvas) const override;
|
||||
|
||||
private:
|
||||
bool ShouldShowVerticalTabs() const;
|
||||
bool IsInGroupAndNotActive() const;
|
||||
SkColor GetTargetTabBackgroundColor(
|
||||
TabStyle::TabSelectionState selection_state,
|
||||
bool hovered) const override;
|
||||
@@ -82,7 +83,7 @@ SkPath BraveVerticalTabStyle::GetPath(
|
||||
float scale,
|
||||
bool force_active,
|
||||
TabStyle::RenderUnits render_units) const {
|
||||
if (!ShouldShowVerticalTabs()) {
|
||||
if (!HorizontalTabsUpdateEnabled() && !ShouldShowVerticalTabs()) {
|
||||
return BraveGM2TabStyle::GetPath(path_type, scale, force_active,
|
||||
render_units);
|
||||
}
|
||||
@@ -94,6 +95,15 @@ SkPath BraveVerticalTabStyle::GetPath(
|
||||
return {};
|
||||
}
|
||||
|
||||
// Horizontal tabs should have a visual gap between them, even if their view
|
||||
// bounds are touching or slightly overlapping. Create a visual gap by
|
||||
// insetting the bounds of the tab by the required gap plus overlap before
|
||||
// drawing the rectangle.
|
||||
if (!ShouldShowVerticalTabs()) {
|
||||
aligned_bounds.Inset(
|
||||
gfx::InsetsF::VH(0, brave_tabs::kHorizontalTabInset * scale));
|
||||
}
|
||||
|
||||
#if DCHECK_IS_ON()
|
||||
if (tab()->bounds().height() != std::round(aligned_bounds.height() / scale)) {
|
||||
DLOG(ERROR) << "We don't want it to be off by 1 dip\n|height|: "
|
||||
@@ -109,8 +119,7 @@ SkPath BraveVerticalTabStyle::GetPath(
|
||||
float tab_left = aligned_bounds.x();
|
||||
float tab_right = aligned_bounds.right();
|
||||
float tab_bottom = aligned_bounds.bottom();
|
||||
int radius =
|
||||
is_pinned ? tabs::kPinnedTabBorderRadius : tabs::kUnpinnedTabBorderRadius;
|
||||
int radius = tabs::GetTabCornerRadius(*tab());
|
||||
|
||||
if (is_pinned) {
|
||||
// Only pinned tabs have border
|
||||
@@ -152,28 +161,111 @@ SkPath BraveVerticalTabStyle::GetPath(
|
||||
return path;
|
||||
}
|
||||
|
||||
gfx::Insets BraveVerticalTabStyle::GetContentsInsets() const {
|
||||
if (!HorizontalTabsUpdateEnabled()) {
|
||||
return BraveGM2TabStyle::GetContentsInsets();
|
||||
}
|
||||
|
||||
// Ignore any stroke widths when determining the horizontal contents insets.
|
||||
return tab_style()->GetContentsInsets();
|
||||
}
|
||||
|
||||
TabStyle::SeparatorBounds BraveVerticalTabStyle::GetSeparatorBounds(
|
||||
float scale) const {
|
||||
if (ShouldShowVerticalTabs()) {
|
||||
return {};
|
||||
}
|
||||
|
||||
return BraveGM2TabStyle::GetSeparatorBounds(scale);
|
||||
if (!HorizontalTabsUpdateEnabled()) {
|
||||
return BraveGM2TabStyle::GetSeparatorBounds(scale);
|
||||
}
|
||||
|
||||
gfx::SizeF size(tab_style()->GetSeparatorSize());
|
||||
size.Scale(scale);
|
||||
const gfx::RectF aligned_bounds =
|
||||
ScaleAndAlignBounds(tab()->bounds(), scale, GetStrokeThickness());
|
||||
|
||||
// Note: `leading` bounds are used for rect corner radius calculation and so
|
||||
// must be non-empty, even if we don't want to show it.
|
||||
TabStyle::SeparatorBounds bounds;
|
||||
bounds.leading = gfx::RectF(aligned_bounds.right(),
|
||||
(aligned_bounds.height() - size.height()) / 2,
|
||||
size.width(), size.height());
|
||||
bounds.trailing = bounds.leading;
|
||||
bounds.trailing.set_x(aligned_bounds.right() - size.width());
|
||||
|
||||
gfx::PointF origin(tab()->bounds().origin());
|
||||
origin.Scale(scale);
|
||||
bounds.trailing.Offset(-origin.x(), -origin.y());
|
||||
|
||||
return bounds;
|
||||
}
|
||||
|
||||
float BraveVerticalTabStyle::GetSeparatorOpacity(bool for_layout,
|
||||
bool leading) const {
|
||||
if (ShouldShowVerticalTabs() || !HorizontalTabsUpdateEnabled()) {
|
||||
return BraveGM2TabStyle::GetSeparatorOpacity(for_layout, leading);
|
||||
}
|
||||
|
||||
if (leading) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (tab()->data().pinned) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
const auto has_visible_background = [](const Tab* const tab) {
|
||||
return tab->IsActive() || tab->IsSelected() || tab->IsMouseHovered();
|
||||
};
|
||||
|
||||
if (has_visible_background(tab())) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
const Tab* const next_tab = tab()->controller()->GetAdjacentTab(tab(), 1);
|
||||
|
||||
const float visible_opacity =
|
||||
GetHoverInterpolatedSeparatorOpacity(for_layout, next_tab);
|
||||
|
||||
// Show separator if this is the last tab (and is therefore followed by the
|
||||
// new tab icon).
|
||||
if (!next_tab) {
|
||||
return visible_opacity;
|
||||
}
|
||||
|
||||
// Show separator if there is a group header between this tab and the next.
|
||||
if (next_tab->group().has_value() && tab()->group() != next_tab->group()) {
|
||||
return visible_opacity;
|
||||
}
|
||||
|
||||
if (has_visible_background(next_tab)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return visible_opacity;
|
||||
}
|
||||
|
||||
void BraveVerticalTabStyle::PaintTab(gfx::Canvas* canvas) const {
|
||||
BraveGM2TabStyle::PaintTab(canvas);
|
||||
if (!ShouldShowVerticalTabs()) {
|
||||
|
||||
if (!HorizontalTabsUpdateEnabled() && !ShouldShowVerticalTabs()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (tab()->data().pinned) {
|
||||
const auto* widget = tab()->GetWidget();
|
||||
CHECK(widget);
|
||||
const SkColor tab_stroke_color =
|
||||
widget->GetColorProvider()->GetColor(kColorBraveVerticalTabSeparator);
|
||||
|
||||
ui::ColorId color_id = widget->ShouldPaintAsActive()
|
||||
? kColorTabStrokeFrameActive
|
||||
: kColorTabStrokeFrameInactive;
|
||||
if (ShouldShowVerticalTabs()) {
|
||||
color_id = kColorBraveVerticalTabSeparator;
|
||||
}
|
||||
|
||||
PaintBackgroundStroke(canvas, TabStyle::TabSelectionState::kActive,
|
||||
tab_stroke_color);
|
||||
widget->GetColorProvider()->GetColor(color_id));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
/* Copyright (c) 2023 The Brave Authors. All rights reserved.
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||
* You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
#include "brave/browser/ui/tabs/brave_tab_style.h"
|
||||
|
||||
#define BRAVE_TAB_STYLE_GET return new BraveTabStyle<GM2TabStyle>();
|
||||
#include "src/chrome/browser/ui/tabs/tab_style.cc"
|
||||
#undef BRAVE_TAB_STYLE_GET
|
||||
@@ -0,0 +1,17 @@
|
||||
/* Copyright (c) 2023 The Brave Authors. All rights reserved.
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||
* You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
#include "brave/browser/ui/tabs/features.h"
|
||||
|
||||
// The tab region view maintains its own padding; the frame view does not need
|
||||
// to reserve an extra top margin for it.
|
||||
#define BRAVE_BROWSER_FRAME_VIEW_WIN_TOP_AREA_HEIGHT \
|
||||
if (tabs::features::HorizontalTabsUpdateEnabled()) { \
|
||||
return top; \
|
||||
}
|
||||
|
||||
#include "src/chrome/browser/ui/views/frame/browser_frame_view_win.cc" // IWYU pragma: export
|
||||
|
||||
#undef BRAVE_BROWSER_FRAME_VIEW_WIN_TOP_AREA_HEIGHT
|
||||
@@ -6,8 +6,17 @@
|
||||
#include "brave/browser/ui/views/tabs/brave_new_tab_button.h"
|
||||
#include "brave/browser/ui/views/tabs/brave_tab_search_button.h"
|
||||
|
||||
// Currently, `NewTabButton::kButtonSize` is used to calculate tab strip button
|
||||
// borders. Since the size of buttons varies depending upon the tabs update
|
||||
// feature flag, replace the `kButtonSize` identifier with a call to the static
|
||||
// `BraveNewTabButton::GetButtonSize` function.
|
||||
#define kButtonSize GetButtonSize()
|
||||
|
||||
#define NewTabButton BraveNewTabButton
|
||||
#define TabSearchButton BraveTabSearchButton
|
||||
|
||||
#include "src/chrome/browser/ui/views/frame/tab_strip_region_view.cc"
|
||||
|
||||
#undef TabSearchButton
|
||||
#undef NewTabButton
|
||||
#undef kButtonSize
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
|
||||
#include "chrome/browser/ui/views/tabs/tab_group_style.h"
|
||||
|
||||
#include "brave/browser/ui/tabs/brave_tab_layout_constants.h"
|
||||
#include "brave/browser/ui/tabs/features.h"
|
||||
#include "brave/browser/ui/views/tabs/vertical_tab_utils.h"
|
||||
|
||||
#define TabGroupStyle TabGroupStyle_ChromiumImpl
|
||||
@@ -48,10 +50,28 @@ SkPath TabGroupStyle::GetUnderlinePath(gfx::Rect local_bounds) const {
|
||||
return path;
|
||||
}
|
||||
|
||||
gfx::Insets TabGroupStyle::GetInsetsForHeaderChip() const {
|
||||
auto insets = TabGroupStyle_ChromiumImpl::GetInsetsForHeaderChip();
|
||||
if (!tabs::features::HorizontalTabsUpdateEnabled()) {
|
||||
return insets;
|
||||
}
|
||||
if (!ShouldShowVerticalTabs()) {
|
||||
insets += gfx::Insets::VH(0, brave_tabs::kHorizontalTabInset);
|
||||
}
|
||||
return insets;
|
||||
}
|
||||
|
||||
bool TabGroupStyle::ShouldShowVerticalTabs() const {
|
||||
return tabs::utils::ShouldShowVerticalTabs(tab_group_views_->GetBrowser());
|
||||
}
|
||||
|
||||
float TabGroupStyle::GetEmptyChipSize() const {
|
||||
if (!tabs::features::HorizontalTabsUpdateEnabled()) {
|
||||
return TabGroupStyle_ChromiumImpl::GetEmptyChipSize();
|
||||
}
|
||||
return brave_tabs::kEmptyGroupTitleSize;
|
||||
}
|
||||
|
||||
int ChromeRefresh2023TabGroupStyle::GetTabGroupOverlapAdjustment() {
|
||||
return ChromeRefresh2023TabGroupStyle_ChromiumImpl::
|
||||
GetTabGroupOverlapAdjustment();
|
||||
|
||||
@@ -22,6 +22,10 @@ class TabGroupStyle : public TabGroupStyle_ChromiumImpl {
|
||||
|
||||
SkPath GetUnderlinePath(gfx::Rect local_bounds) const override;
|
||||
|
||||
gfx::Insets GetInsetsForHeaderChip() const override;
|
||||
|
||||
float GetEmptyChipSize() const override;
|
||||
|
||||
private:
|
||||
bool ShouldShowVerticalTabs() const;
|
||||
};
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
|
||||
#include <cmath>
|
||||
|
||||
#include "brave/browser/ui/tabs/features.h"
|
||||
#include "brave/browser/ui/views/tabs/brave_compound_tab_container.h"
|
||||
#include "brave/browser/ui/views/tabs/brave_tab.h"
|
||||
#include "brave/browser/ui/views/tabs/brave_tab_group_header.h"
|
||||
@@ -43,19 +44,20 @@
|
||||
continue; \
|
||||
}
|
||||
|
||||
#define BRAVE_TAB_DRAG_CONTEXT_IMPL_CALCULATE_BOUNDS_FOR_DRAGGED_VIEWS \
|
||||
if (tabs::utils::ShouldShowVerticalTabs(tab_strip_->GetBrowser())) { \
|
||||
return tabs::CalculateBoundsForVerticalDraggedViews(views, tab_strip_); \
|
||||
#define BRAVE_TAB_DRAG_CONTEXT_IMPL_CALCULATE_BOUNDS_FOR_DRAGGED_VIEWS \
|
||||
if (tabs::utils::ShouldShowVerticalTabs(tab_strip_->GetBrowser())) { \
|
||||
return tabs::CalculateBoundsForVerticalDraggedViews(views, tab_strip_); \
|
||||
} \
|
||||
if (tabs::features::HorizontalTabsUpdateEnabled()) { \
|
||||
return tabs::CalculateBoundsForHorizontalDraggedViews(views, tab_strip_); \
|
||||
}
|
||||
|
||||
#define BRAVE_TAB_DRAG_CONTEXT_IMPL_PAINT_CHILDREN \
|
||||
if (tabs::utils::ShouldShowVerticalTabs(tab_strip_->GetBrowser())) { \
|
||||
for (const ZOrderableTabContainerElement& child : orderable_children) \
|
||||
if (!child.view()->layer()) { \
|
||||
child.view()->Paint(paint_info); \
|
||||
} \
|
||||
return; \
|
||||
}
|
||||
#define BRAVE_TAB_DRAG_CONTEXT_IMPL_PAINT_CHILDREN \
|
||||
for (const ZOrderableTabContainerElement& child : orderable_children) \
|
||||
if (!child.view()->layer()) { \
|
||||
child.view()->Paint(paint_info); \
|
||||
} \
|
||||
return;
|
||||
|
||||
#include "src/chrome/browser/ui/views/tabs/tab_strip.cc"
|
||||
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
|
||||
#include "chrome/browser/ui/views/tabs/tab_style_views.h"
|
||||
#include "brave/browser/ui/color/brave_color_id.h"
|
||||
#include "brave/browser/ui/tabs/brave_tab_layout_constants.h"
|
||||
#include "brave/browser/ui/tabs/features.h"
|
||||
#include "brave/browser/ui/views/tabs/brave_tab_group_header.h"
|
||||
#include "brave/browser/ui/views/tabs/vertical_tab_utils.h"
|
||||
#include "chrome/browser/ui/views/tabs/tab_slot_controller.h"
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
diff --git a/chrome/browser/ui/tabs/tab_style.cc b/chrome/browser/ui/tabs/tab_style.cc
|
||||
index aa9cd303743116892d65f71f66759bc4cefe05f5..25a252b713af07ecc4cf3ecd0312d48b9f9eba3a 100644
|
||||
--- a/chrome/browser/ui/tabs/tab_style.cc
|
||||
+++ b/chrome/browser/ui/tabs/tab_style.cc
|
||||
@@ -275,6 +275,7 @@ SkColor ChromeRefresh2023TabStyle::GetTabBackgroundColor(
|
||||
|
||||
// static
|
||||
const TabStyle* TabStyle::Get() {
|
||||
+ BRAVE_TAB_STYLE_GET
|
||||
static TabStyle* const tab_style =
|
||||
features::IsChromeRefresh2023()
|
||||
? static_cast<TabStyle*>(new ChromeRefresh2023TabStyle())
|
||||
@@ -0,0 +1,12 @@
|
||||
diff --git a/chrome/browser/ui/views/frame/browser_frame_view_win.cc b/chrome/browser/ui/views/frame/browser_frame_view_win.cc
|
||||
index a4c7824a16a504f577668cfb2b40428c1b63d1c1..bde9e6ede746e52cd90c7417917b503c635eb79e 100644
|
||||
--- a/chrome/browser/ui/views/frame/browser_frame_view_win.cc
|
||||
+++ b/chrome/browser/ui/views/frame/browser_frame_view_win.cc
|
||||
@@ -531,6 +531,7 @@ int BrowserFrameViewWin::TopAreaHeight(bool restored) const {
|
||||
: caption_button_container_->GetPreferredSize().height();
|
||||
return top;
|
||||
}
|
||||
+ BRAVE_BROWSER_FRAME_VIEW_WIN_TOP_AREA_HEIGHT
|
||||
|
||||
// In Refresh, the tabstrip controls its own top padding.
|
||||
if (features::IsChromeRefresh2023()) {
|
||||
Reference in New Issue
Block a user