holding_space_item_screen_capture_view.cc 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. // Copyright 2020 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "ash/system/holding_space/holding_space_item_screen_capture_view.h"
  5. #include "ash/public/cpp/holding_space/holding_space_constants.h"
  6. #include "ash/public/cpp/holding_space/holding_space_image.h"
  7. #include "ash/public/cpp/holding_space/holding_space_item.h"
  8. #include "ash/public/cpp/rounded_image_view.h"
  9. #include "ash/style/ash_color_provider.h"
  10. #include "ash/style/dark_light_mode_controller_impl.h"
  11. #include "ash/system/holding_space/holding_space_util.h"
  12. #include "ash/system/tray/tray_constants.h"
  13. #include "base/bind.h"
  14. #include "components/vector_icons/vector_icons.h"
  15. #include "ui/base/metadata/metadata_impl_macros.h"
  16. #include "ui/gfx/paint_vector_icon.h"
  17. #include "ui/views/accessibility/view_accessibility.h"
  18. #include "ui/views/background.h"
  19. #include "ui/views/border.h"
  20. #include "ui/views/controls/button/image_button.h"
  21. #include "ui/views/controls/image_view.h"
  22. #include "ui/views/layout/box_layout.h"
  23. #include "ui/views/layout/box_layout_view.h"
  24. #include "ui/views/layout/fill_layout.h"
  25. #include "ui/views/layout/flex_layout_view.h"
  26. namespace ash {
  27. namespace {
  28. // Appearance.
  29. constexpr int kBorderThickness = 1;
  30. constexpr gfx::Insets kCheckmarkAndPrimaryActionContainerPadding(4);
  31. constexpr gfx::Size kPlayIconSize(32, 32);
  32. constexpr gfx::Size kPrimaryActionSize(24, 24);
  33. } // namespace
  34. HoldingSpaceItemScreenCaptureView::HoldingSpaceItemScreenCaptureView(
  35. HoldingSpaceViewDelegate* delegate,
  36. const HoldingSpaceItem* item)
  37. : HoldingSpaceItemView(delegate, item) {
  38. using CrossAxisAlignment = views::BoxLayout::CrossAxisAlignment;
  39. using MainAxisAlignment = views::BoxLayout::MainAxisAlignment;
  40. views::Builder<HoldingSpaceItemScreenCaptureView> builder(this);
  41. builder.SetPreferredSize(kHoldingSpaceScreenCaptureSize)
  42. .SetLayoutManager(std::make_unique<views::FillLayout>())
  43. .AddChild(views::Builder<RoundedImageView>()
  44. .CopyAddressTo(&image_)
  45. .SetID(kHoldingSpaceItemImageId)
  46. .SetCornerRadius(kHoldingSpaceCornerRadius));
  47. if (item->type() == HoldingSpaceItem::Type::kScreenRecording) {
  48. builder.AddChild(
  49. views::Builder<views::BoxLayoutView>()
  50. .SetOrientation(views::BoxLayout::Orientation::kHorizontal)
  51. .SetMainAxisAlignment(MainAxisAlignment::kCenter)
  52. .SetCrossAxisAlignment(CrossAxisAlignment::kCenter)
  53. .SetFocusBehavior(views::View::FocusBehavior::NEVER)
  54. .AddChild(views::Builder<views::ImageView>()
  55. .CopyAddressTo(&play_icon_)
  56. .SetID(kHoldingSpaceScreenCapturePlayIconId)
  57. .SetPreferredSize(kPlayIconSize)
  58. .SetImageSize(gfx::Size(kHoldingSpaceIconSize,
  59. kHoldingSpaceIconSize))));
  60. }
  61. std::move(builder)
  62. .AddChild(
  63. views::Builder<views::FlexLayoutView>()
  64. .SetOrientation(views::LayoutOrientation::kHorizontal)
  65. .SetCrossAxisAlignment(views::LayoutAlignment::kStart)
  66. .SetInteriorMargin(kCheckmarkAndPrimaryActionContainerPadding)
  67. .AddChild(CreateCheckmarkBuilder())
  68. .AddChild(views::Builder<views::View>().SetProperty(
  69. views::kFlexBehaviorKey,
  70. views::FlexSpecification(
  71. views::MinimumFlexSizeRule::kScaleToZero,
  72. views::MaximumFlexSizeRule::kUnbounded)))
  73. .AddChild(CreatePrimaryActionBuilder(kPrimaryActionSize)))
  74. .AddChild(views::Builder<views::View>()
  75. .CopyAddressTo(&border_)
  76. .SetCanProcessEventsWithinSubtree(false))
  77. .BuildChildren();
  78. // Subscribe to be notified of changes to `item`'s image.
  79. image_skia_changed_subscription_ = item->image().AddImageSkiaChangedCallback(
  80. base::BindRepeating(&HoldingSpaceItemScreenCaptureView::UpdateImage,
  81. base::Unretained(this)));
  82. UpdateImage();
  83. }
  84. HoldingSpaceItemScreenCaptureView::~HoldingSpaceItemScreenCaptureView() =
  85. default;
  86. views::View* HoldingSpaceItemScreenCaptureView::GetTooltipHandlerForPoint(
  87. const gfx::Point& point) {
  88. // Tooltip events should be handled top level, not by descendents.
  89. return HitTestPoint(point) ? this : nullptr;
  90. }
  91. std::u16string HoldingSpaceItemScreenCaptureView::GetTooltipText(
  92. const gfx::Point& point) const {
  93. return item() ? item()->GetText() : base::EmptyString16();
  94. }
  95. void HoldingSpaceItemScreenCaptureView::OnHoldingSpaceItemUpdated(
  96. const HoldingSpaceItem* item,
  97. uint32_t updated_fields) {
  98. HoldingSpaceItemView::OnHoldingSpaceItemUpdated(item, updated_fields);
  99. if (this->item() == item)
  100. TooltipTextChanged();
  101. }
  102. void HoldingSpaceItemScreenCaptureView::OnThemeChanged() {
  103. HoldingSpaceItemView::OnThemeChanged();
  104. // Border.
  105. border_->SetBorder(views::CreateRoundedRectBorder(
  106. kBorderThickness, kHoldingSpaceCornerRadius,
  107. AshColorProvider::Get()->GetContentLayerColor(
  108. AshColorProvider::ContentLayerType::kSeparatorColor)));
  109. // Image.
  110. UpdateImage();
  111. // Primary action.
  112. primary_action_container()->SetBackground(
  113. holding_space_util::CreateCircleBackground(
  114. AshColorProvider::Get()->GetBaseLayerColor(
  115. AshColorProvider::BaseLayerType::kTransparent80)));
  116. if (!play_icon_)
  117. return;
  118. // Play icon.
  119. play_icon_->SetBackground(holding_space_util::CreateCircleBackground(
  120. AshColorProvider::Get()->GetBaseLayerColor(
  121. AshColorProvider::BaseLayerType::kTransparent80)));
  122. play_icon_->SetImage(gfx::CreateVectorIcon(
  123. vector_icons::kPlayArrowIcon, kHoldingSpaceIconSize,
  124. AshColorProvider::Get()->GetContentLayerColor(
  125. AshColorProvider::ContentLayerType::kButtonIconColor)));
  126. }
  127. void HoldingSpaceItemScreenCaptureView::UpdateImage() {
  128. // If the associated `item()` has been deleted then `this` is in the process
  129. // of being destroyed and no action needs to be taken.
  130. if (!item())
  131. return;
  132. image_->SetImage(item()->image().GetImageSkia(
  133. kHoldingSpaceScreenCaptureSize,
  134. /*dark_background=*/DarkLightModeControllerImpl::Get()
  135. ->IsDarkModeEnabled()));
  136. SchedulePaint();
  137. }
  138. BEGIN_METADATA(HoldingSpaceItemScreenCaptureView, HoldingSpaceItemView)
  139. END_METADATA
  140. } // namespace ash