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

Unified 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 side-by-side diff with in-line comments
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 »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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..4ab47e98f886f30233175bac716550e33e2c5b95 100644
--- a/ash/wm/overview/window_selector_item.cc
+++ b/ash/wm/overview/window_selector_item.cc
@@ -113,19 +113,20 @@ OverviewCloseButton::~OverviewCloseButton() {
} // namespace
-WindowSelectorItem::WindowSelectorItem(aura::Window* root_window)
+WindowSelectorItem::WindowSelectorItem(aura::Window* window)
: dimmed_(false),
- root_window_(root_window),
+ root_window_(window->GetRootWindow()),
+ transform_window_(window),
in_bounds_update_(false),
window_label_view_(nullptr),
close_button_(new OverviewCloseButton(this)),
selector_item_activate_window_button_(
- new TransparentActivateWindowButton(root_window, this)) {
+ new TransparentActivateWindowButton(root_window_, this)) {
views::Widget::InitParams params;
params.type = views::Widget::InitParams::TYPE_POPUP;
params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW;
- params.parent = Shell::GetContainer(root_window,
+ params.parent = Shell::GetContainer(root_window_,
kShellWindowId_OverlayContainer);
close_button_widget_.set_focus_on_creation(false);
close_button_widget_.Init(params);
@@ -141,102 +142,37 @@ 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);
- }
-}
+ GetWindow()->AddObserver(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;
-}
-
-bool WindowSelectorItem::Contains(const aura::Window* target) const {
- for (auto* transform_window : transform_windows_) {
- if (transform_window->Contains(target))
- return true;
- }
- return false;
+WindowSelectorItem::~WindowSelectorItem() {
+ GetWindow()->RemoveObserver(this);
}
-void WindowSelectorItem::RestoreWindowOnExit(aura::Window* window) {
- for (auto* transform_window : transform_windows_) {
- if (transform_window->Contains(window)) {
- transform_window->RestoreWindowOnExit();
- break;
- }
- }
+aura::Window* WindowSelectorItem::GetWindow() {
+ return transform_window_.window();
}
-aura::Window* WindowSelectorItem::SelectionWindow() const {
- return SelectionTransformWindow()->window();
+void WindowSelectorItem::RestoreWindow() {
+ transform_window_.RestoreWindow();
}
-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();
+void WindowSelectorItem::ShowWindowOnExit() {
+ transform_window_.ShowWindowOnExit();
}
-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 +183,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 +194,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();
@@ -280,14 +214,18 @@ void WindowSelectorItem::SetDimmed(bool dimmed) {
void WindowSelectorItem::ButtonPressed(views::Button* sender,
const ui::Event& event) {
- CHECK(!transform_windows_.empty());
- SelectionTransformWindow()->Close();
+ transform_window_.Close();
+}
+
+void WindowSelectorItem::OnWindowDestroying(aura::Window* window) {
+ window->RemoveObserver(this);
+ transform_window_.OnWindowDestroyed();
}
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 +234,40 @@ 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 =
+ DCHECK(root_window_ == GetWindow()->GetRootWindow());
+ 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 +321,15 @@ void WindowSelectorItem::CreateWindowLabel(const base::string16& title) {
}
void WindowSelectorItem::UpdateSelectorButtons() {
- CHECK(!transform_windows_.empty());
+ aura::Window* window = GetWindow();
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 +343,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 +355,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
« 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