blob: b96f4a1ae392f2698a4581333067d5510bfb05fb [file] [log] [blame]
// Copyright 2017 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/box_layout_example.h"
#include <memory>
#include <string>
#include <utility>
#include "base/strings/string_number_conversions.h"
#include "base/strings/utf_string_conversions.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/base/models/combobox_model.h"
#include "ui/gfx/geometry/insets.h"
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/views/border.h"
#include "ui/views/controls/button/checkbox.h"
#include "ui/views/controls/button/md_text_button.h"
#include "ui/views/controls/combobox/combobox.h"
#include "ui/views/controls/label.h"
#include "ui/views/controls/textfield/textfield.h"
#include "ui/views/examples/example_combobox_model.h"
#include "ui/views/layout/fill_layout.h"
#include "ui/views/view.h"
namespace views {
namespace examples {
BoxLayoutExample::BoxLayoutExample() : LayoutExampleBase("Box Layout") {}
BoxLayoutExample::~BoxLayoutExample() = default;
void BoxLayoutExample::ContentsChanged(Textfield* textfield,
const std::u16string& new_contents) {
if (textfield == between_child_spacing_) {
UpdateLayoutManager();
} else if (textfield == default_flex_) {
int default_flex;
base::StringToInt(default_flex_->GetText(), &default_flex);
layout_->SetDefaultFlex(default_flex);
} else if (textfield == min_cross_axis_size_) {
int min_cross_size;
base::StringToInt(min_cross_axis_size_->GetText(), &min_cross_size);
layout_->set_minimum_cross_axis_size(min_cross_size);
} else if (textfield == border_insets_.left ||
textfield == border_insets_.top ||
textfield == border_insets_.right ||
textfield == border_insets_.bottom) {
UpdateBorderInsets();
}
RefreshLayoutPanel(false);
}
void BoxLayoutExample::CreateAdditionalControls() {
constexpr const char* kOrientationValues[2] = {"Horizontal", "Vertical"};
orientation_ = CreateAndAddCombobox(
u"Orientation", kOrientationValues, std::size(kOrientationValues),
base::BindRepeating(&LayoutExampleBase::RefreshLayoutPanel,
base::Unretained(this), true));
constexpr const char* kMainAxisValues[3] = {"Start", "Center", "End"};
main_axis_alignment_ = CreateAndAddCombobox(
u"Main axis", kMainAxisValues, std::size(kMainAxisValues),
base::BindRepeating(&BoxLayoutExample::MainAxisAlignmentChanged,
base::Unretained(this)));
constexpr const char* kCrossAxisValues[4] = {"Stretch", "Start", "Center",
"End"};
cross_axis_alignment_ = CreateAndAddCombobox(
u"Cross axis", kCrossAxisValues, std::size(kCrossAxisValues),
base::BindRepeating(&BoxLayoutExample::CrossAxisAlignmentChanged,
base::Unretained(this)));
between_child_spacing_ = CreateAndAddTextfield(u"Child spacing");
default_flex_ = CreateAndAddTextfield(u"Default flex");
min_cross_axis_size_ = CreateAndAddTextfield(u"Min cross axis");
CreateMarginsTextFields(u"Insets", &border_insets_);
collapse_margins_ = CreateAndAddCheckbox(
u"Collapse margins",
base::BindRepeating(&LayoutExampleBase::RefreshLayoutPanel,
base::Unretained(this), true));
UpdateLayoutManager();
}
void BoxLayoutExample::UpdateLayoutManager() {
View* const panel = layout_panel();
int child_spacing;
base::StringToInt(between_child_spacing_->GetText(), &child_spacing);
layout_ = panel->SetLayoutManager(std::make_unique<BoxLayout>(
orientation_->GetSelectedIndex() == 0
? BoxLayout::Orientation::kHorizontal
: BoxLayout::Orientation::kVertical,
gfx::Insets(), child_spacing, collapse_margins_->GetChecked()));
layout_->set_cross_axis_alignment(static_cast<BoxLayout::CrossAxisAlignment>(
cross_axis_alignment_->GetSelectedIndex()));
layout_->set_main_axis_alignment(static_cast<BoxLayout::MainAxisAlignment>(
main_axis_alignment_->GetSelectedIndex()));
int default_flex;
base::StringToInt(default_flex_->GetText(), &default_flex);
layout_->SetDefaultFlex(default_flex);
int min_cross_size;
base::StringToInt(min_cross_axis_size_->GetText(), &min_cross_size);
layout_->set_minimum_cross_axis_size(min_cross_size);
UpdateBorderInsets();
for (View* child : panel->children()) {
const int flex = static_cast<ChildPanel*>(child)->GetFlex();
if (flex < 0)
layout_->ClearFlexForView(child);
else
layout_->SetFlexForView(child, flex);
}
}
void BoxLayoutExample::UpdateBorderInsets() {
layout_->set_inside_border_insets(TextfieldsToInsets(border_insets_));
}
void BoxLayoutExample::MainAxisAlignmentChanged() {
layout_->set_main_axis_alignment(static_cast<BoxLayout::MainAxisAlignment>(
main_axis_alignment_->GetSelectedIndex()));
RefreshLayoutPanel(false);
}
void BoxLayoutExample::CrossAxisAlignmentChanged() {
layout_->set_cross_axis_alignment(static_cast<BoxLayout::CrossAxisAlignment>(
cross_axis_alignment_->GetSelectedIndex()));
RefreshLayoutPanel(false);
}
} // namespace examples
} // namespace views