blob: ea6ea76361338a3496e18e7d797f8820a0d68039 [file] [log] [blame]
// Copyright 2020 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 "ash/system/holding_space/holding_space_item_screen_capture_view.h"
#include "ash/public/cpp/holding_space/holding_space_constants.h"
#include "ash/public/cpp/holding_space/holding_space_image.h"
#include "ash/public/cpp/holding_space/holding_space_item.h"
#include "ash/public/cpp/rounded_image_view.h"
#include "ash/style/ash_color_provider.h"
#include "ash/system/holding_space/holding_space_util.h"
#include "ash/system/holding_space/holding_space_view_builder.h"
#include "ash/system/tray/tray_constants.h"
#include "base/bind.h"
#include "components/vector_icons/vector_icons.h"
#include "ui/base/metadata/metadata_impl_macros.h"
#include "ui/gfx/paint_vector_icon.h"
#include "ui/views/accessibility/view_accessibility.h"
#include "ui/views/background.h"
#include "ui/views/controls/button/image_button.h"
#include "ui/views/controls/image_view.h"
#include "ui/views/layout/box_layout.h"
#include "ui/views/layout/box_layout_view.h"
#include "ui/views/layout/fill_layout.h"
#include "ui/views/layout/flex_layout_view.h"
#include "ui/views/metadata/view_factory.h"
namespace ash {
// Appearance.
constexpr gfx::Insets kCheckmarkAndPrimaryActionContainerPadding(4);
constexpr gfx::Size kPlayIconSize(32, 32);
constexpr gfx::Size kPrimaryActionSize(24, 24);
HoldingSpaceItemScreenCaptureView::HoldingSpaceItemScreenCaptureView(
HoldingSpaceViewDelegate* delegate,
const HoldingSpaceItem* item)
: HoldingSpaceItemView(delegate, item) {
using CrossAxisAlignment = views::BoxLayout::CrossAxisAlignment;
using MainAxisAlignment = views::BoxLayout::MainAxisAlignment;
HoldingSpaceViewBuilder<HoldingSpaceItemScreenCaptureView>(this)
.SetPreferredSize(kHoldingSpaceScreenCaptureSize)
.SetLayoutManager(std::make_unique<views::FillLayout>())
.AddChild(views::Builder<RoundedImageView>()
.CopyAddressTo(&image_)
.SetID(kHoldingSpaceItemImageId)
.SetCornerRadius(kHoldingSpaceCornerRadius))
.AddChildIf(
item->type() == HoldingSpaceItem::Type::kScreenRecording,
base::BindOnce(
[](views::ImageView** play_icon) -> std::unique_ptr<views::View> {
return views::Builder<views::BoxLayoutView>()
.SetOrientation(views::BoxLayout::Orientation::kHorizontal)
.SetMainAxisAlignment(MainAxisAlignment::kCenter)
.SetCrossAxisAlignment(CrossAxisAlignment::kCenter)
.SetFocusBehavior(views::View::FocusBehavior::NEVER)
.AddChild(views::Builder<views::ImageView>()
.CopyAddressTo(play_icon)
.SetID(kHoldingSpaceScreenCapturePlayIconId)
.SetPreferredSize(kPlayIconSize))
.Build();
},
&play_icon_))
.AddChild(HoldingSpaceViewBuilder<views::FlexLayoutView>(
views::Builder<views::FlexLayoutView>()
.SetOrientation(views::LayoutOrientation::kHorizontal)
.SetCrossAxisAlignment(views::LayoutAlignment::kStart)
.SetInteriorMargin(
kCheckmarkAndPrimaryActionContainerPadding))
.AddChild(CreateCheckmark())
.AddChild(views::Builder<views::View>().SetProperty(
views::kFlexBehaviorKey,
views::FlexSpecification(
views::MinimumFlexSizeRule::kScaleToZero,
views::MaximumFlexSizeRule::kUnbounded)))
.AddChild(CreatePrimaryAction(kPrimaryActionSize)))
.BuildChildren();
// Subscribe to be notified of changes to `item_`'s image.
image_subscription_ = item->image().AddImageSkiaChangedCallback(
base::BindRepeating(&HoldingSpaceItemScreenCaptureView::UpdateImage,
base::Unretained(this)));
UpdateImage();
}
HoldingSpaceItemScreenCaptureView::~HoldingSpaceItemScreenCaptureView() =
default;
views::View* HoldingSpaceItemScreenCaptureView::GetTooltipHandlerForPoint(
const gfx::Point& point) {
// Tooltip events should be handled top level, not by descendents.
return HitTestPoint(point) ? this : nullptr;
}
std::u16string HoldingSpaceItemScreenCaptureView::GetTooltipText(
const gfx::Point& point) const {
return item()->GetText();
}
void HoldingSpaceItemScreenCaptureView::OnHoldingSpaceItemUpdated(
const HoldingSpaceItem* item) {
HoldingSpaceItemView::OnHoldingSpaceItemUpdated(item);
if (this->item() == item)
TooltipTextChanged();
}
void HoldingSpaceItemScreenCaptureView::OnThemeChanged() {
HoldingSpaceItemView::OnThemeChanged();
// Image.
UpdateImage();
// Primary action.
primary_action_container()->SetBackground(
holding_space_util::CreateCircleBackground(
AshColorProvider::Get()->GetBaseLayerColor(
AshColorProvider::BaseLayerType::kTransparent80)));
if (!play_icon_)
return;
// Play icon.
play_icon_->SetBackground(holding_space_util::CreateCircleBackground(
AshColorProvider::Get()->GetBaseLayerColor(
AshColorProvider::BaseLayerType::kTransparent80)));
play_icon_->SetImage(gfx::CreateVectorIcon(
vector_icons::kPlayArrowIcon, kHoldingSpaceIconSize,
AshColorProvider::Get()->GetContentLayerColor(
AshColorProvider::ContentLayerType::kButtonIconColor)));
}
void HoldingSpaceItemScreenCaptureView::UpdateImage() {
image_->SetImage(item()->image().GetImageSkia(
kHoldingSpaceScreenCaptureSize,
/*dark_background=*/AshColorProvider::Get()->IsDarkModeEnabled()));
SchedulePaint();
}
BEGIN_METADATA(HoldingSpaceItemScreenCaptureView, HoldingSpaceItemView)
END_METADATA
} // namespace ash