diff options
Diffstat (limited to 'thumbs.c')
-rw-r--r-- | thumbs.c | 44 |
1 files changed, 36 insertions, 8 deletions
@@ -88,21 +88,27 @@ void tns_load(tns_t *tns, win_t *win, const char *filename) { } void tns_check_view(tns_t *tns, Bool scrolled) { + int r; + if (!tns) return; tns->first -= tns->first % tns->cols; + r = fileidx % tns->cols; if (scrolled) { /* move selection into visible area */ + if (fileidx >= tns->first + tns->cols * tns->rows) + fileidx = tns->first + r + tns->cols * (tns->rows - 1); + else if (fileidx < tns->first) + fileidx = tns->first + r; } else { /* scroll to selection */ if (tns->first + tns->cols * tns->rows <= fileidx) { - tns->first = fileidx - fileidx % tns->cols - - tns->cols * (tns->rows - 1); + tns->first = fileidx - r - tns->cols * (tns->rows - 1); tns->dirty = 1; } else if (tns->first > fileidx) { - tns->first = fileidx - fileidx % tns->cols; + tns->first = fileidx - r; tns->dirty = 1; } } @@ -167,7 +173,7 @@ void tns_highlight(tns_t *tns, win_t *win, int n, Bool hl) { win_draw(win); } -int tns_move_selection(tns_t *tns, win_t *win, movedir_t dir) { +int tns_move_selection(tns_t *tns, win_t *win, tnsdir_t dir) { int old; if (!tns || !win) @@ -176,19 +182,19 @@ int tns_move_selection(tns_t *tns, win_t *win, movedir_t dir) { old = fileidx; switch (dir) { - case MOVE_LEFT: + case TNS_LEFT: if (fileidx > 0) --fileidx; break; - case MOVE_RIGHT: + case TNS_RIGHT: if (fileidx < tns->cnt - 1) ++fileidx; break; - case MOVE_UP: + case TNS_UP: if (fileidx >= tns->cols) fileidx -= tns->cols; break; - case MOVE_DOWN: + case TNS_DOWN: if (fileidx + tns->cols < tns->cnt) fileidx += tns->cols; break; @@ -204,6 +210,28 @@ int tns_move_selection(tns_t *tns, win_t *win, movedir_t dir) { return fileidx != old; } +int tns_scroll(tns_t *tns, tnsdir_t dir) { + int old; + + if (!tns) + return 0; + + old = tns->first; + + if (dir == TNS_DOWN && tns->first + tns->cols * tns->rows < tns->cnt) + tns->first += tns->cols; + else if (dir == TNS_UP && tns->first >= tns->cols) + tns->first -= tns->cols; + + if (tns->first != old) { + tns_check_view(tns, True); + tns->dirty = 1; + return 1; + } else { + return 0; + } +} + int tns_translate(tns_t *tns, int x, int y) { int n; thumb_t *t; |