blob: b395387d61aa6cc04e89fe8fc10bdba1b36e302c [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/views/examples/button_sticker_sheet.h"
#include "base/strings/utf_string_conversions.h"
#include "ui/base/material_design/material_design_controller.h"
#include "ui/views/controls/button/button.h"
#include "ui/views/controls/button/md_text_button.h"
#include "ui/views/layout/grid_layout.h"
namespace views {
namespace examples {
namespace {
// The id of the only ColumnSet in a stretchy grid (see below).
const int kStretchyGridColumnSetId = 0;
// Creates a stretchy grid layout: there are |ncols| columns, separated from
// each other by padding columns, and all non-padding columns have equal flex
// weight and will flex in either dimension as needed. The resulting grid layout
// has only one ColumnSet (numbered kStretchyGridColumnSetId).
GridLayout* MakeStretchyGridLayout(View* host, int ncols) {
const float kPaddingResizesEqually = 1.0;
const int kPaddingWidth = 30;
const GridLayout::Alignment kColumnStretchesHorizontally = GridLayout::FILL;
const GridLayout::Alignment kColumnStretchesVertically = GridLayout::FILL;
const float kColumnDoesNotResize = 0.0;
const GridLayout::SizeType kColumnUsesFixedSize = GridLayout::FIXED;
const int kColumnWidth = 96;
GridLayout* layout =
host->SetLayoutManager(std::make_unique<views::GridLayout>(host));
ColumnSet* columns = layout->AddColumnSet(kStretchyGridColumnSetId);
for (int i = 0; i < ncols; ++i) {
if (i != 0)
columns->AddPaddingColumn(kPaddingResizesEqually, kPaddingWidth);
columns->AddColumn(kColumnStretchesHorizontally, kColumnStretchesVertically,
kColumnDoesNotResize, kColumnUsesFixedSize, kColumnWidth,
kColumnWidth);
}
return layout;
}
View* MakePlainLabel(const std::string& text) {
return new Label(base::ASCIIToUTF16(text));
}
// Add a row containing a label whose text is |label_text| and then all the
// views in |views| to the supplied GridLayout, with padding between rows.
void AddLabelledRowToGridLayout(GridLayout* layout,
const std::string& label_text,
std::vector<View*> views) {
const float kRowDoesNotResizeVertically = 0.0;
const int kPaddingRowHeight = 8;
layout->StartRow(kRowDoesNotResizeVertically, kStretchyGridColumnSetId);
layout->AddView(MakePlainLabel(label_text));
for (auto* view : views)
layout->AddView(view);
// This gets added extraneously after the last row, but it doesn't hurt and
// means there's no need to keep track of whether to add it or not.
layout->AddPaddingRow(kRowDoesNotResizeVertically, kPaddingRowHeight);
}
// Constructs a pair of MdTextButtons in the specified |state| with the
// specified |listener|, and returns them in |*primary| and |*secondary|. The
// button in |*primary| is a call-to-action button, and the button in
// |*secondary| is a regular button.
void MakeButtonsInState(MdTextButton** primary,
MdTextButton** secondary,
ButtonListener* listener,
Button::ButtonState state) {
const base::string16 button_text = base::ASCIIToUTF16("Button");
*primary = MdTextButton::Create(listener, button_text);
(*primary)->SetProminent(true);
(*primary)->SetState(state);
*secondary = MdTextButton::Create(listener, button_text);
(*secondary)->SetState(state);
}
} // namespace
ButtonStickerSheet::ButtonStickerSheet()
: ExampleBase("Button (Sticker Sheet)") {}
ButtonStickerSheet::~ButtonStickerSheet() {}
void ButtonStickerSheet::CreateExampleView(View* container) {
GridLayout* layout = MakeStretchyGridLayout(container, 3);
if (!ui::MaterialDesignController::IsSecondaryUiMaterial()) {
const char* kNeedsMdWarning =
"This will look wrong without --secondary-ui-md.";
layout->StartRow(0, 0);
layout->AddView(MakePlainLabel(kNeedsMdWarning), 3, 1);
}
// The title row has an empty row label.
AddLabelledRowToGridLayout(
layout, std::string(),
{MakePlainLabel("Primary"), MakePlainLabel("Secondary")});
MdTextButton* primary = nullptr;
MdTextButton* secondary = nullptr;
MakeButtonsInState(&primary, &secondary, this, Button::STATE_NORMAL);
AddLabelledRowToGridLayout(layout, "Default", {primary, secondary});
MakeButtonsInState(&primary, &secondary, this, Button::STATE_NORMAL);
AddLabelledRowToGridLayout(layout, "Normal", {primary, secondary});
MakeButtonsInState(&primary, &secondary, this, Button::STATE_HOVERED);
AddLabelledRowToGridLayout(layout, "Hovered", {primary, secondary});
MakeButtonsInState(&primary, &secondary, this, Button::STATE_PRESSED);
AddLabelledRowToGridLayout(layout, "Pressed", {primary, secondary});
MakeButtonsInState(&primary, &secondary, this, Button::STATE_DISABLED);
AddLabelledRowToGridLayout(layout, "Disabled", {primary, secondary});
MakeButtonsInState(&primary, &secondary, this, Button::STATE_NORMAL);
primary->OnFocus();
secondary->OnFocus();
AddLabelledRowToGridLayout(layout, "Focused", {primary, secondary});
}
void ButtonStickerSheet::ButtonPressed(Button* button, const ui::Event& event) {
// Ignore button presses.
}
} // namespace examples
} // namespace views