Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(480)

Side by Side Diff: ash/wm/overview/window_selector_item.cc

Issue 810033010: Remove TransparentActivateWindowButton from Overview Mode (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ash/wm/overview/window_selector_item.h" 5 #include "ash/wm/overview/window_selector_item.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <vector> 8 #include <vector>
9 9
10 #include "ash/screen_util.h" 10 #include "ash/screen_util.h"
11 #include "ash/shell.h" 11 #include "ash/shell.h"
12 #include "ash/shell_window_ids.h" 12 #include "ash/shell_window_ids.h"
13 #include "ash/wm/overview/overview_animation_type.h" 13 #include "ash/wm/overview/overview_animation_type.h"
14 #include "ash/wm/overview/scoped_overview_animation_settings.h" 14 #include "ash/wm/overview/scoped_overview_animation_settings.h"
15 #include "ash/wm/overview/scoped_transform_overview_window.h" 15 #include "ash/wm/overview/scoped_transform_overview_window.h"
16 #include "ash/wm/overview/window_selector_controller.h" 16 #include "ash/wm/overview/window_selector_controller.h"
17 #include "ash/wm/window_state.h" 17 #include "ash/wm/window_state.h"
18 #include "base/auto_reset.h" 18 #include "base/auto_reset.h"
19 #include "base/strings/string_util.h" 19 #include "base/strings/string_util.h"
20 #include "base/strings/utf_string_conversions.h" 20 #include "base/strings/utf_string_conversions.h"
21 #include "base/time/time.h" 21 #include "base/time/time.h"
22 #include "grit/ash_resources.h" 22 #include "grit/ash_resources.h"
23 #include "grit/ash_strings.h" 23 #include "grit/ash_strings.h"
24 #include "ui/aura/window.h" 24 #include "ui/aura/window.h"
25 #include "ui/base/l10n/l10n_util.h" 25 #include "ui/base/l10n/l10n_util.h"
26 #include "ui/base/resource/resource_bundle.h" 26 #include "ui/base/resource/resource_bundle.h"
27 #include "ui/gfx/geometry/vector2d.h" 27 #include "ui/gfx/geometry/vector2d.h"
28 #include "ui/gfx/text_constants.h"
28 #include "ui/gfx/transform_util.h" 29 #include "ui/gfx/transform_util.h"
29 #include "ui/strings/grit/ui_strings.h" 30 #include "ui/strings/grit/ui_strings.h"
31 #include "ui/views/border.h"
30 #include "ui/views/controls/button/image_button.h" 32 #include "ui/views/controls/button/image_button.h"
31 #include "ui/views/controls/label.h" 33 #include "ui/views/controls/button/label_button.h"
32 #include "ui/views/layout/box_layout.h" 34 #include "ui/views/layout/box_layout.h"
33 #include "ui/views/widget/widget.h" 35 #include "ui/views/widget/widget.h"
34 #include "ui/wm/core/window_util.h" 36 #include "ui/wm/core/window_util.h"
35 37
36 namespace ash { 38 namespace ash {
37 39
38 namespace { 40 namespace {
39 41
40 // In the conceptual overview table, the window margin is the space reserved 42 // In the conceptual overview table, the window margin is the space reserved
41 // around the window within the cell. This margin does not overlap so the 43 // around the window within the cell. This margin does not overlap so the
42 // closest distance between adjacent windows will be twice this amount. 44 // closest distance between adjacent windows will be twice this amount.
43 static const int kWindowMargin = 30; 45 static const int kWindowMargin = 30;
44 46
45 // Foreground label color. 47 // Foreground label color.
46 static const SkColor kLabelColor = SK_ColorWHITE; 48 static const SkColor kLabelColor = SK_ColorWHITE;
47 49
48 // Background label color.
49 static const SkColor kLabelBackground = SK_ColorTRANSPARENT;
50
51 // Label shadow color. 50 // Label shadow color.
52 static const SkColor kLabelShadow = 0xB0000000; 51 static const SkColor kLabelShadow = 0xB0000000;
53 52
54 // Vertical padding for the label, both over and beneath it. 53 // Vertical padding for the label, both over and beneath it.
55 static const int kVerticalLabelPadding = 20; 54 static const int kVerticalLabelPadding = 20;
56 55
57 // Solid shadow length from the label 56 // Solid shadow length from the label
58 static const int kVerticalShadowOffset = 1; 57 static const int kVerticalShadowOffset = 1;
59 58
60 // Amount of blur applied to the label shadow 59 // Amount of blur applied to the label shadow
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
110 109
111 OverviewCloseButton::~OverviewCloseButton() { 110 OverviewCloseButton::~OverviewCloseButton() {
112 } 111 }
113 112
114 } // namespace 113 } // namespace
115 114
116 WindowSelectorItem::WindowSelectorItem(aura::Window* root_window) 115 WindowSelectorItem::WindowSelectorItem(aura::Window* root_window)
117 : dimmed_(false), 116 : dimmed_(false),
118 root_window_(root_window), 117 root_window_(root_window),
119 in_bounds_update_(false), 118 in_bounds_update_(false),
120 window_label_view_(nullptr), 119 window_label_button_view_(nullptr),
121 close_button_(new OverviewCloseButton(this)), 120 close_button_(new OverviewCloseButton(this)) {
122 selector_item_activate_window_button_(
123 new TransparentActivateWindowButton(root_window, this)) {
124 views::Widget::InitParams params; 121 views::Widget::InitParams params;
125 params.type = views::Widget::InitParams::TYPE_POPUP; 122 params.type = views::Widget::InitParams::TYPE_POPUP;
126 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 123 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
127 params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; 124 params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW;
128 params.parent = Shell::GetContainer(root_window, 125 params.parent = Shell::GetContainer(root_window,
129 kShellWindowId_OverlayContainer); 126 kShellWindowId_OverlayContainer);
130 close_button_widget_.set_focus_on_creation(false); 127 close_button_widget_.set_focus_on_creation(false);
131 close_button_widget_.Init(params); 128 close_button_widget_.Init(params);
132 close_button_->SetVisible(false); 129 close_button_->SetVisible(false);
133 close_button_widget_.SetContentsView(close_button_); 130 close_button_widget_.SetContentsView(close_button_);
(...skipping 14 matching lines...) Expand all
148 transform_window->window()->RemoveObserver(this); 145 transform_window->window()->RemoveObserver(this);
149 } 146 }
150 } 147 }
151 148
152 void WindowSelectorItem::AddWindow(aura::Window* window) { 149 void WindowSelectorItem::AddWindow(aura::Window* window) {
153 DCHECK(window->GetRootWindow() == root_window_); 150 DCHECK(window->GetRootWindow() == root_window_);
154 window->AddObserver(this); 151 window->AddObserver(this);
155 ScopedTransformOverviewWindow* transform_window = 152 ScopedTransformOverviewWindow* transform_window =
156 new ScopedTransformOverviewWindow(window); 153 new ScopedTransformOverviewWindow(window);
157 transform_windows_.push_back(transform_window); 154 transform_windows_.push_back(transform_window);
158 // The transparent overlays are added at the front of the z-order when
159 // created so make sure the selector item's transparent overlay is behind the
160 // overlay for the window that was just added.
161 transform_window->activate_button()->StackAbove(
162 selector_item_activate_window_button_.get());
163 155
164 UpdateSelectorButtons();
165 UpdateCloseButtonAccessibilityName(); 156 UpdateCloseButtonAccessibilityName();
166 } 157 }
167 158
168 bool WindowSelectorItem::HasSelectableWindow(const aura::Window* window) const { 159 bool WindowSelectorItem::HasSelectableWindow(const aura::Window* window) const {
169 for (auto* transform_window : transform_windows_) { 160 for (auto* transform_window : transform_windows_) {
170 if (transform_window->window() == window) 161 if (transform_window->window() == window)
171 return true; 162 return true;
172 } 163 }
173 return false; 164 return false;
174 } 165 }
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
216 // If empty WindowSelectorItem will be destroyed immediately after this by 207 // If empty WindowSelectorItem will be destroyed immediately after this by
217 // its owner. 208 // its owner.
218 if (empty()) 209 if (empty())
219 return; 210 return;
220 211
221 UpdateCloseButtonAccessibilityName(); 212 UpdateCloseButtonAccessibilityName();
222 window_label_.reset(); 213 window_label_.reset();
223 UpdateWindowLabels(target_bounds_, 214 UpdateWindowLabels(target_bounds_,
224 OverviewAnimationType::OVERVIEW_ANIMATION_NONE); 215 OverviewAnimationType::OVERVIEW_ANIMATION_NONE);
225 UpdateCloseButtonLayout(OverviewAnimationType::OVERVIEW_ANIMATION_NONE); 216 UpdateCloseButtonLayout(OverviewAnimationType::OVERVIEW_ANIMATION_NONE);
226 UpdateSelectorButtons();
227 } 217 }
228 218
229 bool WindowSelectorItem::empty() const { 219 bool WindowSelectorItem::empty() const {
230 return transform_windows_.empty(); 220 return transform_windows_.empty();
231 } 221 }
232 222
233 void WindowSelectorItem::PrepareForOverview() { 223 void WindowSelectorItem::PrepareForOverview() {
234 for (auto* transform_window : transform_windows_) 224 for (auto* transform_window : transform_windows_)
235 transform_window->PrepareForOverview(); 225 transform_window->PrepareForOverview();
236 } 226 }
237 227
238 void WindowSelectorItem::SetBounds(aura::Window* root_window, 228 void WindowSelectorItem::SetBounds(aura::Window* root_window,
239 const gfx::Rect& target_bounds, 229 const gfx::Rect& target_bounds,
240 OverviewAnimationType animation_type) { 230 OverviewAnimationType animation_type) {
241 if (in_bounds_update_) 231 if (in_bounds_update_)
242 return; 232 return;
243 base::AutoReset<bool> auto_reset_in_bounds_update(&in_bounds_update_, true); 233 base::AutoReset<bool> auto_reset_in_bounds_update(&in_bounds_update_, true);
244 target_bounds_ = target_bounds; 234 target_bounds_ = target_bounds;
245 235
246 UpdateWindowLabels(target_bounds, animation_type); 236 UpdateWindowLabels(target_bounds, animation_type);
247 237
248 gfx::Rect inset_bounds(target_bounds); 238 gfx::Rect inset_bounds(target_bounds);
249 inset_bounds.Inset(kWindowMargin, kWindowMargin); 239 inset_bounds.Inset(kWindowMargin, kWindowMargin);
250 SetItemBounds(root_window, inset_bounds, animation_type); 240 SetItemBounds(root_window, inset_bounds, animation_type);
251 241
252 // SetItemBounds is called before UpdateCloseButtonLayout so the close button 242 // SetItemBounds is called before UpdateCloseButtonLayout so the close button
253 // can properly use the updated windows bounds. 243 // can properly use the updated windows bounds.
254 UpdateCloseButtonLayout(animation_type); 244 UpdateCloseButtonLayout(animation_type);
255 UpdateSelectorButtons();
256 } 245 }
257 246
258 void WindowSelectorItem::RecomputeWindowTransforms() { 247 void WindowSelectorItem::RecomputeWindowTransforms() {
259 if (in_bounds_update_ || target_bounds_.IsEmpty()) 248 if (in_bounds_update_ || target_bounds_.IsEmpty())
260 return; 249 return;
261 DCHECK(root_window_); 250 DCHECK(root_window_);
262 base::AutoReset<bool> auto_reset_in_bounds_update(&in_bounds_update_, true); 251 base::AutoReset<bool> auto_reset_in_bounds_update(&in_bounds_update_, true);
263 gfx::Rect inset_bounds(target_bounds_); 252 gfx::Rect inset_bounds(target_bounds_);
264 inset_bounds.Inset(kWindowMargin, kWindowMargin); 253 inset_bounds.Inset(kWindowMargin, kWindowMargin);
265 SetItemBounds(root_window_, inset_bounds, 254 SetItemBounds(root_window_, inset_bounds,
266 OverviewAnimationType::OVERVIEW_ANIMATION_NONE); 255 OverviewAnimationType::OVERVIEW_ANIMATION_NONE);
267 256
268 UpdateCloseButtonLayout(OverviewAnimationType::OVERVIEW_ANIMATION_NONE); 257 UpdateCloseButtonLayout(OverviewAnimationType::OVERVIEW_ANIMATION_NONE);
269 UpdateSelectorButtons();
270 } 258 }
271 259
272 void WindowSelectorItem::SendFocusAlert() const { 260 void WindowSelectorItem::SendFocusAlert() const {
273 selector_item_activate_window_button_->SendFocusAlert(); 261 window_label_button_view_->NotifyAccessibilityEvent(ui::AX_EVENT_FOCUS,
262 true);
274 } 263 }
275 264
276 void WindowSelectorItem::SetDimmed(bool dimmed) { 265 void WindowSelectorItem::SetDimmed(bool dimmed) {
277 dimmed_ = dimmed; 266 dimmed_ = dimmed;
278 SetOpacity(dimmed ? kDimmedItemOpacity : 1.0f); 267 SetOpacity(dimmed ? kDimmedItemOpacity : 1.0f);
279 } 268 }
280 269
281 void WindowSelectorItem::ButtonPressed(views::Button* sender, 270 void WindowSelectorItem::ButtonPressed(views::Button* sender,
282 const ui::Event& event) { 271 const ui::Event& event) {
283 CHECK(!transform_windows_.empty()); 272 if (sender == close_button_) {
284 SelectionTransformWindow()->Close(); 273 CHECK(!transform_windows_.empty());
274 SelectionTransformWindow()->Close();
275 return;
276 }
277 wm::GetWindowState(SelectionWindow())->Activate();
bruthig 2015/01/09 17:04:33 I'm assuming this is handling the clicks on the La
Nina 2015/01/21 16:24:16 I don't think we want to add a redundant if clause
285 } 278 }
286 279
287 void WindowSelectorItem::OnWindowTitleChanged(aura::Window* window) { 280 void WindowSelectorItem::OnWindowTitleChanged(aura::Window* window) {
288 // TODO(flackr): Maybe add the new title to a vector of titles so that we can 281 // TODO(flackr): Maybe add the new title to a vector of titles so that we can
289 // filter any of the titles the window had while in the overview session. 282 // filter any of the titles the window had while in the overview session.
290 if (window == SelectionWindow()) { 283 if (window == SelectionWindow()) {
291 window_label_view_->SetText(window->title()); 284 window_label_button_view_->SetText(window->title());
292 UpdateCloseButtonAccessibilityName(); 285 UpdateCloseButtonAccessibilityName();
293 } 286 }
294 UpdateCloseButtonLayout(OverviewAnimationType::OVERVIEW_ANIMATION_NONE); 287 UpdateCloseButtonLayout(OverviewAnimationType::OVERVIEW_ANIMATION_NONE);
295 UpdateSelectorButtons();
296 }
297
298 void WindowSelectorItem::Select() {
299 aura::Window* selection_window = SelectionWindow();
300 if (selection_window)
301 wm::GetWindowState(selection_window)->Activate();
302 } 288 }
303 289
304 void WindowSelectorItem::SetItemBounds(aura::Window* root_window, 290 void WindowSelectorItem::SetItemBounds(aura::Window* root_window,
305 const gfx::Rect& target_bounds, 291 const gfx::Rect& target_bounds,
306 OverviewAnimationType animation_type) { 292 OverviewAnimationType animation_type) {
307 gfx::Rect bounding_rect; 293 gfx::Rect bounding_rect;
308 for (auto* transform_window : transform_windows_) { 294 for (auto* transform_window : transform_windows_) {
309 bounding_rect.Union( 295 bounding_rect.Union(
310 transform_window->GetTargetBoundsInScreen()); 296 transform_window->GetTargetBoundsInScreen());
311 } 297 }
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
370 } 356 }
371 357
372 void WindowSelectorItem::CreateWindowLabel(const base::string16& title) { 358 void WindowSelectorItem::CreateWindowLabel(const base::string16& title) {
373 window_label_.reset(new views::Widget); 359 window_label_.reset(new views::Widget);
374 views::Widget::InitParams params; 360 views::Widget::InitParams params;
375 params.type = views::Widget::InitParams::TYPE_POPUP; 361 params.type = views::Widget::InitParams::TYPE_POPUP;
376 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 362 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
377 params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; 363 params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW;
378 params.parent = Shell::GetContainer(root_window_, 364 params.parent = Shell::GetContainer(root_window_,
379 kShellWindowId_OverlayContainer); 365 kShellWindowId_OverlayContainer);
380 params.accept_events = false;
381 params.visible_on_all_workspaces = true; 366 params.visible_on_all_workspaces = true;
382 window_label_->set_focus_on_creation(false); 367 window_label_->set_focus_on_creation(false);
383 window_label_->Init(params); 368 window_label_->Init(params);
384 window_label_view_ = new views::Label; 369 window_label_button_view_ = new views::LabelButton(this, title);
385 window_label_view_->SetEnabledColor(kLabelColor); 370 window_label_button_view_->SetTextColor(views::LabelButton::STATE_NORMAL,
386 window_label_view_->SetBackgroundColor(kLabelBackground); 371 kLabelColor);
387 window_label_view_->SetShadows(gfx::ShadowValues( 372 window_label_button_view_->SetTextColor(views::LabelButton::STATE_HOVERED,
373 kLabelColor);
374 window_label_button_view_->SetTextColor(views::LabelButton::STATE_PRESSED,
375 kLabelColor);
376 window_label_button_view_->set_animate_on_state_change(false);
377 window_label_button_view_->SetHorizontalAlignment(gfx::ALIGN_CENTER);
378 window_label_button_view_->SetBorder(views::Border::NullBorder());
379 window_label_button_view_->SetTextShadows(gfx::ShadowValues(
388 1, 380 1,
389 gfx::ShadowValue( 381 gfx::ShadowValue(
390 gfx::Point(0, kVerticalShadowOffset), kShadowBlur, kLabelShadow))); 382 gfx::Point(0, kVerticalShadowOffset), kShadowBlur, kLabelShadow)));
391 ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); 383 ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
392 window_label_view_->SetFontList( 384 window_label_button_view_->SetFontList(
393 bundle.GetFontList(ui::ResourceBundle::BoldFont)); 385 bundle.GetFontList(ui::ResourceBundle::BoldFont));
394 window_label_view_->SetText(title);
395 views::BoxLayout* layout = new views::BoxLayout(views::BoxLayout::kVertical, 386 views::BoxLayout* layout = new views::BoxLayout(views::BoxLayout::kVertical,
396 0, 387 0,
397 kVerticalLabelPadding, 388 kVerticalLabelPadding,
398 0); 389 0);
399 window_label_view_->SetLayoutManager(layout); 390 window_label_button_view_->SetLayoutManager(layout);
400 window_label_->SetContentsView(window_label_view_); 391 window_label_->SetContentsView(window_label_button_view_);
401 window_label_->Show(); 392 window_label_->Show();
402 } 393 }
403 394
404 void WindowSelectorItem::UpdateSelectorButtons() {
405 CHECK(!transform_windows_.empty());
406
407 selector_item_activate_window_button_->SetBounds(target_bounds());
408 selector_item_activate_window_button_->SetAccessibleName(
409 transform_windows_.front()->window()->title());
410
411 for (auto* transform_window : transform_windows_) {
412 TransparentActivateWindowButton* activate_button =
413 transform_window->activate_button();
414
415 // If there is only one window in this, then expand the transparent overlay
416 // so that touch exploration in ChromVox only provides spoken feedback once
417 // within |this| selector item's bounds.
418 gfx::Rect bounds = transform_windows_.size() == 1
419 ? target_bounds() : GetTransformedBounds(transform_window->window());
420 activate_button->SetBounds(bounds);
421 activate_button->SetAccessibleName(transform_window->window()->title());
422 }
423 }
424
425 void WindowSelectorItem::UpdateCloseButtonLayout( 395 void WindowSelectorItem::UpdateCloseButtonLayout(
426 OverviewAnimationType animation_type) { 396 OverviewAnimationType animation_type) {
427 if (!close_button_->visible()) { 397 if (!close_button_->visible()) {
428 close_button_->SetVisible(true); 398 close_button_->SetVisible(true);
429 SetupFadeInAfterLayout(close_button_widget_.GetNativeWindow()); 399 SetupFadeInAfterLayout(close_button_widget_.GetNativeWindow());
430 } 400 }
431 ScopedOverviewAnimationSettings animation_settings(animation_type, 401 ScopedOverviewAnimationSettings animation_settings(animation_type,
432 close_button_widget_.GetNativeWindow()); 402 close_button_widget_.GetNativeWindow());
433 403
434 gfx::Rect transformed_window_bounds = ScreenUtil::ConvertRectFromScreen( 404 gfx::Rect transformed_window_bounds = ScreenUtil::ConvertRectFromScreen(
(...skipping 13 matching lines...) Expand all
448 SelectionWindow()->title())); 418 SelectionWindow()->title()));
449 } 419 }
450 420
451 ScopedTransformOverviewWindow* 421 ScopedTransformOverviewWindow*
452 WindowSelectorItem::SelectionTransformWindow() const { 422 WindowSelectorItem::SelectionTransformWindow() const {
453 CHECK(!transform_windows_.empty()); 423 CHECK(!transform_windows_.empty());
454 return transform_windows_.front(); 424 return transform_windows_.front();
455 } 425 }
456 426
457 } // namespace ash 427 } // namespace ash
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698