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

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: Fixed stale pointer in ScopedTransformOverviewWindow. 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
« no previous file with comments | « ash/wm/overview/window_selector_item.h ('k') | ash/wm/overview/window_selector_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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* window)
117 : dimmed_(false), 117 : dimmed_(false),
118 root_window_(root_window), 118 root_window_(window->GetRootWindow()),
119 transform_window_(window),
119 in_bounds_update_(false), 120 in_bounds_update_(false),
120 window_label_view_(nullptr), 121 window_label_view_(nullptr),
121 close_button_(new OverviewCloseButton(this)), 122 close_button_(new OverviewCloseButton(this)),
122 selector_item_activate_window_button_( 123 selector_item_activate_window_button_(
123 new TransparentActivateWindowButton(root_window, this)) { 124 new TransparentActivateWindowButton(root_window_, this)) {
124 views::Widget::InitParams params; 125 views::Widget::InitParams params;
125 params.type = views::Widget::InitParams::TYPE_POPUP; 126 params.type = views::Widget::InitParams::TYPE_POPUP;
126 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 127 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
127 params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; 128 params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW;
128 params.parent = Shell::GetContainer(root_window, 129 params.parent = Shell::GetContainer(root_window_,
129 kShellWindowId_OverlayContainer); 130 kShellWindowId_OverlayContainer);
130 close_button_widget_.set_focus_on_creation(false); 131 close_button_widget_.set_focus_on_creation(false);
131 close_button_widget_.Init(params); 132 close_button_widget_.Init(params);
132 close_button_->SetVisible(false); 133 close_button_->SetVisible(false);
133 close_button_widget_.SetContentsView(close_button_); 134 close_button_widget_.SetContentsView(close_button_);
134 close_button_widget_.SetSize(close_button_->GetPreferredSize()); 135 close_button_widget_.SetSize(close_button_->GetPreferredSize());
135 close_button_widget_.Show(); 136 close_button_widget_.Show();
136 137
137 gfx::Rect close_button_rect(close_button_widget_.GetNativeWindow()->bounds()); 138 gfx::Rect close_button_rect(close_button_widget_.GetNativeWindow()->bounds());
138 // Align the center of the button with position (0, 0) so that the 139 // 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 140 // translate transform does not need to take the button dimensions into
140 // account. 141 // account.
141 close_button_rect.set_x(-close_button_rect.width() / 2); 142 close_button_rect.set_x(-close_button_rect.width() / 2);
142 close_button_rect.set_y(-close_button_rect.height() / 2); 143 close_button_rect.set_y(-close_button_rect.height() / 2);
143 close_button_widget_.GetNativeWindow()->SetBounds(close_button_rect); 144 close_button_widget_.GetNativeWindow()->SetBounds(close_button_rect);
145
146 GetWindow()->AddObserver(this);
147
148 UpdateCloseButtonAccessibilityName();
144 } 149 }
145 150
146 WindowSelectorItem::~WindowSelectorItem() { 151 WindowSelectorItem::~WindowSelectorItem() {
147 for (auto* transform_window : transform_windows_) { 152 GetWindow()->RemoveObserver(this);
148 transform_window->window()->RemoveObserver(this);
149 }
150 } 153 }
151 154
152 void WindowSelectorItem::AddWindow(aura::Window* window) { 155 aura::Window* WindowSelectorItem::GetWindow() {
153 DCHECK(window->GetRootWindow() == root_window_); 156 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 } 157 }
167 158
168 bool WindowSelectorItem::HasSelectableWindow(const aura::Window* window) const { 159 void WindowSelectorItem::RestoreWindow() {
169 for (auto* transform_window : transform_windows_) { 160 transform_window_.RestoreWindow();
170 if (transform_window->window() == window) 161 }
171 return true; 162
172 } 163 void WindowSelectorItem::ShowWindowOnExit() {
173 return false; 164 transform_window_.ShowWindowOnExit();
165 }
166
167 void WindowSelectorItem::PrepareForOverview() {
168 transform_window_.PrepareForOverview();
174 } 169 }
175 170
176 bool WindowSelectorItem::Contains(const aura::Window* target) const { 171 bool WindowSelectorItem::Contains(const aura::Window* target) const {
177 for (auto* transform_window : transform_windows_) { 172 return transform_window_.Contains(target);
178 if (transform_window->Contains(target))
179 return true;
180 }
181 return false;
182 } 173 }
183 174
184 void WindowSelectorItem::RestoreWindowOnExit(aura::Window* window) { 175 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) { 176 OverviewAnimationType animation_type) {
241 if (in_bounds_update_) 177 if (in_bounds_update_)
242 return; 178 return;
243 base::AutoReset<bool> auto_reset_in_bounds_update(&in_bounds_update_, true); 179 base::AutoReset<bool> auto_reset_in_bounds_update(&in_bounds_update_, true);
244 target_bounds_ = target_bounds; 180 target_bounds_ = target_bounds;
245 181
246 UpdateWindowLabels(target_bounds, animation_type); 182 UpdateWindowLabels(target_bounds, animation_type);
247 183
248 gfx::Rect inset_bounds(target_bounds); 184 gfx::Rect inset_bounds(target_bounds);
249 inset_bounds.Inset(kWindowMargin, kWindowMargin); 185 inset_bounds.Inset(kWindowMargin, kWindowMargin);
250 SetItemBounds(root_window, inset_bounds, animation_type); 186 SetItemBounds(inset_bounds, animation_type);
251 187
252 // SetItemBounds is called before UpdateCloseButtonLayout so the close button 188 // SetItemBounds is called before UpdateCloseButtonLayout so the close button
253 // can properly use the updated windows bounds. 189 // can properly use the updated windows bounds.
254 UpdateCloseButtonLayout(animation_type); 190 UpdateCloseButtonLayout(animation_type);
255 UpdateSelectorButtons(); 191 UpdateSelectorButtons();
256 } 192 }
257 193
258 void WindowSelectorItem::RecomputeWindowTransforms() { 194 void WindowSelectorItem::RecomputeWindowTransforms() {
259 if (in_bounds_update_ || target_bounds_.IsEmpty()) 195 if (in_bounds_update_ || target_bounds_.IsEmpty())
260 return; 196 return;
261 DCHECK(root_window_);
262 base::AutoReset<bool> auto_reset_in_bounds_update(&in_bounds_update_, true); 197 base::AutoReset<bool> auto_reset_in_bounds_update(&in_bounds_update_, true);
263 gfx::Rect inset_bounds(target_bounds_); 198 gfx::Rect inset_bounds(target_bounds_);
264 inset_bounds.Inset(kWindowMargin, kWindowMargin); 199 inset_bounds.Inset(kWindowMargin, kWindowMargin);
265 SetItemBounds(root_window_, inset_bounds, 200 SetItemBounds(inset_bounds, OverviewAnimationType::OVERVIEW_ANIMATION_NONE);
266 OverviewAnimationType::OVERVIEW_ANIMATION_NONE);
267 201
268 UpdateCloseButtonLayout(OverviewAnimationType::OVERVIEW_ANIMATION_NONE); 202 UpdateCloseButtonLayout(OverviewAnimationType::OVERVIEW_ANIMATION_NONE);
269 UpdateSelectorButtons(); 203 UpdateSelectorButtons();
270 } 204 }
271 205
272 void WindowSelectorItem::SendFocusAlert() const { 206 void WindowSelectorItem::SendFocusAlert() const {
273 selector_item_activate_window_button_->SendFocusAlert(); 207 selector_item_activate_window_button_->SendFocusAlert();
274 } 208 }
275 209
276 void WindowSelectorItem::SetDimmed(bool dimmed) { 210 void WindowSelectorItem::SetDimmed(bool dimmed) {
277 dimmed_ = dimmed; 211 dimmed_ = dimmed;
278 SetOpacity(dimmed ? kDimmedItemOpacity : 1.0f); 212 SetOpacity(dimmed ? kDimmedItemOpacity : 1.0f);
279 } 213 }
280 214
281 void WindowSelectorItem::ButtonPressed(views::Button* sender, 215 void WindowSelectorItem::ButtonPressed(views::Button* sender,
282 const ui::Event& event) { 216 const ui::Event& event) {
283 CHECK(!transform_windows_.empty()); 217 transform_window_.Close();
284 SelectionTransformWindow()->Close(); 218 }
219
220 void WindowSelectorItem::OnWindowDestroying(aura::Window* window) {
221 window->RemoveObserver(this);
222 transform_window_.OnWindowDestroyed();
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 DCHECK(root_window_ == GetWindow()->GetRootWindow());
308 for (auto* transform_window : transform_windows_) { 245 gfx::Rect screen_bounds = transform_window_.GetTargetBoundsInScreen();
309 bounding_rect.Union( 246 gfx::Rect selector_item_bounds =
310 transform_window->GetTargetBoundsInScreen());
311 }
312 gfx::Rect bounds =
313 ScopedTransformOverviewWindow::ShrinkRectToFitPreservingAspectRatio( 247 ScopedTransformOverviewWindow::ShrinkRectToFitPreservingAspectRatio(
314 bounding_rect, target_bounds); 248 screen_bounds, target_bounds);
315 gfx::Transform bounding_transform = 249 gfx::Transform transform =
316 ScopedTransformOverviewWindow::GetTransformForRect(bounding_rect, bounds); 250 ScopedTransformOverviewWindow::GetTransformForRect(screen_bounds,
317 for (auto* transform_window : transform_windows_) { 251 selector_item_bounds);
318 gfx::Rect target_bounds = transform_window->GetTargetBoundsInScreen(); 252 ScopedTransformOverviewWindow::ScopedAnimationSettings animation_settings;
319 gfx::Transform transform = TransformAboutPivot( 253 transform_window_.BeginScopedAnimation(animation_type, &animation_settings);
320 gfx::Point(bounding_rect.x() - target_bounds.x(), 254 transform_window_.SetTransform(root_window_, transform);
321 bounding_rect.y() - target_bounds.y()), 255 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 } 256 }
330 257
331 void WindowSelectorItem::SetOpacity(float opacity) { 258 void WindowSelectorItem::SetOpacity(float opacity) {
332 window_label_->GetNativeWindow()->layer()->SetOpacity(opacity); 259 window_label_->GetNativeWindow()->layer()->SetOpacity(opacity);
333 close_button_widget_.GetNativeWindow()->layer()->SetOpacity(opacity); 260 close_button_widget_.GetNativeWindow()->layer()->SetOpacity(opacity);
334 261
335 // TODO(flackr): find a way to make panels that are hidden behind other panels 262 transform_window_.SetOpacity(opacity);
336 // look nice.
337 for (auto* transform_window : transform_windows_) {
338 transform_window->SetOpacity(opacity);
339 }
340 } 263 }
341 264
342 void WindowSelectorItem::UpdateWindowLabels( 265 void WindowSelectorItem::UpdateWindowLabels(
343 const gfx::Rect& window_bounds, 266 const gfx::Rect& window_bounds,
344 OverviewAnimationType animation_type) { 267 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_ ||
348 window_label_->GetNativeWindow()->GetRootWindow() == root_window_);
349 268
350 if (!window_label_) { 269 if (!window_label_) {
351 CreateWindowLabel(SelectionWindow()->title()); 270 CreateWindowLabel(GetWindow()->title());
352 SetupFadeInAfterLayout(window_label_->GetNativeWindow()); 271 SetupFadeInAfterLayout(window_label_->GetNativeWindow());
353 } 272 }
354 273
355 gfx::Rect converted_bounds = ScreenUtil::ConvertRectFromScreen(root_window_, 274 gfx::Rect converted_bounds = ScreenUtil::ConvertRectFromScreen(root_window_,
356 window_bounds); 275 window_bounds);
357 gfx::Rect label_bounds(converted_bounds.x(), 276 gfx::Rect label_bounds(converted_bounds.x(),
358 converted_bounds.bottom(), 277 converted_bounds.bottom(),
359 converted_bounds.width(), 278 converted_bounds.width(),
360 0); 279 0);
361 label_bounds.set_height(window_label_->GetContentsView()-> 280 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, 314 views::BoxLayout* layout = new views::BoxLayout(views::BoxLayout::kVertical,
396 0, 315 0,
397 kVerticalLabelPadding, 316 kVerticalLabelPadding,
398 0); 317 0);
399 window_label_view_->SetLayoutManager(layout); 318 window_label_view_->SetLayoutManager(layout);
400 window_label_->SetContentsView(window_label_view_); 319 window_label_->SetContentsView(window_label_view_);
401 window_label_->Show(); 320 window_label_->Show();
402 } 321 }
403 322
404 void WindowSelectorItem::UpdateSelectorButtons() { 323 void WindowSelectorItem::UpdateSelectorButtons() {
405 CHECK(!transform_windows_.empty()); 324 aura::Window* window = GetWindow();
406 325
407 selector_item_activate_window_button_->SetBounds(target_bounds()); 326 selector_item_activate_window_button_->SetBounds(target_bounds());
408 selector_item_activate_window_button_->SetAccessibleName( 327 selector_item_activate_window_button_->SetAccessibleName(window->title());
409 transform_windows_.front()->window()->title());
410 328
411 for (auto* transform_window : transform_windows_) { 329 TransparentActivateWindowButton* activate_button =
412 TransparentActivateWindowButton* activate_button = 330 transform_window_.activate_button();
413 transform_window->activate_button(); 331 activate_button->SetBounds(target_bounds());
414 332 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 } 333 }
424 334
425 void WindowSelectorItem::UpdateCloseButtonLayout( 335 void WindowSelectorItem::UpdateCloseButtonLayout(
426 OverviewAnimationType animation_type) { 336 OverviewAnimationType animation_type) {
427 if (!close_button_->visible()) { 337 if (!close_button_->visible()) {
428 close_button_->SetVisible(true); 338 close_button_->SetVisible(true);
429 SetupFadeInAfterLayout(close_button_widget_.GetNativeWindow()); 339 SetupFadeInAfterLayout(close_button_widget_.GetNativeWindow());
430 } 340 }
431 ScopedOverviewAnimationSettings animation_settings(animation_type, 341 ScopedOverviewAnimationSettings animation_settings(animation_type,
432 close_button_widget_.GetNativeWindow()); 342 close_button_widget_.GetNativeWindow());
433 343
434 gfx::Rect transformed_window_bounds = ScreenUtil::ConvertRectFromScreen( 344 gfx::Rect transformed_window_bounds = ScreenUtil::ConvertRectFromScreen(
435 close_button_widget_.GetNativeWindow()->GetRootWindow(), 345 close_button_widget_.GetNativeWindow()->GetRootWindow(),
436 GetTransformedBounds(SelectionWindow())); 346 GetTransformedBounds(GetWindow()));
437 347
438 gfx::Transform close_button_transform; 348 gfx::Transform close_button_transform;
439 close_button_transform.Translate(transformed_window_bounds.right(), 349 close_button_transform.Translate(transformed_window_bounds.right(),
440 transformed_window_bounds.y()); 350 transformed_window_bounds.y());
441 close_button_widget_.GetNativeWindow()->SetTransform( 351 close_button_widget_.GetNativeWindow()->SetTransform(
442 close_button_transform); 352 close_button_transform);
443 } 353 }
444 354
445 void WindowSelectorItem::UpdateCloseButtonAccessibilityName() { 355 void WindowSelectorItem::UpdateCloseButtonAccessibilityName() {
446 close_button_->SetAccessibleName(l10n_util::GetStringFUTF16( 356 close_button_->SetAccessibleName(l10n_util::GetStringFUTF16(
447 IDS_ASH_OVERVIEW_CLOSE_ITEM_BUTTON_ACCESSIBLE_NAME, 357 IDS_ASH_OVERVIEW_CLOSE_ITEM_BUTTON_ACCESSIBLE_NAME,
448 SelectionWindow()->title())); 358 GetWindow()->title()));
449 }
450
451 ScopedTransformOverviewWindow*
452 WindowSelectorItem::SelectionTransformWindow() const {
453 CHECK(!transform_windows_.empty());
454 return transform_windows_.front();
455 } 359 }
456 360
457 } // namespace ash 361 } // namespace ash
OLDNEW
« no previous file with comments | « ash/wm/overview/window_selector_item.h ('k') | ash/wm/overview/window_selector_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698