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 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
|
// 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 "chrome/browser/ui/views/toolbar/pinned_toolbar_button_status_indicator.h"
#include <string>
#include "ui/base/metadata/metadata_impl_macros.h"
#include "ui/color/color_id.h"
#include "ui/color/color_provider.h"
#include "ui/compositor/layer.h"
#include "ui/gfx/canvas.h"
#include "ui/gfx/geometry/insets.h"
#include "ui/views/cascading_property.h"
#include "ui/views/view_utils.h"
#include "ui/views/widget/widget.h"
// static
PinnedToolbarButtonStatusIndicator* PinnedToolbarButtonStatusIndicator::Install(
View* parent) {
auto indicator = base::WrapUnique<PinnedToolbarButtonStatusIndicator>(
new PinnedToolbarButtonStatusIndicator());
indicator->SetPaintToLayer();
indicator->layer()->SetFillsBoundsOpaquely(false);
indicator->SetVisible(false);
return parent->AddChildView(std::move(indicator));
}
PinnedToolbarButtonStatusIndicator*
PinnedToolbarButtonStatusIndicator::GetStatusIndicator(View* parent) {
for (auto& child : parent->children()) {
if (views::IsViewClass<PinnedToolbarButtonStatusIndicator>(child)) {
return views::AsViewClass<PinnedToolbarButtonStatusIndicator>(child);
}
}
return nullptr;
}
PinnedToolbarButtonStatusIndicator::~PinnedToolbarButtonStatusIndicator() =
default;
void PinnedToolbarButtonStatusIndicator::SetColorId(
ui::ColorId active_color_id,
ui::ColorId inactive_color_id) {
active_color_id_ = active_color_id;
inactive_color_id_ = inactive_color_id;
SchedulePaint();
}
void PinnedToolbarButtonStatusIndicator::Show() {
SetVisible(true);
}
void PinnedToolbarButtonStatusIndicator::Hide() {
SetVisible(false);
}
PinnedToolbarButtonStatusIndicator::PinnedToolbarButtonStatusIndicator() {
// Don't allow the view to process events.
SetCanProcessEventsWithinSubtree(false);
}
void PinnedToolbarButtonStatusIndicator::OnPaint(gfx::Canvas* canvas) {
canvas->SaveLayerAlpha(SK_AlphaOPAQUE);
SkPath path;
path.addRoundRect(gfx::RectToSkRect(GetLocalBounds()), height() / 2,
height() / 2);
cc::PaintFlags flags;
std::optional<ui::ColorId> color_id = GetWidget()->ShouldPaintAsActive()
? active_color_id_
: inactive_color_id_;
flags.setColor(color_id.has_value()
? GetColorProvider()->GetColor(color_id.value())
: GetCascadingAccentColor(this));
flags.setAntiAlias(true);
flags.setStyle(cc::PaintFlags::kFill_Style);
canvas->DrawPath(path, flags);
}
void PinnedToolbarButtonStatusIndicator::AddedToWidget() {
paint_as_active_subscription_ =
GetWidget()->RegisterPaintAsActiveChangedCallback(base::BindRepeating(
&PinnedToolbarButtonStatusIndicator::PaintAsActiveChanged,
base::Unretained(this)));
}
void PinnedToolbarButtonStatusIndicator::PaintAsActiveChanged() {
SchedulePaint();
}
void PinnedToolbarButtonStatusIndicator::OnThemeChanged() {
View::OnThemeChanged();
SchedulePaint();
}
BEGIN_METADATA(PinnedToolbarButtonStatusIndicator)
END_METADATA
|