summaryrefslogtreecommitdiffstats
path: root/ui
diff options
context:
space:
mode:
authorsadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-13 03:20:00 +0000
committersadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-13 03:20:00 +0000
commite45d882b945b5c3eba1cae47be9446b8149dafec (patch)
tree888c887efd2d35c7201008c921fbea3e3ad62ae0 /ui
parente80c0fd597cb8c85a9610b01534e7607ddf5874d (diff)
downloadchromium_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.h3
-rw-r--r--ui/views/controls/menu/submenu_view.cc11
-rw-r--r--ui/views/controls/menu/submenu_view.h2
-rw-r--r--ui/views/controls/scrollbar/base_scroll_bar.cc22
-rw-r--r--ui/views/controls/scrollbar/base_scroll_bar.h4
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,