summaryrefslogtreecommitdiff
path: root/src/ui/listwidget.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/listwidget.c')
-rw-r--r--src/ui/listwidget.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/src/ui/listwidget.c b/src/ui/listwidget.c
index 06689023..3e7203b8 100644
--- a/src/ui/listwidget.c
+++ b/src/ui/listwidget.c
@@ -179,8 +179,20 @@ void scrollOffset_ListWidget(iListWidget *d, int offset) {
179 } 179 }
180} 180}
181 181
182static int visCount_ListWidget_(const iListWidget *d) { 182void scrollToItem_ListWidget(iListWidget *d, size_t index) {
183 return iMin(height_Rect(innerBounds_Widget(constAs_Widget(d))) / d->itemHeight + 2, 183 const iRect rect = innerBounds_Widget(as_Widget(d));
184 int yTop = d->itemHeight * index - d->scrollY;
185 int yBottom = yTop + d->itemHeight;
186 if (yBottom > height_Rect(rect)) {
187 scrollOffset_ListWidget(d, yBottom - height_Rect(rect));
188 }
189 else if (yTop < 0) {
190 scrollOffset_ListWidget(d, yTop);
191 }
192}
193
194int visCount_ListWidget(const iListWidget *d) {
195 return iMin(height_Rect(innerBounds_Widget(constAs_Widget(d))) / d->itemHeight,
184 (int) size_PtrArray(&d->items)); 196 (int) size_PtrArray(&d->items));
185} 197}
186 198
@@ -189,7 +201,7 @@ static iRanges visRange_ListWidget_(const iListWidget *d) {
189 return (iRanges){ 0, 0 }; 201 return (iRanges){ 0, 0 };
190 } 202 }
191 iRanges vis = { d->scrollY / d->itemHeight, 0 }; 203 iRanges vis = { d->scrollY / d->itemHeight, 0 };
192 vis.end = iMin(size_PtrArray(&d->items), vis.start + visCount_ListWidget_(d)); 204 vis.end = iMin(size_PtrArray(&d->items), vis.start + visCount_ListWidget(d) + 1);
193 return vis; 205 return vis;
194} 206}
195 207