diff options
author | Max Klinger <git@max-klinger.org> | 2014-04-29 08:35:03 +0200 |
---|---|---|
committer | Yorhel <git@yorhel.nl> | 2014-04-30 12:25:48 +0200 |
commit | 0a230cdd1cf64ee86f6e140fd86b845873c2d504 (patch) | |
tree | b39dfdcd645872fffa65f07d34da4943f3fbd158 | |
parent | 79213f0d63fe286fbfc73cfe6b1004d368258800 (diff) |
add a clear function into the existing delete code
-rw-r--r-- | src/browser.c | 17 | ||||
-rw-r--r-- | src/delete.c | 37 | ||||
-rw-r--r-- | src/delete.h | 2 |
3 files changed, 43 insertions, 13 deletions
diff --git a/src/browser.c b/src/browser.c index ac39a32..0a93237 100644 --- a/src/browser.c +++ b/src/browser.c @@ -426,7 +426,22 @@ int browse_key(int ch) { if((t = dirlist_get(1)) == sel) if((t = dirlist_get(-1)) == sel || t == dirlist_parent) t = NULL; - delete_init(sel, t); + delete_init(sel, t, 0); + break; + case 'D': + if(read_only || dir_import_active) { + message = read_only + ? "Folder clearing disabled in read-only mode." + : "Folder clearing not available for imported directories."; + break; + } + if(sel == NULL || sel == dirlist_parent) + break; + if (!(sel->flags & FF_DIR)) { + message = "You can only clear folders"; + } + info_show = 0; + delete_init(sel, t, 1); break; } diff --git a/src/delete.c b/src/delete.c index a8e15ae..43dc4f3 100644 --- a/src/delete.c +++ b/src/delete.c @@ -38,16 +38,23 @@ static struct dir *root, *nextsel, *curdir; static char noconfirm = 0, ignoreerr = 0, state, seloption; -static int lasterrno; +static int lasterrno, _clear = 0; static void delete_draw_confirm() { - nccreate(6, 60, "Confirm delete"); - ncprint(1, 2, "Are you sure you want to delete \"%s\"%c", + if (_clear) { + nccreate(6, 60, "Confirm clear"); + ncprint(1, 2, "Are you sure you want to clear \"%s\"%c", cropstr(root->name, 21), root->flags & FF_DIR ? ' ' : '?'); - if(root->flags & FF_DIR) - ncprint(2, 18, "and all of its contents?"); + } else { + nccreate(6, 60, "Confirm delete"); + ncprint(1, 2, "Are you sure you want to delete \"%s\"%c", + cropstr(root->name, 21), root->flags & FF_DIR ? ' ' : '?'); + + if(root->flags & FF_DIR) + ncprint(2, 18, "and all of its contents?"); + } if(seloption == 0) attron(A_REVERSE); @@ -67,7 +74,10 @@ static void delete_draw_confirm() { static void delete_draw_progress() { - nccreate(6, 60, "Deleting..."); + if (_clear) + nccreate(6, 60, "Clearing..."); + else + nccreate(6, 60, "Deleting..."); ncaddstr(1, 2, cropstr(getpath(curdir), 47)); ncaddstr(4, 41, "Press q to abort"); @@ -77,7 +87,10 @@ static void delete_draw_progress() { static void delete_draw_error() { nccreate(6, 60, "Error!"); - ncprint(1, 2, "Can't delete %s:", cropstr(getpath(curdir), 42)); + if (_clear && root == curdir) + ncprint(1, 2, "Can't clear %s:", cropstr(getpath(curdir), 42)); + else + ncprint(1, 2, "Can't delete %s:", cropstr(getpath(curdir), 42)); ncaddstr(2, 4, strerror(lasterrno)); if(seloption == 0) @@ -187,7 +200,7 @@ static int delete_dir(struct dir *dr) { } if((r = chdir("..")) < 0) goto delete_nxt; - r = dr->sub == NULL ? rmdir(dr->name) : 0; + r = dr->sub == NULL && (!_clear || dr != root) ? rmdir(dr->name) : 0; } else r = unlink(dr->name); @@ -200,7 +213,8 @@ delete_nxt: while(state == DS_FAILED) if(input_handle(0)) return 1; - } else if(!(dr->flags & FF_DIR && dr->sub != NULL)) { + } else if( !(dr->flags & FF_DIR && dr->sub != NULL) + && (!_clear || root != dr)) { freedir(dr); return 0; } @@ -236,15 +250,16 @@ void delete_process() { if(nextsel) nextsel->flags |= FF_BSEL; browse_init(par); - if(nextsel) + if(!_clear && nextsel) dirlist_top(-4); } -void delete_init(struct dir *dr, struct dir *s) { +void delete_init(struct dir *dr, struct dir *s, int clear) { state = DS_CONFIRM; root = curdir = dr; pstate = ST_DEL; nextsel = s; + _clear = clear; } diff --git a/src/delete.h b/src/delete.h index 91b9eaa..73312e9 100644 --- a/src/delete.h +++ b/src/delete.h @@ -31,7 +31,7 @@ void delete_process(void); int delete_key(int); void delete_draw(void); -void delete_init(struct dir *, struct dir *); +void delete_init(struct dir *, struct dir *, int clear); #endif |