mirror of
https://code.blicky.net/yorhel/ncdu.git
synced 2026-01-13 01:08:41 -09:00
Implement confirm quit
(+ 2 minor crash fixes due to out-of-bounds cursor_idx)
This commit is contained in:
parent
b0e81ea4e9
commit
4cc422d628
3 changed files with 60 additions and 10 deletions
|
|
@ -60,6 +60,8 @@ Potentially to be implemented:
|
||||||
|
|
||||||
- Faster --exclude-pattern matching
|
- Faster --exclude-pattern matching
|
||||||
- Multithreaded scanning
|
- 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
|
### Regressions compared to the C version
|
||||||
|
|
||||||
|
|
@ -67,6 +69,9 @@ Aside from this implementation being unfinished:
|
||||||
|
|
||||||
- Assumes a UTF-8 locale and terminal.
|
- Assumes a UTF-8 locale and terminal.
|
||||||
- No doubt somewhat less portable.
|
- 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
|
## Requirements
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -41,6 +41,7 @@ const View = struct {
|
||||||
fn load(self: *@This()) void {
|
fn load(self: *@This()) void {
|
||||||
if (opened_dir_views.get(@ptrToInt(dir_parents.top()))) |v| self.* = v
|
if (opened_dir_views.get(@ptrToInt(dir_parents.top()))) |v| self.* = v
|
||||||
else self.* = @This(){};
|
else self.* = @This(){};
|
||||||
|
cursor_idx = 0;
|
||||||
for (dir_items.items) |e, i| {
|
for (dir_items.items) |e, i| {
|
||||||
if (self.cursor_hash == hashEntry(e)) {
|
if (self.cursor_hash == hashEntry(e)) {
|
||||||
cursor_idx = i;
|
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 {
|
pub fn draw() !void {
|
||||||
ui.style(.hd);
|
ui.style(.hd);
|
||||||
ui.move(0,0);
|
ui.move(0,0);
|
||||||
|
|
@ -243,6 +260,8 @@ pub fn draw() !void {
|
||||||
ui.addsize(.hd, dir_parents.top().entry.size);
|
ui.addsize(.hd, dir_parents.top().entry.size);
|
||||||
ui.addstr(" Items: ");
|
ui.addstr(" Items: ");
|
||||||
ui.addnum(.hd, dir_parents.top().total_items);
|
ui.addnum(.hd, dir_parents.top().total_items);
|
||||||
|
|
||||||
|
if (need_confirm_quit) drawQuit();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn sortToggle(col: main.SortCol, default_order: main.SortOrder) void {
|
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 {
|
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();
|
defer current_view.save();
|
||||||
|
|
||||||
switch (ch) {
|
switch (ch) {
|
||||||
'q' => ui.quit(), // TODO: Confirm quit
|
'q' => if (main.config.confirm_quit) { need_confirm_quit = true; } else ui.quit(),
|
||||||
|
|
||||||
// Selection
|
// Selection
|
||||||
'j', ui.c.KEY_DOWN => {
|
'j', ui.c.KEY_DOWN => {
|
||||||
|
|
@ -298,7 +325,8 @@ pub fn key(ch: i32) !void {
|
||||||
|
|
||||||
// Navigation
|
// Navigation
|
||||||
10, 'l', ui.c.KEY_RIGHT => {
|
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| {
|
if (e.dir()) |d| {
|
||||||
try dir_parents.push(d);
|
try dir_parents.push(d);
|
||||||
try loadDir();
|
try loadDir();
|
||||||
|
|
|
||||||
21
src/scan.zig
21
src/scan.zig
|
|
@ -273,6 +273,7 @@ pub fn scanRoot(path: []const u8) !void {
|
||||||
}
|
}
|
||||||
|
|
||||||
var animation_pos: u32 = 0;
|
var animation_pos: u32 = 0;
|
||||||
|
var need_confirm_quit = false;
|
||||||
|
|
||||||
fn drawBox() !void {
|
fn drawBox() !void {
|
||||||
ui.init();
|
ui.init();
|
||||||
|
|
@ -304,12 +305,21 @@ fn drawBox() !void {
|
||||||
ui.addstr("some directory sizes may not be correct.");
|
ui.addstr("some directory sizes may not be correct.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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));
|
box.move(8, saturateSub(width, 18));
|
||||||
ui.addstr("Press ");
|
ui.addstr("Press ");
|
||||||
ui.style(.key);
|
ui.style(.key);
|
||||||
ui.addch('q');
|
ui.addch('q');
|
||||||
ui.style(.default);
|
ui.style(.default);
|
||||||
ui.addstr(" to abort");
|
ui.addstr(" to abort");
|
||||||
|
}
|
||||||
|
|
||||||
if (main.config.update_delay < std.time.ns_per_s and width > 40) {
|
if (main.config.update_delay < std.time.ns_per_s and width > 40) {
|
||||||
const txt = "Scanning...";
|
const txt = "Scanning...";
|
||||||
|
|
@ -352,8 +362,15 @@ pub fn draw() !void {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn key(ch: i32) !void {
|
pub fn key(ch: i32) !void {
|
||||||
|
if (need_confirm_quit) {
|
||||||
switch (ch) {
|
switch (ch) {
|
||||||
'q' => ui.quit(), // TODO: Confirm quit
|
'y', 'Y' => if (need_confirm_quit) ui.quit(),
|
||||||
else => {},
|
else => need_confirm_quit = false,
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
switch (ch) {
|
||||||
|
'q' => if (main.config.confirm_quit) { need_confirm_quit = true; } else ui.quit(),
|
||||||
|
else => need_confirm_quit = false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue