Index: ash/wm/overview/window_selector_item.cc |
diff --git a/ash/wm/overview/window_selector_item.cc b/ash/wm/overview/window_selector_item.cc |
index 7350ebdeed59394c0325f3d91ffa0909bd9110ed..de187bb20a2b819c58302a6307ccaffe46a2f7e6 100644 |
--- a/ash/wm/overview/window_selector_item.cc |
+++ b/ash/wm/overview/window_selector_item.cc |
@@ -113,9 +113,11 @@ OverviewCloseButton::~OverviewCloseButton() { |
} // namespace |
-WindowSelectorItem::WindowSelectorItem(aura::Window* root_window) |
+WindowSelectorItem::WindowSelectorItem(aura::Window* root_window, |
+ aura::Window* window) |
: dimmed_(false), |
root_window_(root_window), |
+ transform_window_(window), |
in_bounds_update_(false), |
window_label_view_(nullptr), |
close_button_(new OverviewCloseButton(this)), |
@@ -141,102 +143,38 @@ WindowSelectorItem::WindowSelectorItem(aura::Window* root_window) |
close_button_rect.set_x(-close_button_rect.width() / 2); |
close_button_rect.set_y(-close_button_rect.height() / 2); |
close_button_widget_.GetNativeWindow()->SetBounds(close_button_rect); |
-} |
-WindowSelectorItem::~WindowSelectorItem() { |
- for (auto* transform_window : transform_windows_) { |
- transform_window->window()->RemoveObserver(this); |
- } |
-} |
-void WindowSelectorItem::AddWindow(aura::Window* window) { |
- DCHECK(window->GetRootWindow() == root_window_); |
window->AddObserver(this); |
- ScopedTransformOverviewWindow* transform_window = |
- new ScopedTransformOverviewWindow(window); |
- transform_windows_.push_back(transform_window); |
- // The transparent overlays are added at the front of the z-order when |
- // created so make sure the selector item's transparent overlay is behind the |
- // overlay for the window that was just added. |
- transform_window->activate_button()->StackAbove( |
- selector_item_activate_window_button_.get()); |
- UpdateSelectorButtons(); |
UpdateCloseButtonAccessibilityName(); |
} |
-bool WindowSelectorItem::HasSelectableWindow(const aura::Window* window) const { |
- for (auto* transform_window : transform_windows_) { |
- if (transform_window->window() == window) |
- return true; |
- } |
- return false; |
+WindowSelectorItem::~WindowSelectorItem() { |
+ aura::Window* window = GetWindow(); |
+ if (window) |
+ window->RemoveObserver(this); |
} |
-bool WindowSelectorItem::Contains(const aura::Window* target) const { |
- for (auto* transform_window : transform_windows_) { |
- if (transform_window->Contains(target)) |
- return true; |
- } |
- return false; |
+aura::Window* WindowSelectorItem::GetWindow() const { |
+ return transform_window_.window(); |
} |
void WindowSelectorItem::RestoreWindowOnExit(aura::Window* window) { |
- for (auto* transform_window : transform_windows_) { |
- if (transform_window->Contains(window)) { |
- transform_window->RestoreWindowOnExit(); |
- break; |
- } |
+ if (transform_window_.Contains(window)) { |
+ transform_window_.RestoreWindowOnExit(); |
} |
} |
-aura::Window* WindowSelectorItem::SelectionWindow() const { |
- return SelectionTransformWindow()->window(); |
-} |
- |
-void WindowSelectorItem::RemoveWindow(const aura::Window* window) { |
- bool window_found = false; |
- |
- for (TransformWindows::iterator iter = transform_windows_.begin(); |
- iter != transform_windows_.end(); |
- ++iter) { |
- ScopedTransformOverviewWindow* transform_window = *iter; |
- |
- if (transform_window->window() == window) { |
- transform_window->window()->RemoveObserver(this); |
- transform_window->OnWindowDestroyed(); |
- transform_windows_.erase(iter); |
- window_found = true; |
- break; |
- } |
- } |
- CHECK(window_found); |
- |
- |
- // If empty WindowSelectorItem will be destroyed immediately after this by |
- // its owner. |
- if (empty()) |
- return; |
- |
- UpdateCloseButtonAccessibilityName(); |
- window_label_.reset(); |
- UpdateWindowLabels(target_bounds_, |
- OverviewAnimationType::OVERVIEW_ANIMATION_NONE); |
- UpdateCloseButtonLayout(OverviewAnimationType::OVERVIEW_ANIMATION_NONE); |
- UpdateSelectorButtons(); |
-} |
- |
-bool WindowSelectorItem::empty() const { |
- return transform_windows_.empty(); |
+void WindowSelectorItem::PrepareForOverview() { |
+ transform_window_.PrepareForOverview(); |
} |
-void WindowSelectorItem::PrepareForOverview() { |
- for (auto* transform_window : transform_windows_) |
- transform_window->PrepareForOverview(); |
+bool WindowSelectorItem::Contains(const aura::Window* target) const { |
+ return transform_window_.Contains(target); |
} |
-void WindowSelectorItem::SetBounds(aura::Window* root_window, |
- const gfx::Rect& target_bounds, |
+void WindowSelectorItem::SetBounds(const gfx::Rect& target_bounds, |
OverviewAnimationType animation_type) { |
if (in_bounds_update_) |
return; |
@@ -247,7 +185,7 @@ void WindowSelectorItem::SetBounds(aura::Window* root_window, |
gfx::Rect inset_bounds(target_bounds); |
inset_bounds.Inset(kWindowMargin, kWindowMargin); |
- SetItemBounds(root_window, inset_bounds, animation_type); |
+ SetItemBounds(inset_bounds, animation_type); |
// SetItemBounds is called before UpdateCloseButtonLayout so the close button |
// can properly use the updated windows bounds. |
@@ -258,12 +196,10 @@ void WindowSelectorItem::SetBounds(aura::Window* root_window, |
void WindowSelectorItem::RecomputeWindowTransforms() { |
if (in_bounds_update_ || target_bounds_.IsEmpty()) |
return; |
- DCHECK(root_window_); |
base::AutoReset<bool> auto_reset_in_bounds_update(&in_bounds_update_, true); |
gfx::Rect inset_bounds(target_bounds_); |
inset_bounds.Inset(kWindowMargin, kWindowMargin); |
- SetItemBounds(root_window_, inset_bounds, |
- OverviewAnimationType::OVERVIEW_ANIMATION_NONE); |
+ SetItemBounds(inset_bounds, OverviewAnimationType::OVERVIEW_ANIMATION_NONE); |
UpdateCloseButtonLayout(OverviewAnimationType::OVERVIEW_ANIMATION_NONE); |
UpdateSelectorButtons(); |
@@ -278,16 +214,21 @@ void WindowSelectorItem::SetDimmed(bool dimmed) { |
SetOpacity(dimmed ? kDimmedItemOpacity : 1.0f); |
} |
+void WindowSelectorItem::OnWindowDestroyed() { |
+ CHECK(GetWindow()); |
+ GetWindow()->RemoveObserver(this); |
+ transform_window_.OnWindowDestroyed(); |
+} |
+ |
void WindowSelectorItem::ButtonPressed(views::Button* sender, |
const ui::Event& event) { |
- CHECK(!transform_windows_.empty()); |
- SelectionTransformWindow()->Close(); |
+ transform_window_.Close(); |
} |
void WindowSelectorItem::OnWindowTitleChanged(aura::Window* window) { |
// TODO(flackr): Maybe add the new title to a vector of titles so that we can |
// filter any of the titles the window had while in the overview session. |
- if (window == SelectionWindow()) { |
+ if (window == GetWindow()) { |
window_label_view_->SetText(window->title()); |
UpdateCloseButtonAccessibilityName(); |
} |
@@ -296,59 +237,41 @@ void WindowSelectorItem::OnWindowTitleChanged(aura::Window* window) { |
} |
void WindowSelectorItem::Select() { |
- aura::Window* selection_window = SelectionWindow(); |
+ aura::Window* selection_window = GetWindow(); |
if (selection_window) |
wm::GetWindowState(selection_window)->Activate(); |
} |
-void WindowSelectorItem::SetItemBounds(aura::Window* root_window, |
- const gfx::Rect& target_bounds, |
+void WindowSelectorItem::SetItemBounds(const gfx::Rect& target_bounds, |
OverviewAnimationType animation_type) { |
- gfx::Rect bounding_rect; |
- for (auto* transform_window : transform_windows_) { |
- bounding_rect.Union( |
- transform_window->GetTargetBoundsInScreen()); |
- } |
- gfx::Rect bounds = |
+ gfx::Rect screen_bounds = transform_window_.GetTargetBoundsInScreen(); |
+ gfx::Rect selector_item_bounds = |
ScopedTransformOverviewWindow::ShrinkRectToFitPreservingAspectRatio( |
- bounding_rect, target_bounds); |
- gfx::Transform bounding_transform = |
- ScopedTransformOverviewWindow::GetTransformForRect(bounding_rect, bounds); |
- for (auto* transform_window : transform_windows_) { |
- gfx::Rect target_bounds = transform_window->GetTargetBoundsInScreen(); |
- gfx::Transform transform = TransformAboutPivot( |
- gfx::Point(bounding_rect.x() - target_bounds.x(), |
- bounding_rect.y() - target_bounds.y()), |
- bounding_transform); |
- |
- ScopedTransformOverviewWindow::ScopedAnimationSettings animation_settings; |
- transform_window->BeginScopedAnimation(animation_type, &animation_settings); |
- transform_window->SetTransform(root_window, transform); |
- transform_window->set_overview_transform(transform); |
- } |
+ screen_bounds, target_bounds); |
+ gfx::Transform transform = |
+ ScopedTransformOverviewWindow::GetTransformForRect(screen_bounds, |
+ selector_item_bounds); |
+ ScopedTransformOverviewWindow::ScopedAnimationSettings animation_settings; |
+ transform_window_.BeginScopedAnimation(animation_type, &animation_settings); |
+ transform_window_.SetTransform(root_window_, transform); |
+ transform_window_.set_overview_transform(transform); |
} |
void WindowSelectorItem::SetOpacity(float opacity) { |
window_label_->GetNativeWindow()->layer()->SetOpacity(opacity); |
close_button_widget_.GetNativeWindow()->layer()->SetOpacity(opacity); |
- // TODO(flackr): find a way to make panels that are hidden behind other panels |
- // look nice. |
- for (auto* transform_window : transform_windows_) { |
- transform_window->SetOpacity(opacity); |
- } |
+ transform_window_.SetOpacity(opacity); |
} |
void WindowSelectorItem::UpdateWindowLabels( |
const gfx::Rect& window_bounds, |
OverviewAnimationType animation_type) { |
- // If the root window has changed, force the window label to be recreated |
- // and faded in on the new root window. |
DCHECK(!window_label_ || |
window_label_->GetNativeWindow()->GetRootWindow() == root_window_); |
if (!window_label_) { |
- CreateWindowLabel(SelectionWindow()->title()); |
+ CreateWindowLabel(GetWindow()->title()); |
SetupFadeInAfterLayout(window_label_->GetNativeWindow()); |
} |
@@ -402,24 +325,16 @@ void WindowSelectorItem::CreateWindowLabel(const base::string16& title) { |
} |
void WindowSelectorItem::UpdateSelectorButtons() { |
- CHECK(!transform_windows_.empty()); |
+ aura::Window* window = GetWindow(); |
+ CHECK(window); |
selector_item_activate_window_button_->SetBounds(target_bounds()); |
- selector_item_activate_window_button_->SetAccessibleName( |
- transform_windows_.front()->window()->title()); |
- |
- for (auto* transform_window : transform_windows_) { |
- TransparentActivateWindowButton* activate_button = |
- transform_window->activate_button(); |
- |
- // If there is only one window in this, then expand the transparent overlay |
- // so that touch exploration in ChromVox only provides spoken feedback once |
- // within |this| selector item's bounds. |
- gfx::Rect bounds = transform_windows_.size() == 1 |
- ? target_bounds() : GetTransformedBounds(transform_window->window()); |
- activate_button->SetBounds(bounds); |
- activate_button->SetAccessibleName(transform_window->window()->title()); |
- } |
+ selector_item_activate_window_button_->SetAccessibleName(window->title()); |
+ |
+ TransparentActivateWindowButton* activate_button = |
+ transform_window_.activate_button(); |
+ activate_button->SetBounds(target_bounds()); |
+ activate_button->SetAccessibleName(window->title()); |
} |
void WindowSelectorItem::UpdateCloseButtonLayout( |
@@ -433,7 +348,7 @@ void WindowSelectorItem::UpdateCloseButtonLayout( |
gfx::Rect transformed_window_bounds = ScreenUtil::ConvertRectFromScreen( |
close_button_widget_.GetNativeWindow()->GetRootWindow(), |
- GetTransformedBounds(SelectionWindow())); |
+ GetTransformedBounds(GetWindow())); |
gfx::Transform close_button_transform; |
close_button_transform.Translate(transformed_window_bounds.right(), |
@@ -445,13 +360,7 @@ void WindowSelectorItem::UpdateCloseButtonLayout( |
void WindowSelectorItem::UpdateCloseButtonAccessibilityName() { |
close_button_->SetAccessibleName(l10n_util::GetStringFUTF16( |
IDS_ASH_OVERVIEW_CLOSE_ITEM_BUTTON_ACCESSIBLE_NAME, |
- SelectionWindow()->title())); |
-} |
- |
-ScopedTransformOverviewWindow* |
- WindowSelectorItem::SelectionTransformWindow() const { |
- CHECK(!transform_windows_.empty()); |
- return transform_windows_.front(); |
+ GetWindow()->title())); |
} |
} // namespace ash |