Chromium Code Reviews| Index: ash/magnifier/magnification_controller.cc |
| diff --git a/ash/magnifier/magnification_controller.cc b/ash/magnifier/magnification_controller.cc |
| index f43154f1026c7e90e30943086e894b15b6f71ea6..786e9182a126fdd7db7288d6642fcb0af62c3ae6 100644 |
| --- a/ash/magnifier/magnification_controller.cc |
| +++ b/ash/magnifier/magnification_controller.cc |
| @@ -11,6 +11,7 @@ |
| #include "ash/host/ash_window_tree_host.h" |
| #include "ash/host/root_window_transformer.h" |
| #include "ash/root_window_controller.h" |
| +#include "ash/screen_util.h" |
| #include "ash/shell.h" |
| #include "ash/system/tray/system_tray_delegate.h" |
| #include "base/command_line.h" |
| @@ -88,6 +89,10 @@ class MagnificationControllerImpl : virtual public MagnificationController, |
| return gfx::ToFlooredPoint(origin_); |
| } |
| void SetScrollDirection(ScrollDirection direction) override; |
| + gfx::Rect GetViewportRect() override; |
| + void HandleFocusedNodeChanged( |
| + bool is_editable_node, |
| + const gfx::Rect& node_bounds_in_screen) override; |
| // For test |
| gfx::Point GetPointOfInterestForTesting() override { |
| @@ -145,7 +150,7 @@ class MagnificationControllerImpl : virtual public MagnificationController, |
| // Returns the size of the root window. |
| gfx::Size GetHostSizeDIP() const; |
| - // Correct the givin scale value if nessesary. |
| + // Correct the given scale value if necessary. |
| void ValidateScale(float* scale); |
| // ui::EventHandler overrides: |
| @@ -158,11 +163,15 @@ class MagnificationControllerImpl : virtual public MagnificationController, |
| // window region. The view port will be moved so that the |point| will be |
| // moved to the point where it has |x_target_margin| and |y_target_margin| |
| // to the edge of the visible region. |
| - void MoveMagnifierWindow(const gfx::Point& point, |
| - int x_panning_margin, |
| - int y_panning_margin, |
| - int x_target_margin, |
| - int y_target_margin); |
| + void MoveMagnifierWindowFollowPoint(const gfx::Point& point, |
| + int x_panning_margin, |
| + int y_panning_margin, |
| + int x_target_margin, |
| + int y_target_margin); |
| + |
| + // Moves the view port to follow |rect|, if |rect| is partially or completely |
|
oshima
2014/12/12 00:48:44
Move the viewport so that rect is fully visible. (
jennyz
2014/12/12 23:14:44
Done.
|
| + // outside of the view port. |
| + void MoveMaginifierWindowFollowRect(const gfx::Rect& rect); |
| // ui::InputMethodObserver: |
| void OnTextInputTypeChanged(const ui::TextInputClient* client) override {} |
| @@ -353,7 +362,26 @@ void MagnificationControllerImpl::OnMouseMove(const gfx::Point& location) { |
| gfx::Point mouse(location); |
| int margin = kPanningMergin / scale_; // No need to consider DPI. |
| - MoveMagnifierWindow(mouse, margin, margin, margin, margin); |
| + MoveMagnifierWindowFollowPoint(mouse, margin, margin, margin, margin); |
| +} |
| + |
| +gfx::Rect MagnificationControllerImpl::GetViewportRect() { |
| + return gfx::ToEnclosingRect(GetWindowRectDIP(scale_)); |
| +} |
| + |
| +void MagnificationControllerImpl::HandleFocusedNodeChanged( |
| + bool is_editable_node, |
| + const gfx::Rect& node_bounds_in_screen) { |
| + // The editable node is handled by OnCaretBoundsChanged. |
| + if (is_editable_node) |
| + return; |
| + |
| + gfx::Rect node_bounds_in_root = |
| + ScreenUtil::ConvertRectFromScreen(root_window_, node_bounds_in_screen); |
| + if (GetViewportRect().Contains(node_bounds_in_root)) |
| + return; |
| + |
| + MoveMaginifierWindowFollowRect(node_bounds_in_root); |
| } |
| void MagnificationControllerImpl::AfterAnimationMoveCursorTo( |
| @@ -597,17 +625,16 @@ void MagnificationControllerImpl::OnTouchEvent(ui::TouchEvent* event) { |
| } |
| } |
| -void MagnificationControllerImpl::MoveMagnifierWindow(const gfx::Point& point, |
| - int x_panning_margin, |
| - int y_panning_margin, |
| - int x_target_margin, |
| - int y_target_margin) { |
| +void MagnificationControllerImpl::MoveMagnifierWindowFollowPoint( |
| + const gfx::Point& point, |
| + int x_panning_margin, |
| + int y_panning_margin, |
| + int x_target_margin, |
| + int y_target_margin) { |
| DCHECK(root_window_); |
| - int x = origin_.x(); |
| - int y = origin_.y(); |
| bool start_zoom = false; |
| - const gfx::Rect window_rect = gfx::ToEnclosingRect(GetWindowRectDIP(scale_)); |
| + const gfx::Rect window_rect = GetViewportRect(); |
| const int left = window_rect.x(); |
| const int right = window_rect.right(); |
| @@ -621,7 +648,7 @@ void MagnificationControllerImpl::MoveMagnifierWindow(const gfx::Point& point, |
| x_diff = point.x() - (right - x_target_margin); |
| start_zoom = true; |
| } |
| - x = left + x_diff; |
| + int x = left + x_diff; |
| const int top = window_rect.y(); |
| const int bottom = window_rect.bottom(); |
| @@ -636,7 +663,7 @@ void MagnificationControllerImpl::MoveMagnifierWindow(const gfx::Point& point, |
| y_diff = point.y() - (bottom - y_target_margin); |
| start_zoom = true; |
| } |
| - y = top + y_diff; |
| + int y = top + y_diff; |
| if (start_zoom && !is_on_animation_) { |
| // No animation on panning. |
| bool animate = false; |
| @@ -650,6 +677,41 @@ void MagnificationControllerImpl::MoveMagnifierWindow(const gfx::Point& point, |
| } |
| } |
| +void MagnificationControllerImpl::MoveMaginifierWindowFollowRect( |
| + const gfx::Rect& rect) { |
| + DCHECK(root_window_); |
| + bool start_zoom = false; |
|
oshima
2014/12/12 00:48:45
shouldn't this be called "should_pan/should_scroll
jennyz
2014/12/12 23:14:44
Done.
|
| + |
| + const gfx::Rect window_rect = GetViewportRect(); |
|
oshima
2014/12/12 00:48:45
viewport_rect
jennyz
2014/12/12 23:14:45
Done.
|
| + const int left = window_rect.x(); |
| + const int right = window_rect.right(); |
| + const gfx::Point rect_center = rect.CenterPoint(); |
| + const gfx::Point window_center = window_rect.CenterPoint(); |
| + |
| + int x_diff = 0; |
| + if (rect.x() < left || right < rect.right()) { |
| + // Panning horizontally. |
| + x_diff = rect_center.x() - window_center.x(); |
|
oshima
2014/12/12 00:48:45
I didn't fully understand why this is using center
jennyz
2014/12/12 23:14:44
For the non-editable control, we move the viewport
oshima
2014/12/12 23:23:43
ok, so x can just be
rect_center.x() - window_rec
jennyz
2014/12/13 00:09:30
Done.
|
| + start_zoom = true; |
| + } |
| + int x = left + x_diff; |
| + |
| + const int top = window_rect.y(); |
| + const int bottom = window_rect.bottom(); |
| + |
| + int y_diff = 0; |
| + if (rect.y() < top || bottom < rect.bottom()) { |
| + // Panning vertically. |
| + y_diff = rect_center.y() - window_center.y(); |
|
oshima
2014/12/12 23:23:43
ditto
|
| + start_zoom = true; |
| + } |
| + int y = top + y_diff; |
| + |
| + if (start_zoom && !is_on_animation_) { |
|
oshima
2014/12/12 00:48:45
shouldn't we stop the current animation, and pan?
jennyz
2014/12/12 23:14:45
Done.
|
| + RedrawDIP(gfx::Point(x, y), scale_, false); // No animation on panning. |
| + } |
| +} |
| + |
| void MagnificationControllerImpl::OnCaretBoundsChanged( |
| const ui::TextInputClient* client) { |
| // caret bounds in screen coordinates. |
| @@ -667,15 +729,12 @@ void MagnificationControllerImpl::OnCaretBoundsChanged( |
| wm::ConvertPointFromScreen(root_window_, &caret_origin); |
| // Visible window_rect in |root_window_| coordinates. |
| - const gfx::Rect visible_window_rect = |
| - gfx::ToEnclosingRect(GetWindowRectDIP(scale_)); |
| + const gfx::Rect visible_window_rect = GetViewportRect(); |
| const int panning_margin = kCaretPanningMargin / scale_; |
| - MoveMagnifierWindow(caret_origin, |
| - panning_margin, |
| - panning_margin, |
| - visible_window_rect.width() / 2, |
| - visible_window_rect.height() / 2); |
| + MoveMagnifierWindowFollowPoint(caret_origin, panning_margin, panning_margin, |
| + visible_window_rect.width() / 2, |
| + visible_window_rect.height() / 2); |
| } |
| //////////////////////////////////////////////////////////////////////////////// |