Index: ui/views/bubble/tray_bubble_view.cc |
diff --git a/ui/views/bubble/tray_bubble_view.cc b/ui/views/bubble/tray_bubble_view.cc |
index 6725b8b7a45fde10816b43636f011a2d0cfd51e0..61f1f7eed7b6a62befdb274ac7d5253ba7a80279 100644 |
--- a/ui/views/bubble/tray_bubble_view.cc |
+++ b/ui/views/bubble/tray_bubble_view.cc |
@@ -19,6 +19,7 @@ |
#include "ui/compositor/paint_recorder.h" |
#include "ui/events/event.h" |
#include "ui/gfx/canvas.h" |
+#include "ui/gfx/color_palette.h" |
#include "ui/gfx/geometry/insets.h" |
#include "ui/gfx/geometry/rect.h" |
#include "ui/gfx/path.h" |
@@ -28,25 +29,26 @@ |
#include "ui/views/layout/box_layout.h" |
#include "ui/views/widget/widget.h" |
-namespace { |
- |
-// Inset the arrow a bit from the edge. |
-const int kArrowMinOffset = 20; |
-const int kBubbleSpacing = 20; |
+namespace views { |
-// The new theme adjusts the menus / bubbles to be flush with the shelf when |
-// there is no bubble. These are the offsets which need to be applied. |
-const int kArrowOffsetTopBottom = 4; |
-const int kArrowOffsetLeft = 9; |
-const int kArrowOffsetRight = -5; |
-const int kOffsetLeftRightForTopBottomOrientation = 5; |
+namespace { |
// The sampling time for mouse position changes in ms - which is roughly a frame |
// time. |
const int kFrameTimeInMS = 30; |
-} // namespace |
-namespace views { |
+BubbleBorder::Arrow GetArrowAlignment( |
+ TrayBubbleView::AnchorAlignment alignment) { |
+ if (alignment == TrayBubbleView::ANCHOR_ALIGNMENT_BOTTOM) { |
+ return base::i18n::IsRTL() ? BubbleBorder::BOTTOM_LEFT |
+ : BubbleBorder::BOTTOM_RIGHT; |
+ } |
+ if (alignment == TrayBubbleView::ANCHOR_ALIGNMENT_LEFT) |
+ return BubbleBorder::LEFT_BOTTOM; |
+ return BubbleBorder::RIGHT_BOTTOM; |
+} |
+ |
+} // namespace |
namespace internal { |
@@ -74,104 +76,6 @@ bool MouseMoveDetectorHost::Contains(const gfx::Point& screen_point, |
return false; |
} |
-// Custom border for TrayBubbleView. Contains special logic for GetBounds() |
-// to stack bubbles with no arrows correctly. Also calculates the arrow offset. |
-class TrayBubbleBorder : public BubbleBorder { |
- public: |
- TrayBubbleBorder(View* owner, |
- View* anchor, |
- TrayBubbleView::InitParams params) |
- : BubbleBorder(params.arrow, params.shadow, params.arrow_color), |
- owner_(owner), |
- anchor_(anchor), |
- tray_arrow_offset_(params.arrow_offset), |
- first_item_has_no_margin_(params.first_item_has_no_margin) { |
- set_alignment(params.arrow_alignment); |
- set_background_color(params.arrow_color); |
- set_paint_arrow(params.arrow_paint_type); |
- } |
- |
- ~TrayBubbleBorder() override {} |
- |
- // Overridden from BubbleBorder. |
- // Sets the bubble on top of the anchor when it has no arrow. |
- gfx::Rect GetBounds(const gfx::Rect& position_relative_to, |
- const gfx::Size& contents_size) const override { |
- if (has_arrow(arrow())) { |
- gfx::Rect rect = |
- BubbleBorder::GetBounds(position_relative_to, contents_size); |
- if (first_item_has_no_margin_) { |
- if (arrow() == BubbleBorder::BOTTOM_RIGHT || |
- arrow() == BubbleBorder::BOTTOM_LEFT) { |
- rect.set_y(rect.y() + kArrowOffsetTopBottom); |
- int rtl_factor = base::i18n::IsRTL() ? -1 : 1; |
- rect.set_x(rect.x() + |
- rtl_factor * kOffsetLeftRightForTopBottomOrientation); |
- } else if (arrow() == BubbleBorder::LEFT_BOTTOM) { |
- rect.set_x(rect.x() + kArrowOffsetLeft); |
- } else if (arrow() == BubbleBorder::RIGHT_BOTTOM) { |
- rect.set_x(rect.x() + kArrowOffsetRight); |
- } |
- } |
- return rect; |
- } |
- |
- gfx::Size border_size(contents_size); |
- gfx::Insets insets = GetInsets(); |
- border_size.Enlarge(insets.width(), insets.height()); |
- const int x = position_relative_to.x() + |
- position_relative_to.width() / 2 - border_size.width() / 2; |
- // Position the bubble on top of the anchor. |
- const int y = position_relative_to.y() - border_size.height() + |
- insets.height() - kBubbleSpacing; |
- return gfx::Rect(x, y, border_size.width(), border_size.height()); |
- } |
- |
- void UpdateArrowOffset() { |
- int arrow_offset = 0; |
- if (arrow() == BubbleBorder::BOTTOM_RIGHT || |
- arrow() == BubbleBorder::BOTTOM_LEFT) { |
- // Note: tray_arrow_offset_ is relative to the anchor widget. |
- if (tray_arrow_offset_ == |
- TrayBubbleView::InitParams::kArrowDefaultOffset) { |
- arrow_offset = kArrowMinOffset; |
- } else { |
- const int width = owner_->GetWidget()->GetContentsView()->width(); |
- gfx::Point pt(tray_arrow_offset_, 0); |
- View::ConvertPointToScreen(anchor_->GetWidget()->GetRootView(), &pt); |
- View::ConvertPointFromScreen(owner_->GetWidget()->GetRootView(), &pt); |
- arrow_offset = pt.x(); |
- if (arrow() == BubbleBorder::BOTTOM_RIGHT) |
- arrow_offset = width - arrow_offset; |
- arrow_offset = std::max(arrow_offset, kArrowMinOffset); |
- } |
- } else { |
- if (tray_arrow_offset_ == |
- TrayBubbleView::InitParams::kArrowDefaultOffset) { |
- arrow_offset = kArrowMinOffset; |
- } else { |
- gfx::Point pt(0, tray_arrow_offset_); |
- View::ConvertPointToScreen(anchor_->GetWidget()->GetRootView(), &pt); |
- View::ConvertPointFromScreen(owner_->GetWidget()->GetRootView(), &pt); |
- arrow_offset = pt.y(); |
- arrow_offset = std::max(arrow_offset, kArrowMinOffset); |
- } |
- } |
- set_arrow_offset(arrow_offset); |
- } |
- |
- private: |
- View* owner_; |
- View* anchor_; |
- const int tray_arrow_offset_; |
- |
- // If true the first item should not get any additional spacing against the |
- // anchor (without the bubble tip the bubble should be flush to the shelf). |
- const bool first_item_has_no_margin_; |
- |
- DISALLOW_COPY_AND_ASSIGN(TrayBubbleBorder); |
-}; |
- |
// This mask layer clips the bubble's content so that it does not overwrite the |
// rounded bubble corners. |
// TODO(miket): This does not work on Windows. Implement layer masking or |
@@ -259,32 +163,19 @@ class BottomAlignedBoxLayout : public BoxLayout { |
} // namespace internal |
-using internal::TrayBubbleBorder; |
using internal::TrayBubbleContentMask; |
using internal::BottomAlignedBoxLayout; |
-// static |
-const int TrayBubbleView::InitParams::kArrowDefaultOffset = -1; |
- |
-TrayBubbleView::InitParams::InitParams(AnchorType anchor_type, |
- AnchorAlignment anchor_alignment, |
+TrayBubbleView::InitParams::InitParams(AnchorAlignment anchor_alignment, |
int min_width, |
int max_width) |
- : anchor_type(anchor_type), |
- anchor_alignment(anchor_alignment), |
+ : anchor_alignment(anchor_alignment), |
min_width(min_width), |
max_width(max_width), |
max_height(0), |
can_activate(false), |
close_on_deactivate(true), |
- arrow_color(SK_ColorBLACK), |
- first_item_has_no_margin(false), |
- arrow(BubbleBorder::NONE), |
- arrow_offset(kArrowDefaultOffset), |
- arrow_paint_type(BubbleBorder::PAINT_NORMAL), |
- shadow(BubbleBorder::BIG_SHADOW), |
- arrow_alignment(BubbleBorder::ALIGN_EDGE_TO_ANCHOR_EDGE) { |
-} |
+ bg_color(gfx::kPlaceholderColor) {} |
TrayBubbleView::InitParams::InitParams(const InitParams& other) = default; |
@@ -292,37 +183,25 @@ TrayBubbleView::InitParams::InitParams(const InitParams& other) = default; |
TrayBubbleView* TrayBubbleView::Create(View* anchor, |
Delegate* delegate, |
InitParams* init_params) { |
- DCHECK(anchor); |
- // Set arrow here so that it can be passed to the BubbleView constructor. |
- if (init_params->anchor_type == ANCHOR_TYPE_TRAY) { |
- if (init_params->anchor_alignment == ANCHOR_ALIGNMENT_BOTTOM) { |
- init_params->arrow = base::i18n::IsRTL() ? |
- BubbleBorder::BOTTOM_LEFT : BubbleBorder::BOTTOM_RIGHT; |
- } else if (init_params->anchor_alignment == ANCHOR_ALIGNMENT_TOP) { |
- init_params->arrow = BubbleBorder::TOP_LEFT; |
- } else if (init_params->anchor_alignment == ANCHOR_ALIGNMENT_LEFT) { |
- init_params->arrow = BubbleBorder::LEFT_BOTTOM; |
- } else { |
- init_params->arrow = BubbleBorder::RIGHT_BOTTOM; |
- } |
- } else { |
- init_params->arrow = BubbleBorder::NONE; |
- } |
- |
return new TrayBubbleView(anchor, delegate, *init_params); |
} |
TrayBubbleView::TrayBubbleView(View* anchor, |
Delegate* delegate, |
const InitParams& init_params) |
- : BubbleDialogDelegateView(anchor, init_params.arrow), |
+ : BubbleDialogDelegateView(anchor, |
+ GetArrowAlignment(init_params.anchor_alignment)), |
params_(init_params), |
delegate_(delegate), |
preferred_width_(init_params.min_width), |
- bubble_border_(new TrayBubbleBorder(this, GetAnchorView(), init_params)), |
+ bubble_border_(new BubbleBorder(arrow(), |
+ BubbleBorder::BIG_SHADOW, |
+ init_params.bg_color)), |
owned_bubble_border_(bubble_border_), |
is_gesture_dragging_(false), |
mouse_actively_entered_(false) { |
+ bubble_border_->set_alignment(BubbleBorder::ALIGN_EDGE_TO_ANCHOR_EDGE); |
+ bubble_border_->set_paint_arrow(BubbleBorder::PAINT_NONE); |
set_can_activate(params_.can_activate); |
DCHECK(anchor_widget()); // Computed by BubbleDialogDelegateView(). |
set_notify_enter_exit_on_child(true); |
@@ -342,10 +221,6 @@ TrayBubbleView::~TrayBubbleView() { |
} |
void TrayBubbleView::InitializeAndShowBubble() { |
- // Must occur after call to BubbleDialogDelegateView::CreateBubble(). |
- SetAlignment(params_.arrow_alignment); |
- bubble_border_->UpdateArrowOffset(); |
- |
layer()->parent()->SetMaskLayer(bubble_content_mask_->layer()); |
GetWidget()->Show(); |
@@ -377,12 +252,6 @@ void TrayBubbleView::SetWidth(int width) { |
SizeToContents(); |
} |
-void TrayBubbleView::SetArrowPaintType( |
- views::BubbleBorder::ArrowPaintType paint_type) { |
- bubble_border_->set_paint_arrow(paint_type); |
- UpdateBubble(); |
-} |
- |
gfx::Insets TrayBubbleView::GetBorderInsets() const { |
return bubble_border_->GetInsets(); |
} |
@@ -397,14 +266,6 @@ void TrayBubbleView::Init() { |
SetLayoutManager(layout); |
} |
-gfx::Rect TrayBubbleView::GetAnchorRect() const { |
- if (!delegate_) |
- return gfx::Rect(); |
- return delegate_->GetAnchorRect(anchor_widget(), |
- params_.anchor_type, |
- params_.anchor_alignment); |
-} |
- |
void TrayBubbleView::OnBeforeBubbleWidgetInit(Widget::InitParams* params, |
Widget* bubble_widget) const { |
if (delegate_) |