#ifndef UI_VIEWS_BUBBLE_TOOLTIP_ICON_H_
#define UI_VIEWS_BUBBLE_TOOLTIP_ICON_H_
#include <memory>
#include <string>
#include "base/memory/raw_ptr.h"
#include "base/observer_list.h"
#include "base/scoped_observation.h"
#include "base/timer/timer.h"
#include "ui/views/bubble/bubble_border.h"
#include "ui/views/controls/image_view.h"
#include "ui/views/mouse_watcher.h"
#include "ui/views/widget/widget.h"
#include "ui/views/widget/widget_observer.h"
namespace views {
class InfoBubble;
class VIEWS_EXPORT TooltipIcon : public ImageView,
public MouseWatcherListener,
public WidgetObserver {
public:
class Observer : public base::CheckedObserver {
public:
virtual void OnTooltipBubbleShown(TooltipIcon* icon) = 0;
virtual void OnTooltipIconDestroying(TooltipIcon* icon) = 0;
};
METADATA_HEADER(TooltipIcon);
explicit TooltipIcon(const std::u16string& tooltip,
int tooltip_icon_size = 16);
TooltipIcon(const TooltipIcon&) = delete;
TooltipIcon& operator=(const TooltipIcon&) = delete;
~TooltipIcon() override;
void OnMouseEntered(const ui::MouseEvent& event) override;
void OnMouseExited(const ui::MouseEvent& event) override;
bool OnMousePressed(const ui::MouseEvent& event) override;
void OnFocus() override;
void OnBlur() override;
void OnGestureEvent(ui::GestureEvent* event) override;
void OnThemeChanged() override;
void MouseMovedOutOfHost() override;
void OnWidgetDestroyed(Widget* widget) override;
void set_bubble_width(int preferred_width) {
preferred_width_ = preferred_width;
}
void set_anchor_point_arrow(BubbleBorder::Arrow arrow) {
anchor_point_arrow_ = arrow;
}
void AddObserver(Observer* observer);
void RemoveObserver(Observer* observer);
private:
void SetDrawAsHovered(bool hovered);
void ShowBubble();
void HideBubble();
std::u16string tooltip_;
int tooltip_icon_size_;
BubbleBorder::Arrow anchor_point_arrow_ = BubbleBorder::TOP_RIGHT;
bool mouse_inside_ = false;
raw_ptr<InfoBubble> bubble_;
int preferred_width_ = 0;
base::OneShotTimer show_timer_;
std::unique_ptr<MouseWatcher> mouse_watcher_;
base::ScopedObservation<Widget, WidgetObserver> observation_{this};
base::ObserverList<Observer, true> observers_;
};
}
#endif