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

Side by Side Diff: ash/system/tray/system_tray_bubble.cc

Issue 10381132: Allow Uber Tray popup pointing to the related tray item view. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase & offset position fix Created 8 years, 7 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
« no previous file with comments | « ash/system/tray/system_tray_bubble.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/system/tray/system_tray_bubble.h" 5 #include "ash/system/tray/system_tray_bubble.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/system/tray/system_tray.h" 9 #include "ash/system/tray/system_tray.h"
10 #include "ash/system/tray/system_tray_delegate.h" 10 #include "ash/system/tray/system_tray_delegate.h"
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
169 DISALLOW_COPY_AND_ASSIGN(SystemTrayBubbleBackground); 169 DISALLOW_COPY_AND_ASSIGN(SystemTrayBubbleBackground);
170 }; 170 };
171 171
172 class SystemTrayBubbleBorder : public views::BubbleBorder { 172 class SystemTrayBubbleBorder : public views::BubbleBorder {
173 public: 173 public:
174 enum ArrowType { 174 enum ArrowType {
175 ARROW_TYPE_NONE, 175 ARROW_TYPE_NONE,
176 ARROW_TYPE_BOTTOM, 176 ARROW_TYPE_BOTTOM,
177 }; 177 };
178 178
179 SystemTrayBubbleBorder(views::View* owner, ArrowType arrow_type) 179 SystemTrayBubbleBorder(views::View* owner,
180 ArrowType arrow_type,
181 int arrow_offset)
180 : views::BubbleBorder(views::BubbleBorder::BOTTOM_RIGHT, 182 : views::BubbleBorder(views::BubbleBorder::BOTTOM_RIGHT,
181 views::BubbleBorder::NO_SHADOW), 183 views::BubbleBorder::NO_SHADOW),
182 owner_(owner), 184 owner_(owner),
183 arrow_type_(arrow_type) { 185 arrow_type_(arrow_type),
186 arrow_offset_(arrow_offset) {
184 set_alignment(views::BubbleBorder::ALIGN_EDGE_TO_ANCHOR_EDGE); 187 set_alignment(views::BubbleBorder::ALIGN_EDGE_TO_ANCHOR_EDGE);
185 } 188 }
186 189
187 virtual ~SystemTrayBubbleBorder() {} 190 virtual ~SystemTrayBubbleBorder() {}
188 191
189 private: 192 private:
190 // Overridden from views::Border. 193 // Overridden from views::Border.
191 virtual void Paint(const views::View& view, 194 virtual void Paint(const views::View& view,
192 gfx::Canvas* canvas) const OVERRIDE { 195 gfx::Canvas* canvas) const OVERRIDE {
193 gfx::Insets inset; 196 gfx::Insets inset;
194 GetInsets(&inset); 197 GetInsets(&inset);
195 DrawBlurredShadowAroundView(canvas, 0, owner_->height(), owner_->width(), 198 DrawBlurredShadowAroundView(canvas, 0, owner_->height(), owner_->width(),
196 inset); 199 inset);
197 200
198 // Draw the bottom line. 201 // Draw the bottom line.
199 int y = owner_->height() + 1; 202 int y = owner_->height() + 1;
200 canvas->FillRect(gfx::Rect(kLeftPadding, y, owner_->width(), 203 canvas->FillRect(gfx::Rect(kLeftPadding, y, owner_->width(),
201 kBottomLineHeight), kBorderDarkColor); 204 kBottomLineHeight), kBorderDarkColor);
202 205
203 if (!Shell::GetInstance()->shelf()->IsVisible()) 206 if (!Shell::GetInstance()->shelf()->IsVisible())
204 return; 207 return;
205 208
206 // Draw the arrow. 209 // Draw the arrow.
207 if (arrow_type_ == ARROW_TYPE_BOTTOM) { 210 if (arrow_type_ == ARROW_TYPE_BOTTOM) {
208 int left_base_x = base::i18n::IsRTL() ? kArrowWidth : 211 int tip_x = base::i18n::IsRTL() ? arrow_offset_ :
209 owner_->width() - kArrowPaddingFromRight - kArrowWidth; 212 owner_->width() - arrow_offset_;
213 int left_base_x = tip_x - kArrowWidth / 2;
210 int left_base_y = y; 214 int left_base_y = y;
211 int tip_x = left_base_x + kArrowWidth / 2;
212 int tip_y = left_base_y + kArrowHeight; 215 int tip_y = left_base_y + kArrowHeight;
216
213 SkPath path; 217 SkPath path;
214 path.incReserve(4); 218 path.incReserve(4);
215 path.moveTo(SkIntToScalar(left_base_x), SkIntToScalar(left_base_y)); 219 path.moveTo(SkIntToScalar(left_base_x), SkIntToScalar(left_base_y));
216 path.lineTo(SkIntToScalar(tip_x), SkIntToScalar(tip_y)); 220 path.lineTo(SkIntToScalar(tip_x), SkIntToScalar(tip_y));
217 path.lineTo(SkIntToScalar(left_base_x + kArrowWidth), 221 path.lineTo(SkIntToScalar(left_base_x + kArrowWidth),
218 SkIntToScalar(left_base_y)); 222 SkIntToScalar(left_base_y));
219 223
220 SkPaint paint; 224 SkPaint paint;
221 paint.setStyle(SkPaint::kFill_Style); 225 paint.setStyle(SkPaint::kFill_Style);
222 paint.setColor(kHeaderBackgroundColorDark); 226 paint.setColor(kHeaderBackgroundColorDark);
223 canvas->DrawPath(path, paint); 227 canvas->DrawPath(path, paint);
224 228
225 // Now draw the arrow border. 229 // Now draw the arrow border.
226 paint.setStyle(SkPaint::kStroke_Style); 230 paint.setStyle(SkPaint::kStroke_Style);
227 paint.setColor(kBorderDarkColor); 231 paint.setColor(kBorderDarkColor);
228 canvas->DrawPath(path, paint); 232 canvas->DrawPath(path, paint);
229 } 233 }
230 } 234 }
231 235
232 views::View* owner_; 236 views::View* owner_;
233 ArrowType arrow_type_; 237 ArrowType arrow_type_;
238 const int arrow_offset_;
234 239
235 DISALLOW_COPY_AND_ASSIGN(SystemTrayBubbleBorder); 240 DISALLOW_COPY_AND_ASSIGN(SystemTrayBubbleBorder);
236 }; 241 };
237 242
238 } // namespace 243 } // namespace
239 244
240 namespace internal { 245 namespace internal {
241 246
242 // SystemTrayBubbleView 247 // SystemTrayBubbleView
243 248
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
314 void SystemTrayBubbleView::OnMouseEntered(const views::MouseEvent& event) { 319 void SystemTrayBubbleView::OnMouseEntered(const views::MouseEvent& event) {
315 if (host_) 320 if (host_)
316 host_->StopAutoCloseTimer(); 321 host_->StopAutoCloseTimer();
317 } 322 }
318 323
319 void SystemTrayBubbleView::OnMouseExited(const views::MouseEvent& event) { 324 void SystemTrayBubbleView::OnMouseExited(const views::MouseEvent& event) {
320 if (host_) 325 if (host_)
321 host_->RestartAutoCloseTimer(); 326 host_->RestartAutoCloseTimer();
322 } 327 }
323 328
329 // SystemTrayBubble::InitParams
330 SystemTrayBubble::InitParams::InitParams(
331 SystemTrayBubble::AnchorType anchor_type)
332 : anchor(NULL),
333 anchor_type(anchor_type),
334 can_activate(false),
335 login_status(ash::user::LOGGED_IN_NONE),
336 arrow_offset(kArrowPaddingFromRight + kArrowWidth / 2) {
337 }
338
324 // SystemTrayBubble 339 // SystemTrayBubble
325 340
326 SystemTrayBubble::SystemTrayBubble( 341 SystemTrayBubble::SystemTrayBubble(
327 ash::SystemTray* tray, 342 ash::SystemTray* tray,
328 const std::vector<ash::SystemTrayItem*>& items, 343 const std::vector<ash::SystemTrayItem*>& items,
329 BubbleType bubble_type) 344 BubbleType bubble_type)
330 : tray_(tray), 345 : tray_(tray),
331 bubble_view_(NULL), 346 bubble_view_(NULL),
332 bubble_widget_(NULL), 347 bubble_widget_(NULL),
333 items_(items), 348 items_(items),
(...skipping 19 matching lines...) Expand all
353 BubbleType bubble_type) { 368 BubbleType bubble_type) {
354 DestroyItemViews(); 369 DestroyItemViews();
355 bubble_view_->RemoveAllChildViews(true); 370 bubble_view_->RemoveAllChildViews(true);
356 371
357 items_ = items; 372 items_ = items;
358 bubble_type_ = bubble_type; 373 bubble_type_ = bubble_type;
359 CreateItemViews(Shell::GetInstance()->tray_delegate()->GetUserLoginStatus()); 374 CreateItemViews(Shell::GetInstance()->tray_delegate()->GetUserLoginStatus());
360 bubble_widget_->GetContentsView()->Layout(); 375 bubble_widget_->GetContentsView()->Layout();
361 } 376 }
362 377
363 void SystemTrayBubble::InitView(views::View* anchor, 378 void SystemTrayBubble::InitView(const InitParams& init_params) {
364 AnchorType anchor_type,
365 bool can_activate,
366 ash::user::LoginStatus login_status) {
367 DCHECK(bubble_view_ == NULL); 379 DCHECK(bubble_view_ == NULL);
368 anchor_type_ = anchor_type; 380 anchor_type_ = init_params.anchor_type;
369 bubble_view_ = new SystemTrayBubbleView(anchor, this, can_activate); 381 bubble_view_ = new SystemTrayBubbleView(
382 init_params.anchor, this, init_params.can_activate);
370 383
371 CreateItemViews(login_status); 384 CreateItemViews(init_params.login_status);
372 385
373 DCHECK(bubble_widget_ == NULL); 386 DCHECK(bubble_widget_ == NULL);
374 bubble_widget_ = views::BubbleDelegateView::CreateBubble(bubble_view_); 387 bubble_widget_ = views::BubbleDelegateView::CreateBubble(bubble_view_);
375 388
376 // Must occur after call to CreateBubble() 389 // Must occur after call to CreateBubble()
377 bubble_view_->SetAlignment(views::BubbleBorder::ALIGN_EDGE_TO_ANCHOR_EDGE); 390 bubble_view_->SetAlignment(views::BubbleBorder::ALIGN_EDGE_TO_ANCHOR_EDGE);
378 bubble_widget_->non_client_view()->frame_view()->set_background(NULL); 391 bubble_widget_->non_client_view()->frame_view()->set_background(NULL);
379 SystemTrayBubbleBorder::ArrowType arrow_type; 392 SystemTrayBubbleBorder::ArrowType arrow_type;
380 if (anchor_type_ == ANCHOR_TYPE_TRAY) 393 if (anchor_type_ == ANCHOR_TYPE_TRAY)
381 arrow_type = SystemTrayBubbleBorder::ARROW_TYPE_BOTTOM; 394 arrow_type = SystemTrayBubbleBorder::ARROW_TYPE_BOTTOM;
382 else 395 else
383 arrow_type = SystemTrayBubbleBorder::ARROW_TYPE_NONE; 396 arrow_type = SystemTrayBubbleBorder::ARROW_TYPE_NONE;
384 bubble_view_->SetBubbleBorder( 397
385 new SystemTrayBubbleBorder(bubble_view_, arrow_type)); 398 SystemTrayBubbleBorder* bubble_border = new SystemTrayBubbleBorder(
399 bubble_view_, arrow_type, init_params.arrow_offset);
400 bubble_view_->SetBubbleBorder(bubble_border);
386 401
387 bubble_widget_->AddObserver(this); 402 bubble_widget_->AddObserver(this);
388 403
389 // Setup animation. 404 // Setup animation.
390 ash::SetWindowVisibilityAnimationType( 405 ash::SetWindowVisibilityAnimationType(
391 bubble_widget_->GetNativeWindow(), 406 bubble_widget_->GetNativeWindow(),
392 ash::WINDOW_VISIBILITY_ANIMATION_TYPE_FADE); 407 ash::WINDOW_VISIBILITY_ANIMATION_TYPE_FADE);
393 ash::SetWindowVisibilityAnimationTransition( 408 ash::SetWindowVisibilityAnimationTransition(
394 bubble_widget_->GetNativeWindow(), 409 bubble_widget_->GetNativeWindow(),
395 ash::ANIMATE_BOTH); 410 ash::ANIMATE_BOTH);
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
486 } 501 }
487 502
488 void SystemTrayBubble::OnWidgetClosing(views::Widget* widget) { 503 void SystemTrayBubble::OnWidgetClosing(views::Widget* widget) {
489 CHECK_EQ(bubble_widget_, widget); 504 CHECK_EQ(bubble_widget_, widget);
490 bubble_widget_ = NULL; 505 bubble_widget_ = NULL;
491 tray_->RemoveBubble(this); 506 tray_->RemoveBubble(this);
492 } 507 }
493 508
494 } // namespace internal 509 } // namespace internal
495 } // namespace ash 510 } // namespace ash
OLDNEW
« no previous file with comments | « ash/system/tray/system_tray_bubble.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698