Chromium Code Reviews| OLD | NEW |
|---|---|
| 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/common/system/tray/tray_background_view.h" | 5 #include "ash/common/system/tray/tray_background_view.h" |
| 6 | 6 |
| 7 #include "ash/common/material_design/material_design_controller.h" | 7 #include "ash/common/material_design/material_design_controller.h" |
| 8 #include "ash/common/shelf/shelf_constants.h" | 8 #include "ash/common/shelf/shelf_constants.h" |
| 9 #include "ash/common/shelf/wm_shelf.h" | 9 #include "ash/common/shelf/wm_shelf.h" |
| 10 #include "ash/common/shelf/wm_shelf_util.h" | 10 #include "ash/common/shelf/wm_shelf_util.h" |
| (...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 226 views::BoxLayout::Orientation orientation = | 226 views::BoxLayout::Orientation orientation = |
| 227 is_horizontal ? views::BoxLayout::kHorizontal | 227 is_horizontal ? views::BoxLayout::kHorizontal |
| 228 : views::BoxLayout::kVertical; | 228 : views::BoxLayout::kVertical; |
| 229 const gfx::Insets insets( | 229 const gfx::Insets insets( |
| 230 ash::MaterialDesignController::IsShelfMaterial() | 230 ash::MaterialDesignController::IsShelfMaterial() |
| 231 ? is_horizontal ? gfx::Insets(0, kHitRegionPadding, 0, | 231 ? is_horizontal ? gfx::Insets(0, kHitRegionPadding, 0, |
| 232 kHitRegionPadding + kSeparatorWidth) | 232 kHitRegionPadding + kSeparatorWidth) |
| 233 : gfx::Insets(kHitRegionPadding, 0, | 233 : gfx::Insets(kHitRegionPadding, 0, |
| 234 kHitRegionPadding + kSeparatorWidth, 0) | 234 kHitRegionPadding + kSeparatorWidth, 0) |
| 235 : gfx::Insets(kBackgroundAdjustPadding)); | 235 : gfx::Insets(kBackgroundAdjustPadding)); |
| 236 const gfx::Insets margin( | 236 SetBorder(views::CreateEmptyBorder(insets)); |
| 237 is_horizontal ? gfx::Insets(cross_axis_margin_, main_axis_margin_) | |
| 238 : gfx::Insets(main_axis_margin_, cross_axis_margin_)); | |
| 239 SetBorder(views::CreateEmptyBorder(insets + margin)); | |
| 240 | 237 |
| 241 views::BoxLayout* layout = new views::BoxLayout(orientation, 0, 0, 0); | 238 int horizontal_margin = main_axis_margin_; |
| 239 int vertical_margin = cross_axis_margin_; | |
| 240 if (!is_horizontal) | |
| 241 std::swap(horizontal_margin, vertical_margin); | |
| 242 views::BoxLayout* layout = | |
| 243 new views::BoxLayout(orientation, horizontal_margin, vertical_margin, 0); | |
| 244 | |
| 242 if (!ash::MaterialDesignController::IsShelfMaterial()) | 245 if (!ash::MaterialDesignController::IsShelfMaterial()) |
| 243 layout->SetDefaultFlex(1); | 246 layout->SetDefaultFlex(1); |
| 244 layout->set_minimum_cross_axis_size(kTrayItemSize); | 247 layout->set_minimum_cross_axis_size(kTrayItemSize); |
| 245 views::View::SetLayoutManager(layout); | 248 views::View::SetLayoutManager(layout); |
| 246 | 249 |
| 247 PreferredSizeChanged(); | 250 PreferredSizeChanged(); |
| 248 } | 251 } |
| 249 | 252 |
| 250 //////////////////////////////////////////////////////////////////////////////// | 253 //////////////////////////////////////////////////////////////////////////////// |
| 251 // TrayBackgroundView | 254 // TrayBackgroundView |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 382 event->type() == ui::ET_GESTURE_TAP_CANCEL) { | 385 event->type() == ui::ET_GESTURE_TAP_CANCEL) { |
| 383 SetDrawBackgroundAsActive(false); | 386 SetDrawBackgroundAsActive(false); |
| 384 } | 387 } |
| 385 ActionableView::OnGestureEvent(event); | 388 ActionableView::OnGestureEvent(event); |
| 386 } | 389 } |
| 387 | 390 |
| 388 void TrayBackgroundView::SetContents(views::View* contents) { | 391 void TrayBackgroundView::SetContents(views::View* contents) { |
| 389 SetLayoutManager(new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 0)); | 392 SetLayoutManager(new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 0)); |
| 390 AddChildView(contents); | 393 AddChildView(contents); |
| 391 } | 394 } |
| 395 | |
| 392 void TrayBackgroundView::SetContentsBackground() { | 396 void TrayBackgroundView::SetContentsBackground() { |
| 393 background_ = new TrayBackground(this); | 397 background_ = new TrayBackground(this); |
| 394 tray_container_->set_background(background_); | 398 tray_container_->set_background(background_); |
| 395 } | 399 } |
| 396 | 400 |
| 397 void TrayBackgroundView::SetShelfAlignment(ShelfAlignment alignment) { | 401 void TrayBackgroundView::SetShelfAlignment(ShelfAlignment alignment) { |
| 398 shelf_alignment_ = alignment; | 402 shelf_alignment_ = alignment; |
| 399 tray_container_->SetAlignment(alignment); | 403 tray_container_->SetAlignment(alignment); |
| 400 } | 404 } |
| 401 | 405 |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 422 | 426 |
| 423 void TrayBackgroundView::HideTransformation() { | 427 void TrayBackgroundView::HideTransformation() { |
| 424 gfx::Transform transform; | 428 gfx::Transform transform; |
| 425 if (IsHorizontalAlignment(shelf_alignment_)) | 429 if (IsHorizontalAlignment(shelf_alignment_)) |
| 426 transform.Translate(width(), 0.0f); | 430 transform.Translate(width(), 0.0f); |
| 427 else | 431 else |
| 428 transform.Translate(0.0f, height()); | 432 transform.Translate(0.0f, height()); |
| 429 layer()->SetTransform(transform); | 433 layer()->SetTransform(transform); |
| 430 } | 434 } |
| 431 | 435 |
| 432 gfx::Rect TrayBackgroundView::GetBubbleAnchorRect( | |
| 433 views::Widget* anchor_widget, | |
| 434 TrayBubbleView::AnchorType anchor_type, | |
| 435 TrayBubbleView::AnchorAlignment anchor_alignment) const { | |
| 436 gfx::Rect rect; | |
| 437 if (anchor_widget && anchor_widget->IsVisible()) { | |
| 438 rect = anchor_widget->GetWindowBoundsInScreen(); | |
| 439 if (anchor_type == TrayBubbleView::ANCHOR_TYPE_TRAY) { | |
| 440 if (anchor_alignment == TrayBubbleView::ANCHOR_ALIGNMENT_BOTTOM) { | |
| 441 bool rtl = base::i18n::IsRTL(); | |
| 442 rect.Inset(rtl ? kBubblePaddingHorizontalSide : 0, | |
| 443 kBubblePaddingHorizontalBottom, | |
| 444 rtl ? 0 : kBubblePaddingHorizontalSide, 0); | |
| 445 } else if (anchor_alignment == TrayBubbleView::ANCHOR_ALIGNMENT_LEFT) { | |
| 446 rect.Inset(0, 0, kBubblePaddingVerticalSide + 4, | |
| 447 kBubblePaddingVerticalBottom); | |
| 448 } else if (anchor_alignment == TrayBubbleView::ANCHOR_ALIGNMENT_RIGHT) { | |
| 449 rect.Inset(kBubblePaddingVerticalSide, 0, 0, | |
| 450 kBubblePaddingVerticalBottom); | |
| 451 } else { | |
| 452 // TODO(bruthig) May need to handle other ANCHOR_ALIGNMENT_ values. | |
| 453 // ie. ANCHOR_ALIGNMENT_TOP | |
| 454 DCHECK(false) << "Unhandled anchor alignment."; | |
| 455 } | |
| 456 } else if (anchor_type == TrayBubbleView::ANCHOR_TYPE_BUBBLE) { | |
| 457 // Invert the offsets to align with the bubble below. | |
| 458 // Note that with the alternate shelf layout the tips are not shown and | |
| 459 // the offsets for left and right alignment do not need to be applied. | |
| 460 int vertical_alignment = 0; | |
| 461 int horizontal_alignment = kBubblePaddingVerticalBottom; | |
| 462 if (anchor_alignment == TrayBubbleView::ANCHOR_ALIGNMENT_LEFT) | |
| 463 rect.Inset(vertical_alignment, 0, 0, horizontal_alignment); | |
| 464 else if (anchor_alignment == TrayBubbleView::ANCHOR_ALIGNMENT_RIGHT) | |
| 465 rect.Inset(0, 0, vertical_alignment, horizontal_alignment); | |
| 466 } else { | |
| 467 DCHECK(false) << "Unhandled anchor type."; | |
| 468 } | |
| 469 } else { | |
| 470 WmWindow* target_root = anchor_widget | |
| 471 ? WmLookup::Get() | |
| 472 ->GetWindowForWidget(anchor_widget) | |
| 473 ->GetRootWindow() | |
| 474 : WmShell::Get()->GetPrimaryRootWindow(); | |
| 475 rect = target_root->GetBounds(); | |
| 476 if (anchor_type == TrayBubbleView::ANCHOR_TYPE_TRAY) { | |
| 477 if (anchor_alignment == TrayBubbleView::ANCHOR_ALIGNMENT_BOTTOM) { | |
| 478 rect = gfx::Rect( | |
| 479 base::i18n::IsRTL() | |
| 480 ? kPaddingFromRightEdgeOfScreenBottomAlignment | |
| 481 : rect.width() - kPaddingFromRightEdgeOfScreenBottomAlignment, | |
| 482 rect.height() - kPaddingFromBottomOfScreenBottomAlignment, 0, 0); | |
| 483 rect = target_root->ConvertRectToScreen(rect); | |
| 484 } else if (anchor_alignment == TrayBubbleView::ANCHOR_ALIGNMENT_LEFT) { | |
| 485 rect = gfx::Rect( | |
| 486 kPaddingFromRightEdgeOfScreenBottomAlignment, | |
| 487 rect.height() - kPaddingFromBottomOfScreenBottomAlignment, 1, 1); | |
| 488 rect = target_root->ConvertRectToScreen(rect); | |
| 489 } else if (anchor_alignment == TrayBubbleView::ANCHOR_ALIGNMENT_RIGHT) { | |
| 490 rect = gfx::Rect( | |
| 491 rect.width() - kPaddingFromRightEdgeOfScreenBottomAlignment, | |
| 492 rect.height() - kPaddingFromBottomOfScreenBottomAlignment, 1, 1); | |
| 493 rect = target_root->ConvertRectToScreen(rect); | |
| 494 } else { | |
| 495 // TODO(bruthig) May need to handle other ANCHOR_ALIGNMENT_ values. | |
| 496 // ie. ANCHOR_ALIGNMENT_TOP | |
| 497 DCHECK(false) << "Unhandled anchor alignment."; | |
| 498 } | |
| 499 } else { | |
| 500 rect = gfx::Rect( | |
| 501 base::i18n::IsRTL() | |
| 502 ? kPaddingFromRightEdgeOfScreenBottomAlignment | |
| 503 : rect.width() - kPaddingFromRightEdgeOfScreenBottomAlignment, | |
| 504 rect.height() - kPaddingFromBottomOfScreenBottomAlignment, 0, 0); | |
| 505 } | |
| 506 } | |
| 507 return rect; | |
| 508 } | |
| 509 | |
| 510 TrayBubbleView::AnchorAlignment TrayBackgroundView::GetAnchorAlignment() const { | 436 TrayBubbleView::AnchorAlignment TrayBackgroundView::GetAnchorAlignment() const { |
| 511 if (shelf_alignment_ == SHELF_ALIGNMENT_LEFT) | 437 if (shelf_alignment_ == SHELF_ALIGNMENT_LEFT) |
| 512 return TrayBubbleView::ANCHOR_ALIGNMENT_LEFT; | 438 return TrayBubbleView::ANCHOR_ALIGNMENT_LEFT; |
| 513 if (shelf_alignment_ == SHELF_ALIGNMENT_RIGHT) | 439 if (shelf_alignment_ == SHELF_ALIGNMENT_RIGHT) |
| 514 return TrayBubbleView::ANCHOR_ALIGNMENT_RIGHT; | 440 return TrayBubbleView::ANCHOR_ALIGNMENT_RIGHT; |
| 515 return TrayBubbleView::ANCHOR_ALIGNMENT_BOTTOM; | 441 return TrayBubbleView::ANCHOR_ALIGNMENT_BOTTOM; |
| 516 } | 442 } |
| 517 | 443 |
| 518 void TrayBackgroundView::SetDrawBackgroundAsActive(bool visible) { | 444 void TrayBackgroundView::SetDrawBackgroundAsActive(bool visible) { |
| 519 if (draw_background_as_active_ == visible) | 445 if (draw_background_as_active_ == visible) |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 534 background_->set_alpha(alpha); | 460 background_->set_alpha(alpha); |
| 535 SchedulePaint(); | 461 SchedulePaint(); |
| 536 } | 462 } |
| 537 } | 463 } |
| 538 | 464 |
| 539 void TrayBackgroundView::SetSeparatorVisibility(bool is_shown) { | 465 void TrayBackgroundView::SetSeparatorVisibility(bool is_shown) { |
| 540 is_separator_visible_ = is_shown; | 466 is_separator_visible_ = is_shown; |
| 541 SchedulePaint(); | 467 SchedulePaint(); |
| 542 } | 468 } |
| 543 | 469 |
| 470 views::View* TrayBackgroundView::GetBubbleAnchor() const { | |
| 471 return tray_container_; | |
| 472 } | |
| 473 | |
| 474 gfx::Insets TrayBackgroundView::GetBubbleAnchorInsets() const { | |
| 475 gfx::Insets anchor_insets = GetBubbleAnchor()->GetInsets(); | |
| 476 gfx::Insets tray_bg_insets = GetInsets(); | |
| 477 const bool bottom = | |
| 478 GetAnchorAlignment() == TrayBubbleView::ANCHOR_ALIGNMENT_BOTTOM; | |
| 479 // TODO(estade): for reasons I don't understand, BubbleBorder distances the | |
|
msw
2016/11/15 02:59:38
What's the action on this TODO? Is it worth keepin
Evan Stade
2016/11/15 17:01:29
I think the comment has value to explain what's go
| |
| 480 // bubble by the arrow's "interior" thickness even when the paint type is | |
| 481 // PAINT_NONE. | |
| 482 const int kBigShadowArrowInteriorThickness = 9; | |
| 483 return gfx::Insets( | |
|
msw
2016/11/15 02:59:38
This may be more legible with if (bottom) return .
Evan Stade
2016/11/15 17:01:29
done (still not super legible though :)
| |
| 484 bottom ? kBigShadowArrowInteriorThickness - tray_bg_insets.top() | |
| 485 : anchor_insets.top(), | |
| 486 bottom ? anchor_insets.left() | |
| 487 : kBigShadowArrowInteriorThickness - tray_bg_insets.left(), | |
| 488 bottom ? -tray_bg_insets.bottom() : anchor_insets.bottom(), | |
| 489 bottom ? anchor_insets.right() | |
| 490 : kBigShadowArrowInteriorThickness - tray_bg_insets.right()); | |
| 491 } | |
| 492 | |
| 544 void TrayBackgroundView::OnPaint(gfx::Canvas* canvas) { | 493 void TrayBackgroundView::OnPaint(gfx::Canvas* canvas) { |
| 545 ActionableView::OnPaint(canvas); | 494 ActionableView::OnPaint(canvas); |
| 546 if (!MaterialDesignController::IsShelfMaterial() || | 495 if (!MaterialDesignController::IsShelfMaterial() || |
| 547 shelf()->GetBackgroundType() == | 496 shelf()->GetBackgroundType() == |
| 548 ShelfBackgroundType::SHELF_BACKGROUND_DEFAULT || | 497 ShelfBackgroundType::SHELF_BACKGROUND_DEFAULT || |
| 549 !is_separator_visible_) { | 498 !is_separator_visible_) { |
| 550 return; | 499 return; |
| 551 } | 500 } |
| 552 // In the given |canvas|, draws a 1x32px separator line 4 pixel to the right | 501 // In the given |canvas|, draws a 1x32px separator line 4 pixel to the right |
| 553 // of the TrayBackgroundView. | 502 // of the TrayBackgroundView. |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 566 paint.setAntiAlias(true); | 515 paint.setAntiAlias(true); |
| 567 | 516 |
| 568 const gfx::Rect bounds = horizontal_shelf ? gfx::Rect(x, y, width, height) | 517 const gfx::Rect bounds = horizontal_shelf ? gfx::Rect(x, y, width, height) |
| 569 : gfx::Rect(y, x, height, width); | 518 : gfx::Rect(y, x, height, width); |
| 570 gfx::RectF rect(gfx::ScaleRect(gfx::RectF(bounds), scale)); | 519 gfx::RectF rect(gfx::ScaleRect(gfx::RectF(bounds), scale)); |
| 571 canvas->DrawLine(horizontal_shelf ? rect.top_right() : rect.bottom_left(), | 520 canvas->DrawLine(horizontal_shelf ? rect.top_right() : rect.bottom_left(), |
| 572 rect.bottom_right(), paint); | 521 rect.bottom_right(), paint); |
| 573 } | 522 } |
| 574 | 523 |
| 575 } // namespace ash | 524 } // namespace ash |
| OLD | NEW |