diff options
Diffstat (limited to 'src/ui/listwidget.c')
-rw-r--r-- | src/ui/listwidget.c | 18 |
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 | ||
182 | static int visCount_ListWidget_(const iListWidget *d) { | 182 | void 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 | |||
194 | int 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 | ||