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

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

Issue 844763006: Change overview mode to so that docked panel windows are not grouped together. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Changed OnOverviewModeEnding to OnOverviewModeEnded. 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"
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
106 rb.GetImageSkiaNamed(IDR_AURA_WINDOW_OVERVIEW_CLOSE_H)); 106 rb.GetImageSkiaNamed(IDR_AURA_WINDOW_OVERVIEW_CLOSE_H));
107 SetImage(views::CustomButton::STATE_PRESSED, 107 SetImage(views::CustomButton::STATE_PRESSED,
108 rb.GetImageSkiaNamed(IDR_AURA_WINDOW_OVERVIEW_CLOSE_P)); 108 rb.GetImageSkiaNamed(IDR_AURA_WINDOW_OVERVIEW_CLOSE_P));
109 } 109 }
110 110
111 OverviewCloseButton::~OverviewCloseButton() { 111 OverviewCloseButton::~OverviewCloseButton() {
112 } 112 }
113 113
114 } // namespace 114 } // namespace
115 115
116 WindowSelectorItem::WindowSelectorItem(aura::Window* root_window) 116 WindowSelectorItem::WindowSelectorItem(aura::Window* root_window,
117 aura::Window* window)
117 : dimmed_(false), 118 : dimmed_(false),
118 root_window_(root_window), 119 root_window_(root_window),
120 transform_window_(window),
119 in_bounds_update_(false), 121 in_bounds_update_(false),
120 window_label_view_(nullptr), 122 window_label_view_(nullptr),
121 close_button_(new OverviewCloseButton(this)), 123 close_button_(new OverviewCloseButton(this)),
122 selector_item_activate_window_button_( 124 selector_item_activate_window_button_(
123 new TransparentActivateWindowButton(root_window, this)) { 125 new TransparentActivateWindowButton(root_window, this)) {
124 views::Widget::InitParams params; 126 views::Widget::InitParams params;
125 params.type = views::Widget::InitParams::TYPE_POPUP; 127 params.type = views::Widget::InitParams::TYPE_POPUP;
126 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 128 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
127 params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; 129 params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW;
128 params.parent = Shell::GetContainer(root_window, 130 params.parent = Shell::GetContainer(root_window,
129 kShellWindowId_OverlayContainer); 131 kShellWindowId_OverlayContainer);
130 close_button_widget_.set_focus_on_creation(false); 132 close_button_widget_.set_focus_on_creation(false);
131 close_button_widget_.Init(params); 133 close_button_widget_.Init(params);
132 close_button_->SetVisible(false); 134 close_button_->SetVisible(false);
133 close_button_widget_.SetContentsView(close_button_); 135 close_button_widget_.SetContentsView(close_button_);
134 close_button_widget_.SetSize(close_button_->GetPreferredSize()); 136 close_button_widget_.SetSize(close_button_->GetPreferredSize());
135 close_button_widget_.Show(); 137 close_button_widget_.Show();
136 138
137 gfx::Rect close_button_rect(close_button_widget_.GetNativeWindow()->bounds()); 139 gfx::Rect close_button_rect(close_button_widget_.GetNativeWindow()->bounds());
138 // Align the center of the button with position (0, 0) so that the 140 // Align the center of the button with position (0, 0) so that the
139 // translate transform does not need to take the button dimensions into 141 // translate transform does not need to take the button dimensions into
140 // account. 142 // account.
141 close_button_rect.set_x(-close_button_rect.width() / 2); 143 close_button_rect.set_x(-close_button_rect.width() / 2);
142 close_button_rect.set_y(-close_button_rect.height() / 2); 144 close_button_rect.set_y(-close_button_rect.height() / 2);
143 close_button_widget_.GetNativeWindow()->SetBounds(close_button_rect); 145 close_button_widget_.GetNativeWindow()->SetBounds(close_button_rect);
146
147 GetWindow()->AddObserver(this);
148
149 UpdateCloseButtonAccessibilityName();
144 } 150 }
145 151
146 WindowSelectorItem::~WindowSelectorItem() { 152 WindowSelectorItem::~WindowSelectorItem() {
147 for (auto* transform_window : transform_windows_) { 153 GetWindow()->RemoveObserver(this);
148 transform_window->window()->RemoveObserver(this);
149 }
150 } 154 }
151 155
152 void WindowSelectorItem::AddWindow(aura::Window* window) { 156 aura::Window* WindowSelectorItem::GetWindow() const {
153 DCHECK(window->GetRootWindow() == root_window_); 157 return transform_window_.window();
154 window->AddObserver(this);
155 ScopedTransformOverviewWindow* transform_window =
156 new ScopedTransformOverviewWindow(window);
157 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
164 UpdateSelectorButtons();
165 UpdateCloseButtonAccessibilityName();
166 } 158 }
167 159
168 bool WindowSelectorItem::HasSelectableWindow(const aura::Window* window) const { 160 void WindowSelectorItem::RestoreWindow() {
169 for (auto* transform_window : transform_windows_) { 161 transform_window_.RestoreWindow();
170 if (transform_window->window() == window) 162 }
171 return true; 163
172 } 164 void WindowSelectorItem::ShowWindowOnExit() {
173 return false; 165 transform_window_.ShowWindowOnExit();
166 }
167
168 void WindowSelectorItem::PrepareForOverview() {
169 transform_window_.PrepareForOverview();
174 } 170 }
175 171
176 bool WindowSelectorItem::Contains(const aura::Window* target) const { 172 bool WindowSelectorItem::Contains(const aura::Window* target) const {
177 for (auto* transform_window : transform_windows_) { 173 return transform_window_.Contains(target);
178 if (transform_window->Contains(target))
179 return true;
180 }
181 return false;
182 } 174 }
183 175
184 void WindowSelectorItem::RestoreWindowOnExit(aura::Window* window) { 176 void WindowSelectorItem::SetBounds(const gfx::Rect& target_bounds,
185 for (auto* transform_window : transform_windows_) {
186 if (transform_window->Contains(window)) {
187 transform_window->RestoreWindowOnExit();
188 break;
189 }
190 }
191 }
192
193 aura::Window* WindowSelectorItem::SelectionWindow() const {
194 return SelectionTransformWindow()->window();
195 }
196
197 void WindowSelectorItem::RemoveWindow(const aura::Window* window) {
198 bool window_found = false;
199
200 for (TransformWindows::iterator iter = transform_windows_.begin();
201 iter != transform_windows_.end();
202 ++iter) {
203 ScopedTransformOverviewWindow* transform_window = *iter;
204
205 if (transform_window->window() == window) {
206 transform_window->window()->RemoveObserver(this);
207 transform_window->OnWindowDestroyed();
208 transform_windows_.erase(iter);
209 window_found = true;
210 break;
211 }
212 }
213 CHECK(window_found);
214
215
216 // If empty WindowSelectorItem will be destroyed immediately after this by
217 // its owner.
218 if (empty())
219 return;
220
221 UpdateCloseButtonAccessibilityName();
222 window_label_.reset();
223 UpdateWindowLabels(target_bounds_,
224 OverviewAnimationType::OVERVIEW_ANIMATION_NONE);
225 UpdateCloseButtonLayout(OverviewAnimationType::OVERVIEW_ANIMATION_NONE);
226 UpdateSelectorButtons();
227 }
228
229 bool WindowSelectorItem::empty() const {
230 return transform_windows_.empty();
231 }
232
233 void WindowSelectorItem::PrepareForOverview() {
234 for (auto* transform_window : transform_windows_)
235 transform_window->PrepareForOverview();
236 }
237
238 void WindowSelectorItem::SetBounds(aura::Window* root_window,
239 const gfx::Rect& target_bounds,
240 OverviewAnimationType animation_type) { 177 OverviewAnimationType animation_type) {
241 if (in_bounds_update_) 178 if (in_bounds_update_)
242 return; 179 return;
243 base::AutoReset<bool> auto_reset_in_bounds_update(&in_bounds_update_, true); 180 base::AutoReset<bool> auto_reset_in_bounds_update(&in_bounds_update_, true);
244 target_bounds_ = target_bounds; 181 target_bounds_ = target_bounds;
245 182
246 UpdateWindowLabels(target_bounds, animation_type); 183 UpdateWindowLabels(target_bounds, animation_type);
247 184
248 gfx::Rect inset_bounds(target_bounds); 185 gfx::Rect inset_bounds(target_bounds);
249 inset_bounds.Inset(kWindowMargin, kWindowMargin); 186 inset_bounds.Inset(kWindowMargin, kWindowMargin);
250 SetItemBounds(root_window, inset_bounds, animation_type); 187 SetItemBounds(inset_bounds, animation_type);
251 188
252 // SetItemBounds is called before UpdateCloseButtonLayout so the close button 189 // SetItemBounds is called before UpdateCloseButtonLayout so the close button
253 // can properly use the updated windows bounds. 190 // can properly use the updated windows bounds.
254 UpdateCloseButtonLayout(animation_type); 191 UpdateCloseButtonLayout(animation_type);
255 UpdateSelectorButtons(); 192 UpdateSelectorButtons();
256 } 193 }
257 194
258 void WindowSelectorItem::RecomputeWindowTransforms() { 195 void WindowSelectorItem::RecomputeWindowTransforms() {
259 if (in_bounds_update_ || target_bounds_.IsEmpty()) 196 if (in_bounds_update_ || target_bounds_.IsEmpty())
260 return; 197 return;
261 DCHECK(root_window_);
262 base::AutoReset<bool> auto_reset_in_bounds_update(&in_bounds_update_, true); 198 base::AutoReset<bool> auto_reset_in_bounds_update(&in_bounds_update_, true);
263 gfx::Rect inset_bounds(target_bounds_); 199 gfx::Rect inset_bounds(target_bounds_);
264 inset_bounds.Inset(kWindowMargin, kWindowMargin); 200 inset_bounds.Inset(kWindowMargin, kWindowMargin);
265 SetItemBounds(root_window_, inset_bounds, 201 SetItemBounds(inset_bounds, OverviewAnimationType::OVERVIEW_ANIMATION_NONE);
266 OverviewAnimationType::OVERVIEW_ANIMATION_NONE);
267 202
268 UpdateCloseButtonLayout(OverviewAnimationType::OVERVIEW_ANIMATION_NONE); 203 UpdateCloseButtonLayout(OverviewAnimationType::OVERVIEW_ANIMATION_NONE);
269 UpdateSelectorButtons(); 204 UpdateSelectorButtons();
270 } 205 }
271 206
272 void WindowSelectorItem::SendFocusAlert() const { 207 void WindowSelectorItem::SendFocusAlert() const {
273 selector_item_activate_window_button_->SendFocusAlert(); 208 selector_item_activate_window_button_->SendFocusAlert();
274 } 209 }
275 210
276 void WindowSelectorItem::SetDimmed(bool dimmed) { 211 void WindowSelectorItem::SetDimmed(bool dimmed) {
277 dimmed_ = dimmed; 212 dimmed_ = dimmed;
278 SetOpacity(dimmed ? kDimmedItemOpacity : 1.0f); 213 SetOpacity(dimmed ? kDimmedItemOpacity : 1.0f);
279 } 214 }
280 215
281 void WindowSelectorItem::ButtonPressed(views::Button* sender, 216 void WindowSelectorItem::ButtonPressed(views::Button* sender,
282 const ui::Event& event) { 217 const ui::Event& event) {
283 CHECK(!transform_windows_.empty()); 218 transform_window_.Close();
284 SelectionTransformWindow()->Close(); 219 }
220
221 void WindowSelectorItem::OnWindowDestroying(aura::Window* window) {
222 window->RemoveObserver(this);
285 } 223 }
286 224
287 void WindowSelectorItem::OnWindowTitleChanged(aura::Window* window) { 225 void WindowSelectorItem::OnWindowTitleChanged(aura::Window* window) {
288 // TODO(flackr): Maybe add the new title to a vector of titles so that we can 226 // 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. 227 // filter any of the titles the window had while in the overview session.
290 if (window == SelectionWindow()) { 228 if (window == GetWindow()) {
291 window_label_view_->SetText(window->title()); 229 window_label_view_->SetText(window->title());
292 UpdateCloseButtonAccessibilityName(); 230 UpdateCloseButtonAccessibilityName();
293 } 231 }
294 UpdateCloseButtonLayout(OverviewAnimationType::OVERVIEW_ANIMATION_NONE); 232 UpdateCloseButtonLayout(OverviewAnimationType::OVERVIEW_ANIMATION_NONE);
295 UpdateSelectorButtons(); 233 UpdateSelectorButtons();
296 } 234 }
297 235
298 void WindowSelectorItem::Select() { 236 void WindowSelectorItem::Select() {
299 aura::Window* selection_window = SelectionWindow(); 237 aura::Window* selection_window = GetWindow();
300 if (selection_window) 238 if (selection_window)
301 wm::GetWindowState(selection_window)->Activate(); 239 wm::GetWindowState(selection_window)->Activate();
302 } 240 }
303 241
304 void WindowSelectorItem::SetItemBounds(aura::Window* root_window, 242 void WindowSelectorItem::SetItemBounds(const gfx::Rect& target_bounds,
305 const gfx::Rect& target_bounds,
306 OverviewAnimationType animation_type) { 243 OverviewAnimationType animation_type) {
307 gfx::Rect bounding_rect; 244 gfx::Rect screen_bounds = transform_window_.GetTargetBoundsInScreen();
308 for (auto* transform_window : transform_windows_) { 245 gfx::Rect selector_item_bounds =
309 bounding_rect.Union(
310 transform_window->GetTargetBoundsInScreen());
311 }
312 gfx::Rect bounds =
313 ScopedTransformOverviewWindow::ShrinkRectToFitPreservingAspectRatio( 246 ScopedTransformOverviewWindow::ShrinkRectToFitPreservingAspectRatio(
314 bounding_rect, target_bounds); 247 screen_bounds, target_bounds);
315 gfx::Transform bounding_transform = 248 gfx::Transform transform =
316 ScopedTransformOverviewWindow::GetTransformForRect(bounding_rect, bounds); 249 ScopedTransformOverviewWindow::GetTransformForRect(screen_bounds,
317 for (auto* transform_window : transform_windows_) { 250 selector_item_bounds);
318 gfx::Rect target_bounds = transform_window->GetTargetBoundsInScreen(); 251 ScopedTransformOverviewWindow::ScopedAnimationSettings animation_settings;
319 gfx::Transform transform = TransformAboutPivot( 252 transform_window_.BeginScopedAnimation(animation_type, &animation_settings);
320 gfx::Point(bounding_rect.x() - target_bounds.x(), 253 transform_window_.SetTransform(root_window_, transform);
321 bounding_rect.y() - target_bounds.y()), 254 transform_window_.set_overview_transform(transform);
322 bounding_transform);
323
324 ScopedTransformOverviewWindow::ScopedAnimationSettings animation_settings;
325 transform_window->BeginScopedAnimation(animation_type, &animation_settings);
326 transform_window->SetTransform(root_window, transform);
327 transform_window->set_overview_transform(transform);
328 }
329 } 255 }
330 256
331 void WindowSelectorItem::SetOpacity(float opacity) { 257 void WindowSelectorItem::SetOpacity(float opacity) {
332 window_label_->GetNativeWindow()->layer()->SetOpacity(opacity); 258 window_label_->GetNativeWindow()->layer()->SetOpacity(opacity);
333 close_button_widget_.GetNativeWindow()->layer()->SetOpacity(opacity); 259 close_button_widget_.GetNativeWindow()->layer()->SetOpacity(opacity);
334 260
335 // TODO(flackr): find a way to make panels that are hidden behind other panels 261 transform_window_.SetOpacity(opacity);
336 // look nice.
337 for (auto* transform_window : transform_windows_) {
338 transform_window->SetOpacity(opacity);
339 }
340 } 262 }
341 263
342 void WindowSelectorItem::UpdateWindowLabels( 264 void WindowSelectorItem::UpdateWindowLabels(
343 const gfx::Rect& window_bounds, 265 const gfx::Rect& window_bounds,
344 OverviewAnimationType animation_type) { 266 OverviewAnimationType animation_type) {
345 // If the root window has changed, force the window label to be recreated
346 // and faded in on the new root window.
347 DCHECK(!window_label_ || 267 DCHECK(!window_label_ ||
348 window_label_->GetNativeWindow()->GetRootWindow() == root_window_); 268 window_label_->GetNativeWindow()->GetRootWindow() == root_window_);
349 269
350 if (!window_label_) { 270 if (!window_label_) {
351 CreateWindowLabel(SelectionWindow()->title()); 271 CreateWindowLabel(GetWindow()->title());
352 SetupFadeInAfterLayout(window_label_->GetNativeWindow()); 272 SetupFadeInAfterLayout(window_label_->GetNativeWindow());
353 } 273 }
354 274
355 gfx::Rect converted_bounds = ScreenUtil::ConvertRectFromScreen(root_window_, 275 gfx::Rect converted_bounds = ScreenUtil::ConvertRectFromScreen(root_window_,
356 window_bounds); 276 window_bounds);
357 gfx::Rect label_bounds(converted_bounds.x(), 277 gfx::Rect label_bounds(converted_bounds.x(),
358 converted_bounds.bottom(), 278 converted_bounds.bottom(),
359 converted_bounds.width(), 279 converted_bounds.width(),
360 0); 280 0);
361 label_bounds.set_height(window_label_->GetContentsView()-> 281 label_bounds.set_height(window_label_->GetContentsView()->
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
395 views::BoxLayout* layout = new views::BoxLayout(views::BoxLayout::kVertical, 315 views::BoxLayout* layout = new views::BoxLayout(views::BoxLayout::kVertical,
396 0, 316 0,
397 kVerticalLabelPadding, 317 kVerticalLabelPadding,
398 0); 318 0);
399 window_label_view_->SetLayoutManager(layout); 319 window_label_view_->SetLayoutManager(layout);
400 window_label_->SetContentsView(window_label_view_); 320 window_label_->SetContentsView(window_label_view_);
401 window_label_->Show(); 321 window_label_->Show();
402 } 322 }
403 323
404 void WindowSelectorItem::UpdateSelectorButtons() { 324 void WindowSelectorItem::UpdateSelectorButtons() {
405 CHECK(!transform_windows_.empty()); 325 aura::Window* window = GetWindow();
326 CHECK(window);
jonross 2015/01/16 20:10:20 This is the only spot where we are doing this chec
bruthig 2015/01/16 20:22:46 Done.
406 327
407 selector_item_activate_window_button_->SetBounds(target_bounds()); 328 selector_item_activate_window_button_->SetBounds(target_bounds());
408 selector_item_activate_window_button_->SetAccessibleName( 329 selector_item_activate_window_button_->SetAccessibleName(window->title());
409 transform_windows_.front()->window()->title());
410 330
411 for (auto* transform_window : transform_windows_) { 331 TransparentActivateWindowButton* activate_button =
412 TransparentActivateWindowButton* activate_button = 332 transform_window_.activate_button();
413 transform_window->activate_button(); 333 activate_button->SetBounds(target_bounds());
414 334 activate_button->SetAccessibleName(window->title());
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 } 335 }
424 336
425 void WindowSelectorItem::UpdateCloseButtonLayout( 337 void WindowSelectorItem::UpdateCloseButtonLayout(
426 OverviewAnimationType animation_type) { 338 OverviewAnimationType animation_type) {
427 if (!close_button_->visible()) { 339 if (!close_button_->visible()) {
428 close_button_->SetVisible(true); 340 close_button_->SetVisible(true);
429 SetupFadeInAfterLayout(close_button_widget_.GetNativeWindow()); 341 SetupFadeInAfterLayout(close_button_widget_.GetNativeWindow());
430 } 342 }
431 ScopedOverviewAnimationSettings animation_settings(animation_type, 343 ScopedOverviewAnimationSettings animation_settings(animation_type,
432 close_button_widget_.GetNativeWindow()); 344 close_button_widget_.GetNativeWindow());
433 345
434 gfx::Rect transformed_window_bounds = ScreenUtil::ConvertRectFromScreen( 346 gfx::Rect transformed_window_bounds = ScreenUtil::ConvertRectFromScreen(
435 close_button_widget_.GetNativeWindow()->GetRootWindow(), 347 close_button_widget_.GetNativeWindow()->GetRootWindow(),
436 GetTransformedBounds(SelectionWindow())); 348 GetTransformedBounds(GetWindow()));
437 349
438 gfx::Transform close_button_transform; 350 gfx::Transform close_button_transform;
439 close_button_transform.Translate(transformed_window_bounds.right(), 351 close_button_transform.Translate(transformed_window_bounds.right(),
440 transformed_window_bounds.y()); 352 transformed_window_bounds.y());
441 close_button_widget_.GetNativeWindow()->SetTransform( 353 close_button_widget_.GetNativeWindow()->SetTransform(
442 close_button_transform); 354 close_button_transform);
443 } 355 }
444 356
445 void WindowSelectorItem::UpdateCloseButtonAccessibilityName() { 357 void WindowSelectorItem::UpdateCloseButtonAccessibilityName() {
446 close_button_->SetAccessibleName(l10n_util::GetStringFUTF16( 358 close_button_->SetAccessibleName(l10n_util::GetStringFUTF16(
447 IDS_ASH_OVERVIEW_CLOSE_ITEM_BUTTON_ACCESSIBLE_NAME, 359 IDS_ASH_OVERVIEW_CLOSE_ITEM_BUTTON_ACCESSIBLE_NAME,
448 SelectionWindow()->title())); 360 GetWindow()->title()));
449 }
450
451 ScopedTransformOverviewWindow*
452 WindowSelectorItem::SelectionTransformWindow() const {
453 CHECK(!transform_windows_.empty());
454 return transform_windows_.front();
455 } 361 }
456 362
457 } // namespace ash 363 } // namespace ash
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698