diff --git a/radio/src/thirdparty/libopenui/src/window.cpp b/radio/src/thirdparty/libopenui/src/window.cpp index f5022b4df..3bd69c198 100644 --- a/radio/src/thirdparty/libopenui/src/window.cpp +++ b/radio/src/thirdparty/libopenui/src/window.cpp @@ -338,6 +338,27 @@ void Window::paintChildren(BitmapBuffer * dc, std::list::iterator it) } } +#if defined(HARDWARE_TOUCH) +coord_t Window::getSnapStep(coord_t relativeScrollPosition, coord_t pageSize) +{ + coord_t result = 0; + if (relativeScrollPosition > pageSize / 2) { + // closer to next page + result = (pageSize - relativeScrollPosition); + } + else { + // closer to previous page + result = (0 - relativeScrollPosition); + } + + // do not get too slow + if (abs(result) > 32) + result /= 2; + + return result; +} +#endif + void Window::checkEvents() { auto copy = children; @@ -361,18 +382,15 @@ void Window::checkEvents() #if defined(HARDWARE_TOUCH) if (touchState.event != TE_SLIDE && touchState.lastDeltaX == 0 && touchState.lastDeltaY == 0) { if (pageWidth) { - coord_t relativeScrollPosition = scrollPositionX % pageWidth; + coord_t relativeScrollPosition = getScrollPositionX() % pageWidth; if (relativeScrollPosition) { - setScrollPositionX(getScrollPositionX() - relativeScrollPosition + (relativeScrollPosition > pageWidth / 2 ? pageWidth : 0)); + setScrollPositionX(getScrollPositionX() + getSnapStep(relativeScrollPosition, pageWidth)); } } if (pageHeight) { - coord_t relativeScrollPosition = scrollPositionY % pageHeight; + coord_t relativeScrollPosition = getScrollPositionY() % pageHeight; if (relativeScrollPosition) { - if (relativeScrollPosition > 0) - setScrollPositionY(getScrollPositionY() - relativeScrollPosition + (relativeScrollPosition > pageHeight / 2 ? pageHeight : 0)); - else - setScrollPositionY(getScrollPositionY() - relativeScrollPosition - (relativeScrollPosition > -pageHeight / 2 ? 0 : pageHeight)); + setScrollPositionY(getScrollPositionY() + getSnapStep(relativeScrollPosition, pageHeight)); } } } diff --git a/radio/src/thirdparty/libopenui/src/window.h b/radio/src/thirdparty/libopenui/src/window.h index b77972104..0afe516f1 100644 --- a/radio/src/thirdparty/libopenui/src/window.h +++ b/radio/src/thirdparty/libopenui/src/window.h @@ -427,6 +427,8 @@ class Window } #if defined(HARDWARE_TOUCH) + static coord_t getSnapStep(coord_t relativeScrollPosition, coord_t pageSize); + virtual bool onTouchStart(coord_t x, coord_t y); virtual bool onTouchEnd(coord_t x, coord_t y);