forked from chromium/chromium
-
Notifications
You must be signed in to change notification settings - Fork 0
/
capture_mode_settings_view.h
189 lines (152 loc) · 7.94 KB
/
capture_mode_settings_view.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef ASH_CAPTURE_MODE_CAPTURE_MODE_SETTINGS_VIEW_H_
#define ASH_CAPTURE_MODE_CAPTURE_MODE_SETTINGS_VIEW_H_
#include "ash/ash_export.h"
#include "ash/capture_mode/capture_mode_camera_controller.h"
#include "ash/capture_mode/capture_mode_menu_group.h"
#include "ash/capture_mode/capture_mode_session_focus_cycler.h"
#include "base/containers/flat_map.h"
#include "base/functional/callback_forward.h"
#include "base/memory/raw_ptr.h"
#include "ui/base/metadata/metadata_header_macros.h"
#include "ui/views/view.h"
namespace views {
class Separator;
} // namespace views
namespace ash {
class CaptureModeBarView;
class CaptureModeBehavior;
class CaptureModeMenuGroup;
class CaptureModeSession;
class CaptureModeMenuToggleButton;
class SystemShadow;
// All the options in the CaptureMode settings view.
enum CaptureSettingsOption {
kAudioOff = 0,
kAudioSystem,
kAudioMicrophone,
kAudioSystemAndMicrophone,
kDownloadsFolder,
kCustomFolder,
kCameraOff,
kCameraDevicesBegin,
};
// A view that acts as the content view of the capture mode settings menu
// widget. It is the content view of settings widget and it contains
// `CaptureModeMenuGroup` for each setting, save to, audio input etc.
class ASH_EXPORT CaptureModeSettingsView
: public views::View,
public CaptureModeMenuGroup::Delegate,
public CaptureModeCameraController::Observer {
public:
METADATA_HEADER(CaptureModeSettingsView);
CaptureModeSettingsView(CaptureModeSession* session,
CaptureModeBehavior* active_behavior);
CaptureModeSettingsView(const CaptureModeSettingsView&) = delete;
CaptureModeSettingsView& operator=(const CaptureModeSettingsView&) = delete;
~CaptureModeSettingsView() override;
// Gets the ideal bounds in screen coordinates of the settings widget on
// the given |capture_mode_bar_view|. If |content_view| is not null, it will
// be used to get the preferred size to calculate the final bounds. Otherwise,
// a default size will be used.
static gfx::Rect GetBounds(CaptureModeBarView* capture_mode_bar_view,
CaptureModeSettingsView* content_view = nullptr);
// Called when the folder, in which the captured files will be saved, may have
// changed. This may result in adding or removing a menu option for the folder
// that was added or removed. This means that the preferred size of this view
// can possibly change, and therefore it's the responsibility of the caller to
// to set the proper bounds on the widget.
void OnCaptureFolderMayHaveChanged();
// Called when we change the setting to force-use the default downloads folder
// as the save folder. This results in updating which folder menu option is
// currently selected.
void OnDefaultCaptureFolderSelectionChanged();
// Gets the highlightable `CaptureModeOption` and `CaptureModeMenuItem` inside
// this view.
std::vector<CaptureModeSessionFocusCycler::HighlightableView*>
GetHighlightableItems();
// CaptureModeMenuGroup::Delegate:
void OnOptionSelected(int option_id) const override;
bool IsOptionChecked(int option_id) const override;
bool IsOptionEnabled(int option_id) const override;
// CaptureModeCameraController::Observer:
void OnAvailableCamerasChanged(const CameraInfoList& cameras) override;
void OnSelectedCameraChanged(const CameraId& camera_id) override;
CaptureModeMenuToggleButton* demo_tools_menu_toggle_button_for_testing() {
return demo_tools_menu_toggle_button_;
}
private:
friend class CaptureModeSettingsTestApi;
// Called when the "Select folder" menu item in the |save_to_menu_group_| is
// pressed. It opens the folder selection dialog so that user can pick a
// location in which captured files will be saved.
void OnSelectFolderMenuItemPressed();
// Called back when the check for custom folder's availability is done, with
// `available` indicating whether the custom folder is available or not. We
// will check the custom folder's availability every time when
// `OnCaptureFolderMayHaveChanged` is triggered and custom folder is not
// empty.
void OnCustomFolderAvailabilityChecked(bool available);
// Finds the camera id by the given `option_id` from the
// `option_camera_id_map_` if any. Otherwise, return nullptr.
const CameraId* FindCameraIdByOptionId(int option_id) const;
// Adds all camera options (including the option for `kCameraOff`) for the
// given `cameras` to the `camera_menu_group_`. It deletes all options in
// `camera_menu_group_` before adding options. Called when initializing `this`
// or `OnAvailableCamerasChanged` is triggered. It will also trigger
// `UpdateCameraMenuGroupVisibility` at the end.
// Note that camera options are only added when `cameras` is not empty.
// When cameras are disabled by policy (i.e. `managed_by_policy` is true),
// only the "Off" option is added. Users are not allowed to choose any cameras
// in that case.
void AddCameraOptions(const CameraInfoList& cameras, bool managed_by_policy);
void UpdateCameraMenuGroupVisibility(bool visible);
void OnDemoToolsButtonToggled();
// A reference to the session that owns this view indirectly by owning its
// containing widget.
const raw_ptr<CaptureModeSession, ExperimentalAsh>
capture_mode_session_; // Not null;
const raw_ptr<CaptureModeBehavior, ExperimentalAsh> active_behavior_;
// "Audio input" menu group that users can select an audio input from for
// screen capture recording. It has "Off" and "Microphone" options for now.
// "Off" is the default one which means no audio input selected.
raw_ptr<CaptureModeMenuGroup, ExperimentalAsh> audio_input_menu_group_ =
nullptr;
// The separator between audio input and camera menus.
raw_ptr<views::Separator, ExperimentalAsh> separator_1_ = nullptr;
// Camera menu group that users can select a camera device from for selfie
// cam while video recording. It has an `Off` option and options for all
// available camera devices. `Off` is the default one which means no camera is
// selected.
raw_ptr<CaptureModeMenuGroup, ExperimentalAsh> camera_menu_group_ = nullptr;
// A mapping from option id to camera id for camera devices.
base::flat_map<int, CameraId> option_camera_id_map_;
// `demo_tools_menu_toggle_button_` will be used as the entry point to enable
// the capture mode demo tools feature. Currently
// `demo_tools_menu_toggle_button_` and `separator_2_` are guarded by the
// feature flag and will only be visible when the feature is enabled.
raw_ptr<views::Separator, ExperimentalAsh> separator_2_ = nullptr;
raw_ptr<CaptureModeMenuToggleButton, ExperimentalAsh>
demo_tools_menu_toggle_button_ = nullptr;
// Can be null if `ShouldSaveToSettingsBeIncluded()` is false for the active
// behavior of current capture mode session, since then it's not needed as the
// "Save-to" menu group will not be added at all.
raw_ptr<views::Separator, ExperimentalAsh> separator_3_ = nullptr;
// "Save to" menu group that users can select a folder to save the captured
// files to. It will include the "Downloads" folder as the default one and
// one more folder selected by users.
// This menu group is not added when in `ShouldSaveToSettingsBeIncluded()` is
// false for the active behavior of current capture mode session.
raw_ptr<CaptureModeMenuGroup, ExperimentalAsh> save_to_menu_group_ = nullptr;
// If not set, custom folder is not set. If true, customer folder is set and
// available. If false, customer folder is set but unavailable.
absl::optional<bool> is_custom_folder_available_;
// If set, it will be called when the settings menu is refreshed.
base::OnceClosure on_settings_menu_refreshed_callback_for_test_;
std::unique_ptr<SystemShadow> shadow_;
base::WeakPtrFactory<CaptureModeSettingsView> weak_ptr_factory_{this};
};
} // namespace ash
#endif // ASH_CAPTURE_MODE_CAPTURE_MODE_SETTINGS_VIEW_H_