0

Migrate VectorIconModel and its related classes to ui::ColorVariant

Bug: b:394420459
Change-Id: I838ec1927823a0d77f8da9b7ef421baccb1dac57
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6236788
Reviewed-by: Xiyuan Xia <xiyuan@chromium.org>
Commit-Queue: Zoraiz Naeem <zoraiznaeem@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1427382}
This commit is contained in:
Zoraiz Naeem
2025-03-03 14:16:02 -08:00
committed by Chromium LUCI CQ
parent badbedab2a
commit dcba9470ae
10 changed files with 30 additions and 98 deletions

@ -718,14 +718,8 @@ std::pair<ui::ImageModel, ui::ImageModel> IconButton::VectorImages(
return {ui::ImageModel(), ui::ImageModel()}; return {ui::ImageModel(), ui::ImageModel()};
} }
ui::ImageModel new_normal_image_model; ui::ImageModel new_normal_image_model =
if (auto sk_color = color.GetSkColor()) { ui::ImageModel::FromVectorIcon(*icon, color, icon_size);
new_normal_image_model =
ui::ImageModel::FromVectorIcon(*icon, *sk_color, icon_size);
} else {
new_normal_image_model =
ui::ImageModel::FromVectorIcon(*icon, *color.GetColorId(), icon_size);
}
ui::ImageModel disabled_image_model = ui::ImageModel::FromVectorIcon( ui::ImageModel disabled_image_model = ui::ImageModel::FromVectorIcon(
*icon, cros_tokens::kCrosSysDisabled, icon_size); *icon, cros_tokens::kCrosSysDisabled, icon_size);

@ -423,14 +423,9 @@ void PillButton::UpdateIconColor() {
// If custom icon color is set, use it to set icon color. // If custom icon color is set, use it to set icon color.
if (icon_color_) { if (icon_color_) {
if (auto color = icon_color_->GetSkColor()) { SetImageModel(
SetImageModel(views::Button::STATE_NORMAL, views::Button::STATE_NORMAL,
ui::ImageModel::FromVectorIcon(*icon_, *color, kIconSize)); ui::ImageModel::FromVectorIcon(*icon_, *icon_color_, kIconSize));
} else {
SetImageModel(views::Button::STATE_NORMAL,
ui::ImageModel::FromVectorIcon(
*icon_, *icon_color_->GetColorId(), kIconSize));
}
} else { } else {
// Otherwise, use default color ID to set icon color. // Otherwise, use default color ID to set icon color.
auto default_color_id = GetDefaultButtonTextIconColorId(type_); auto default_color_id = GetDefaultButtonTextIconColorId(type_);

@ -499,11 +499,7 @@ ui::ImageModel GetSizedAvatarImageModel(const ui::ImageModel& image, int size) {
gfx::Size(size, size))); gfx::Size(size, size)));
} }
const ui::VectorIconModel& model = image.GetVectorIcon(); const ui::VectorIconModel& model = image.GetVectorIcon();
if (model.has_color()) { return ui::ImageModel::FromVectorIcon(*model.vector_icon(), model.color(),
return ui::ImageModel::FromVectorIcon(*model.vector_icon(), model.color(),
size);
}
return ui::ImageModel::FromVectorIcon(*model.vector_icon(), model.color_id(),
size); size);
} }

@ -30,21 +30,21 @@ class StarRatingViewTest : public views::ViewsTestBase {
const ui::VectorIconModel& model = const ui::VectorIconModel& model =
view()->GetVectorIconModelForIndexForTesting(index); view()->GetVectorIconModelForIndexForTesting(index);
return model.vector_icon()->name == vector_icons::kStarIcon.name && return model.vector_icon()->name == vector_icons::kStarIcon.name &&
model.color_id() == kColorStarRatingFullIcon; model.color() == kColorStarRatingFullIcon;
} }
bool IsHalfStarIconAt(int index) { bool IsHalfStarIconAt(int index) {
const ui::VectorIconModel& model = const ui::VectorIconModel& model =
view()->GetVectorIconModelForIndexForTesting(index); view()->GetVectorIconModelForIndexForTesting(index);
return model.vector_icon()->name == vector_icons::kStarHalfIcon.name && return model.vector_icon()->name == vector_icons::kStarHalfIcon.name &&
model.color_id() == kColorStarRatingFullIcon; model.color() == kColorStarRatingFullIcon;
} }
bool IsEmptyStarIconAt(int index) { bool IsEmptyStarIconAt(int index) {
const ui::VectorIconModel& model = const ui::VectorIconModel& model =
view()->GetVectorIconModelForIndexForTesting(index); view()->GetVectorIconModelForIndexForTesting(index);
return model.vector_icon()->name == vector_icons::kStarIcon.name && return model.vector_icon()->name == vector_icons::kStarIcon.name &&
model.color_id() == kColorStarRatingEmptyIcon; model.color() == kColorStarRatingEmptyIcon;
} }
private: private:

@ -477,18 +477,9 @@ std::optional<ui::ImageModel> ToolbarController::GetMenuIcon(
pinned_icon_image.IsVectorIcon()) { pinned_icon_image.IsVectorIcon()) {
ui::VectorIconModel vector_icon_model = ui::VectorIconModel vector_icon_model =
pinned_icon_image.GetVectorIcon(); pinned_icon_image.GetVectorIcon();
if (vector_icon_model.has_color()) {
return std::make_optional(ui::ImageModel::FromVectorIcon( return std::make_optional(ui::ImageModel::FromVectorIcon(
*vector_icon_model.vector_icon(), vector_icon_model.color(), *vector_icon_model.vector_icon(), vector_icon_model.color(),
ui::SimpleMenuModel::kDefaultIconSize)); ui::SimpleMenuModel::kDefaultIconSize));
} else {
return std::make_optional(ui::ImageModel::FromVectorIcon(
*vector_icon_model.vector_icon(),
vector_icon_model.color_id(),
ui::SimpleMenuModel::kDefaultIconSize));
}
} else { } else {
return std::make_optional(pinned_icon_image); return std::make_optional(pinned_icon_image);
} }
@ -812,7 +803,7 @@ void ToolbarController::ActionItemChanged(actions::ActionItem* action_item) {
ui::VectorIconModel vector_icon_model = pinned_icon_image.GetVectorIcon(); ui::VectorIconModel vector_icon_model = pinned_icon_image.GetVectorIcon();
menu_item->icon_view()->SetImage(ui::ImageModel::FromVectorIcon( menu_item->icon_view()->SetImage(ui::ImageModel::FromVectorIcon(
*vector_icon_model.vector_icon(), vector_icon_model.color_id(), *vector_icon_model.vector_icon(), vector_icon_model.color(),
ui::SimpleMenuModel::kDefaultIconSize)); ui::SimpleMenuModel::kDefaultIconSize));
} }
status_indicator->Hide(); status_indicator->Hide();

@ -11,6 +11,7 @@
#include "base/trace_event/trace_event.h" #include "base/trace_event/trace_event.h"
#include "ui/base/resource/resource_bundle.h" #include "ui/base/resource/resource_bundle.h"
#include "ui/color/color_id.h" #include "ui/color/color_id.h"
#include "ui/color/color_variant.h"
#include "ui/gfx/vector_icon_utils.h" #include "ui/gfx/vector_icon_utils.h"
#if !BUILDFLAG(IS_IOS) #if !BUILDFLAG(IS_IOS)
@ -22,16 +23,7 @@ namespace ui {
VectorIconModel::VectorIconModel() = default; VectorIconModel::VectorIconModel() = default;
VectorIconModel::VectorIconModel(const gfx::VectorIcon& vector_icon, VectorIconModel::VectorIconModel(const gfx::VectorIcon& vector_icon,
ColorId color_id, ui::ColorVariant color,
int icon_size,
const gfx::VectorIcon* badge_icon)
: vector_icon_(&vector_icon),
icon_size_(icon_size),
color_(color_id),
badge_icon_(badge_icon) {}
VectorIconModel::VectorIconModel(const gfx::VectorIcon& vector_icon,
SkColor color,
int icon_size, int icon_size,
const gfx::VectorIcon* badge_icon) const gfx::VectorIcon* badge_icon)
: vector_icon_(&vector_icon), : vector_icon_(&vector_icon),
@ -73,18 +65,7 @@ ImageModel& ImageModel::operator=(ImageModel&&) = default;
// static // static
ImageModel ImageModel::FromVectorIcon(const gfx::VectorIcon& vector_icon, ImageModel ImageModel::FromVectorIcon(const gfx::VectorIcon& vector_icon,
ColorId color_id, ui::ColorVariant color,
int icon_size,
const gfx::VectorIcon* badge_icon) {
if (!icon_size)
icon_size = gfx::GetDefaultSizeOfVectorIcon(vector_icon);
return ImageModel(
VectorIconModel(vector_icon, color_id, icon_size, badge_icon));
}
// static
ImageModel ImageModel::FromVectorIcon(const gfx::VectorIcon& vector_icon,
SkColor color,
int icon_size, int icon_size,
const gfx::VectorIcon* badge_icon) { const gfx::VectorIcon* badge_icon) {
if (!icon_size) if (!icon_size)

@ -11,6 +11,7 @@
#include "third_party/abseil-cpp/absl/types/variant.h" #include "third_party/abseil-cpp/absl/types/variant.h"
#include "third_party/skia/include/core/SkColor.h" #include "third_party/skia/include/core/SkColor.h"
#include "ui/color/color_id.h" #include "ui/color/color_id.h"
#include "ui/color/color_variant.h"
#include "ui/gfx/color_palette.h" #include "ui/gfx/color_palette.h"
#include "ui/gfx/geometry/size.h" #include "ui/gfx/geometry/size.h"
#include "ui/gfx/image/image.h" #include "ui/gfx/image/image.h"
@ -33,14 +34,16 @@ class ColorProvider;
// eventually resolved by the ColorProvider from the correct context. This class // eventually resolved by the ColorProvider from the correct context. This class
// is only used internal to ImageModel and should never be instantiated except // is only used internal to ImageModel and should never be instantiated except
// by ImageModel. // by ImageModel.
class COMPONENT_EXPORT(UI_BASE) VectorIconModel { class COMPONENT_EXPORT(UI_BASE) VectorIconModel {
public: public:
VectorIconModel(); VectorIconModel();
VectorIconModel(const VectorIconModel&); VectorIconModel(const VectorIconModel&);
VectorIconModel& operator=(const VectorIconModel&); VectorIconModel& operator=(const VectorIconModel&);
VectorIconModel(VectorIconModel&&); VectorIconModel(VectorIconModel&&);
VectorIconModel& operator=(VectorIconModel&&); VectorIconModel& operator=(VectorIconModel&&);
~VectorIconModel(); ~VectorIconModel();
bool is_empty() const { return !vector_icon_; } bool is_empty() const { return !vector_icon_; }
@ -50,28 +53,20 @@ class COMPONENT_EXPORT(UI_BASE) VectorIconModel {
const gfx::VectorIcon* vector_icon() const { return vector_icon_; } const gfx::VectorIcon* vector_icon() const { return vector_icon_; }
int icon_size() const { return icon_size_; } int icon_size() const { return icon_size_; }
ColorId color_id() const { return absl::get<ColorId>(color_); } ui::ColorVariant color() const { return color_; }
SkColor color() const { return absl::get<SkColor>(color_); }
bool has_color() const { return absl::holds_alternative<SkColor>(color_); }
const gfx::VectorIcon* badge_icon() const { return badge_icon_; } const gfx::VectorIcon* badge_icon() const { return badge_icon_; }
private: private:
friend class ImageModel; friend class ImageModel;
VectorIconModel(const gfx::VectorIcon& vector_icon, VectorIconModel(const gfx::VectorIcon& vector_icon,
ColorId color_id, ui::ColorVariant color,
int icon_size,
const gfx::VectorIcon* badge_icon);
// TODO (kylixrd): This should be eventually removed once all instances of
// hard-coded SkColor constants are removed in favor of using a color id.
VectorIconModel(const gfx::VectorIcon& vector_icon,
SkColor color,
int icon_size, int icon_size,
const gfx::VectorIcon* badge_icon); const gfx::VectorIcon* badge_icon);
raw_ptr<const gfx::VectorIcon> vector_icon_ = nullptr; raw_ptr<const gfx::VectorIcon> vector_icon_ = nullptr;
int icon_size_ = 0; int icon_size_ = 0;
absl::variant<ColorId, SkColor> color_ = gfx::kPlaceholderColor; ui::ColorVariant color_;
raw_ptr<const gfx::VectorIcon> badge_icon_ = nullptr; raw_ptr<const gfx::VectorIcon> badge_icon_ = nullptr;
}; };
@ -91,11 +86,7 @@ class COMPONENT_EXPORT(UI_BASE) ImageModel {
// TODO(pkasting): Remove the default `color_id` or replace with kColorIcon. // TODO(pkasting): Remove the default `color_id` or replace with kColorIcon.
static ImageModel FromVectorIcon(const gfx::VectorIcon& vector_icon, static ImageModel FromVectorIcon(const gfx::VectorIcon& vector_icon,
ColorId color_id = kColorMenuIcon, ui::ColorVariant color = kColorMenuIcon,
int icon_size = 0,
const gfx::VectorIcon* badge_icon = nullptr);
static ImageModel FromVectorIcon(const gfx::VectorIcon& vector_icon,
SkColor color,
int icon_size = 0, int icon_size = 0,
const gfx::VectorIcon* badge_icon = nullptr); const gfx::VectorIcon* badge_icon = nullptr);
static ImageModel FromImage(const gfx::Image& image); static ImageModel FromImage(const gfx::Image& image);

@ -5,6 +5,7 @@
#include "ui/base/themed_vector_icon.h" #include "ui/base/themed_vector_icon.h"
#include "ui/color/color_provider.h" #include "ui/color/color_provider.h"
#include "ui/color/color_variant.h"
#include "ui/gfx/paint_vector_icon.h" #include "ui/gfx/paint_vector_icon.h"
#include "ui/gfx/vector_icon_types.h" #include "ui/gfx/vector_icon_types.h"
#include "ui/gfx/vector_icon_utils.h" #include "ui/gfx/vector_icon_utils.h"
@ -14,28 +15,18 @@ namespace ui {
ThemedVectorIcon::ThemedVectorIcon() = default; ThemedVectorIcon::ThemedVectorIcon() = default;
ThemedVectorIcon::ThemedVectorIcon(const gfx::VectorIcon* icon, ThemedVectorIcon::ThemedVectorIcon(const gfx::VectorIcon* icon,
ColorId color_id, ui::ColorVariant color,
int icon_size, int icon_size,
const gfx::VectorIcon* badge) const gfx::VectorIcon* badge)
: icon_(icon), icon_size_(icon_size), color_(color_id), badge_(badge) {} : icon_(icon), icon_size_(icon_size), color_(color), badge_(badge) {}
ThemedVectorIcon::ThemedVectorIcon(const VectorIconModel& vector_icon_model) ThemedVectorIcon::ThemedVectorIcon(const VectorIconModel& vector_icon_model)
: icon_(vector_icon_model.vector_icon()), : icon_(vector_icon_model.vector_icon()),
icon_size_(vector_icon_model.icon_size()), icon_size_(vector_icon_model.icon_size()),
badge_(vector_icon_model.badge_icon()) { badge_(vector_icon_model.badge_icon()) {
if (vector_icon_model.has_color()) { color_ = vector_icon_model.color();
color_ = vector_icon_model.color();
} else {
color_ = vector_icon_model.color_id();
}
} }
ThemedVectorIcon::ThemedVectorIcon(const gfx::VectorIcon* icon,
SkColor color,
int icon_size,
const gfx::VectorIcon* badge)
: icon_(icon), icon_size_(icon_size), color_(color), badge_(badge) {}
ThemedVectorIcon::ThemedVectorIcon(const ThemedVectorIcon&) = default; ThemedVectorIcon::ThemedVectorIcon(const ThemedVectorIcon&) = default;
ThemedVectorIcon& ThemedVectorIcon::operator=(const ThemedVectorIcon&) = ThemedVectorIcon& ThemedVectorIcon::operator=(const ThemedVectorIcon&) =
@ -70,9 +61,7 @@ gfx::ImageSkia ThemedVectorIcon::GetImageSkia(SkColor color) const {
} }
SkColor ThemedVectorIcon::GetColor(const ColorProvider* color_provider) const { SkColor ThemedVectorIcon::GetColor(const ColorProvider* color_provider) const {
return absl::holds_alternative<ColorId>(color_) return color_.ConvertToSkColor(color_provider);
? color_provider->GetColor(absl::get<ColorId>(color_))
: absl::get<SkColor>(color_);
} }
gfx::ImageSkia ThemedVectorIcon::GetImageSkia(SkColor color, gfx::ImageSkia ThemedVectorIcon::GetImageSkia(SkColor color,

@ -11,6 +11,7 @@
#include "third_party/skia/include/core/SkColor.h" #include "third_party/skia/include/core/SkColor.h"
#include "ui/base/models/image_model.h" #include "ui/base/models/image_model.h"
#include "ui/color/color_id.h" #include "ui/color/color_id.h"
#include "ui/color/color_variant.h"
namespace gfx { namespace gfx {
class ImageSkia; class ImageSkia;
@ -25,16 +26,10 @@ class COMPONENT_EXPORT(UI_BASE) ThemedVectorIcon {
public: public:
ThemedVectorIcon(); ThemedVectorIcon();
explicit ThemedVectorIcon(const gfx::VectorIcon* icon, explicit ThemedVectorIcon(const gfx::VectorIcon* icon,
ColorId color_id = kColorMenuIcon, ui::ColorVariant color = kColorMenuIcon,
int icon_size = 0, int icon_size = 0,
const gfx::VectorIcon* badge = nullptr); const gfx::VectorIcon* badge = nullptr);
explicit ThemedVectorIcon(const VectorIconModel& vector_icon_model); explicit ThemedVectorIcon(const VectorIconModel& vector_icon_model);
// TODO (kylixrd): Remove this once all the hard-coded uses of color are
// removed.
ThemedVectorIcon(const gfx::VectorIcon* icon,
SkColor color,
int icon_size = 0,
const gfx::VectorIcon* badge = nullptr);
// Copyable and moveable // Copyable and moveable
ThemedVectorIcon(const ThemedVectorIcon& other); ThemedVectorIcon(const ThemedVectorIcon& other);
@ -57,7 +52,7 @@ class COMPONENT_EXPORT(UI_BASE) ThemedVectorIcon {
raw_ptr<const gfx::VectorIcon> icon_ = nullptr; raw_ptr<const gfx::VectorIcon> icon_ = nullptr;
int icon_size_ = 0; int icon_size_ = 0;
absl::variant<ColorId, SkColor> color_ = gfx::kPlaceholderColor; ui::ColorVariant color_;
raw_ptr<const gfx::VectorIcon> badge_ = nullptr; raw_ptr<const gfx::VectorIcon> badge_ = nullptr;
}; };

@ -64,7 +64,7 @@ void ImageView::OnThemeChanged() {
View::OnThemeChanged(); View::OnThemeChanged();
if (image_model_.IsImageGenerator() || if (image_model_.IsImageGenerator() ||
(image_model_.IsVectorIcon() && (image_model_.IsVectorIcon() &&
!image_model_.GetVectorIcon().has_color())) { !image_model_.GetVectorIcon().color().GetSkColor())) {
scaled_image_ = gfx::ImageSkia(); scaled_image_ = gfx::ImageSkia();
SchedulePaint(); SchedulePaint();
} }