nsxiv6e696ba
Add mark range function
Sets the marked state of all images ranging from the latest marked/unmarked image to the current image, to the state of that latest toggled image.
+42 −0
5 files changed
- M commands.c +35 −0
- M commands.lst +1 −0
- M config.def.h +1 −0
- M main.c +1 −0
- M sxiv.1 +4 −0
| @@ -46,6 +46,7 @@ extern fileinfo_t *files; | |||
| 46 | 46 | extern int filecnt, fileidx; | |
| 47 | 47 | extern int alternate; | |
| 48 | 48 | extern int markcnt; | |
| 49 | + | extern int toggledidx; | |
| 49 | 50 | ||
| 50 | 51 | extern int prefix; | |
| 51 | 52 | extern bool extprefix; | |
| @@ -196,6 +197,7 @@ bool cg_toggle_image_mark(arg_t _) | |||
| 196 | 197 | markcnt += files[fileidx].flags & FF_MARK ? 1 : -1; | |
| 197 | 198 | if (mode == MODE_THUMB) | |
| 198 | 199 | tns_mark(&tns, fileidx, !!(files[fileidx].flags & FF_MARK)); | |
| 200 | + | toggledidx = fileidx; | |
| 199 | 201 | return true; | |
| 200 | 202 | } | |
| 201 | 203 | ||
| @@ -212,6 +214,39 @@ bool cg_reverse_marks(arg_t _) | |||
| 212 | 214 | return true; | |
| 213 | 215 | } | |
| 214 | 216 | ||
| 217 | + | bool cg_mark_range(arg_t _) | |
| 218 | + | { | |
| 219 | + | int i, from, to; | |
| 220 | + | ||
| 221 | + | if (toggledidx < 0) | |
| 222 | + | return true; | |
| 223 | + | if (toggledidx == fileidx) | |
| 224 | + | return true; | |
| 225 | + | ||
| 226 | + | from = toggledidx; | |
| 227 | + | to = fileidx; | |
| 228 | + | if (fileidx < toggledidx) { | |
| 229 | + | from = fileidx; | |
| 230 | + | to = toggledidx; | |
| 231 | + | } | |
| 232 | + | for (i = from; i <= to; i++) { | |
| 233 | + | if (files[toggledidx].flags & FF_MARK) { | |
| 234 | + | if (!(files[i].flags & FF_MARK)) { | |
| 235 | + | files[i].flags |= FF_MARK; | |
| 236 | + | markcnt += 1; | |
| 237 | + | } | |
| 238 | + | } else { | |
| 239 | + | if (files[i].flags & FF_MARK) { | |
| 240 | + | files[i].flags &= ~FF_MARK; | |
| 241 | + | markcnt -= 1; | |
| 242 | + | } | |
| 243 | + | } | |
| 244 | + | if (mode == MODE_THUMB) | |
| 245 | + | tns_mark(&tns, i, !!(files[i].flags & FF_MARK)); | |
| 246 | + | } | |
| 247 | + | return true; | |
| 248 | + | } | |
| 249 | + | ||
| 215 | 250 | bool cg_unmark_all(arg_t _) | |
| 216 | 251 | { | |
| 217 | 252 | int i; | |
| @@ -11,6 +11,7 @@ G_CMD(scroll_screen) | |||
| 11 | 11 | G_CMD(zoom) | |
| 12 | 12 | G_CMD(toggle_image_mark) | |
| 13 | 13 | G_CMD(reverse_marks) | |
| 14 | + | G_CMD(mark_range) | |
| 14 | 15 | G_CMD(unmark_all) | |
| 15 | 16 | G_CMD(navigate_marked) | |
| 16 | 17 | G_CMD(change_gamma) | |
| @@ -91,6 +91,7 @@ static const keymap_t keys[] = { | |||
| 91 | 91 | { 0, XK_KP_Subtract, g_zoom, -1 }, | |
| 92 | 92 | { 0, XK_m, g_toggle_image_mark, None }, | |
| 93 | 93 | { 0, XK_M, g_reverse_marks, None }, | |
| 94 | + | { ControlMask, XK_M, g_mark_range, None }, | |
| 94 | 95 | { ControlMask, XK_m, g_unmark_all, None }, | |
| 95 | 96 | { 0, XK_N, g_navigate_marked, +1 }, | |
| 96 | 97 | { 0, XK_P, g_navigate_marked, -1 }, | |
| @@ -57,6 +57,7 @@ fileinfo_t *files; | |||
| 57 | 57 | int filecnt, fileidx; | |
| 58 | 58 | int alternate; | |
| 59 | 59 | int markcnt; | |
| 60 | + | int toggledidx = -1; | |
| 60 | 61 | ||
| 61 | 62 | int prefix; | |
| 62 | 63 | bool extprefix; | |
| @@ -172,6 +172,10 @@ Mark/unmark the current image. | |||
| 172 | 172 | .B M | |
| 173 | 173 | Reverse all image marks. | |
| 174 | 174 | .TP | |
| 175 | + | .B Ctrl-M | |
| 176 | + | Repeat last mark action on all images from the last marked/unmarked up to the | |
| 177 | + | current one. | |
| 178 | + | .TP | |
| 175 | 179 | .B Ctrl-m | |
| 176 | 180 | Remove all image marks. | |
| 177 | 181 | .TP | |