nsxivc6726ed
Nicer tns_move_selection
+17 −20
2 files changed
| @@ -32,8 +32,9 @@ void tns_init(tns_t *tns, int cnt) { | |||
| 32 | 32 | if (!tns) | |
| 33 | 33 | return; | |
| 34 | 34 | ||
| 35 | − | tns->cnt = tns->first = tns->sel = tns->vis = 0; | |
| 35 | + | tns->cnt = tns->first = tns->sel = 0; | |
| 36 | 36 | tns->thumbs = (thumb_t*) s_malloc(cnt * sizeof(thumb_t)); | |
| 37 | + | memset(tns->thumbs, 0, cnt * sizeof(thumb_t)); | |
| 37 | 38 | } | |
| 38 | 39 | ||
| 39 | 40 | void tns_free(tns_t *tns, win_t *win) { | |
| @@ -115,7 +116,6 @@ void tns_render(tns_t *tns, win_t *win) { | |||
| 115 | 116 | x += thumb_dim; | |
| 116 | 117 | } | |
| 117 | 118 | } | |
| 118 | − | tns->vis = i - tns->first; | |
| 119 | 119 | ||
| 120 | 120 | tns_highlight(tns, win, -1); | |
| 121 | 121 | } | |
| @@ -139,7 +139,7 @@ void tns_highlight(tns_t *tns, win_t *win, int old) { | |||
| 139 | 139 | } | |
| 140 | 140 | ||
| 141 | 141 | void tns_move_selection(tns_t *tns, win_t *win, movedir_t dir) { | |
| 142 | − | int sel; | |
| 142 | + | int sel, old; | |
| 143 | 143 | ||
| 144 | 144 | if (!tns || !win) | |
| 145 | 145 | return; | |
| @@ -148,30 +148,28 @@ void tns_move_selection(tns_t *tns, win_t *win, movedir_t dir) { | |||
| 148 | 148 | ||
| 149 | 149 | switch (dir) { | |
| 150 | 150 | case MOVE_LEFT: | |
| 151 | − | if (sel % tns->cols > 0) { | |
| 152 | − | --tns->sel; | |
| 153 | − | tns_highlight(tns, win, sel); | |
| 154 | − | } | |
| 151 | + | if (sel % tns->cols > 0) | |
| 152 | + | --sel; | |
| 155 | 153 | break; | |
| 156 | 154 | case MOVE_RIGHT: | |
| 157 | − | if (sel % tns->cols < tns->cols - 1 && sel < tns->cnt - 1) { | |
| 158 | − | ++tns->sel; | |
| 159 | − | tns_highlight(tns, win, sel); | |
| 160 | − | } | |
| 155 | + | if (sel % tns->cols < tns->cols - 1 && sel < tns->cnt - 1) | |
| 156 | + | ++sel; | |
| 161 | 157 | break; | |
| 162 | 158 | case MOVE_UP: | |
| 163 | − | if (sel / tns->cols > 0) { | |
| 164 | − | tns->sel -= tns->cols; | |
| 165 | − | tns_highlight(tns, win, sel); | |
| 166 | − | } | |
| 159 | + | if (sel / tns->cols > 0) | |
| 160 | + | sel -= tns->cols; | |
| 167 | 161 | break; | |
| 168 | 162 | case MOVE_DOWN: | |
| 169 | − | if (sel / tns->cols < tns->rows - 1 && sel + tns->cols < tns->vis) { | |
| 170 | − | tns->sel += tns->cols; | |
| 171 | − | tns_highlight(tns, win, sel); | |
| 172 | − | } | |
| 163 | + | if (sel / tns->cols < tns->rows - 1 && sel + tns->cols < tns->cnt) | |
| 164 | + | sel += tns->cols; | |
| 173 | 165 | break; | |
| 174 | 166 | } | |
| 167 | + | ||
| 168 | + | if (sel != tns->sel && tns->thumbs[sel].x != 0) { | |
| 169 | + | old = tns->sel; | |
| 170 | + | tns->sel = sel; | |
| 171 | + | tns_highlight(tns, win, old); | |
| 172 | + | } | |
| 175 | 173 | } | |
| 176 | 174 | ||
| 177 | 175 | int tns_translate(tns_t *tns, int x, int y) { | |
| @@ -45,7 +45,6 @@ typedef struct tns_s { | |||
| 45 | 45 | int rows; | |
| 46 | 46 | int first; | |
| 47 | 47 | int sel; | |
| 48 | − | int vis; | |
| 49 | 48 | } tns_t; | |
| 50 | 49 | ||
| 51 | 50 | void tns_init(tns_t*, int); | |