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
|
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/views/controls/button/md_text_button_with_down_arrow.h"
#include <utility>
#include "ui/base/metadata/metadata_impl_macros.h"
#include "ui/base/ui_base_features.h"
#include "ui/gfx/color_utils.h"
#include "ui/gfx/paint_vector_icon.h"
#include "ui/views/border.h"
#include "ui/views/controls/button/md_text_button.h"
#include "ui/views/layout/layout_provider.h"
#include "ui/views/vector_icons.h"
namespace views {
constexpr int kDropdownArrowSize = 20;
MdTextButtonWithDownArrow::MdTextButtonWithDownArrow(PressedCallback callback,
const std::u16string& text)
: MdTextButton(std::move(callback), text) {
SetHorizontalAlignment(gfx::ALIGN_RIGHT);
SetImageLabelSpacing(LayoutProvider::Get()->GetDistanceMetric(
DISTANCE_DROPDOWN_BUTTON_LABEL_ARROW_SPACING));
SetDropArrowImage();
// Reduce padding between the drop arrow and the right border.
const gfx::Insets original_padding = GetInsets();
SetCustomPadding(
gfx::Insets::TLBR(original_padding.top(),
LayoutProvider::Get()->GetDistanceMetric(
DISTANCE_DROPDOWN_BUTTON_LEFT_MARGIN),
original_padding.bottom(),
LayoutProvider::Get()->GetDistanceMetric(
DISTANCE_DROPDOWN_BUTTON_RIGHT_MARGIN)));
}
MdTextButtonWithDownArrow::~MdTextButtonWithDownArrow() = default;
void MdTextButtonWithDownArrow::OnThemeChanged() {
MdTextButton::OnThemeChanged();
// The icon's color is derived from the label's |enabled_color|, which might
// have changed as the result of the theme change.
SetDropArrowImage();
}
void MdTextButtonWithDownArrow::StateChanged(ButtonState old_state) {
MdTextButton::StateChanged(old_state);
// A state change may require the arrow's color to be updated.
SetDropArrowImage();
}
void MdTextButtonWithDownArrow::SetDropArrowImage() {
SkColor drop_arrow_color = label()->GetEnabledColor();
auto drop_arrow_image = ui::ImageModel::FromVectorIcon(
kArrowDropDownIcon, drop_arrow_color, kDropdownArrowSize);
SetImageModel(Button::STATE_NORMAL, drop_arrow_image);
}
BEGIN_METADATA(MdTextButtonWithDownArrow)
END_METADATA
} // namespace views
|