0x004C8898 regs.bp: deltaY
| 50 | // 0x004C8898 |
| 51 | // regs.bp: deltaY |
| 52 | static void verticalFollow(Ui::Window& window, Ui::Widget* const widget, const WidgetIndex_t widgetIndex, const size_t scrollIndex, const int16_t deltaY) |
| 53 | { |
| 54 | ScrollArea& scrollArea = window.scrollAreas[scrollIndex]; |
| 55 | scrollArea.flags |= ScrollFlags::vscrollbarThumbPressed; |
| 56 | |
| 57 | uint16_t trackHeight = widget->height() - (kThumbSize * 2); |
| 58 | if (scrollArea.hasFlags(ScrollFlags::hscrollbarVisible)) |
| 59 | { |
| 60 | trackHeight -= kScrollbarSize; |
| 61 | } |
| 62 | |
| 63 | if (trackHeight == 0) |
| 64 | { |
| 65 | return; |
| 66 | } |
| 67 | auto contentDeltaY = deltaY * scrollArea.contentHeight / trackHeight; |
| 68 | |
| 69 | int16_t newOffset = scrollArea.contentOffsetY + contentDeltaY; |
| 70 | |
| 71 | int frameHeight = widget->height() - (kScrollbarMargin * 2); |
| 72 | if (scrollArea.hasFlags(ScrollFlags::hscrollbarVisible)) |
| 73 | { |
| 74 | frameHeight -= kScrollbarSize; |
| 75 | } |
| 76 | |
| 77 | int16_t maxOffset = scrollArea.contentHeight - frameHeight; |
| 78 | maxOffset = std::max<int16_t>(maxOffset, 0); |
| 79 | |
| 80 | scrollArea.contentOffsetY = std::clamp<int16_t>(newOffset, 0, maxOffset); |
| 81 | |
| 82 | ScrollView::updateThumbs(window, widgetIndex); |
| 83 | WindowManager::invalidateWidget(window.type, window.number, widgetIndex); |
| 84 | } |
| 85 | |
| 86 | // 0x004C8CFD |
| 87 | // regs.bp: deltaX |
no test coverage detected