Chromium Code Reviews| Index: chrome/browser/ui/views/location_bar/icon_label_bubble_view.h |
| diff --git a/chrome/browser/ui/views/location_bar/icon_label_bubble_view.h b/chrome/browser/ui/views/location_bar/icon_label_bubble_view.h |
| index 7b5d37e0dfeb9b652ca2ef4b191108c954cc60d9..52de44c6e473b78ab7256a34a6edd0a5f1c77db4 100644 |
| --- a/chrome/browser/ui/views/location_bar/icon_label_bubble_view.h |
| +++ b/chrome/browser/ui/views/location_bar/icon_label_bubble_view.h |
| @@ -9,32 +9,40 @@ |
| #include "base/macros.h" |
| #include "base/strings/string16.h" |
| +#include "ui/compositor/layer_animation_observer.h" |
| #include "ui/gfx/geometry/insets.h" |
| #include "ui/gfx/geometry/size.h" |
| #include "ui/views/animation/ink_drop_host_view.h" |
| +#include "ui/views/animation/ink_drop_observer.h" |
| +#include "ui/views/controls/button/custom_button.h" |
| #include "ui/views/controls/label.h" |
| +#include "ui/views/widget/widget_observer.h" |
| namespace gfx { |
| -class Canvas; |
| class FontList; |
| class ImageSkia; |
| } |
| namespace views { |
| class ImageView; |
| -class Label; |
| +class InkDropContainerView; |
| } |
| // View used to draw a bubble, containing an icon and a label. We use this as a |
| // base for the classes that handle the location icon (including the EV bubble), |
| // tab-to-search UI, and content settings. |
| -class IconLabelBubbleView : public views::InkDropHostView { |
| +class IconLabelBubbleView : public views::InkDropObserver, |
| + public views::CustomButton, |
| + public views::WidgetObserver { |
| public: |
| static constexpr int kTrailingPaddingPreMd = 2; |
| IconLabelBubbleView(const gfx::FontList& font_list, bool elide_in_middle); |
| ~IconLabelBubbleView() override; |
| + // views::InkDropObserver: |
| + void InkDropAnimationStarted() override; |
| + |
| void SetLabel(const base::string16& label); |
| void SetImage(const gfx::ImageSkia& image); |
| @@ -48,6 +56,9 @@ class IconLabelBubbleView : public views::InkDropHostView { |
| const views::ImageView* image() const { return image_; } |
| views::Label* label() { return label_; } |
| const views::Label* label() const { return label_; } |
| + const views::InkDropContainerView* ink_drop_container() const { |
| + return ink_drop_container_; |
| + } |
| void set_next_element_interior_padding(int padding) { |
| next_element_interior_padding_ = padding; |
| @@ -67,30 +78,73 @@ class IconLabelBubbleView : public views::InkDropHostView { |
| // Returns true when animation is in progress and is shrinking. |
| virtual bool IsShrinking() const; |
| - // The view has been activated by a user gesture such as spacebar. Returns |
| - // true if some handling was performed. |
| - virtual bool OnActivate(const ui::Event& event); |
| + // Returns true if a bubble was shown. |
| + virtual bool ShowBubble(const ui::Event& event); |
| + |
| + // Returns true if the bubble anchored to the icon is shown. This is to |
| + // prevent the bubble from reshowing on a mouse release. |
| + virtual bool IsBubbleShown() const; |
|
sky
2017/05/12 13:11:48
IsBubbleShowing()
spqchan
2017/05/18 01:13:05
Done.
|
| // views::InkDropHostView: |
| gfx::Size GetPreferredSize() const override; |
| void Layout() override; |
| + bool OnMousePressed(const ui::MouseEvent& event) override; |
| bool OnKeyPressed(const ui::KeyEvent& event) override; |
| bool OnKeyReleased(const ui::KeyEvent& event) override; |
| void GetAccessibleNodeData(ui::AXNodeData* node_data) override; |
| + void OnBoundsChanged(const gfx::Rect& previous_bounds) override; |
| void OnNativeThemeChanged(const ui::NativeTheme* native_theme) override; |
| void AddInkDropLayer(ui::Layer* ink_drop_layer) override; |
| void RemoveInkDropLayer(ui::Layer* ink_drop_layer) override; |
| + std::unique_ptr<views::InkDrop> CreateInkDrop() override; |
| std::unique_ptr<views::InkDropHighlight> CreateInkDropHighlight() |
| const override; |
| + std::unique_ptr<views::InkDropRipple> CreateInkDropRipple() const override; |
| SkColor GetInkDropBaseColor() const override; |
| + // views::CustomButton: |
| + bool IsTriggerableEvent(const ui::Event& event) override; |
| + bool ShouldUpdateInkDropOnClickCanceled() const override; |
| + void NotifyClick(const ui::Event& event) override; |
| + |
| + // views::WidgetObserver: |
| + void OnWidgetDestroying(views::Widget* widget) override; |
| + void OnWidgetVisibilityChanged(views::Widget* widget, bool visible) override; |
| + |
| const gfx::FontList& font_list() const { return label_->font_list(); } |
| SkColor GetParentBackgroundColor() const; |
| gfx::Size GetSizeForLabelWidth(int label_width) const; |
| + // Returns the maximum size for the label width. The value ignores |
| + // WidthMultiplier(). |
| + gfx::Size GetMaxSizeForLabelWidth(int label_width) const; |
| + |
| private: |
| + // A view that draws the separator. |
| + class SeparatorView : public views::View, |
| + public ui::ImplicitAnimationObserver { |
| + public: |
| + explicit SeparatorView(IconLabelBubbleView* owner); |
| + |
| + // views::View: |
| + void OnPaint(gfx::Canvas* canvas) override; |
| + bool CanProcessEventsWithinSubtree() const override; |
| + |
| + // ui::ImplicitAnimationObserver: |
| + void OnImplicitAnimationsCompleted() override; |
| + |
| + // Updates the opacity based on the ink drop's state. |
| + void UpdateOpacity(); |
| + |
| + private: |
| + // Weak. |
| + IconLabelBubbleView* owner_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(SeparatorView); |
| + }; |
| + |
| // Amount of padding from the leading edge of the view to the leading edge of |
| // the image, and from the trailing edge of the label (or image, if the label |
| // is invisible) to the trailing edge of the view. |
| @@ -104,19 +158,30 @@ class IconLabelBubbleView : public views::InkDropHostView { |
| float GetScaleFactor() const; |
| + // The view has been activated by a user gesture such as spacebar. |
| + // Returns true if some handling was performed. |
| + bool OnActivate(const ui::Event& event); |
| + |
| // views::View: |
| const char* GetClassName() const override; |
| - void OnPaint(gfx::Canvas* canvas) override; |
| // The contents of the bubble. |
| views::ImageView* image_; |
| views::Label* label_; |
| + views::InkDropContainerView* ink_drop_container_; |
| + std::unique_ptr<SeparatorView> separator_view_; |
|
sky
2017/05/12 13:11:48
Why do you use a unique_ptr for SeparatorView but
spqchan
2017/05/18 01:13:05
Removed unique_ptr
|
| // The padding of the element that will be displayed after |this|. This value |
| // is relevant for calculating the amount of space to reserve after the |
| // separator. |
| int next_element_interior_padding_ = 0; |
| + // This is used to check if the bubble was showing in the last mouse press |
| + // event. If this is true then the IsTriggerableEvent() will return false to |
|
sky
2017/05/12 13:11:48
Remove 'the' or add 'function' before 'will'.
spqchan
2017/05/18 01:13:05
Done.
|
| + // prevent the bubble from reshowing. This flag is necessary because the |
| + // bubble gets dismissed before the button handles the mouse release event. |
| + bool suppress_button_release_; |
|
sky
2017/05/12 13:11:48
Is there test coverage of this? By that I mean a t
spqchan
2017/05/18 01:13:05
Done. Added in the unit test
|
| + |
| DISALLOW_COPY_AND_ASSIGN(IconLabelBubbleView); |
| }; |