diff options
Diffstat (limited to 'src/ui/lookupwidget.c')
-rw-r--r-- | src/ui/lookupwidget.c | 38 |
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 | ||
379 | static 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 | |||
378 | static iBool processEvent_LookupWidget_(iLookupWidget *d, const SDL_Event *ev) { | 394 | static 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); |