1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269
|
// 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,
kSidePanelPageContentRadius,
};
// 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_
|