aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2019-06-15 18:21:37 -0700
committerBruce Hill <bruce@bruce-hill.com>2019-06-15 18:21:37 -0700
commitf2298a5786325f994aa4d0b070ed7566c3069957 (patch)
treeb4722ec9ad20bf20640ad2833be89c09b06361a5
parent4c717185de001c0d74c8d498e42facedc03de176 (diff)
Condensed selection code by converting select_entry()/deselect_entry()
to set_selected() with an argument for whether the file should be selected.
-rw-r--r--bb.c58
1 files changed, 20 insertions, 38 deletions
diff --git a/bb.c b/bb.c
index 197ec36..b4a9a49 100644
--- a/bb.c
+++ b/bb.c
@@ -129,7 +129,6 @@ static int compare_files(void *v, const void *v1, const void *v2);
#else
static int compare_files(const void *v1, const void *v2, void *v);
#endif
-static void deselect_entry(bb_t *bb, entry_t *e);
static int fputs_escaped(FILE *f, const char *str, const char *color);
static void init_term(void);
static entry_t* load_entry(bb_t *bb, const char *path, int clear_dots);
@@ -140,12 +139,11 @@ static void print_bindings(void);
static bb_result_t process_cmd(bb_t *bb, const char *cmd);
static void render(bb_t *bb);
static int run_script(bb_t *bb, const char *cmd);
-static void select_entry(bb_t *bb, entry_t *e);
static void set_cursor(bb_t *bb, int i);
+static void set_selected(bb_t *bb, entry_t *e, int selected);
static void set_scroll(bb_t *bb, int i);
static void set_sort(bb_t *bb, const char *sort);
static void sort_files(bb_t *bb);
-static void toggle_entry(bb_t *bb, entry_t *e);
static int try_free_entry(entry_t *e);
static void update_term_size(int sig);
@@ -618,27 +616,22 @@ int compare_files(const void *v1, const void *v2, void *v)
}
/*
- * Select a file
+ * Select or deselect a file.
*/
-void select_entry(bb_t *bb, entry_t *e)
+void set_selected(bb_t *bb, entry_t *e, int selected)
{
- if (IS_SELECTED(e)) return;
+ if (IS_SELECTED(e) == selected) return;
+
if (bb->nfiles > 0 && e != bb->files[bb->cursor])
bb->dirty = 1;
- if (bb->firstselected)
- bb->firstselected->selected.atme = &e->selected.next;
- e->selected.next = bb->firstselected;
- e->selected.atme = &bb->firstselected;
- bb->firstselected = e;
-}
-/*
- * Deselect a file
- */
-void deselect_entry(bb_t *bb, entry_t *e)
-{
- (void)bb;
- if (IS_SELECTED(e)) {
+ if (selected) {
+ if (bb->firstselected)
+ bb->firstselected->selected.atme = &e->selected.next;
+ e->selected.next = bb->firstselected;
+ e->selected.atme = &bb->firstselected;
+ bb->firstselected = e;
+ } else {
if (bb->nfiles > 0 && e != bb->files[bb->cursor])
bb->dirty = 1;
if (e->selected.next)
@@ -646,17 +639,8 @@ void deselect_entry(bb_t *bb, entry_t *e)
*(e->selected.atme) = e->selected.next;
e->selected.next = NULL;
e->selected.atme = NULL;
+ try_free_entry(e);
}
- try_free_entry(e);
-}
-
-/*
- * Toggle a file's selection state
- */
-void toggle_entry(bb_t *bb, entry_t *e)
-{
- if (IS_SELECTED(e)) deselect_entry(bb, e);
- else select_entry(bb, e);
}
/*
@@ -1014,13 +998,13 @@ bb_result_t process_cmd(bb_t *bb, const char *cmd)
normalize_path(bb->path, value, pbuf, 1);
entry_t *e = load_entry(bb, pbuf, 0);
if (e) {
- deselect_entry(bb, e);
+ set_selected(bb, e, 0);
return BB_OK;
}
// Filename may no longer exist:
for (e = bb->firstselected; e; e = e->selected.next) {
if (strcmp(e->fullname, pbuf) == 0) {
- deselect_entry(bb, e);
+ set_selected(bb, e, 0);
break;
}
}
@@ -1098,10 +1082,8 @@ bb_result_t process_cmd(bb_t *bb, const char *cmd)
else set_cursor(bb, n);
if (cmd[0] == 's') { // +spread:
int sel = IS_SELECTED(bb->files[oldcur]);
- for (int i = bb->cursor; i != oldcur; i += (oldcur > i ? 1 : -1)) {
- if (sel != IS_SELECTED(bb->files[i]))
- toggle_entry(bb, bb->files[i]);
- }
+ for (int i = bb->cursor; i != oldcur; i += (oldcur > i ? 1 : -1))
+ set_selected(bb, bb->files[i], sel);
}
return BB_OK;
}
@@ -1133,7 +1115,7 @@ bb_result_t process_cmd(bb_t *bb, const char *cmd)
if (!value && !bb->nfiles) return BB_INVALID;
if (!value) value = bb->files[bb->cursor]->fullname;
entry_t *e = load_entry(bb, value, 1);
- if (e) select_entry(bb, e);
+ if (e) set_selected(bb, e, 1);
return BB_OK;
}
case 'o': // +sort:
@@ -1149,7 +1131,7 @@ bb_result_t process_cmd(bb_t *bb, const char *cmd)
if (!value && !bb->nfiles) return BB_INVALID;
if (!value) value = bb->files[bb->cursor]->fullname;
entry_t *e = load_entry(bb, value, 1);
- if (e) toggle_entry(bb, e);
+ if (e) set_selected(bb, e, !IS_SELECTED(e));
return BB_OK;
}
default: err("UNKNOWN COMMAND: '%s'", cmd); break;
@@ -1257,7 +1239,7 @@ void bb_browse(bb_t *bb, const char *path)
int clicked = bb->scroll + (mouse_y - 2);
if (clicked > bb->nfiles - 1) goto next_input;
if (column[1] == COL_SELECTED) {
- toggle_entry(bb, bb->files[clicked]);
+ set_selected(bb, bb->files[clicked], !IS_SELECTED(bb->files[clicked]));
bb->dirty = 1;
goto redraw;
}