1 // Copyright 2014 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.
5 #ifndef CHROME_BROWSER_UI_VIEWS_DESKTOP_MEDIA_PICKER_VIEWS_H_
6 #define CHROME_BROWSER_UI_VIEWS_DESKTOP_MEDIA_PICKER_VIEWS_H_
8 #include "chrome/browser/media/desktop_media_list_observer.h"
9 #include "chrome/browser/media/desktop_media_picker.h"
10 #include "ui/views/window/dialog_delegate.h"
17 class DesktopMediaPickerDialogView
;
18 class DesktopMediaPickerViews
;
19 class DesktopMediaSourceView
;
21 // View that shows a list of desktop media sources available from
23 class DesktopMediaListView
: public views::View
,
24 public DesktopMediaListObserver
{
26 DesktopMediaListView(DesktopMediaPickerDialogView
* parent
,
27 scoped_ptr
<DesktopMediaList
> media_list
);
28 ~DesktopMediaListView() override
;
30 void StartUpdating(content::DesktopMediaID dialog_window_id
);
32 // Called by DesktopMediaSourceView when selection has changed.
33 void OnSelectionChanged();
35 // Called by DesktopMediaSourceView when a source has been double-clicked.
38 // Returns currently selected source.
39 DesktopMediaSourceView
* GetSelection();
41 // views::View overrides.
42 gfx::Size
GetPreferredSize() const override
;
43 void Layout() override
;
44 bool OnKeyPressed(const ui::KeyEvent
& event
) override
;
47 // DesktopMediaList::Observer interface
48 void OnSourceAdded(int index
) override
;
49 void OnSourceRemoved(int index
) override
;
50 void OnSourceMoved(int old_index
, int new_index
) override
;
51 void OnSourceNameChanged(int index
) override
;
52 void OnSourceThumbnailChanged(int index
) override
;
54 // Accepts whatever happens to be selected right now.
55 void AcceptSelection();
57 DesktopMediaPickerDialogView
* parent_
;
58 scoped_ptr
<DesktopMediaList
> media_list_
;
59 base::WeakPtrFactory
<DesktopMediaListView
> weak_factory_
;
61 DISALLOW_COPY_AND_ASSIGN(DesktopMediaListView
);
64 // View used for each item in DesktopMediaListView. Shows a single desktop media
65 // source as a thumbnail with the title under it.
66 class DesktopMediaSourceView
: public views::View
{
68 DesktopMediaSourceView(DesktopMediaListView
* parent
,
69 content::DesktopMediaID source_id
);
70 ~DesktopMediaSourceView() override
;
72 // Updates thumbnail and title from |source|.
73 void SetName(const base::string16
& name
);
74 void SetThumbnail(const gfx::ImageSkia
& thumbnail
);
76 // Id for the source shown by this View.
77 const content::DesktopMediaID
& source_id() const { return source_id_
; }
79 // Returns true if the source is selected.
80 bool is_selected() const { return selected_
; }
82 // views::View interface.
83 const char* GetClassName() const override
;
84 void Layout() override
;
85 views::View
* GetSelectedViewForGroup(int group
) override
;
86 bool IsGroupFocusTraversable() const override
;
87 void OnPaint(gfx::Canvas
* canvas
) override
;
88 void OnFocus() override
;
89 void OnBlur() override
;
90 bool OnMousePressed(const ui::MouseEvent
& event
) override
;
91 void OnGestureEvent(ui::GestureEvent
* event
) override
;
94 // Updates selection state of the element. If |selected| is true then also
95 // calls SetSelected(false) for the source view that was selected before that
97 void SetSelected(bool selected
);
99 DesktopMediaListView
* parent_
;
100 content::DesktopMediaID source_id_
;
102 views::ImageView
* image_view_
;
103 views::Label
* label_
;
107 DISALLOW_COPY_AND_ASSIGN(DesktopMediaSourceView
);
110 // Dialog view used for DesktopMediaPickerViews.
111 class DesktopMediaPickerDialogView
: public views::DialogDelegateView
{
113 DesktopMediaPickerDialogView(content::WebContents
* parent_web_contents
,
114 gfx::NativeWindow context
,
115 DesktopMediaPickerViews
* parent
,
116 const base::string16
& app_name
,
117 const base::string16
& target_name
,
118 scoped_ptr
<DesktopMediaList
> media_list
);
119 ~DesktopMediaPickerDialogView() override
;
121 // Called by parent (DesktopMediaPickerViews) when it's destroyed.
124 // Called by DesktopMediaListView.
125 void OnSelectionChanged();
126 void OnDoubleClick();
128 // views::View overrides.
129 gfx::Size
GetPreferredSize() const override
;
130 void Layout() override
;
132 // views::DialogDelegateView overrides.
133 ui::ModalType
GetModalType() const override
;
134 base::string16
GetWindowTitle() const override
;
135 bool IsDialogButtonEnabled(ui::DialogButton button
) const override
;
136 base::string16
GetDialogButtonLabel(ui::DialogButton button
) const override
;
137 bool Accept() override
;
138 void DeleteDelegate() override
;
140 void OnMediaListRowsChanged();
142 DesktopMediaSourceView
* GetMediaSourceViewForTesting(int index
) const;
145 DesktopMediaPickerViews
* parent_
;
146 base::string16 app_name_
;
148 views::Label
* label_
;
149 views::ScrollView
* scroll_view_
;
150 DesktopMediaListView
* list_view_
;
152 DISALLOW_COPY_AND_ASSIGN(DesktopMediaPickerDialogView
);
155 // Implementation of DesktopMediaPicker for Views.
156 class DesktopMediaPickerViews
: public DesktopMediaPicker
{
158 DesktopMediaPickerViews();
159 ~DesktopMediaPickerViews() override
;
161 void NotifyDialogResult(content::DesktopMediaID source
);
163 // DesktopMediaPicker overrides.
164 void Show(content::WebContents
* web_contents
,
165 gfx::NativeWindow context
,
166 gfx::NativeWindow parent
,
167 const base::string16
& app_name
,
168 const base::string16
& target_name
,
169 scoped_ptr
<DesktopMediaList
> media_list
,
170 const DoneCallback
& done_callback
) override
;
172 DesktopMediaPickerDialogView
* GetDialogViewForTesting() const {
177 DoneCallback callback_
;
179 // The |dialog_| is owned by the corresponding views::Widget instance.
180 // When DesktopMediaPickerViews is destroyed the |dialog_| is destroyed
181 // asynchronously by closing the widget.
182 DesktopMediaPickerDialogView
* dialog_
;
184 DISALLOW_COPY_AND_ASSIGN(DesktopMediaPickerViews
);
187 #endif // CHROME_BROWSER_UI_VIEWS_DESKTOP_MEDIA_PICKER_VIEWS_H_