Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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) | |
|
oshima
2015/01/16 22:36:37
is it possible to just use window->GetRootWindow()
bruthig
2015/01/17 17:35:06
The WindowGrid ensures that the root_window_ is wi
| |
| 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 { |
|
oshima
2015/01/16 22:36:37
a method should be non const if the method returns
bruthig
2015/01/17 17:35:06
Done.
| |
| 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); | |
|
oshima
2015/01/16 22:36:37
transform_window_ will now have a stale pointer to
bruthig
2015/01/17 17:35:06
Done.
| |
| 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 Loading... | |
| 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(); |
| 406 | 326 |
| 407 selector_item_activate_window_button_->SetBounds(target_bounds()); | 327 selector_item_activate_window_button_->SetBounds(target_bounds()); |
| 408 selector_item_activate_window_button_->SetAccessibleName( | 328 selector_item_activate_window_button_->SetAccessibleName(window->title()); |
| 409 transform_windows_.front()->window()->title()); | |
| 410 | 329 |
| 411 for (auto* transform_window : transform_windows_) { | 330 TransparentActivateWindowButton* activate_button = |
| 412 TransparentActivateWindowButton* activate_button = | 331 transform_window_.activate_button(); |
| 413 transform_window->activate_button(); | 332 activate_button->SetBounds(target_bounds()); |
| 414 | 333 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 } | 334 } |
| 424 | 335 |
| 425 void WindowSelectorItem::UpdateCloseButtonLayout( | 336 void WindowSelectorItem::UpdateCloseButtonLayout( |
| 426 OverviewAnimationType animation_type) { | 337 OverviewAnimationType animation_type) { |
| 427 if (!close_button_->visible()) { | 338 if (!close_button_->visible()) { |
| 428 close_button_->SetVisible(true); | 339 close_button_->SetVisible(true); |
| 429 SetupFadeInAfterLayout(close_button_widget_.GetNativeWindow()); | 340 SetupFadeInAfterLayout(close_button_widget_.GetNativeWindow()); |
| 430 } | 341 } |
| 431 ScopedOverviewAnimationSettings animation_settings(animation_type, | 342 ScopedOverviewAnimationSettings animation_settings(animation_type, |
| 432 close_button_widget_.GetNativeWindow()); | 343 close_button_widget_.GetNativeWindow()); |
| 433 | 344 |
| 434 gfx::Rect transformed_window_bounds = ScreenUtil::ConvertRectFromScreen( | 345 gfx::Rect transformed_window_bounds = ScreenUtil::ConvertRectFromScreen( |
| 435 close_button_widget_.GetNativeWindow()->GetRootWindow(), | 346 close_button_widget_.GetNativeWindow()->GetRootWindow(), |
| 436 GetTransformedBounds(SelectionWindow())); | 347 GetTransformedBounds(GetWindow())); |
| 437 | 348 |
| 438 gfx::Transform close_button_transform; | 349 gfx::Transform close_button_transform; |
| 439 close_button_transform.Translate(transformed_window_bounds.right(), | 350 close_button_transform.Translate(transformed_window_bounds.right(), |
| 440 transformed_window_bounds.y()); | 351 transformed_window_bounds.y()); |
| 441 close_button_widget_.GetNativeWindow()->SetTransform( | 352 close_button_widget_.GetNativeWindow()->SetTransform( |
| 442 close_button_transform); | 353 close_button_transform); |
| 443 } | 354 } |
| 444 | 355 |
| 445 void WindowSelectorItem::UpdateCloseButtonAccessibilityName() { | 356 void WindowSelectorItem::UpdateCloseButtonAccessibilityName() { |
| 446 close_button_->SetAccessibleName(l10n_util::GetStringFUTF16( | 357 close_button_->SetAccessibleName(l10n_util::GetStringFUTF16( |
| 447 IDS_ASH_OVERVIEW_CLOSE_ITEM_BUTTON_ACCESSIBLE_NAME, | 358 IDS_ASH_OVERVIEW_CLOSE_ITEM_BUTTON_ACCESSIBLE_NAME, |
| 448 SelectionWindow()->title())); | 359 GetWindow()->title())); |
| 449 } | |
| 450 | |
| 451 ScopedTransformOverviewWindow* | |
| 452 WindowSelectorItem::SelectionTransformWindow() const { | |
| 453 CHECK(!transform_windows_.empty()); | |
| 454 return transform_windows_.front(); | |
| 455 } | 360 } |
| 456 | 361 |
| 457 } // namespace ash | 362 } // namespace ash |
| OLD | NEW |