diff options
author | xiyuan@chromium.org <xiyuan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-06-16 01:00:34 +0000 |
---|---|---|
committer | xiyuan@chromium.org <xiyuan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-06-16 01:00:34 +0000 |
commit | 380aeaf0c6f3e4ab8ae8b2acbab2616eb83e445a (patch) | |
tree | dae23a5a4250e83974f1b538411f7874ab9a133e /ash | |
parent | 26dc99aa8ecc3b19c8c8d51e8d302e7358ee01d6 (diff) | |
download | chromium_src-380aeaf0c6f3e4ab8ae8b2acbab2616eb83e445a.zip chromium_src-380aeaf0c6f3e4ab8ae8b2acbab2616eb83e445a.tar.gz chromium_src-380aeaf0c6f3e4ab8ae8b2acbab2616eb83e445a.tar.bz2 |
ash/app_list: Make app list bubble move with launcher app list button.
BUG=131693
TEST=Verify that app list bubble moves with launcher app list button when pinning/unpinning from app list grid.
Review URL: https://chromiumcodereview.appspot.com/10535170
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@142548 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ash')
-rw-r--r-- | ash/launcher/launcher_icon_observer.h | 5 | ||||
-rw-r--r-- | ash/launcher/launcher_view.cc | 23 | ||||
-rw-r--r-- | ash/launcher/launcher_view.h | 13 | ||||
-rw-r--r-- | ash/launcher/launcher_view_unittest.cc | 43 | ||||
-rw-r--r-- | ash/test/launcher_view_test_api.cc | 2 | ||||
-rw-r--r-- | ash/wm/app_list_controller.cc | 18 | ||||
-rw-r--r-- | ash/wm/app_list_controller.h | 10 | ||||
-rw-r--r-- | ash/wm/panel_layout_manager.cc | 5 | ||||
-rw-r--r-- | ash/wm/panel_layout_manager.h | 4 | ||||
-rw-r--r-- | ash/wm/panel_layout_manager_unittest.cc | 21 |
10 files changed, 104 insertions, 40 deletions
diff --git a/ash/launcher/launcher_icon_observer.h b/ash/launcher/launcher_icon_observer.h index 5b24e92..b38f958 100644 --- a/ash/launcher/launcher_icon_observer.h +++ b/ash/launcher/launcher_icon_observer.h @@ -6,21 +6,18 @@ #define ASH_LAUNCHER_LAUNCHER_ICON_OBSERVER_H_ #pragma once +#include "ash/ash_export.h" #include "base/basictypes.h" namespace ash { class ASH_EXPORT LauncherIconObserver { public: - LauncherIconObserver() {} - // Invoked when any icon on launcher changes position. virtual void OnLauncherIconPositionsChanged() = 0; protected: virtual ~LauncherIconObserver() {} - - DISALLOW_COPY_AND_ASSIGN(LauncherIconObserver); }; } // namespace ash diff --git a/ash/launcher/launcher_view.cc b/ash/launcher/launcher_view.cc index e2581e5..d5112c2 100644 --- a/ash/launcher/launcher_view.cc +++ b/ash/launcher/launcher_view.cc @@ -274,12 +274,14 @@ LauncherView::LauncherView(LauncherModel* model, LauncherDelegate* delegate) alignment_(SHELF_ALIGNMENT_BOTTOM) { DCHECK(model_); bounds_animator_.reset(new views::BoundsAnimator(this)); + bounds_animator_->AddObserver(this); set_context_menu_controller(this); focus_search_.reset(new LauncherFocusSearch(view_model_.get())); tooltip_.reset(new LauncherTooltipManager(alignment_)); } LauncherView::~LauncherView() { + bounds_animator_->RemoveObserver(this); model_->RemoveObserver(this); } @@ -837,9 +839,6 @@ void LauncherView::LauncherItemAdded(int model_index) { // Undo the hiding if animation does not run. view->layer()->SetOpacity(1.0f); } - - FOR_EACH_OBSERVER(LauncherIconObserver, observers_, - OnLauncherIconPositionsChanged()); } void LauncherView::LauncherItemRemoved(int model_index, LauncherID id) { @@ -855,14 +854,6 @@ void LauncherView::LauncherItemRemoved(int model_index, LauncherID id) { bounds_animator_->AnimateViewTo(view, view->bounds()); bounds_animator_->SetAnimationDelegate( view, new FadeOutAnimationDelegate(this, view), true); - - // The animation will eventually update the ideal bounds, but we want to - // force an update immediately so we can notify launcher icon observers. - IdealBounds ideal_bounds; - CalculateIdealBounds(&ideal_bounds); - - FOR_EACH_OBSERVER(LauncherIconObserver, observers_, - OnLauncherIconPositionsChanged()); } void LauncherView::LauncherItemChanged(int model_index, @@ -913,8 +904,6 @@ void LauncherView::LauncherItemChanged(int model_index, void LauncherView::LauncherItemMoved(int start_index, int target_index) { view_model_->Move(start_index, target_index); AnimateToIdealBounds(); - FOR_EACH_OBSERVER(LauncherIconObserver, observers_, - OnLauncherIconPositionsChanged()); } void LauncherView::MousePressedOnButton(views::View* view, @@ -1071,5 +1060,13 @@ void LauncherView::ShowContextMenuForView(views::View* source, #endif } +void LauncherView::OnBoundsAnimatorProgressed(views::BoundsAnimator* animator) { + FOR_EACH_OBSERVER(LauncherIconObserver, observers_, + OnLauncherIconPositionsChanged()); +} + +void LauncherView::OnBoundsAnimatorDone(views::BoundsAnimator* animator) { +} + } // namespace internal } // namespace ash diff --git a/ash/launcher/launcher_view.h b/ash/launcher/launcher_view.h index 8f0323f..0935ccc 100644 --- a/ash/launcher/launcher_view.h +++ b/ash/launcher/launcher_view.h @@ -13,6 +13,7 @@ #include "ash/launcher/launcher_model_observer.h" #include "ash/wm/shelf_auto_hide_behavior.h" #include "base/observer_list.h" +#include "ui/views/animation/bounds_animator_observer.h" #include "ui/views/context_menu_controller.h" #include "ui/views/controls/button/button.h" #include "ui/views/focus/focus_manager.h" @@ -46,7 +47,8 @@ class ASH_EXPORT LauncherView : public views::View, public views::ButtonListener, public LauncherButtonHost, public views::ContextMenuController, - public views::FocusTraversable { + public views::FocusTraversable, + public views::BoundsAnimatorObserver { public: LauncherView(LauncherModel* model, LauncherDelegate* delegate); virtual ~LauncherView(); @@ -178,14 +180,19 @@ class ASH_EXPORT LauncherView : public views::View, virtual ShelfAlignment GetShelfAlignment() const OVERRIDE; virtual string16 GetAccessibleName(const views::View* view) OVERRIDE; - // Overriden from views::ButtonListener: + // Overridden from views::ButtonListener: virtual void ButtonPressed(views::Button* sender, const views::Event& event) OVERRIDE; - // Overriden from views::ContextMenuController: + // Overridden from views::ContextMenuController: virtual void ShowContextMenuForView(views::View* source, const gfx::Point& point) OVERRIDE; + // Overridden from views::BoundsAnimatorObserver: + virtual void OnBoundsAnimatorProgressed( + views::BoundsAnimator* animator) OVERRIDE; + virtual void OnBoundsAnimatorDone(views::BoundsAnimator* animator) OVERRIDE; + // The model; owned by Launcher. LauncherModel* model_; diff --git a/ash/launcher/launcher_view_unittest.cc b/ash/launcher/launcher_view_unittest.cc index e769835..556c99d 100644 --- a/ash/launcher/launcher_view_unittest.cc +++ b/ash/launcher/launcher_view_unittest.cc @@ -36,24 +36,29 @@ namespace test { class TestLauncherIconObserver : public LauncherIconObserver { public: - TestLauncherIconObserver() : count_(0) { - Shell::GetInstance()->launcher()->AddIconObserver(this); + explicit TestLauncherIconObserver(Launcher* launcher) + : launcher_(launcher), + change_notified_(false) { + if (launcher_) + launcher_->AddIconObserver(this); } virtual ~TestLauncherIconObserver() { - Shell::GetInstance()->launcher()->RemoveIconObserver(this); + if (launcher_) + launcher_->RemoveIconObserver(this); } // LauncherIconObserver implementation. - void OnLauncherIconPositionsChanged() OVERRIDE { - ++count_; + virtual void OnLauncherIconPositionsChanged() OVERRIDE { + change_notified_ = true; } - int count() const { return count_; } - void Reset() { count_ = 0; } + int change_notified() const { return change_notified_; } + void Reset() { change_notified_ = false; } private: - int count_; + Launcher* launcher_; + bool change_notified_; DISALLOW_COPY_AND_ASSIGN(TestLauncherIconObserver); }; @@ -65,7 +70,13 @@ class LauncherViewIconObserverTest : public ash::test::AshTestBase { virtual void SetUp() OVERRIDE { AshTestBase::SetUp(); - observer_.reset(new TestLauncherIconObserver); + + Launcher* launcher = Shell::GetInstance()->launcher(); + observer_.reset(new TestLauncherIconObserver(launcher)); + + launcher_view_test_.reset(new LauncherViewTestAPI( + launcher->GetLauncherViewForTest())); + launcher_view_test_->SetAnimationDuration(1); } virtual void TearDown() OVERRIDE { @@ -75,8 +86,13 @@ class LauncherViewIconObserverTest : public ash::test::AshTestBase { TestLauncherIconObserver* observer() { return observer_.get(); } + LauncherViewTestAPI* launcher_vew_test() { + return launcher_view_test_.get(); + } + private: scoped_ptr<TestLauncherIconObserver> observer_; + scoped_ptr<LauncherViewTestAPI> launcher_view_test_; DISALLOW_COPY_AND_ASSIGN(LauncherViewIconObserverTest); }; @@ -93,12 +109,14 @@ TEST_F(LauncherViewIconObserverTest, AddRemove) { scoped_ptr<views::Widget> widget(new views::Widget()); widget->Init(params); launcher_delegate->AddLauncherItem(widget->GetNativeWindow()); - EXPECT_EQ(1, observer()->count()); + launcher_vew_test()->RunMessageLoopUntilAnimationsDone(); + EXPECT_TRUE(observer()->change_notified()); observer()->Reset(); widget->Show(); widget->GetNativeWindow()->parent()->RemoveChild(widget->GetNativeWindow()); - EXPECT_EQ(1, observer()->count()); + launcher_vew_test()->RunMessageLoopUntilAnimationsDone(); + EXPECT_TRUE(observer()->change_notified()); observer()->Reset(); } @@ -108,7 +126,8 @@ TEST_F(LauncherViewIconObserverTest, BoundsChanged) { int total_width = launcher_size.width() / 2; ASSERT_GT(total_width, 0); launcher->SetStatusSize(gfx::Size(total_width, launcher_size.height())); - EXPECT_EQ(1, observer()->count()); + // No animation happens for LauncherView bounds change. + EXPECT_TRUE(observer()->change_notified()); observer()->Reset(); } diff --git a/ash/test/launcher_view_test_api.cc b/ash/test/launcher_view_test_api.cc index 3dc45bf..0f8893b 100644 --- a/ash/test/launcher_view_test_api.cc +++ b/ash/test/launcher_view_test_api.cc @@ -20,6 +20,8 @@ class TestAPIAnimationObserver : public views::BoundsAnimatorObserver { virtual ~TestAPIAnimationObserver() {} // views::BoundsAnimatorObserver overrides: + virtual void OnBoundsAnimatorProgressed( + views::BoundsAnimator* animator) OVERRIDE {} virtual void OnBoundsAnimatorDone(views::BoundsAnimator* animator) OVERRIDE { MessageLoop::current()->Quit(); } diff --git a/ash/wm/app_list_controller.cc b/ash/wm/app_list_controller.cc index 5ffc075..69b2ed7 100644 --- a/ash/wm/app_list_controller.cc +++ b/ash/wm/app_list_controller.cc @@ -5,6 +5,7 @@ #include "ash/wm/app_list_controller.h" #include "ash/ash_switches.h" +#include "ash/launcher/launcher.h" #include "ash/root_window_controller.h" #include "ash/shell.h" #include "ash/shell_delegate.h" @@ -115,6 +116,7 @@ void AppListController::SetView(app_list::AppListView* view) { views::Widget* widget = view_->GetWidget(); widget->AddObserver(this); Shell::GetInstance()->AddEnvEventFilter(this); + Shell::GetInstance()->launcher()->AddIconObserver(this); widget->GetNativeView()->GetRootWindow()->AddRootWindowObserver(this); widget->GetNativeView()->GetFocusManager()->AddObserver(this); widget->SetOpacity(0); @@ -134,6 +136,7 @@ void AppListController::ResetView() { widget->RemoveObserver(this); GetLayer(widget)->GetAnimator()->RemoveObserver(this); Shell::GetInstance()->RemoveEnvEventFilter(this); + Shell::GetInstance()->launcher()->RemoveIconObserver(this); widget->GetNativeView()->GetRootWindow()->RemoveRootWindowObserver(this); widget->GetNativeView()->GetFocusManager()->RemoveObserver(this); view_ = NULL; @@ -168,6 +171,11 @@ void AppListController::ProcessLocatedEvent(const aura::LocatedEvent& event) { } } +void AppListController::UpdateBounds() { + if (view_ && is_visible_) + view_->UpdateBounds(); +} + //////////////////////////////////////////////////////////////////////////////// // AppListController, aura::EventFilter implementation: @@ -218,8 +226,7 @@ void AppListController::OnWindowFocused(aura::Window* window) { // AppListController, aura::RootWindowObserver implementation: void AppListController::OnRootWindowResized(const aura::RootWindow* root, const gfx::Size& old_size) { - if (view_ && is_visible_) - view_->UpdateBounds(); + UpdateBounds(); } //////////////////////////////////////////////////////////////////////////////// @@ -249,5 +256,12 @@ void AppListController::OnShelfAlignmentChanged() { view_->SetBubbleArrowLocation(GetBubbleArrowLocation()); } +//////////////////////////////////////////////////////////////////////////////// +// AppListController, LauncherIconObserver implementation: + +void AppListController::OnLauncherIconPositionsChanged() { + UpdateBounds(); +} + } // namespace internal } // namespace ash diff --git a/ash/wm/app_list_controller.h b/ash/wm/app_list_controller.h index 4031111..303326a 100644 --- a/ash/wm/app_list_controller.h +++ b/ash/wm/app_list_controller.h @@ -6,6 +6,7 @@ #define ASH_WM_APP_LIST_CONTROLLER_H_ #pragma once +#include "ash/launcher/launcher_icon_observer.h" #include "ash/shell_observer.h" #include "base/basictypes.h" #include "base/compiler_specific.h" @@ -36,7 +37,8 @@ class AppListController : public aura::EventFilter, public aura::RootWindowObserver, public ui::ImplicitAnimationObserver, public views::Widget::Observer, - public ShellObserver { + public ShellObserver, + public LauncherIconObserver { public: AppListController(); virtual ~AppListController(); @@ -67,6 +69,9 @@ class AppListController : public aura::EventFilter, void ProcessLocatedEvent(const aura::LocatedEvent& event); + // Makes app list bubble update its bounds. + void UpdateBounds(); + // aura::EventFilter overrides: virtual bool PreHandleKeyEvent(aura::Window* target, aura::KeyEvent* event) OVERRIDE; @@ -94,6 +99,9 @@ class AppListController : public aura::EventFilter, // ShellObserver overrides: virtual void OnShelfAlignmentChanged() OVERRIDE; + // LauncherIconObserver overrides: + virtual void OnLauncherIconPositionsChanged() OVERRIDE; + // Whether we should show or hide app list widget. bool is_visible_; diff --git a/ash/wm/panel_layout_manager.cc b/ash/wm/panel_layout_manager.cc index 1a5d20d..b426c4e 100644 --- a/ash/wm/panel_layout_manager.cc +++ b/ash/wm/panel_layout_manager.cc @@ -5,6 +5,7 @@ #include "ash/wm/panel_layout_manager.h" #include <algorithm> +#include <map> #include "ash/launcher/launcher.h" #include "ash/shell.h" @@ -218,7 +219,11 @@ void PanelLayoutManager::SetChildBounds(aura::Window* child, //////////////////////////////////////////////////////////////////////////////// // PanelLayoutManager, ash::LauncherIconObserver implementation: + void PanelLayoutManager::OnLauncherIconPositionsChanged() { + // TODO: As this is called for every animation step now. Relayout needs to be + // updated to use current icon position instead of use the ideal bounds so + // that the panels slide with their icons instead of jumping. Relayout(); } diff --git a/ash/wm/panel_layout_manager.h b/ash/wm/panel_layout_manager.h index cb3c20c..652ed2e 100644 --- a/ash/wm/panel_layout_manager.h +++ b/ash/wm/panel_layout_manager.h @@ -43,8 +43,8 @@ namespace internal { // its layout manager to this instance, e.g.: // panel_container->SetLayoutManager(new PanelLayoutManager(panel_container)); -class ASH_EXPORT PanelLayoutManager : - public aura::LayoutManager, +class ASH_EXPORT PanelLayoutManager + : public aura::LayoutManager, public ash::LauncherIconObserver, public aura::client::ActivationChangeObserver { public: diff --git a/ash/wm/panel_layout_manager_unittest.cc b/ash/wm/panel_layout_manager_unittest.cc index f1878ca..947a892 100644 --- a/ash/wm/panel_layout_manager_unittest.cc +++ b/ash/wm/panel_layout_manager_unittest.cc @@ -9,6 +9,7 @@ #include "ash/shell.h" #include "ash/shell_window_ids.h" #include "ash/test/ash_test_base.h" +#include "ash/test/launcher_view_test_api.h" #include "ash/test/test_launcher_delegate.h" #include "ash/wm/window_util.h" #include "base/basictypes.h" @@ -19,7 +20,6 @@ #include "ui/views/widget/widget.h" namespace ash { - namespace internal { using aura::test::WindowIsAbove; @@ -33,6 +33,11 @@ class PanelLayoutManagerTest : public ash::test::AshTestBase { CommandLine::ForCurrentProcess()->AppendSwitch(switches::kAuraPanelManager); ash::test::AshTestBase::SetUp(); ASSERT_TRUE(ash::test::TestLauncherDelegate::instance()); + + Launcher* launcher = Shell::GetInstance()->launcher(); + launcher_view_test_.reset(new test::LauncherViewTestAPI( + launcher->GetLauncherViewForTest())); + launcher_view_test_->SetAnimationDuration(1); } aura::Window* CreateNormalWindow() { @@ -69,6 +74,9 @@ class PanelLayoutManagerTest : public ash::test::AshTestBase { // TODO(dcheng): This should be const, but GetScreenBoundsOfItemIconForWindow // takes a non-const Window. We can probably fix that. void IsPanelAboveLauncherIcon(aura::Window* panel) { + // Waits until all launcher view animations are done. + launcher_view_test()->RunMessageLoopUntilAnimationsDone(); + Launcher* launcher = Shell::GetInstance()->launcher(); gfx::Rect icon_bounds = launcher->GetScreenBoundsOfItemIconForWindow(panel); ASSERT_FALSE(icon_bounds.IsEmpty()); @@ -104,7 +112,13 @@ class PanelLayoutManagerTest : public ash::test::AshTestBase { return widget->IsVisible(); } + test::LauncherViewTestAPI* launcher_view_test() { + return launcher_view_test_.get(); + } + private: + scoped_ptr<test::LauncherViewTestAPI> launcher_view_test_; + DISALLOW_COPY_AND_ASSIGN(PanelLayoutManagerTest); }; @@ -147,10 +161,12 @@ TEST_F(PanelLayoutManagerTest, MultiplePanelStacking) { // Changing the active window should update the stacking order. wm::ActivateWindow(w1.get()); + launcher_view_test()->RunMessageLoopUntilAnimationsDone(); EXPECT_TRUE(WindowIsAbove(w1.get(), w2.get())); EXPECT_TRUE(WindowIsAbove(w2.get(), w3.get())); wm::ActivateWindow(w2.get()); + launcher_view_test()->RunMessageLoopUntilAnimationsDone(); EXPECT_TRUE(WindowIsAbove(w1.get(), w3.get())); EXPECT_TRUE(WindowIsAbove(w2.get(), w3.get())); EXPECT_TRUE(WindowIsAbove(w2.get(), w1.get())); @@ -179,7 +195,6 @@ TEST_F(PanelLayoutManagerTest, MultiplePanelCallout) { EXPECT_NO_FATAL_FAILURE(IsCalloutAbovePanel(w3.get())); w3.reset(); EXPECT_FALSE(IsCalloutVisible()); - } // Tests removing panels. @@ -191,6 +206,7 @@ TEST_F(PanelLayoutManagerTest, RemoveLeftPanel) { // At this point, windows should be stacked with 1 < 2 < 3 wm::ActivateWindow(w1.get()); + launcher_view_test()->RunMessageLoopUntilAnimationsDone(); // Now, windows should be stacked 1 > 2 > 3 w1.reset(); EXPECT_NO_FATAL_FAILURE(IsPanelAboveLauncherIcon(w2.get())); @@ -244,5 +260,4 @@ TEST_F(PanelLayoutManagerTest, RemoveNonActivePanel) { } } // namespace internal - } // namespace ash |