Index: ash/wm/app_list_controller.cc |
diff --git a/ash/wm/app_list_controller.cc b/ash/wm/app_list_controller.cc |
index 99a0a653f5cef246b6f0e6152b4c25c1e57be1a2..7e60edc5bbdf8c71f2ab4061ddf9d28b8a0b68cc 100644 |
--- a/ash/wm/app_list_controller.cc |
+++ b/ash/wm/app_list_controller.cc |
@@ -173,11 +173,11 @@ AppListController::~AppListController() { |
Shell::GetInstance()->RemoveShellObserver(this); |
} |
-void AppListController::SetVisible(bool visible, aura::Window* window) { |
- if (visible == is_visible_) |
+void AppListController::Show(aura::Window* window) { |
+ if (is_visible_) |
return; |
- is_visible_ = visible; |
+ is_visible_ = true; |
// App list needs to know the new shelf layout in order to calculate its |
// UI layout when AppListView visibility changes. |
@@ -185,15 +185,8 @@ void AppListController::SetVisible(bool visible, aura::Window* window) { |
UpdateAutoHideState(); |
if (view_) { |
- // Our widget is currently active. When the animation completes we'll hide |
- // the widget, changing activation. If a menu is shown before the animation |
- // completes then the activation change triggers the menu to close. By |
- // deactivating now we ensure there is no activation change when the |
- // animation completes and any menus stay open. |
- if (!visible) |
- view_->GetWidget()->Deactivate(); |
ScheduleAnimation(); |
- } else if (is_visible_) { |
+ } else { |
// AppListModel and AppListViewDelegate are owned by AppListView. They |
// will be released with AppListView on close. |
app_list::AppListView* view = new app_list::AppListView( |
@@ -244,6 +237,35 @@ void AppListController::SetVisible(bool visible, aura::Window* window) { |
Shelf::ForWindow(window)->GetAppListButtonView()->SchedulePaint(); |
} |
+void AppListController::Dismiss() { |
+ if (!is_visible_) |
+ return; |
+ |
+ // If the app list is currently visible, there should be an existing view. |
+ DCHECK(view_); |
+ |
+ is_visible_ = false; |
+ |
+ // App list needs to know the new shelf layout in order to calculate its |
+ // UI layout when AppListView visibility changes. |
+ Shell::GetPrimaryRootWindowController() |
+ ->GetShelfLayoutManager() |
+ ->UpdateAutoHideState(); |
+ |
+ // Our widget is currently active. When the animation completes we'll hide |
+ // the widget, changing activation. If a menu is shown before the animation |
+ // completes then the activation change triggers the menu to close. By |
+ // deactivating now we ensure there is no activation change when the |
+ // animation completes and any menus stay open. |
+ view_->GetWidget()->Deactivate(); |
+ ScheduleAnimation(); |
+ |
+ // Update applist button status when app list visibility is changed. |
+ Shelf::ForWindow(view_->GetWidget()->GetNativeView()) |
+ ->GetAppListButtonView() |
+ ->SchedulePaint(); |
+} |
+ |
bool AppListController::IsVisible() const { |
return view_ && view_->GetWidget()->IsVisible(); |
} |
@@ -354,7 +376,7 @@ void AppListController::ProcessLocatedEvent(ui::LocatedEvent* event) { |
aura::Window* window = view_->GetWidget()->GetNativeView()->parent(); |
if (!window->Contains(target)) |
- SetVisible(false, window); |
+ Dismiss(); |
} |
void AppListController::UpdateBounds() { |
@@ -392,7 +414,7 @@ void AppListController::OnWindowFocused(aura::Window* gained_focus, |
if (applist_container->Contains(lost_focus) && |
(!gained_focus || !applist_container->Contains(gained_focus))) { |
- SetVisible(false, applist_window); |
+ Dismiss(); |
} |
} |
} |
@@ -421,7 +443,7 @@ void AppListController::OnImplicitAnimationsCompleted() { |
void AppListController::OnWidgetDestroying(views::Widget* widget) { |
DCHECK(view_->GetWidget() == widget); |
if (is_visible_) |
- SetVisible(false, widget->GetNativeView()); |
+ Dismiss(); |
ResetView(); |
} |