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

Side by Side Diff: ash/launcher/launcher_tooltip_manager.cc

Issue 10701051: Polish launcher tooltip visibility (2nd try). (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: add the _unittest.cc file itself Created 8 years, 5 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ash/launcher/launcher_tooltip_manager.h" 5 #include "ash/launcher/launcher_tooltip_manager.h"
6 6
7 #include "ash/shell.h" 7 #include "ash/shell.h"
8 #include "ash/shell_window_ids.h" 8 #include "ash/shell_window_ids.h"
9 #include "ash/wm/window_animations.h" 9 #include "ash/wm/window_animations.h"
10 #include "base/bind.h"
11 #include "base/message_loop.h"
10 #include "base/time.h" 12 #include "base/time.h"
11 #include "base/timer.h" 13 #include "base/timer.h"
12 #include "ui/aura/window.h" 14 #include "ui/aura/window.h"
13 #include "ui/views/bubble/bubble_delegate.h" 15 #include "ui/views/bubble/bubble_delegate.h"
14 #include "ui/views/controls/label.h" 16 #include "ui/views/controls/label.h"
15 #include "ui/views/layout/fill_layout.h" 17 #include "ui/views/layout/fill_layout.h"
16 #include "ui/views/widget/widget.h" 18 #include "ui/views/widget/widget.h"
17 19
18 namespace ash { 20 namespace ash {
19 namespace internal { 21 namespace internal {
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
95 const views::MouseEvent& event) { 97 const views::MouseEvent& event) {
96 GetWidget()->Close(); 98 GetWidget()->Close();
97 host_->OnBubbleClosed(this); 99 host_->OnBubbleClosed(this);
98 } 100 }
99 101
100 void LauncherTooltipManager::LauncherTooltipBubble::WindowClosing() { 102 void LauncherTooltipManager::LauncherTooltipBubble::WindowClosing() {
101 views::BubbleDelegateView::WindowClosing(); 103 views::BubbleDelegateView::WindowClosing();
102 host_->OnBubbleClosed(this); 104 host_->OnBubbleClosed(this);
103 } 105 }
104 106
105 LauncherTooltipManager::LauncherTooltipManager(ShelfAlignment alignment) 107 LauncherTooltipManager::LauncherTooltipManager(
108 ShelfAlignment alignment, ShelfLayoutManager* shelf_layout_manager)
106 : view_(NULL), 109 : view_(NULL),
107 anchor_(NULL), 110 anchor_(NULL),
108 alignment_(alignment) {} 111 alignment_(alignment),
112 shelf_layout_manager_(shelf_layout_manager) {
113 if (shelf_layout_manager)
114 shelf_layout_manager->AddObserver(this);
115 }
109 116
110 LauncherTooltipManager::~LauncherTooltipManager() { 117 LauncherTooltipManager::~LauncherTooltipManager() {
111 Close(); 118 Close();
119 if (shelf_layout_manager_)
120 shelf_layout_manager_->RemoveObserver(this);
112 } 121 }
113 122
114 void LauncherTooltipManager::ShowDelayed(views::View* anchor, 123 void LauncherTooltipManager::ShowDelayed(views::View* anchor,
115 const string16& text) { 124 const string16& text) {
116 if (view_) { 125 if (view_) {
117 if (timer_.get() && timer_->IsRunning()) 126 if (timer_.get() && timer_->IsRunning())
118 return; 127 return;
119 else 128 else
120 Close(); 129 Close();
121 } 130 }
122 131
132 if (shelf_layout_manager_ && !shelf_layout_manager_->IsVisible())
133 return;
134
123 CreateBubble(anchor, text); 135 CreateBubble(anchor, text);
124 gfx::NativeView native_view = view_->GetWidget()->GetNativeView(); 136 gfx::NativeView native_view = view_->GetWidget()->GetNativeView();
125 SetWindowVisibilityAnimationType( 137 SetWindowVisibilityAnimationType(
126 native_view, WINDOW_VISIBILITY_ANIMATION_TYPE_VERTICAL); 138 native_view, WINDOW_VISIBILITY_ANIMATION_TYPE_VERTICAL);
127 SetWindowVisibilityAnimationTransition(native_view, ANIMATE_SHOW); 139 SetWindowVisibilityAnimationTransition(native_view, ANIMATE_SHOW);
128 ResetTimer(); 140 ResetTimer();
129 } 141 }
130 142
131 void LauncherTooltipManager::ShowImmediately(views::View* anchor, 143 void LauncherTooltipManager::ShowImmediately(views::View* anchor,
132 const string16& text) { 144 const string16& text) {
133 if (view_ && IsVisible()) 145 if (view_) {
134 Close(); 146 if (timer_.get() && timer_->IsRunning())
147 StopTimer();
148 Close();
149 }
150
151 if (shelf_layout_manager_ && !shelf_layout_manager_->IsVisible())
152 return;
135 153
136 CreateBubble(anchor, text); 154 CreateBubble(anchor, text);
137 gfx::NativeView native_view = view_->GetWidget()->GetNativeView(); 155 gfx::NativeView native_view = view_->GetWidget()->GetNativeView();
138 SetWindowVisibilityAnimationTransition(native_view, ANIMATE_NONE); 156 SetWindowVisibilityAnimationTransition(native_view, ANIMATE_NONE);
139 ShowInternal(); 157 ShowInternal();
140 } 158 }
141 159
142 void LauncherTooltipManager::Close() { 160 void LauncherTooltipManager::Close() {
143 if (view_) { 161 if (view_) {
144 view_->GetWidget()->Close(); 162 view_->GetWidget()->Close();
(...skipping 17 matching lines...) Expand all
162 ShowImmediately(anchor_, text_); 180 ShowImmediately(anchor_, text_);
163 } 181 }
164 } 182 }
165 183
166 void LauncherTooltipManager::ResetTimer() { 184 void LauncherTooltipManager::ResetTimer() {
167 if (timer_.get() && timer_->IsRunning()) { 185 if (timer_.get() && timer_->IsRunning()) {
168 timer_->Reset(); 186 timer_->Reset();
169 return; 187 return;
170 } 188 }
171 189
190 // We don't start the timer if the shelf isn't visible.
191 if (shelf_layout_manager_ && !shelf_layout_manager_->IsVisible())
192 return;
193
172 base::OneShotTimer<LauncherTooltipManager>* new_timer = 194 base::OneShotTimer<LauncherTooltipManager>* new_timer =
173 new base::OneShotTimer<LauncherTooltipManager>(); 195 new base::OneShotTimer<LauncherTooltipManager>();
174 new_timer->Start( 196 new_timer->Start(
175 FROM_HERE, 197 FROM_HERE,
176 base::TimeDelta::FromMilliseconds(kTooltipAppearanceDelay), 198 base::TimeDelta::FromMilliseconds(kTooltipAppearanceDelay),
177 this, 199 this,
178 &LauncherTooltipManager::ShowInternal); 200 &LauncherTooltipManager::ShowInternal);
179 timer_.reset(new_timer); 201 timer_.reset(new_timer);
180 } 202 }
181 203
182 void LauncherTooltipManager::StopTimer() { 204 void LauncherTooltipManager::StopTimer() {
183 timer_.reset(); 205 timer_.reset();
184 } 206 }
185 207
186 bool LauncherTooltipManager::IsVisible() { 208 bool LauncherTooltipManager::IsVisible() {
187 if (timer_.get() && timer_->IsRunning()) 209 if (timer_.get() && timer_->IsRunning())
188 return false; 210 return false;
189 211
190 return view_ && view_->GetWidget() && view_->GetWidget()->IsVisible(); 212 return view_ && view_->GetWidget() && view_->GetWidget()->IsVisible();
191 } 213 }
192 214
215 void LauncherTooltipManager::WillVisibilityStateChange(
216 ShelfLayoutManager::VisibilityState new_state) {
217 if (new_state == ShelfLayoutManager::HIDDEN) {
218 StopTimer();
219 Close();
220 }
221 }
222
223 void LauncherTooltipManager::OnAutoHideStateChanged(
224 ShelfLayoutManager::AutoHideState new_state) {
225 if (new_state == ShelfLayoutManager::AUTO_HIDE_HIDDEN) {
226 StopTimer();
227 // AutoHide state change happens during an event filter, so immediate close
228 // may cause a crash in the HandleMouseEvent() after the filter. So we just
229 // schedule the Close here.
230 MessageLoopForUI::current()->PostTask(
231 FROM_HERE,
232 base::Bind(&LauncherTooltipManager::Close, base::Unretained(this)));
233 }
234 }
235
193 void LauncherTooltipManager::ShowInternal() { 236 void LauncherTooltipManager::ShowInternal() {
194 if (view_) 237 if (view_)
195 view_->Show(); 238 view_->Show();
196 239
197 timer_.reset(); 240 timer_.reset();
198 } 241 }
199 242
200 void LauncherTooltipManager::CreateBubble(views::View* anchor, 243 void LauncherTooltipManager::CreateBubble(views::View* anchor,
201 const string16& text) { 244 const string16& text) {
202 DCHECK(!view_); 245 DCHECK(!view_);
203 246
204 anchor_ = anchor; 247 anchor_ = anchor;
205 text_ = text; 248 text_ = text;
206 view_ = new LauncherTooltipBubble( 249 view_ = new LauncherTooltipBubble(
207 anchor, GetArrowLocation(alignment_), this); 250 anchor, GetArrowLocation(alignment_), this);
208 views::BubbleDelegateView::CreateBubble(view_); 251 views::BubbleDelegateView::CreateBubble(view_);
209 view_->SetText(text_); 252 view_->SetText(text_);
210 } 253 }
211 254
212 } // namespace internal 255 } // namespace internal
213 } // namespace ash 256 } // namespace ash
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698