diff options
author | mukai@chromium.org <mukai@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-06-29 18:01:23 +0000 |
---|---|---|
committer | mukai@chromium.org <mukai@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-06-29 18:01:23 +0000 |
commit | 403dc94ea7160dd133f262cf504e5a07ec1e50b6 (patch) | |
tree | 79741798b0f408e12d47eb4ebc5f15b6fe96c94f /ash/launcher | |
parent | 38b80bbab9db5a423cace41e4e7757eb4f27806c (diff) | |
download | chromium_src-403dc94ea7160dd133f262cf504e5a07ec1e50b6.zip chromium_src-403dc94ea7160dd133f262cf504e5a07ec1e50b6.tar.gz chromium_src-403dc94ea7160dd133f262cf504e5a07ec1e50b6.tar.bz2 |
Polish launcher tooltip visibility.
Add ShelfLayoutManager::Observer for two cases:
- AutoHide: catches the auto hiding status to close the tooltip property
- FullScreen: catches the shelf visibility changes to close it too
Check the visibility of Shelf itself in case of tooltip showing. Then the toolip
won't show if the shelf is hidden.
R=derat@chromium.org,davemoore@chromium.org
BUG=133551
TEST=manually done on lumpy, made sure aura_shell_unittests passed
Review URL: https://chromiumcodereview.appspot.com/10700030
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@144930 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ash/launcher')
-rw-r--r-- | ash/launcher/launcher.cc | 6 | ||||
-rw-r--r-- | ash/launcher/launcher.h | 4 | ||||
-rw-r--r-- | ash/launcher/launcher_tooltip_manager.cc | 44 | ||||
-rw-r--r-- | ash/launcher/launcher_tooltip_manager.h | 15 | ||||
-rw-r--r-- | ash/launcher/launcher_view.cc | 6 | ||||
-rw-r--r-- | ash/launcher/launcher_view.h | 5 | ||||
-rw-r--r-- | ash/launcher/launcher_view_unittest.cc | 3 |
7 files changed, 72 insertions, 11 deletions
diff --git a/ash/launcher/launcher.cc b/ash/launcher/launcher.cc index f8314bc..bc879e7 100644 --- a/ash/launcher/launcher.cc +++ b/ash/launcher/launcher.cc @@ -95,7 +95,8 @@ void Launcher::DelegateView::Layout() { // Launcher -------------------------------------------------------------------- -Launcher::Launcher(aura::Window* window_container) +Launcher::Launcher(aura::Window* window_container, + internal::ShelfLayoutManager* shelf_layout_manager) : widget_(NULL), window_container_(window_container), delegate_view_(NULL), @@ -119,7 +120,8 @@ Launcher::Launcher(aura::Window* window_container) params.parent = Shell::GetContainer( window_container_->GetRootWindow(), ash::internal::kShellWindowId_LauncherContainer); - launcher_view_ = new internal::LauncherView(model_.get(), delegate_.get()); + launcher_view_ = new internal::LauncherView( + model_.get(), delegate_.get(), shelf_layout_manager); launcher_view_->Init(); delegate_view_ = new DelegateView(this); delegate_view_->AddChildView(launcher_view_); diff --git a/ash/launcher/launcher.h b/ash/launcher/launcher.h index 890ea36..af1ef1d 100644 --- a/ash/launcher/launcher.h +++ b/ash/launcher/launcher.h @@ -32,6 +32,7 @@ namespace ash { namespace internal { class FocusCycler; class LauncherView; +class ShelfLayoutManager; } class LauncherIconObserver; @@ -40,7 +41,8 @@ class LauncherModel; class ASH_EXPORT Launcher : public internal::BackgroundAnimatorDelegate { public: - explicit Launcher(aura::Window* window_container); + explicit Launcher(aura::Window* window_container, + internal::ShelfLayoutManager* shelf_layout_manager); virtual ~Launcher(); // Sets the focus cycler. Also adds the launcher to the cycle. diff --git a/ash/launcher/launcher_tooltip_manager.cc b/ash/launcher/launcher_tooltip_manager.cc index a9b533c..72a1224 100644 --- a/ash/launcher/launcher_tooltip_manager.cc +++ b/ash/launcher/launcher_tooltip_manager.cc @@ -7,6 +7,8 @@ #include "ash/shell.h" #include "ash/shell_window_ids.h" #include "ash/wm/window_animations.h" +#include "base/bind.h" +#include "base/message_loop.h" #include "base/time.h" #include "base/timer.h" #include "ui/aura/window.h" @@ -102,13 +104,20 @@ void LauncherTooltipManager::LauncherTooltipBubble::WindowClosing() { host_->OnBubbleClosed(this); } -LauncherTooltipManager::LauncherTooltipManager(ShelfAlignment alignment) +LauncherTooltipManager::LauncherTooltipManager( + ShelfAlignment alignment, ShelfLayoutManager* shelf_layout_manager) : view_(NULL), anchor_(NULL), - alignment_(alignment) {} + alignment_(alignment), + shelf_layout_manager_(shelf_layout_manager) { + if (shelf_layout_manager) + shelf_layout_manager->AddObserver(this); +} LauncherTooltipManager::~LauncherTooltipManager() { Close(); + if (shelf_layout_manager_) + shelf_layout_manager_->RemoveObserver(this); } void LauncherTooltipManager::ShowDelayed(views::View* anchor, @@ -120,6 +129,9 @@ void LauncherTooltipManager::ShowDelayed(views::View* anchor, Close(); } + if (shelf_layout_manager_ && !shelf_layout_manager_->IsVisible()) + return; + CreateBubble(anchor, text); gfx::NativeView native_view = view_->GetWidget()->GetNativeView(); SetWindowVisibilityAnimationType( @@ -133,6 +145,9 @@ void LauncherTooltipManager::ShowImmediately(views::View* anchor, if (view_ && IsVisible()) Close(); + if (shelf_layout_manager_ && !shelf_layout_manager_->IsVisible()) + return; + CreateBubble(anchor, text); gfx::NativeView native_view = view_->GetWidget()->GetNativeView(); SetWindowVisibilityAnimationTransition(native_view, ANIMATE_NONE); @@ -169,6 +184,10 @@ void LauncherTooltipManager::ResetTimer() { return; } + // We don't start the timer if the shelf isn't visible. + if (shelf_layout_manager_ && !shelf_layout_manager_->IsVisible()) + return; + base::OneShotTimer<LauncherTooltipManager>* new_timer = new base::OneShotTimer<LauncherTooltipManager>(); new_timer->Start( @@ -190,6 +209,27 @@ bool LauncherTooltipManager::IsVisible() { return view_ && view_->GetWidget() && view_->GetWidget()->IsVisible(); } +void LauncherTooltipManager::WillVisibilityStateChange( + ShelfLayoutManager::VisibilityState new_state) { + if (new_state == ShelfLayoutManager::HIDDEN) { + StopTimer(); + Close(); + } +} + +void LauncherTooltipManager::OnAutoHideStateChanged( + ShelfLayoutManager::AutoHideState new_state) { + if (new_state == ShelfLayoutManager::AUTO_HIDE_HIDDEN) { + StopTimer(); + // AutoHide state change happens during an event filter, so immediate close + // may cause a crash in the HandleMouseEvent() after the filter. So we just + // schedule the Close here. + MessageLoopForUI::current()->PostTask( + FROM_HERE, + base::Bind(&LauncherTooltipManager::Close, base::Unretained(this))); + } +} + void LauncherTooltipManager::ShowInternal() { if (view_) view_->Show(); diff --git a/ash/launcher/launcher_tooltip_manager.h b/ash/launcher/launcher_tooltip_manager.h index 5451ccf..37bdfc71 100644 --- a/ash/launcher/launcher_tooltip_manager.h +++ b/ash/launcher/launcher_tooltip_manager.h @@ -7,6 +7,7 @@ #pragma once #include "ash/ash_export.h" +#include "ash/wm/shelf_layout_manager.h" #include "ash/wm/shelf_types.h" #include "base/basictypes.h" #include "base/string16.h" @@ -32,9 +33,10 @@ namespace internal { // LauncherTooltipManager manages the tooltip balloon poping up on launcher // items. -class ASH_EXPORT LauncherTooltipManager { +class ASH_EXPORT LauncherTooltipManager : public ShelfLayoutManager::Observer { public: - LauncherTooltipManager(ShelfAlignment alignment); + LauncherTooltipManager(ShelfAlignment alignment, + ShelfLayoutManager* shelf_layout_manager); ~LauncherTooltipManager(); // Called when the bubble is closed. @@ -63,6 +65,13 @@ class ASH_EXPORT LauncherTooltipManager { // Returns true if the tooltip is currently visible. bool IsVisible(); +protected: + // ShelfLayoutManager::Observer overrides: + virtual void WillVisibilityStateChange( + ShelfLayoutManager::VisibilityState new_state) OVERRIDE; + virtual void OnAutoHideStateChanged( + ShelfLayoutManager::AutoHideState new_state) OVERRIDE; + private: class LauncherTooltipBubble; friend class test::LauncherViewTest; @@ -76,6 +85,8 @@ class ASH_EXPORT LauncherTooltipManager { ShelfAlignment alignment_; scoped_ptr<base::Timer> timer_; + ShelfLayoutManager* shelf_layout_manager_; + DISALLOW_COPY_AND_ASSIGN(LauncherTooltipManager); }; diff --git a/ash/launcher/launcher_view.cc b/ash/launcher/launcher_view.cc index d5112c2..a226631 100644 --- a/ash/launcher/launcher_view.cc +++ b/ash/launcher/launcher_view.cc @@ -260,7 +260,9 @@ class LauncherView::StartFadeAnimationDelegate DISALLOW_COPY_AND_ASSIGN(StartFadeAnimationDelegate); }; -LauncherView::LauncherView(LauncherModel* model, LauncherDelegate* delegate) +LauncherView::LauncherView(LauncherModel* model, + LauncherDelegate* delegate, + ShelfLayoutManager* shelf_layout_manager) : model_(model), delegate_(delegate), view_model_(new views::ViewModel), @@ -277,7 +279,7 @@ LauncherView::LauncherView(LauncherModel* model, LauncherDelegate* delegate) bounds_animator_->AddObserver(this); set_context_menu_controller(this); focus_search_.reset(new LauncherFocusSearch(view_model_.get())); - tooltip_.reset(new LauncherTooltipManager(alignment_)); + tooltip_.reset(new LauncherTooltipManager(alignment_, shelf_layout_manager)); } LauncherView::~LauncherView() { diff --git a/ash/launcher/launcher_view.h b/ash/launcher/launcher_view.h index 1db7a6b..1c61fca 100644 --- a/ash/launcher/launcher_view.h +++ b/ash/launcher/launcher_view.h @@ -41,6 +41,7 @@ namespace internal { class LauncherButton; class LauncherTooltipManager; +class ShelfLayoutManager; class ASH_EXPORT LauncherView : public views::View, public LauncherModelObserver, @@ -50,7 +51,9 @@ class ASH_EXPORT LauncherView : public views::View, public views::FocusTraversable, public views::BoundsAnimatorObserver { public: - LauncherView(LauncherModel* model, LauncherDelegate* delegate); + LauncherView(LauncherModel* model, + LauncherDelegate* delegate, + ShelfLayoutManager* shelf_layout_manager); virtual ~LauncherView(); LauncherTooltipManager* tooltip_manager() { return tooltip_.get(); } diff --git a/ash/launcher/launcher_view_unittest.cc b/ash/launcher/launcher_view_unittest.cc index 556c99d..61530e8 100644 --- a/ash/launcher/launcher_view_unittest.cc +++ b/ash/launcher/launcher_view_unittest.cc @@ -176,7 +176,8 @@ class LauncherViewTest : public aura::test::AuraTestBase { model_.reset(new LauncherModel); - launcher_view_.reset(new internal::LauncherView(model_.get(), &delegate_)); + launcher_view_.reset(new internal::LauncherView( + model_.get(), &delegate_, NULL)); launcher_view_->Init(); // The bounds should be big enough for 4 buttons + overflow chevron. launcher_view_->SetBounds(0, 0, 500, 50); |