MCPcopy Create free account
hub / github.com/OpenLoco/OpenLoco / horizontalDragFollow

Function horizontalDragFollow

src/OpenLoco/src/Ui/ScrollView.cpp:88–123  ·  view source on GitHub ↗

0x004C8CFD regs.bp: deltaX

Source from the content-addressed store, hash-verified

86 // 0x004C8CFD
87 // regs.bp: deltaX
88 void horizontalDragFollow(Ui::Window& window, Ui::Widget* const widget, const WidgetIndex_t dragWidgetIndex, const size_t dragScrollIndex, const int16_t deltaX)
89 {
90 ScrollArea& scrollArea = window.scrollAreas[dragScrollIndex];
91 if (!scrollArea.hasFlags(ScrollFlags::hscrollbarVisible))
92 {
93 return;
94 }
95
96 uint16_t trackWidth = widget->width() - 2 - kThumbSize - kThumbSize;
97 if (scrollArea.hasFlags(ScrollFlags::vscrollbarVisible))
98 {
99 trackWidth -= kScrollbarSize;
100 }
101
102 if (trackWidth == 0)
103 {
104 return;
105 }
106 auto contentDeltaX = deltaX * scrollArea.contentWidth / trackWidth;
107
108 int16_t newOffset = scrollArea.contentOffsetX + contentDeltaX;
109
110 int frameWidth = widget->width() - 2;
111 if (scrollArea.hasFlags(ScrollFlags::vscrollbarVisible))
112 {
113 frameWidth -= kScrollbarSize;
114 }
115
116 int16_t maxOffset = scrollArea.contentWidth - frameWidth;
117 maxOffset = std::max<int16_t>(maxOffset, 0);
118
119 scrollArea.contentOffsetX = std::clamp<int16_t>(newOffset, 0, maxOffset);
120
121 ScrollView::updateThumbs(window, dragWidgetIndex);
122 WindowManager::invalidateWidget(window.type, window.number, dragWidgetIndex);
123 }
124
125 // 0x004C8E2E
126 // regs.bp: deltaY

Callers 1

stateScrollRightFunction · 0.85

Calls 4

updateThumbsFunction · 0.85
invalidateWidgetFunction · 0.85
hasFlagsMethod · 0.45
widthMethod · 0.45

Tested by

no test coverage detected