blob: b2dcced3575a18131a634b4ddba46baec958dc85 [file] [log] [blame]
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_TABS_TAB_STYLE_H_
#define CHROME_BROWSER_UI_TABS_TAB_STYLE_H_
#include <tuple>
#include "chrome/browser/ui/color/chrome_color_id.h"
#include "chrome/browser/ui/tabs/tab_types.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/color/color_id.h"
#include "ui/gfx/color_palette.h"
#include "ui/gfx/font_list.h"
#include "ui/gfx/geometry/insets.h"
#include "ui/gfx/geometry/rect_f.h"
#include "ui/gfx/geometry/size.h"
namespace ui {
class ColorProvider;
}
// Holds the basic logic for rendering tabs, including preferred sizes, paths,
// etc.
class TabStyle {
public:
// The different types of path GetPath() can return. Different paths are used
// in different situations, but most (excluding |kClip|) are roughly the same
// shape.
enum class PathType {
// Interior fill outline. Extends halfway into the border so there are no
// gaps between border and fill.
kFill,
// Center of the border path. The path is guaranteed to fit into the tab
// bounds, including the stroke thickness.
kBorder,
// The hit test region. May be extended into a rectangle that touches the
// top of the bounding box when the window is maximized, for Fitts' Law.
kHitTest,
// The area inside the tab where children can be rendered, used to clip
// child views. Does not have to be the same shape as the border.
kInteriorClip,
// The path used for focus rings.
kHighlight,
};
// How we want the resulting path scaled.
enum class RenderUnits {
// The path is in pixels, and should have its internal area nicely aligned
// to pixel boundaries.
kPixels,
// The path is in DIPs. It will likely be calculated in pixels and then
// scaled back down.
kDips
};
enum class ShowHoverStyle { kSubtle, kPronounced };
enum class HideHoverStyle {
kGradual, // The hover should fade out.
kImmediate, // The hover should cut off, with no fade out.
};
// The states the tab can be in throughout its selection lifecycle.
enum class TabSelectionState {
kActive,
kSelected,
kInactive,
};
// If we want to draw vertical separators between tabs, these are the leading
// and trailing separator stroke rectangles.
struct SeparatorBounds {
gfx::RectF leading;
gfx::RectF trailing;
};
// Contains values 0..1 representing the opacity of the corresponding
// separators. These are physical and not logical, so "left" is the left
// separator in both LTR and RTL.
struct SeparatorOpacities {
float left = 0, right = 0;
};
// Colors for various parts of the tab derived by TabStyle.
struct TabColors {
SkColor foreground_color = gfx::kPlaceholderColor;
SkColor background_color = gfx::kPlaceholderColor;
ui::ColorId focus_ring_color = kColorTabFocusRingInactive;
ui::ColorId close_button_focus_ring_color =
kColorTabCloseButtonFocusRingInactive;
TabColors() = default;
TabColors(SkColor foreground_color,
SkColor background_color,
ui::ColorId focus_ring_color,
ui::ColorId close_button_focus_ring_color)
: foreground_color(foreground_color),
background_color(background_color),
focus_ring_color(focus_ring_color),
close_button_focus_ring_color(close_button_focus_ring_color) {}
bool operator==(const TabColors& other) const {
return std::tie(foreground_color, background_color, focus_ring_color,
close_button_focus_ring_color) ==
std::tie(other.foreground_color, other.background_color,
other.focus_ring_color,
other.close_button_focus_ring_color);
}
};
TabStyle(const TabStyle&) = delete;
TabStyle& operator=(const TabStyle&) = delete;
~TabStyle();
// Returns the standard height of a single Tab.
int GetStandardHeight() const;
// Returns the preferred width of a single Tab, assuming space is
// available.
int GetStandardWidth(const bool is_split) const;
// Returns the width for pinned tabs. Pinned tabs always have this width.
int GetPinnedWidth(const bool is_split) const;
// Returns the minimum possible width of an active Tab. Active tabs must
// always show a close button, and thus have a larger minimum size than
// inactive tabs.
int GetMinimumActiveWidth(const bool is_split) const;
// Returns the minimum possible width of a single inactive Tab.
int GetMinimumInactiveWidth() const;
// Returns the overlap between adjacent tabs.
int GetTabOverlap() const;
// Gets the size of the separator drawn between tabs, if any.
gfx::Size GetSeparatorSize() const;
// Gets the distance between the separator and tab, if any.
gfx::Insets GetSeparatorMargins() const;
// Gets the radius of the rounded rect used to draw the separator.
int GetSeparatorCornerRadius() const;
// Returns, for a tab of height |height|, how far the window top drag handle
// can extend down into inactive tabs or the new tab button. This behavior
// is not used in all cases.
int GetDragHandleExtension(int height) const;
// Gets the preferred size for tab previews, which could be screencaps, hero
// or og:image images, etc.
gfx::Size GetPreviewImageSize() const;
// Returns the radius of the outer corners of the tab shape.
int GetTopCornerRadius() const;
// Returns the radius of the outer corners of the tab shape.
int GetBottomCornerRadius() const;
// Returns the background color of a tab with selection state `state`.
// `frame_active` is whether the tab's widget is painted as active or not.
// TODO(tbergquist): Non-Tab callers of this should probably be refactored to
// use their own color ids.
SkColor GetTabBackgroundColor(TabSelectionState state,
bool hovered,
bool frame_active,
const ui::ColorProvider& color_provider) const;
// Opacity of the active tab background painted over inactive selected tabs.
float GetSelectedTabOpacity() const;
// Returns how far from the leading and trailing edges of a tab the contents
// should actually be laid out.
gfx::Insets GetContentsInsets() const;
// The largest valid value of TabStyle::GetZValue(). Currently,
// GM2TabStyle::GetZValue is the only implementation, and it can't return
// values larger than 7.
static constexpr float kMaximumZValue = 7.0f;
static constexpr float kDefaultSelectedTabOpacity = 0.75f;
static const TabStyle* Get();
protected:
// Avoid implicitly-deleted constructor.
TabStyle() = default;
};
#endif // CHROME_BROWSER_UI_TABS_TAB_STYLE_H_