diff options
author | sadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-13 03:20:00 +0000 |
---|---|---|
committer | sadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-13 03:20:00 +0000 |
commit | e45d882b945b5c3eba1cae47be9446b8149dafec (patch) | |
tree | 888c887efd2d35c7201008c921fbea3e3ad62ae0 /ui | |
parent | e80c0fd597cb8c85a9610b01534e7607ddf5874d (diff) | |
download | chromium_src-e45d882b945b5c3eba1cae47be9446b8149dafec.zip chromium_src-e45d882b945b5c3eba1cae47be9446b8149dafec.tar.gz chromium_src-e45d882b945b5c3eba1cae47be9446b8149dafec.tar.bz2 |
views: Fix touch-scrolling submenus.
Update the views::ScrollDelegate::OnScroll() interface to return
whether the content was scrolled or not. Use this return value to
determine whether to consume touch-scroll events or not.
BUG=141496
Review URL: https://codereview.chromium.org/11442069
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@172801 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui')
-rw-r--r-- | ui/views/animation/scroll_animator.h | 3 | ||||
-rw-r--r-- | ui/views/controls/menu/submenu_view.cc | 11 | ||||
-rw-r--r-- | ui/views/controls/menu/submenu_view.h | 2 | ||||
-rw-r--r-- | ui/views/controls/scrollbar/base_scroll_bar.cc | 22 | ||||
-rw-r--r-- | ui/views/controls/scrollbar/base_scroll_bar.h | 4 |
5 files changed, 25 insertions, 17 deletions
diff --git a/ui/views/animation/scroll_animator.h b/ui/views/animation/scroll_animator.h index 8cc58e4..35e159b 100644 --- a/ui/views/animation/scroll_animator.h +++ b/ui/views/animation/scroll_animator.h @@ -18,7 +18,8 @@ namespace views { class VIEWS_EXPORT ScrollDelegate { public: - virtual void OnScroll(float dx, float dy) = 0; + // Returns true if the content was actually scrolled, false otherwise. + virtual bool OnScroll(float dx, float dy) = 0; protected: ~ScrollDelegate() {} diff --git a/ui/views/controls/menu/submenu_view.cc b/ui/views/controls/menu/submenu_view.cc index 0ace2d1..fe96339 100644 --- a/ui/views/controls/menu/submenu_view.cc +++ b/ui/views/controls/menu/submenu_view.cc @@ -267,7 +267,7 @@ void SubmenuView::OnGestureEvent(ui::GestureEvent* event) { scroll_animator_->Stop(); break; case ui::ET_GESTURE_SCROLL_UPDATE: - OnScroll(0, event->details().scroll_y()); + handled = OnScroll(0, event->details().scroll_y()); break; case ui::ET_GESTURE_SCROLL_END: break; @@ -442,17 +442,20 @@ gfx::Rect SubmenuView::CalculateDropIndicatorBounds( } } -void SubmenuView::OnScroll(float dx, float dy) { +bool SubmenuView::OnScroll(float dx, float dy) { const gfx::Rect& vis_bounds = GetVisibleBounds(); const gfx::Rect& full_bounds = bounds(); int x = vis_bounds.x(); int y = vis_bounds.y() - static_cast<int>(dy); // clamp y to [0, full_height - vis_height) - y = std::max(y, 0); y = std::min(y, full_bounds.height() - vis_bounds.height() - 1); + y = std::max(y, 0); gfx::Rect new_vis_bounds(x, y, vis_bounds.width(), vis_bounds.height()); - if (new_vis_bounds != vis_bounds) + if (new_vis_bounds != vis_bounds) { ScrollRectToVisible(new_vis_bounds); + return true; + } + return false; } } // namespace views diff --git a/ui/views/controls/menu/submenu_view.h b/ui/views/controls/menu/submenu_view.h index a83c5a9a..ae4c0e9 100644 --- a/ui/views/controls/menu/submenu_view.h +++ b/ui/views/controls/menu/submenu_view.h @@ -173,7 +173,7 @@ class VIEWS_EXPORT SubmenuView : public View, MenuDelegate::DropPosition position); // Implementation of ScrollDelegate - virtual void OnScroll(float dx, float dy) OVERRIDE; + virtual bool OnScroll(float dx, float dy) OVERRIDE; // Parent menu item. MenuItemView* parent_menu_item_; diff --git a/ui/views/controls/scrollbar/base_scroll_bar.cc b/ui/views/controls/scrollbar/base_scroll_bar.cc index 6643735..70287d4 100644 --- a/ui/views/controls/scrollbar/base_scroll_bar.cc +++ b/ui/views/controls/scrollbar/base_scroll_bar.cc @@ -99,14 +99,19 @@ void BaseScrollBar::ScrollToThumbPosition(int thumb_position, SchedulePaint(); } -void BaseScrollBar::ScrollByContentsOffset(int contents_offset) { +bool BaseScrollBar::ScrollByContentsOffset(int contents_offset) { + int old_offset = contents_scroll_offset_; contents_scroll_offset_ -= contents_offset; if (contents_scroll_offset_ < GetMinPosition()) { contents_scroll_offset_ = GetMinPosition(); } else if (contents_scroll_offset_ > GetMaxPosition()) { contents_scroll_offset_ = GetMaxPosition(); } + if (old_offset == contents_scroll_offset_) + return false; + ScrollContentsToOffset(); + return true; } /////////////////////////////////////////////////////////////////////////////// @@ -210,9 +215,10 @@ void BaseScrollBar::OnGestureEvent(ui::GestureEvent* event) { } if (event->type() == ui::ET_GESTURE_SCROLL_UPDATE) { - ScrollByContentsOffset(IsHorizontal() ? event->details().scroll_x() : - event->details().scroll_y()); - event->SetHandled(); + if (ScrollByContentsOffset(IsHorizontal() ? event->details().scroll_x() : + event->details().scroll_y())) { + event->SetHandled(); + } return; } @@ -229,11 +235,9 @@ void BaseScrollBar::OnGestureEvent(ui::GestureEvent* event) { /////////////////////////////////////////////////////////////////////////////// // BaseScrollBar, ScrollDelegate implementation: -void BaseScrollBar::OnScroll(float dx, float dy) { - if (IsHorizontal()) - ScrollByContentsOffset(dx); - else - ScrollByContentsOffset(dy); +bool BaseScrollBar::OnScroll(float dx, float dy) { + return IsHorizontal() ? ScrollByContentsOffset(dx) : + ScrollByContentsOffset(dy); } /////////////////////////////////////////////////////////////////////////////// diff --git a/ui/views/controls/scrollbar/base_scroll_bar.h b/ui/views/controls/scrollbar/base_scroll_bar.h index 4621325..94201c4 100644 --- a/ui/views/controls/scrollbar/base_scroll_bar.h +++ b/ui/views/controls/scrollbar/base_scroll_bar.h @@ -55,7 +55,7 @@ class VIEWS_EXPORT BaseScrollBar : public ScrollBar, void ScrollToThumbPosition(int thumb_position, bool scroll_to_middle); // Scroll the contents by the specified offset (contents coordinates). - void ScrollByContentsOffset(int contents_offset); + bool ScrollByContentsOffset(int contents_offset); // View overrides: virtual gfx::Size GetPreferredSize() OVERRIDE = 0; @@ -77,7 +77,7 @@ class VIEWS_EXPORT BaseScrollBar : public ScrollBar, virtual int GetPosition() const OVERRIDE; // ScrollDelegate overrides: - virtual void OnScroll(float dx, float dy) OVERRIDE; + virtual bool OnScroll(float dx, float dy) OVERRIDE; // ContextMenuController overrides: virtual void ShowContextMenuForView(View* source, |