// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ash/capture_mode/capture_mode_type_view.h"
#include <memory>
#include "ash/capture_mode/capture_mode_behavior.h"
#include "ash/capture_mode/capture_mode_camera_controller.h"
#include "ash/capture_mode/capture_mode_controller.h"
#include "ash/capture_mode/capture_mode_metrics.h"
#include "ash/capture_mode/capture_mode_session.h"
#include "ash/capture_mode/capture_mode_session_focus_cycler.h"
#include "ash/resources/vector_icons/vector_icons.h"
#include "ash/strings/grit/ash_strings.h"
#include "ash/style/ash_color_id.h"
#include "ash/style/ash_color_provider.h"
#include "ash/style/tab_slider.h"
#include "ash/style/tab_slider_button.h"
#include "base/functional/bind.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/metadata/metadata_impl_macros.h"
#include "ui/views/layout/fill_layout.h"
namespace ash {
CaptureModeTypeView::CaptureModeTypeView(CaptureModeBehavior* active_behavior)
: capture_type_switch_(AddChildView(std::make_unique<TabSlider>(
/*max_tab_num=*/2,
TabSlider::InitParams{/*internal_border_padding=*/2,
/*between_child_spacing=*/0,
/*has_background=*/true,
/*has_selector_animation=*/true,
/*distribute_space_evenly=*/false}))) {
CHECK(active_behavior);
// Only add the image toggle button if the active behavior allows.
if (active_behavior->ShouldImageCaptureTypeBeAllowed()) {
image_toggle_button_ = capture_type_switch_->AddButton<IconSliderButton>(
base::BindRepeating(&CaptureModeTypeView::OnImageToggle,
base::Unretained(this)),
&kCaptureModeImageIcon,
l10n_util::GetStringUTF16(IDS_ASH_SCREEN_CAPTURE_TOOLTIP_SCREENSHOT));
// Add highlight helper to image toggle button.
CaptureModeSessionFocusCycler::HighlightHelper::Install(
image_toggle_button_);
}
// Add video toggle button.
video_toggle_button_ = capture_type_switch_->AddButton<IconSliderButton>(
base::BindRepeating(&CaptureModeTypeView::OnVideoToggle,
base::Unretained(this)),
&kCaptureModeVideoIcon,
l10n_util::GetStringUTF16(IDS_ASH_SCREEN_CAPTURE_TOOLTIP_SCREENRECORD));
// Add highlight helper to video toggle button.
CaptureModeSessionFocusCycler::HighlightHelper::Install(video_toggle_button_);
auto* controller = CaptureModeController::Get();
if (!controller->can_start_new_recording()) {
// We can't have more than one recording at the same time.
video_toggle_button_->SetEnabled(false);
}
SetLayoutManager(std::make_unique<views::FillLayout>());
}
CaptureModeTypeView::~CaptureModeTypeView() = default;
void CaptureModeTypeView::OnCaptureTypeChanged(CaptureModeType new_type) {
auto* controller = CaptureModeController::Get();
const bool is_video = new_type == CaptureModeType::kVideo;
DCHECK(controller->can_start_new_recording() || !is_video);
video_toggle_button_->SetSelected(is_video);
if (image_toggle_button_) {
image_toggle_button_->SetSelected(!is_video);
}
}
void CaptureModeTypeView::OnImageToggle() {
RecordCaptureModeBarButtonType(CaptureModeBarButtonType::kScreenCapture);
CaptureModeController::Get()->SetType(CaptureModeType::kImage);
}
void CaptureModeTypeView::OnVideoToggle() {
auto* controller = CaptureModeController::Get();
DCHECK(controller->can_start_new_recording());
RecordCaptureModeBarButtonType(CaptureModeBarButtonType::kScreenRecord);
controller->SetType(CaptureModeType::kVideo);
}
BEGIN_METADATA(CaptureModeTypeView)
END_METADATA
} // namespace ash