summaryrefslogtreecommitdiff
path: root/src/ui/lookupwidget.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/lookupwidget.c')
-rw-r--r--src/ui/lookupwidget.c38
1 files changed, 22 insertions, 16 deletions
diff --git a/src/ui/lookupwidget.c b/src/ui/lookupwidget.c
index fbb5d365..c1c52708 100644
--- a/src/ui/lookupwidget.c
+++ b/src/ui/lookupwidget.c
@@ -372,9 +372,25 @@ static void setCursor_LookupWidget_(iLookupWidget *d, size_t index) {
372 item->listItem.isSelected = iTrue; 372 item->listItem.isSelected = iTrue;
373 invalidateItem_ListWidget(d->list, d->cursor); 373 invalidateItem_ListWidget(d->list, d->cursor);
374 } 374 }
375 scrollToItem_ListWidget(d->list, d->cursor);
375 } 376 }
376} 377}
377 378
379static iBool moveCursor_LookupWidget_(iLookupWidget *d, int delta) {
380 const int dir = iSign(delta);
381 size_t cur = d->cursor;
382 size_t good = cur;
383 while (delta && ((dir < 0 && cur > 0) || (dir > 0 && cur < numItems_ListWidget(d->list) - 1))) {
384 cur += dir;
385 if (!item_LookupWidget_(d, cur)->listItem.isSeparator) {
386 delta -= dir;
387 good = cur;
388 }
389 }
390 setCursor_LookupWidget_(d, good);
391 return delta == 0;
392}
393
378static iBool processEvent_LookupWidget_(iLookupWidget *d, const SDL_Event *ev) { 394static iBool processEvent_LookupWidget_(iLookupWidget *d, const SDL_Event *ev) {
379 iWidget *w = as_Widget(d); 395 iWidget *w = as_Widget(d);
380 const char *cmd = command_UserEvent(ev); 396 const char *cmd = command_UserEvent(ev);
@@ -431,29 +447,19 @@ static iBool processEvent_LookupWidget_(iLookupWidget *d, const SDL_Event *ev) {
431 setFocus_Widget(url); 447 setFocus_Widget(url);
432 return iTrue; 448 return iTrue;
433 case SDLK_UP: 449 case SDLK_UP:
434 for (;;) { 450 if (!moveCursor_LookupWidget_(d, -1)) {
435 if (d->cursor == 0) { 451 setCursor_LookupWidget_(d, iInvalidPos);
436 setCursor_LookupWidget_(d, iInvalidPos); 452 setFocus_Widget(url);
437 setFocus_Widget(url);
438 break;
439 }
440 setCursor_LookupWidget_(d, d->cursor - 1);
441 if (!item_LookupWidget_(d, d->cursor)->listItem.isSeparator) {
442 break;
443 }
444 } 453 }
445 return iTrue; 454 return iTrue;
446 case SDLK_DOWN: 455 case SDLK_DOWN:
447 while (d->cursor < numItems_ListWidget(d->list) - 1) { 456 moveCursor_LookupWidget_(d, +1);
448 setCursor_LookupWidget_(d, d->cursor + 1);
449 if (!item_LookupWidget_(d, d->cursor)->listItem.isSeparator) {
450 break;
451 }
452 }
453 return iTrue; 457 return iTrue;
454 case SDLK_PAGEUP: 458 case SDLK_PAGEUP:
459 moveCursor_LookupWidget_(d, -visCount_ListWidget(d->list) + 1);
455 return iTrue; 460 return iTrue;
456 case SDLK_PAGEDOWN: 461 case SDLK_PAGEDOWN:
462 moveCursor_LookupWidget_(d, visCount_ListWidget(d->list) - 1);
457 return iTrue; 463 return iTrue;
458 case SDLK_HOME: 464 case SDLK_HOME:
459 setCursor_LookupWidget_(d, 1); 465 setCursor_LookupWidget_(d, 1);