blob: 689ec1e3dd14846072a169c67d9aa35b859d4289 [file] [log] [blame]
// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef UI_VIEWS_LAYOUT_LAYOUT_PROVIDER_H_
#define UI_VIEWS_LAYOUT_LAYOUT_PROVIDER_H_
#include "ui/gfx/geometry/insets.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/shadow_value.h"
#include "ui/views/style/typography_provider.h"
#include "ui/views/views_export.h"
namespace views {
enum InsetsMetric {
// Embedders can extend this enum with additional values that are understood
// by the LayoutProvider implementation. Embedders define enum values from
// VIEWS_INSETS_END. Values named beginning with "INSETS_" represent the
// actual Insets: the rest are markers.
VIEWS_INSETS_START = 0,
// Internal border around checkboxes and radio buttons.
INSETS_CHECKBOX_RADIO_BUTTON = VIEWS_INSETS_START,
// The margins around the edges of the dialog.
INSETS_DIALOG,
// The margins around the button row of a dialog. The top margin is implied
// by the content insets and the other margins overlap with INSETS_DIALOG.
INSETS_DIALOG_BUTTON_ROW,
// The insets to use for a section of a dialog that needs padding around it.
// For example, the contents of a TabbedPane.
INSETS_DIALOG_SUBSECTION,
// The margins around the icon/title of a dialog. The bottom margin is implied
// by the content insets and the other margins overlap with INSETS_DIALOG.
INSETS_DIALOG_TITLE,
// The margins for the dialog footnote content.
INSETS_DIALOG_FOOTNOTE,
// The margins around the edges of a tooltip bubble.
INSETS_TOOLTIP_BUBBLE,
// Padding to add to vector image buttons to increase their click and touch
// target size.
INSETS_VECTOR_IMAGE_BUTTON,
// Padding used in a label button.
INSETS_LABEL_BUTTON,
// Padding used in icon buttons.
INSETS_ICON_BUTTON,
// Embedders must start Insets enum values from this value.
VIEWS_INSETS_END,
// All Insets enum values must be below this value.
VIEWS_INSETS_MAX = 0x1000
};
enum DistanceMetric {
// DistanceMetric enum values must always be greater than any InsetsMetric
// value. This allows the code to verify at runtime that arguments of the
// two types have not been interchanged.
VIEWS_DISTANCE_START = VIEWS_INSETS_MAX,
// Width and height of a vector icon in a bubble's header (i.e. the one
// returned from GetWindowIcon).
DISTANCE_BUBBLE_HEADER_VECTOR_ICON_SIZE = VIEWS_DISTANCE_START,
// Width of a bubble unless the content is too wide to make that
// feasible.
DISTANCE_BUBBLE_PREFERRED_WIDTH,
// The default padding to add on each side of a button's label.
DISTANCE_BUTTON_HORIZONTAL_PADDING,
// The maximum width a button can have and still influence the sizes of
// other linked buttons. This allows short buttons to have linked widths
// without long buttons making things overly wide.
DISTANCE_BUTTON_MAX_LINKABLE_WIDTH,
// The distance between a dialog's edge and the close button in the upper
// trailing corner.
DISTANCE_CLOSE_BUTTON_MARGIN,
// Vertical spacing between a list of multiple controls in one column.
DISTANCE_CONTROL_LIST_VERTICAL,
// The vertical padding applied to text in a control.
DISTANCE_CONTROL_VERTICAL_TEXT_PADDING,
// The vertical padding applied to text in a table.
DISTANCE_TABLE_VERTICAL_TEXT_PADDING,
// The default minimum width of a dialog button.
DISTANCE_DIALOG_BUTTON_MINIMUM_WIDTH,
// The distance between the bottom of a dialog's content, when the final
// content element is a control, and the top of the dialog's button row.
DISTANCE_DIALOG_CONTENT_MARGIN_BOTTOM_CONTROL,
// The distance between the bottom of a dialog's content, when the final
// content element is text, and the top of the dialog's button row.
DISTANCE_DIALOG_CONTENT_MARGIN_BOTTOM_TEXT,
// The distance between the bottom of a dialog's title and the top of the
// dialog's content, when the first content element is a control.
DISTANCE_DIALOG_CONTENT_MARGIN_TOP_CONTROL,
// The distance between the bottom of a dialog's title and the top of the
// dialog's content, when the first content element is text.
DISTANCE_DIALOG_CONTENT_MARGIN_TOP_TEXT,
// Width of the space in a dropdown button between its label and down arrow.
DISTANCE_DROPDOWN_BUTTON_LABEL_ARROW_SPACING,
// Width of the horizontal padding in a dropdown button between the down arrow
// and the button's border.
DISTANCE_DROPDOWN_BUTTON_RIGHT_MARGIN,
// Width of the horizontal padding in a dropdown button between the button's
// left border and the label.
DISTANCE_DROPDOWN_BUTTON_LEFT_MARGIN,
// Width of modal dialogs unless the content is too wide to make that
// feasible.
DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH,
// Width of larger modal dialogs that require extra width.
DISTANCE_LARGE_MODAL_DIALOG_PREFERRED_WIDTH,
// The spacing between a pair of related horizontal buttons, used for
// dialog layout.
DISTANCE_RELATED_BUTTON_HORIZONTAL,
// Horizontal spacing between controls that are logically related.
DISTANCE_RELATED_CONTROL_HORIZONTAL,
// The spacing between a pair of related vertical controls, used for
// dialog layout.
DISTANCE_RELATED_CONTROL_VERTICAL,
// Horizontal spacing between an item such as an icon or checkbox and a
// label related to it.
DISTANCE_RELATED_LABEL_HORIZONTAL,
// Height to stop at when expanding a scrollable area in a dialog to
// accommodate its content.
DISTANCE_DIALOG_SCROLLABLE_AREA_MAX_HEIGHT,
// Height to stop at when expanding a scrollable area in a modal dialog to
// accomodate its content.
DISTANCE_MODAL_DIALOG_SCROLLABLE_AREA_MAX_HEIGHT,
// Horizontal margin between a table cell and its contents.
DISTANCE_TABLE_CELL_HORIZONTAL_MARGIN,
// Horizontal padding applied to text in a textfield.
DISTANCE_TEXTFIELD_HORIZONTAL_TEXT_PADDING,
// Horizontal spacing between controls that are logically unrelated.
DISTANCE_UNRELATED_CONTROL_HORIZONTAL,
// Vertical spacing between controls that are logically unrelated.
DISTANCE_UNRELATED_CONTROL_VERTICAL,
// Padding in vector icons. This is a general number for more vector icons.
DISTANCE_VECTOR_ICON_PADDING,
// Embedders must start DistanceMetric enum values from here.
VIEWS_DISTANCE_END,
// All Distance enum values must be below this value.
VIEWS_DISTANCE_MAX = 0x2000
};
// The type of a dialog content element. kText should be used for Labels or
// other elements that only show text. Otherwise kControl should be used.
enum class DialogContentType { kControl, kText };
enum class Emphasis {
// No emphasis needed for shadows, corner radius, etc.
kNone,
// Use this to indicate low-emphasis interactive elements such as buttons and
// text fields.
kLow,
// Use this for components with medium emphasis, such the autofill dropdown.
kMedium,
// High-emphasis components, such as tabs or dialogs.
kHigh,
// Maximum emphasis components like the omnibox or rich suggestions.
kMaximum,
};
// ShapeContextTokens are enums specific to the context of a Views object.
// This includes components such as Buttons, Labels, Textfields, Dropdowns, etc.
// These context tokens are granular to the entire client and will map to
// sys token values (see below).
enum class ShapeContextTokens {
kBadgeRadius,
kButtonRadius,
kComboboxRadius,
kDialogRadius,
kExtensionsMenuButtonRadius,
kFindBarViewRadius,
kMenuRadius,
kMenuAuxRadius,
kMenuTouchRadius,
kOmniboxExpandedRadius,
kTextfieldRadius,
kSidePanelContentRadius,
kContentSeparatorRadius,
};
// ShapeSysTokens are tokens that map to a fixed value that aligns with UX/UI.
// Different from context tokens that will expand, sys tokens are more selective
// and are not used by the client. Context tokens will be mapped to a
// Sys token which then will fetch the corresponding fixed value.
enum class ShapeSysTokens {
// Default token should never be used and signals a missing shaping token
// mapping.
kDefault,
kXSmall,
kSmall,
kMediumSmall,
kMedium,
kLarge,
kFull,
};
class VIEWS_EXPORT LayoutProvider {
public:
LayoutProvider();
LayoutProvider(const LayoutProvider&) = delete;
LayoutProvider& operator=(const LayoutProvider&) = delete;
virtual ~LayoutProvider();
// This should never return nullptr.
// TODO(crbug.com/40178332): Replace callers of this with
// View::GetLayoutProvider().
static LayoutProvider* Get();
// Calculates the control height based on the |font|'s reported glyph height,
// the default line spacing and DISTANCE_CONTROL_VERTICAL_TEXT_PADDING.
static int GetControlHeightForFont(int context,
int style,
const gfx::FontList& font);
// Returns the insets metric according to the given enumeration element.
virtual gfx::Insets GetInsetsMetric(int metric) const;
// Returns the distance metric between elements according to the given
// enumeration element.
virtual int GetDistanceMetric(int metric) const;
// Returns the TypographyProvider, used to configure text properties such as
// font, weight, color, size, and line height.
virtual const TypographyProvider& GetTypographyProvider() const;
// Returns the actual width to use for a dialog that requires at least
// |min_width|.
virtual int GetSnappedDialogWidth(int min_width) const;
// Returns the insets that should be used around a dialog's content for the
// given type of content. |leading| is the type (text or control) of the first
// element in the content and |trailing| is the type of the final element.
gfx::Insets GetDialogInsetsForContentType(DialogContentType leading,
DialogContentType trailing) const;
// TODO(crbug.com/41376600): Possibly combine the following two
// functions into a single function returning a struct.
// Returns the corner radius specific to the given emphasis.
virtual int GetCornerRadiusMetric(Emphasis emphasis,
const gfx::Size& size) const;
int GetCornerRadiusMetric(Emphasis emphasis) const {
return GetCornerRadiusMetric(emphasis, gfx::Size());
}
// Returns the shadow elevation metric for the given emphasis.
virtual int GetShadowElevationMetric(Emphasis emphasis) const;
// Returns the corner radius related to a specific context token.
// TODO(crbug.com/40255130): Replace GetCornerRadiusMetric(Emphasis...) with
// context tokens.
int GetCornerRadiusMetric(ShapeContextTokens token,
const gfx::Size& size = gfx::Size()) const;
protected:
static constexpr int kSmallDialogWidth = 320;
static constexpr int kMediumDialogWidth = 448;
static constexpr int kLargeDialogWidth = 512;
private:
TypographyProvider typography_provider_;
};
} // namespace views
#endif // UI_VIEWS_LAYOUT_LAYOUT_PROVIDER_H_