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 5d7f5f9c95636f78f16e45ce0c143fe32ca7db3e..fe7d6d501086e2185868983c3e6ca20431ac9f28 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,70 @@ 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 IsBubbleShowing() const; |
// views::InkDropHostView: |
gfx::Size GetPreferredSize() const override; |
void Layout() override; |
- bool OnKeyPressed(const ui::KeyEvent& event) override; |
- bool OnKeyReleased(const ui::KeyEvent& event) override; |
+ bool OnMousePressed(const ui::MouseEvent& 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; |
+ |
+ // 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. |
@@ -107,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_; |
+ SeparatorView* separator_view_; |
// 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 IsTriggerableEvent() will return false to |
+ // 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_; |
+ |
DISALLOW_COPY_AND_ASSIGN(IconLabelBubbleView); |
}; |