Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5985)

Unified Diff: chrome/browser/ui/views/payments/editor_view_controller.cc

Issue 2871873003: [Payments] Fix up field widths in desktop editors. (Closed)
Patch Set: addressed comments Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/views/payments/editor_view_controller.cc
diff --git a/chrome/browser/ui/views/payments/editor_view_controller.cc b/chrome/browser/ui/views/payments/editor_view_controller.cc
index a6e926ebae2399c4a477f373a0abcaa98d0b1d44..44ac42a67589145a6fecc7b587880fd6f0c87a24 100644
--- a/chrome/browser/ui/views/payments/editor_view_controller.cc
+++ b/chrome/browser/ui/views/payments/editor_view_controller.cc
@@ -106,6 +106,11 @@ std::unique_ptr<views::View> EditorViewController::CreateCustomFieldView(
return nullptr;
}
+std::unique_ptr<views::View> EditorViewController::CreateExtraViewForField(
+ autofill::ServerFieldType type) {
+ return nullptr;
+}
+
std::unique_ptr<views::Button> EditorViewController::CreatePrimaryButton() {
std::unique_ptr<views::Button> button(
views::MdTextButton::CreateSecondaryUiBlueButton(
@@ -205,28 +210,79 @@ std::unique_ptr<views::View> EditorViewController::CreateEditorView() {
text_fields_.clear();
comboboxes_.clear();
- std::unique_ptr<views::GridLayout> editor_layout =
- base::MakeUnique<views::GridLayout>(editor_view.get());
-
// The editor view is padded horizontally.
editor_view->SetBorder(views::CreateEmptyBorder(
0, payments::kPaymentRequestRowHorizontalInsets, 0,
payments::kPaymentRequestRowHorizontalInsets));
- views::ColumnSet* columns = editor_layout->AddColumnSet(0);
- columns->AddColumn(views::GridLayout::LEADING, views::GridLayout::CENTER, 0,
- views::GridLayout::USE_PREF, 0, 0);
-
- // This is the horizontal padding between the label and the input field.
+ // All views have fixed size except the Field which stretches. The fixed
+ // padding at the end is computed so that Field views have a minimum of
+ // 176/272dp (short/long fields) as per spec.
+ // ___________________________________________________________________________
+ // |Label | 16dp pad | Field (flex) | 8dp pad | Extra View | Computed Padding|
+ // |______|__________|______________|_________|____________|_________________|
+ constexpr int kLabelWidth = 140;
+ // This is the horizontal padding between the label and the field.
constexpr int kLabelInputFieldHorizontalPadding = 16;
- columns->AddPaddingColumn(0, kLabelInputFieldHorizontalPadding);
+ // This is the horizontal padding between the field and the extra view.
+ constexpr int kFieldExtraViewHorizontalPadding = 8;
+ constexpr int kShortFieldMinimumWidth = 176;
+ constexpr int kLongFieldMinimumWidth = 272;
- columns->AddColumn(views::GridLayout::LEADING, views::GridLayout::CENTER, 0,
- views::GridLayout::USE_PREF, 0, 0);
+ std::unique_ptr<views::GridLayout> editor_layout =
+ base::MakeUnique<views::GridLayout>(editor_view.get());
+ // Column set for short fields.
+ views::ColumnSet* columns_short = editor_layout->AddColumnSet(0);
+ columns_short->AddColumn(views::GridLayout::LEADING,
+ views::GridLayout::CENTER, 0,
+ views::GridLayout::FIXED, kLabelWidth, 0);
+ columns_short->AddPaddingColumn(0, kLabelInputFieldHorizontalPadding);
+ // The field view column stretches.
+ columns_short->AddColumn(views::GridLayout::LEADING,
+ views::GridLayout::CENTER, 1,
+ views::GridLayout::USE_PREF, 0, 0);
+ columns_short->AddPaddingColumn(0, kFieldExtraViewHorizontalPadding);
+ // The extra field view column is fixed size, computed from the largest
+ // extra view.
+ int short_extra_view_width =
+ ComputeWidestExtraViewWidth(EditorField::LengthHint::HINT_SHORT);
+ columns_short->AddColumn(views::GridLayout::LEADING,
+ views::GridLayout::CENTER, 0,
+ views::GridLayout::FIXED, short_extra_view_width, 0);
+ // The padding at the end is fixed, computed to make sure the short field
+ // maintains its minimum width.
+ int short_padding = kDialogMinWidth - kShortFieldMinimumWidth - kLabelWidth -
+ (2 * kPaymentRequestRowHorizontalInsets) -
+ kLabelInputFieldHorizontalPadding -
+ kFieldExtraViewHorizontalPadding - short_extra_view_width;
+ columns_short->AddPaddingColumn(0, short_padding);
+
+ // Column set for long fields.
+ views::ColumnSet* columns_long = editor_layout->AddColumnSet(1);
+ columns_long->AddColumn(views::GridLayout::LEADING, views::GridLayout::CENTER,
+ 0, views::GridLayout::FIXED, kLabelWidth, 0);
+ columns_long->AddPaddingColumn(0, kLabelInputFieldHorizontalPadding);
+ // The field view column stretches.
+ columns_long->AddColumn(views::GridLayout::LEADING, views::GridLayout::CENTER,
+ 1, views::GridLayout::USE_PREF, 0, 0);
+ columns_long->AddPaddingColumn(0, kFieldExtraViewHorizontalPadding);
+ // The extra field view column is fixed size, computed from the largest
+ // extra view.
+ int long_extra_view_width =
+ ComputeWidestExtraViewWidth(EditorField::LengthHint::HINT_LONG);
+ columns_long->AddColumn(views::GridLayout::LEADING, views::GridLayout::CENTER,
+ 0, views::GridLayout::FIXED, long_extra_view_width,
+ 0);
+ // The padding at the end is fixed, computed to make sure the long field
+ // maintains its minimum width.
+ int long_padding = kDialogMinWidth - kLongFieldMinimumWidth - kLabelWidth -
+ (2 * kPaymentRequestRowHorizontalInsets) -
+ kLabelInputFieldHorizontalPadding -
+ kFieldExtraViewHorizontalPadding - long_extra_view_width;
+ columns_long->AddPaddingColumn(0, long_padding);
editor_view->SetLayoutManager(editor_layout.release());
- std::vector<EditorField> fields = GetFieldDefinitions();
- for (const auto& field : fields) {
+ for (const auto& field : GetFieldDefinitions()) {
CreateInputField(
static_cast<views::GridLayout*>(editor_view->GetLayoutManager()),
field);
@@ -243,15 +299,17 @@ std::unique_ptr<views::View> EditorViewController::CreateEditorView() {
// +----------------------------------------------------------+
void EditorViewController::CreateInputField(views::GridLayout* layout,
const EditorField& field) {
+ int column_set =
+ field.length_hint == EditorField::LengthHint::HINT_SHORT ? 0 : 1;
+
// This is the top padding for every row.
constexpr int kInputRowSpacing = 6;
- layout->StartRowWithPadding(0, 0, 0, kInputRowSpacing);
+ layout->StartRowWithPadding(0, column_set, 0, kInputRowSpacing);
std::unique_ptr<views::Label> label = base::MakeUnique<views::Label>(
field.required ? field.label + base::ASCIIToUTF16("*") : field.label);
label->SetMultiLine(true);
- label->SetMaximumWidth(kMaximumLabelWidth);
layout->AddView(label.release());
constexpr int kInputFieldHeight = 28;
@@ -275,8 +333,10 @@ void EditorViewController::CreateInputField(views::GridLayout* layout,
} else if (field.control_type == EditorField::ControlType::COMBOBOX) {
ValidatingCombobox* combobox = new ValidatingCombobox(
GetComboboxModelForType(field.type), CreateValidationDelegate(field));
- combobox->SelectValue(GetInitialValueForType(field.type));
- // Using autofill field type as a view ID (for testing).
+ base::string16 initial_value = GetInitialValueForType(field.type);
+ if (!initial_value.empty())
+ combobox->SelectValue(initial_value);
+ // Using autofill field type as a view ID.
combobox->set_id(static_cast<int>(field.type));
combobox->set_listener(this);
comboboxes_.insert(std::make_pair(combobox, field));
@@ -290,10 +350,18 @@ void EditorViewController::CreateInputField(views::GridLayout* layout,
} else {
// Custom field view will now be owned by |row|. And it must be valid since
// the derived class specified a custom view for this field.
- layout->AddView(CreateCustomFieldView(field.type).release());
+ std::unique_ptr<views::View> field_view = CreateCustomFieldView(field.type);
+ DCHECK(field_view);
+ layout->AddView(field_view.release());
}
- layout->StartRow(0, 0);
+ // If an extra view needs to go alongside the input field view, add it to the
+ // last column.
+ std::unique_ptr<views::View> extra_view = CreateExtraViewForField(field.type);
+ if (extra_view)
+ layout->AddView(extra_view.release());
+
+ layout->StartRow(0, column_set);
layout->SkipColumns(1);
std::unique_ptr<views::View> error_label_view =
base::MakeUnique<views::View>();
@@ -305,4 +373,22 @@ void EditorViewController::CreateInputField(views::GridLayout* layout,
layout->AddPaddingRow(0, kInputRowSpacing);
}
+int EditorViewController::ComputeWidestExtraViewWidth(
+ EditorField::LengthHint size) {
+ int widest_column_width = 0;
+
+ for (const auto& field : GetFieldDefinitions()) {
+ if (field.length_hint != size)
+ continue;
+
+ std::unique_ptr<views::View> extra_view =
+ CreateExtraViewForField(field.type);
+ if (!extra_view)
+ continue;
+ widest_column_width =
+ std::max(extra_view->GetPreferredSize().width(), widest_column_width);
+ }
+ return widest_column_width;
+}
+
} // namespace payments

Powered by Google App Engine
This is Rietveld 408576698