blob: 17546ab3e147c268bbfa0c57eb6e7e336b26c795 [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/clipboard/views/clipboard_history_bitmap_item_view.h"
#include "ash/clipboard/clipboard_history_item.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/gfx/image/image_skia.h"
#include "ui/views/controls/image_view.h"
#include "ui/views/layout/box_layout.h"
#include "ui/views/layout/fill_layout.h"
#include "ui/views/view_class_properties.h"
namespace {
// The preferred height for the bitmap.
constexpr int kBitmapHeight = 64;
// The margins of the delete button.
constexpr gfx::Insets kDeleteButtonMargins =
gfx::Insets(/*top=*/4, /*left=*/0, /*bottom=*/0, /*right=*/4);
} // namespace
namespace ash {
////////////////////////////////////////////////////////////////////////////////
// ClipboardHistoryBitmapItemView::BitmapContentsView
class ClipboardHistoryBitmapItemView::BitmapContentsView
: public ClipboardHistoryBitmapItemView::ContentsView {
public:
explicit BitmapContentsView(ClipboardHistoryBitmapItemView* container)
: ContentsView(container) {}
BitmapContentsView(const BitmapContentsView& rhs) = delete;
BitmapContentsView& operator=(const BitmapContentsView& rhs) = delete;
~BitmapContentsView() override = default;
// ContentsView:
DeleteButton* CreateDeleteButton() override {
auto delete_button_container = std::make_unique<views::View>();
auto* layout_manager = delete_button_container->SetLayoutManager(
std::make_unique<views::BoxLayout>(
views::BoxLayout::Orientation::kHorizontal));
layout_manager->set_main_axis_alignment(
views::BoxLayout::MainAxisAlignment::kEnd);
layout_manager->set_cross_axis_alignment(
views::BoxLayout::CrossAxisAlignment::kStart);
auto delete_button = std::make_unique<DeleteButton>(container_);
delete_button->SetVisible(false);
delete_button->SetProperty(views::kMarginsKey, kDeleteButtonMargins);
DeleteButton* delete_button_ptr =
delete_button_container->AddChildView(std::move(delete_button));
AddChildView(std::move(delete_button_container));
return delete_button_ptr;
}
};
////////////////////////////////////////////////////////////////////////////////
// ClipboardHistoryBitmapItemView
ClipboardHistoryBitmapItemView::ClipboardHistoryBitmapItemView(
const gfx::ImageSkia& image_skia,
views::MenuItemView* container)
: ClipboardHistoryItemView(container), original_image_(image_skia) {}
ClipboardHistoryBitmapItemView::~ClipboardHistoryBitmapItemView() = default;
const char* ClipboardHistoryBitmapItemView::GetClassName() const {
return "ClipboardHistoryBitmapItemView";
}
std::unique_ptr<ClipboardHistoryBitmapItemView::ContentsView>
ClipboardHistoryBitmapItemView::CreateContentsView() {
auto contents_view = std::make_unique<BitmapContentsView>(this);
contents_view->SetLayoutManager(std::make_unique<views::FillLayout>());
auto image_view = std::make_unique<views::ImageView>();
image_view->SetImage(original_image_);
image_view->SetPreferredSize(gfx::Size(INT_MAX, kBitmapHeight));
image_view_ = contents_view->AddChildView(std::move(image_view));
contents_view->InstallDeleteButton();
return contents_view;
}
void ClipboardHistoryBitmapItemView::OnBoundsChanged(
const gfx::Rect& previous_bounds) {
image_view_->SetImageSize(CalculateTargetImageSize());
}
gfx::Size ClipboardHistoryBitmapItemView::CalculateTargetImageSize() const {
const gfx::Size image_size = image_view_->GetImage().size();
const double width_ratio = image_size.width() / double(width());
const double height_ratio = image_size.height() / double(height());
if (width_ratio <= 1.f || height_ratio <= 1.f)
return image_size;
const double resize_ratio = std::fmin(width_ratio, height_ratio);
return gfx::Size(image_size.width() / resize_ratio,
image_size.height() / resize_ratio);
}
} // namespace ash