blob: bcb52bda7f0679b1865fe14b7c8a520c6e6cb592 [file] [log] [blame]
// Copyright 2023 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/side_panel/side_panel_header.h"
#include <memory>
#include "chrome/browser/ui/views/chrome_layout_provider.h"
#include "chrome/browser/ui/views/side_panel/side_panel_header_controller.h"
#include "ui/base/metadata/metadata_impl_macros.h"
#include "ui/compositor/layer.h"
#include "ui/gfx/geometry/insets.h"
#include "ui/views/controls/button/image_button.h"
#include "ui/views/controls/button/toggle_button.h"
#include "ui/views/controls/image_view.h"
#include "ui/views/controls/label.h"
#include "ui/views/layout/flex_layout.h"
#include "ui/views/layout/flex_layout_types.h"
#include "ui/views/layout/layout_types.h"
#include "ui/views/view.h"
#include "ui/views/view_class_properties.h"
namespace {
// The minimum cross axis size should the expected height of the header.
constexpr int kDefaultSidePanelHeaderHeight = 40;
} // namespace
SidePanelHeader::SidePanelHeader(
std::unique_ptr<SidePanelHeader::Delegate> side_panel_header_delegate)
: side_panel_header_delegate_(std::move(side_panel_header_delegate)) {
SetPaintToLayer();
layer()->SetFillsBoundsOpaquely(false);
auto* const layout = SetLayoutManager(std::make_unique<views::FlexLayout>());
const int header_interior_margin =
ChromeLayoutProvider::Get()->GetDistanceMetric(
ChromeDistanceMetric::
DISTANCE_SIDE_PANEL_HEADER_INTERIOR_MARGIN_HORIZONTAL);
layout->SetDefault(views::kMarginsKey,
gfx::Insets().set_left(header_interior_margin));
// Set alignments for horizontal (main) and vertical (cross) axes.
layout->SetMainAxisAlignment(views::LayoutAlignment::kStart);
layout->SetCrossAxisAlignment(views::LayoutAlignment::kCenter);
layout->SetMinimumCrossAxisSize(kDefaultSidePanelHeaderHeight);
auto panel_icon = side_panel_header_delegate_->CreatePanelIcon();
panel_icon->SetProperty(views::kMarginsKey,
gfx::Insets().set_left(header_interior_margin * 2));
panel_icon_ = AddChildView(std::move(panel_icon));
auto panel_title = side_panel_header_delegate_->CreatePanelTitle();
panel_title->SetProperty(views::kMarginsKey,
gfx::Insets().set_left(header_interior_margin * 2));
panel_title->SetProperty(
views::kFlexBehaviorKey,
views::FlexSpecification(views::LayoutOrientation::kHorizontal,
views::MinimumFlexSizeRule::kScaleToZero,
views::MaximumFlexSizeRule::kUnbounded)
.WithAlignment(views::LayoutAlignment::kStart));
panel_title_ = AddChildView(std::move(panel_title));
auto pin_button = side_panel_header_delegate_->CreatePinButton();
pin_button->SetProperty(
views::kFlexBehaviorKey,
views::FlexSpecification().WithAlignment(views::LayoutAlignment::kEnd));
header_pin_button_ = AddChildView(std::move(pin_button));
auto create_open_new_tab_button =
side_panel_header_delegate_->CreateOpenNewTabButton();
create_open_new_tab_button->SetProperty(
views::kFlexBehaviorKey,
views::FlexSpecification().WithAlignment(views::LayoutAlignment::kEnd));
header_open_in_new_tab_button_ =
AddChildView(std::move(create_open_new_tab_button));
auto more_info_button = side_panel_header_delegate_->CreateMoreInfoButton();
more_info_button->SetProperty(
views::kFlexBehaviorKey,
views::FlexSpecification().WithAlignment(views::LayoutAlignment::kEnd));
header_more_info_button_ = AddChildView(std::move(more_info_button));
auto close_button = side_panel_header_delegate_->CreateCloseButton();
close_button->SetProperty(
views::kFlexBehaviorKey,
views::FlexSpecification().WithAlignment(views::LayoutAlignment::kEnd));
AddChildView(std::move(close_button));
}
SidePanelHeader::~SidePanelHeader() = default;
void SidePanelHeader::Layout(PassKey) {
LayoutSuperclass<views::View>(this);
// The side panel header should draw on top of its parent's border.
gfx::Rect contents_bounds = parent()->GetContentsBounds();
gfx::Rect header_bounds = gfx::Rect(
contents_bounds.x(), contents_bounds.y() - GetPreferredSize().height(),
contents_bounds.width(), GetPreferredSize().height());
SetBoundsRect(header_bounds);
}
BEGIN_METADATA(SidePanelHeader)
END_METADATA