Chromium Code Reviews| Index: ui/views/widget/tooltip_manager_aura.cc |
| diff --git a/ui/views/widget/tooltip_manager_aura.cc b/ui/views/widget/tooltip_manager_aura.cc |
| index 986ea5d28680579208797a3cf42e3df838de4d4b..47f6e9b90dee7bdc992e3621b0a33b32adc67ef0 100644 |
| --- a/ui/views/widget/tooltip_manager_aura.cc |
| +++ b/ui/views/widget/tooltip_manager_aura.cc |
| @@ -11,6 +11,7 @@ |
| #include "ui/base/resource/resource_bundle.h" |
| #include "ui/gfx/rect.h" |
| #include "ui/gfx/screen.h" |
| +#include "ui/views/view.h" |
| #include "ui/views/widget/widget.h" |
| #include "ui/wm/public/tooltip_client.h" |
| @@ -26,7 +27,8 @@ int TooltipManager::GetTooltipHeight() { |
| //////////////////////////////////////////////////////////////////////////////// |
| // TooltipManagerAura public: |
| -TooltipManagerAura::TooltipManagerAura(Widget* widget) : widget_(widget) { |
| +TooltipManagerAura::TooltipManagerAura(Widget* widget) |
| + : widget_(widget) { |
| aura::client::SetTooltipText(GetWindow(), &tooltip_text_); |
| } |
| @@ -122,6 +124,7 @@ View* TooltipManagerAura::GetViewUnderPoint(const gfx::Point& point) { |
| void TooltipManagerAura::UpdateTooltipForTarget(View* target, |
| const gfx::Point& point, |
| aura::Window* root_window) { |
| + bool related = false; |
| if (target) { |
| gfx::Point view_point = point; |
| View::ConvertPointFromWidget(target, &view_point); |
| @@ -130,10 +133,31 @@ void TooltipManagerAura::UpdateTooltipForTarget(View* target, |
| tooltip_text_.clear(); |
| else |
| tooltip_text_ = new_tooltip_text; |
| + |
| + gfx::Point target_rect_origin_in_screen; |
|
sky
2014/04/10 16:12:08
This is a pain for each site to have to deal with.
|
| + views::View::ConvertPointToScreen(target, &target_rect_origin_in_screen); |
| + |
| + gfx::Rect target_rect_in_screen( |
| + target_rect_origin_in_screen, target->bounds().size()); |
| + |
| + const bool bounds_different = |
| + target_rect_in_screen != origin_bounds_; |
| + const bool target_contains_origin = |
| + target_rect_in_screen.Contains(origin_bounds_); |
| + const bool origin_contains_target = |
| + origin_bounds_.Contains(target_rect_in_screen); |
| + |
| + related = |
| + !bounds_different || target_contains_origin || origin_contains_target; |
| + |
| + origin_bounds_ = target_rect_in_screen; |
| } else { |
| tooltip_text_.clear(); |
| + origin_bounds_ = gfx::Rect(); |
| } |
| - aura::client::GetTooltipClient(root_window)->UpdateTooltip(GetWindow()); |
| + |
| + aura::client::GetTooltipClient(root_window) |
| + ->UpdateTooltip(GetWindow(), !related); |
| } |
| aura::Window* TooltipManagerAura::GetWindow() { |