diff --git a/README.md b/README.md index 1407b0c6854efb7dfbaf81d6b7ba49075c3cef13..4200858ca801a83a73719c5015ae1f542f9c1544 100644 --- a/README.md +++ b/README.md @@ -60,6 +60,8 @@ Potentially to be implemented: - Faster --exclude-pattern matching - Multithreaded scanning +- Exporting a JSON dump after scanning into RAM +- Transparent dump (de)compression by piping through gzip/bzip2/etc ### Regressions compared to the C version @@ -67,6 +69,9 @@ Aside from this implementation being unfinished: - Assumes a UTF-8 locale and terminal. - No doubt somewhat less portable. +- Listing all paths for a particular hard link requires a full search through + the in-memory directory tree. +- Not nearly as well tested. ## Requirements diff --git a/src/browser.zig b/src/browser.zig index 697187f245c152a5e84f68337d0d49a4fbd340d6..25db5e81de7d8e8d7f9b811f13d254b28b647c0c 100644 --- a/src/browser.zig +++ b/src/browser.zig @@ -41,6 +41,7 @@ const View = struct { fn load(self: *@This()) void { if (opened_dir_views.get(@ptrToInt(dir_parents.top()))) |v| self.* = v else self.* = @This(){}; + cursor_idx = 0; for (dir_items.items) |e, i| { if (self.cursor_hash == hashEntry(e)) { cursor_idx = i; @@ -194,6 +195,22 @@ const Row = struct { } }; +var need_confirm_quit = false; + +fn drawQuit() void { + const box = ui.Box.create(4, 22, "Confirm quit"); + box.move(2, 2); + ui.addstr("Really quit? ("); + ui.style(.key); + ui.addch('y'); + ui.style(.default); + ui.addch('/'); + ui.style(.key); + ui.addch('N'); + ui.style(.default); + ui.addch(')'); +} + pub fn draw() !void { ui.style(.hd); ui.move(0,0); @@ -243,6 +260,8 @@ pub fn draw() !void { ui.addsize(.hd, dir_parents.top().entry.size); ui.addstr(" Items: "); ui.addnum(.hd, dir_parents.top().total_items); + + if (need_confirm_quit) drawQuit(); } fn sortToggle(col: main.SortCol, default_order: main.SortOrder) void { @@ -254,10 +273,18 @@ fn sortToggle(col: main.SortCol, default_order: main.SortOrder) void { } pub fn key(ch: i32) !void { + if (need_confirm_quit) { + switch (ch) { + 'y', 'Y' => if (need_confirm_quit) ui.quit(), + else => need_confirm_quit = false, + } + return; + } + defer current_view.save(); switch (ch) { - 'q' => ui.quit(), // TODO: Confirm quit + 'q' => if (main.config.confirm_quit) { need_confirm_quit = true; } else ui.quit(), // Selection 'j', ui.c.KEY_DOWN => { @@ -298,7 +325,8 @@ pub fn key(ch: i32) !void { // Navigation 10, 'l', ui.c.KEY_RIGHT => { - if (dir_items.items[cursor_idx]) |e| { + if (dir_items.items.len == 0) { + } else if (dir_items.items[cursor_idx]) |e| { if (e.dir()) |d| { try dir_parents.push(d); try loadDir(); diff --git a/src/scan.zig b/src/scan.zig index 04af0372b48d8a9d0ab12ab01a7064d882703b8c..118750b1e700bb8334600cf6f4e6d0ad1ddc10eb 100644 --- a/src/scan.zig +++ b/src/scan.zig @@ -273,6 +273,7 @@ pub fn scanRoot(path: []const u8) !void { } var animation_pos: u32 = 0; +var need_confirm_quit = false; fn drawBox() !void { ui.init(); @@ -304,12 +305,21 @@ fn drawBox() !void { ui.addstr("some directory sizes may not be correct."); } - box.move(8, saturateSub(width, 18)); - ui.addstr("Press "); - ui.style(.key); - ui.addch('q'); - ui.style(.default); - ui.addstr(" to abort"); + if (need_confirm_quit) { + box.move(8, saturateSub(width, 20)); + ui.addstr("Press "); + ui.style(.key); + ui.addch('y'); + ui.style(.default); + ui.addstr(" to confirm"); + } else { + box.move(8, saturateSub(width, 18)); + ui.addstr("Press "); + ui.style(.key); + ui.addch('q'); + ui.style(.default); + ui.addstr(" to abort"); + } if (main.config.update_delay < std.time.ns_per_s and width > 40) { const txt = "Scanning..."; @@ -352,8 +362,15 @@ pub fn draw() !void { } pub fn key(ch: i32) !void { + if (need_confirm_quit) { + switch (ch) { + 'y', 'Y' => if (need_confirm_quit) ui.quit(), + else => need_confirm_quit = false, + } + return; + } switch (ch) { - 'q' => ui.quit(), // TODO: Confirm quit - else => {}, + 'q' => if (main.config.confirm_quit) { need_confirm_quit = true; } else ui.quit(), + else => need_confirm_quit = false, } }