blob: 2a03e1dbb97c0dc2b0bff45ad6fb8df9203bd56d [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 gfx {
class Canvas;
}
class SkPath;
// 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.
};
// 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;
virtual ~TabStyle();
// Gets the specific |path_type| associated with the specific |tab|.
// If |force_active| is true, applies an active appearance on the tab (usually
// involving painting an optional stroke) even if the tab is not the active
// tab.
virtual SkPath GetPath(
PathType path_type,
float scale,
bool force_active = false,
RenderUnits render_units = RenderUnits::kPixels) const = 0;
// Returns the insets to use for laying out tab contents.
virtual gfx::Insets GetContentsInsets() const = 0;
// Returns the z-value of the tab, which should be used to paint them in
// ascending order. Return values are in the range (0,
// TabStyle::GetMaximumZValue()).
virtual float GetZValue() const = 0;
// Returns the current opacity of the "active" portion of the tab's state.
virtual float GetActiveOpacity() const = 0;
// Returns whichever of (active, inactive) the tab appears more like given the
// active opacity.
virtual TabActive GetApparentActiveState() const = 0;
// Derives and returns colors for the tab. See TabColors, above.
virtual TabColors CalculateColors() const = 0;
// Returns the appropriate fonts for the current theme and active state.
virtual const gfx::FontList& GetFontList() const = 0;
// Paints the tab.
virtual void PaintTab(gfx::Canvas* canvas) const = 0;
// Sets the center of the radial highlight in the hover animation.
virtual void SetHoverLocation(const gfx::Point& location) = 0;
// Shows the hover animation.
virtual void ShowHover(ShowHoverStyle style) = 0;
// Hides the hover animation.
virtual void HideHover(HideHoverStyle style) = 0;
// Opacity of the active tab background painted over inactive selected tabs.
static constexpr float kSelectedTabOpacity = 0.75f;
// Returns the preferred width of a single Tab, assuming space is
// available.
static int GetStandardWidth();
// Returns the width for pinned tabs. Pinned tabs always have this width.
static int GetPinnedWidth();
// Returns the overlap between adjacent tabs.
static int GetTabOverlap();
// Get the space only partially occupied by a tab that we should
// consider to be padding rather than part of the body of the tab for
// interaction purposes.
static gfx::Insets GetTabInternalPadding();
// Gets the size of the separator drawn between tabs, if any.
static gfx::Size GetSeparatorSize();
// 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.
static int GetDragHandleExtension(int height);
// Gets the preferred size for tab previews, which could be screencaps, hero
// or og:image images, etc.
static gfx::Size GetPreviewImageSize();
// Returns the radius of the outer corners of the tab shape.
static int GetCornerRadius();
// 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;
protected:
// Avoid implicitly-deleted constructor.
TabStyle() = default;
// Returns how far from the leading and trailing edges of a tab the contents
// should actually be laid out.
static int GetContentsHorizontalInsetSize();
};
#endif // CHROME_BROWSER_UI_TABS_TAB_STYLE_H_