From 2a3e2b635ce9b8367a0934296a1f2dd7eaf23446 Mon Sep 17 00:00:00 2001 From: Mehdi Mohseni Date: Sat, 27 Jun 2020 15:18:54 +0430 Subject: [PATCH] feat(ui): add an "Are you sure you want to quit?" modal (#44) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(app): show confirm modal before exit add keyEvent handler function for exiting mode add Exiting variant to UiMode enum | add prompt_exit method implement ExitingMode widget rendering fix mixed UiState issue * resolved requested changes * feat(app) add confirm modal before exit fix panic in modals when terminal-width=50 listen for all possible keys when user tries to exit exit without confirmation in ScreenTooSmall mode fix tests to be compatible with ConfirmModal Changes * docs(readme): add gentoo installation info (#47) * feat(ux): make enter select largest folder if nothing is selected (#45) * Make enter select largest folder if nothing is selected * Rename method * Renamed and changed method to do what it originally said * Efficiency improvements * Added test for the feature * Run cargo insta review * Fixed len for assert_eq! * Fixed asserts at end of test * Run cargo insta review again * docs(changelog): enter largest folder * docs(readme): fix error in how it works * feat(ui): show quit shortcut ('q') in the legend (#46) * Add shortcut in the legend * Fix typo for description * Use instead of or * Apply fmt * Merge main * feat(navigation): keep a stack of visited items and make go_up use it (#53) * Keep a stack up visited items and make go_up use it This will allow us to keep track of where our previous selections were so can can automatically select the parents when we go up in the hierarchy. Closes #48. Signed-off-by: Daniel Egger * Redo snapshot tests to fix failures Signed-off-by: Daniel Egger * style(naming): minor naming change for clarity Co-authored-by: Aram Drevekenin * fix(formatting): prevent crashes on files with multibyte characters (#51) * Fix crash when truncating to middle of a character * Fix alignment of file names with wide characters * Respect use ::formatting convention * docs(changelog): update recent changes * chore(release): 0.4.0 * fix enter_largest_folder_with_no_selected_tile test and its snapshot Co-authored-by: Aram Drevekenin Co-authored-by: telans Co-authored-by: redzic <48274562+redzic@users.noreply.github.com> Co-authored-by: Oleh <45392385+olehs0@users.noreply.github.com> Co-authored-by: Daniel Egger Co-authored-by: Renée Kooi --- src/app.rs | 7 + src/input/controls.rs | 19 +- src/main.rs | 5 +- src/messages/instruction.rs | 7 +- ...s__ui__cannot_move_into_small_files-5.snap | 55 ++ ...ection_when_moving_off_screen_edges-5.snap | 55 ++ ...naut__tests__cases__ui__delete_file-8.snap | 22 +- ...sts__cases__ui__delete_file_press_n-5.snap | 55 ++ ...ut__tests__cases__ui__delete_folder-9.snap | 22 +- ...es__ui__delete_folder_small_window-10.snap | 55 ++ ...elete_folder_with_multiple_children-9.snap | 22 +- ...aut__tests__cases__ui__eleven_files-2.snap | 55 ++ ...aut__tests__cases__ui__empty_folder-2.snap | 55 ++ ...aut__tests__cases__ui__enter_folder-4.snap | 22 +- ...ases__ui__enter_folder_medium_width-4.snap | 22 +- ...cases__ui__enter_folder_small_width-4.snap | 22 +- ...argest_folder_with_no_selected_tile-3.snap | 55 ++ ...aut__tests__cases__ui__esc_to_go_up-6.snap | 94 +-- ...ts__cases__ui__files_with_size_zero-2.snap | 55 ++ ...aut__tests__cases__ui__medium_width-2.snap | 55 ++ ...ests__cases__ui__minimum_tile_sides-2.snap | 55 ++ ...ses__ui__move_down_and_enter_folder-5.snap | 22 +- ...ses__ui__move_left_and_enter_folder-6.snap | 22 +- ...es__ui__move_right_and_enter_folder-5.snap | 22 +- ...cases__ui__move_up_and_enter_folder-6.snap | 22 +- ..._cases__ui__noop_when_entering_file-4.snap | 22 +- ...op_when_pressing_esc_at_base_folder-9.snap | 22 +- ...ui__permission_denied_when_deleting-9.snap | 22 +- ...essing_delete_with_no_selected_tile-2.snap | 22 +- ...naut__tests__cases__ui__small_files-2.snap | 55 ++ ...ses__ui__small_files_with_x_as_zero-2.snap | 55 ++ ...ses__ui__small_files_with_y_as_zero-2.snap | 55 ++ ...naut__tests__cases__ui__small_width-2.snap | 55 ++ ...s__ui__small_width_long_folder_name-2.snap | 55 ++ ..._ui__two_large_files_one_small_file-2.snap | 55 ++ src/tests/cases/test_utils.rs | 6 +- src/tests/cases/ui.rs | 596 ++++++++++-------- src/ui/display.rs | 53 +- src/ui/modals/confirm_box.rs | 92 +++ src/ui/modals/error_box.rs | 2 +- src/ui/modals/message_box.rs | 2 +- src/ui/modals/mod.rs | 2 + 42 files changed, 1615 insertions(+), 458 deletions(-) create mode 100644 src/tests/cases/snapshots/diskonaut__tests__cases__ui__cannot_move_into_small_files-5.snap create mode 100644 src/tests/cases/snapshots/diskonaut__tests__cases__ui__clear_selection_when_moving_off_screen_edges-5.snap create mode 100644 src/tests/cases/snapshots/diskonaut__tests__cases__ui__delete_file_press_n-5.snap create mode 100644 src/tests/cases/snapshots/diskonaut__tests__cases__ui__delete_folder_small_window-10.snap create mode 100644 src/tests/cases/snapshots/diskonaut__tests__cases__ui__eleven_files-2.snap create mode 100644 src/tests/cases/snapshots/diskonaut__tests__cases__ui__empty_folder-2.snap create mode 100644 src/tests/cases/snapshots/diskonaut__tests__cases__ui__enter_largest_folder_with_no_selected_tile-3.snap create mode 100644 src/tests/cases/snapshots/diskonaut__tests__cases__ui__files_with_size_zero-2.snap create mode 100644 src/tests/cases/snapshots/diskonaut__tests__cases__ui__medium_width-2.snap create mode 100644 src/tests/cases/snapshots/diskonaut__tests__cases__ui__minimum_tile_sides-2.snap create mode 100644 src/tests/cases/snapshots/diskonaut__tests__cases__ui__small_files-2.snap create mode 100644 src/tests/cases/snapshots/diskonaut__tests__cases__ui__small_files_with_x_as_zero-2.snap create mode 100644 src/tests/cases/snapshots/diskonaut__tests__cases__ui__small_files_with_y_as_zero-2.snap create mode 100644 src/tests/cases/snapshots/diskonaut__tests__cases__ui__small_width-2.snap create mode 100644 src/tests/cases/snapshots/diskonaut__tests__cases__ui__small_width_long_folder_name-2.snap create mode 100644 src/tests/cases/snapshots/diskonaut__tests__cases__ui__two_large_files_one_small_file-2.snap create mode 100644 src/ui/modals/confirm_box.rs diff --git a/src/app.rs b/src/app.rs index f5e05ec..c667b4b 100644 --- a/src/app.rs +++ b/src/app.rs @@ -18,6 +18,7 @@ pub enum UiMode { ScreenTooSmall, DeleteFile(FileToDelete), ErrorMessage(String), + Exiting { app_loaded: bool }, } pub struct App @@ -119,6 +120,12 @@ where } }; } + pub fn prompt_exit(&mut self) { + self.ui_mode = UiMode::Exiting { + app_loaded: self.loaded, + }; + self.render(); + } pub fn exit(&mut self) { self.is_running = false; // here we do a blocking send rather than a try_send diff --git a/src/input/controls.rs b/src/input/controls.rs index 4e3785d..14d37e8 100644 --- a/src/input/controls.rs +++ b/src/input/controls.rs @@ -35,7 +35,7 @@ macro_rules! key { pub fn handle_keypress_loading_mode(evt: Event, app: &mut App) { match evt { key!(ctrl 'c') | key!(char 'q') => { - app.exit(); + app.prompt_exit(); } key!(char 'l') | key!(Right) | key!(ctrl 'f') => { app.move_selected_right(); @@ -62,7 +62,7 @@ pub fn handle_keypress_loading_mode(evt: Event, app: &mut App) { pub fn handle_keypress_normal_mode(evt: Event, app: &mut App) { match evt { key!(ctrl 'c') | key!(char 'q') => { - app.exit(); + app.prompt_exit(); } key!(ctrl 'd') => { app.prompt_file_deletion(); @@ -122,3 +122,18 @@ pub fn handle_keypress_screen_too_small(evt: Event, app: &mut App _ => (), }; } + +pub fn handle_keypress_exiting_mode(evt: Event, app: &mut App) { + match evt { + key!(ctrl 'c') | key!(char 'q') | key!(Esc) | key!(Backspace) | key!(char 'n') => { + app.reset_ui_mode(); + // we have to manually call render here to make sure ui gets updated + // because reset_ui_mode does not call it itself + app.render(); + } + key!(char 'y') => { + app.exit(); + } + _ => (), + }; +} diff --git a/src/main.rs b/src/main.rs index 3adbe32..c8dc258 100644 --- a/src/main.rs +++ b/src/main.rs @@ -116,8 +116,9 @@ pub fn start( let running = running.clone(); move || { for evt in keyboard_events { - if let TermionEvent::Key(Key::Ctrl('c')) - | TermionEvent::Key(Key::Char('q')) = evt + if let TermionEvent::Key(Key::Char('y')) + | TermionEvent::Key(Key::Char('q')) + | TermionEvent::Key(Key::Ctrl('c')) = evt { // not ideal, but works in a pinch let _ = instruction_sender.send(Instruction::Keypress(evt)); diff --git a/src/messages/instruction.rs b/src/messages/instruction.rs index 5cab3a4..2d8677c 100644 --- a/src/messages/instruction.rs +++ b/src/messages/instruction.rs @@ -5,8 +5,8 @@ use ::termion::event::Event as TermionEvent; use ::tui::backend::Backend; use crate::input::{ - handle_keypress_delete_file_mode, handle_keypress_error_message, handle_keypress_loading_mode, - handle_keypress_normal_mode, handle_keypress_screen_too_small, + handle_keypress_delete_file_mode, handle_keypress_error_message, handle_keypress_exiting_mode, + handle_keypress_loading_mode, handle_keypress_normal_mode, handle_keypress_screen_too_small, }; use crate::{App, UiMode}; @@ -82,6 +82,9 @@ where UiMode::ErrorMessage(_) => { handle_keypress_error_message(evt, app); } + UiMode::Exiting { app_loaded: _ } => { + handle_keypress_exiting_mode(evt, app); + } } if !app.is_running { break; diff --git a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__cannot_move_into_small_files-5.snap b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__cannot_move_into_small_files-5.snap new file mode 100644 index 0000000..0c802b9 --- /dev/null +++ b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__cannot_move_into_small_files-5.snap @@ -0,0 +1,55 @@ +--- +source: src/tests/cases/ui.rs +expression: "&terminal_draw_events_mirror[4]" +--- + + + + + + + + + + + + + + + + + + + + + ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ + │ │ + │ │ + │ Are you sure you want to quit? │ + │ │ + │ │ + │ │ + │ │ + │ (y/n) │ + │ │ + └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ + + + + + + + + + + + + + + + + + + + + diff --git a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__clear_selection_when_moving_off_screen_edges-5.snap b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__clear_selection_when_moving_off_screen_edges-5.snap new file mode 100644 index 0000000..0c802b9 --- /dev/null +++ b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__clear_selection_when_moving_off_screen_edges-5.snap @@ -0,0 +1,55 @@ +--- +source: src/tests/cases/ui.rs +expression: "&terminal_draw_events_mirror[4]" +--- + + + + + + + + + + + + + + + + + + + + + ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ + │ │ + │ │ + │ Are you sure you want to quit? │ + │ │ + │ │ + │ │ + │ │ + │ (y/n) │ + │ │ + └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ + + + + + + + + + + + + + + + + + + + + diff --git a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__delete_file-8.snap b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__delete_file-8.snap index 13ba759..4bf669c 100644 --- a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__delete_file-8.snap +++ b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__delete_file-8.snap @@ -22,17 +22,17 @@ expression: "&terminal_draw_events_mirror[7]" - - - - - - - - - - - + ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ + │ │ + │ │ + │ Are you sure you want to quit? │ + │ │ + │ │ + │ │ + │ │ + │ (y/n) │ + │ │ + └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ diff --git a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__delete_file_press_n-5.snap b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__delete_file_press_n-5.snap new file mode 100644 index 0000000..0c802b9 --- /dev/null +++ b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__delete_file_press_n-5.snap @@ -0,0 +1,55 @@ +--- +source: src/tests/cases/ui.rs +expression: "&terminal_draw_events_mirror[4]" +--- + + + + + + + + + + + + + + + + + + + + + ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ + │ │ + │ │ + │ Are you sure you want to quit? │ + │ │ + │ │ + │ │ + │ │ + │ (y/n) │ + │ │ + └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ + + + + + + + + + + + + + + + + + + + + diff --git a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__delete_folder-9.snap b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__delete_folder-9.snap index d8e1fff..7f7dcdd 100644 --- a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__delete_folder-9.snap +++ b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__delete_folder-9.snap @@ -22,17 +22,17 @@ expression: "&terminal_draw_events_mirror[8]" - - - - - - - - - - - + ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ + │ │ + │ │ + │ Are you sure you want to quit? │ + │ │ + │ │ + │ │ + │ │ + │ (y/n) │ + │ │ + └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ diff --git a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__delete_folder_small_window-10.snap b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__delete_folder_small_window-10.snap new file mode 100644 index 0000000..dabf58b --- /dev/null +++ b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__delete_folder_small_window-10.snap @@ -0,0 +1,55 @@ +--- +source: src/tests/cases/ui.rs +expression: "&terminal_draw_events_mirror[9]" +--- + + + + + + + + + + + + + + + + + + + + + ┌─────────────────────────────┐ + │ │ + │ │ + │ Really quit? │ + │ │ + │ │ + │ │ + │ │ + │ (y/n) │ + │ │ + └─────────────────────────────┘ + + + + + + + + + + + + + + + + + + + + diff --git a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__delete_folder_with_multiple_children-9.snap b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__delete_folder_with_multiple_children-9.snap index d8e1fff..7f7dcdd 100644 --- a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__delete_folder_with_multiple_children-9.snap +++ b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__delete_folder_with_multiple_children-9.snap @@ -22,17 +22,17 @@ expression: "&terminal_draw_events_mirror[8]" - - - - - - - - - - - + ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ + │ │ + │ │ + │ Are you sure you want to quit? │ + │ │ + │ │ + │ │ + │ │ + │ (y/n) │ + │ │ + └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ diff --git a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__eleven_files-2.snap b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__eleven_files-2.snap new file mode 100644 index 0000000..26b262d --- /dev/null +++ b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__eleven_files-2.snap @@ -0,0 +1,55 @@ +--- +source: src/tests/cases/ui.rs +expression: "&terminal_draw_events_mirror[1]" +--- + + + + + + + + + + + + + + + + + + + + + ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ + │ │ + │ │ + │ Are you sure you want to quit? │ + │ │ + │ │ + │ │ + │ │ + │ (y/n) │ + │ │ + └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ + + + + + + + + + + + + + + + + + + + + diff --git a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__empty_folder-2.snap b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__empty_folder-2.snap new file mode 100644 index 0000000..26b262d --- /dev/null +++ b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__empty_folder-2.snap @@ -0,0 +1,55 @@ +--- +source: src/tests/cases/ui.rs +expression: "&terminal_draw_events_mirror[1]" +--- + + + + + + + + + + + + + + + + + + + + + ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ + │ │ + │ │ + │ Are you sure you want to quit? │ + │ │ + │ │ + │ │ + │ │ + │ (y/n) │ + │ │ + └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ + + + + + + + + + + + + + + + + + + + + diff --git a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__enter_folder-4.snap b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__enter_folder-4.snap index 5488196..a46f81f 100644 --- a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__enter_folder-4.snap +++ b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__enter_folder-4.snap @@ -22,17 +22,17 @@ expression: "&terminal_draw_events_mirror[3]" - - - - - - - - - - - + ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ + │ │ + │ │ + │ Are you sure you want to quit? │ + │ │ + │ │ + │ │ + │ │ + │ (y/n) │ + │ │ + └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ diff --git a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__enter_folder_medium_width-4.snap b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__enter_folder_medium_width-4.snap index be244b9..25f3807 100644 --- a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__enter_folder_medium_width-4.snap +++ b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__enter_folder_medium_width-4.snap @@ -22,17 +22,17 @@ expression: "&terminal_draw_events_mirror[3]" - - - - - - - - - - - + ┌────────────────────────────────────────────┐ + │ │ + │ │ + │ Are you sure you want to quit? │ + │ │ + │ │ + │ │ + │ │ + │ (y/n) │ + │ │ + └────────────────────────────────────────────┘ diff --git a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__enter_folder_small_width-4.snap b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__enter_folder_small_width-4.snap index ee1bb50..2d88ab4 100644 --- a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__enter_folder_small_width-4.snap +++ b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__enter_folder_small_width-4.snap @@ -22,17 +22,17 @@ expression: "&terminal_draw_events_mirror[3]" - - - - - - - - - - - + ┌─────────────────────────────┐ + │ │ + │ │ + │ Really quit? │ + │ │ + │ │ + │ │ + │ │ + │ (y/n) │ + │ │ + └─────────────────────────────┘ diff --git a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__enter_largest_folder_with_no_selected_tile-3.snap b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__enter_largest_folder_with_no_selected_tile-3.snap new file mode 100644 index 0000000..79f298f --- /dev/null +++ b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__enter_largest_folder_with_no_selected_tile-3.snap @@ -0,0 +1,55 @@ +--- +source: src/tests/cases/ui.rs +expression: "&terminal_draw_events_mirror[2]" +--- + + + + + + + + + + + + + + + + + + + + + ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ + │ │ + │ │ + │ Are you sure you want to quit? │ + │ │ + │ │ + │ │ + │ │ + │ (y/n) │ + │ │ + └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ + + + + + + + + + + + + + + + + + + + + diff --git a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__esc_to_go_up-6.snap b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__esc_to_go_up-6.snap index 5f60839..d57710c 100644 --- a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__esc_to_go_up-6.snap +++ b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__esc_to_go_up-6.snap @@ -3,53 +3,53 @@ source: src/tests/cases/ui.rs expression: "&terminal_draw_events_mirror[5]" --- - ┬ - │ - │ - │ - │ - │ - │ - │ - │ - │ - file2 │ - │ - │ - 4.0K (33%) │ - │ - │ - │ - │ - │ - │ - │ - │ - │ subfolder1/ (+1 descendants) -├─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ - │ 4.0K (33%) - │ - │ - │ - │ - │ - │ - │ - │ - file3 │ - │ - │ - 4.0K (33%) │ - │ - │ - │ - │ - │ - │ - │ - │ - │ - ┴ + + + + + + + + + + + + + + + + + + + + ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ + │ │ + │ │ + │ Are you sure you want to quit? │ + │ │ + │ │ + │ │ + │ │ + │ (y/n) │ + │ │ + └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ + + + + + + + + + + + + + + + + + diff --git a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__files_with_size_zero-2.snap b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__files_with_size_zero-2.snap new file mode 100644 index 0000000..26b262d --- /dev/null +++ b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__files_with_size_zero-2.snap @@ -0,0 +1,55 @@ +--- +source: src/tests/cases/ui.rs +expression: "&terminal_draw_events_mirror[1]" +--- + + + + + + + + + + + + + + + + + + + + + ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ + │ │ + │ │ + │ Are you sure you want to quit? │ + │ │ + │ │ + │ │ + │ │ + │ (y/n) │ + │ │ + └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ + + + + + + + + + + + + + + + + + + + + diff --git a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__medium_width-2.snap b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__medium_width-2.snap new file mode 100644 index 0000000..421b077 --- /dev/null +++ b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__medium_width-2.snap @@ -0,0 +1,55 @@ +--- +source: src/tests/cases/ui.rs +expression: "&terminal_draw_events_mirror[1]" +--- + + + + + + + + + + + + + + + + + + + + + ┌─────────────────────────────┐ + │ │ + │ │ + │ Really quit? │ + │ │ + │ │ + │ │ + │ │ + │ (y/n) │ + │ │ + └─────────────────────────────┘ + + + + + + + + + + + + + + + + + + + + diff --git a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__minimum_tile_sides-2.snap b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__minimum_tile_sides-2.snap new file mode 100644 index 0000000..26b262d --- /dev/null +++ b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__minimum_tile_sides-2.snap @@ -0,0 +1,55 @@ +--- +source: src/tests/cases/ui.rs +expression: "&terminal_draw_events_mirror[1]" +--- + + + + + + + + + + + + + + + + + + + + + ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ + │ │ + │ │ + │ Are you sure you want to quit? │ + │ │ + │ │ + │ │ + │ │ + │ (y/n) │ + │ │ + └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ + + + + + + + + + + + + + + + + + + + + diff --git a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__move_down_and_enter_folder-5.snap b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__move_down_and_enter_folder-5.snap index 3bc2b32..0c802b9 100644 --- a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__move_down_and_enter_folder-5.snap +++ b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__move_down_and_enter_folder-5.snap @@ -22,17 +22,17 @@ expression: "&terminal_draw_events_mirror[4]" - - - - - - - - - - - + ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ + │ │ + │ │ + │ Are you sure you want to quit? │ + │ │ + │ │ + │ │ + │ │ + │ (y/n) │ + │ │ + └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ diff --git a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__move_left_and_enter_folder-6.snap b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__move_left_and_enter_folder-6.snap index 77cebb0..d57710c 100644 --- a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__move_left_and_enter_folder-6.snap +++ b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__move_left_and_enter_folder-6.snap @@ -22,17 +22,17 @@ expression: "&terminal_draw_events_mirror[5]" - - - - - - - - - - - + ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ + │ │ + │ │ + │ Are you sure you want to quit? │ + │ │ + │ │ + │ │ + │ │ + │ (y/n) │ + │ │ + └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ diff --git a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__move_right_and_enter_folder-5.snap b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__move_right_and_enter_folder-5.snap index 3bc2b32..0c802b9 100644 --- a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__move_right_and_enter_folder-5.snap +++ b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__move_right_and_enter_folder-5.snap @@ -22,17 +22,17 @@ expression: "&terminal_draw_events_mirror[4]" - - - - - - - - - - - + ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ + │ │ + │ │ + │ Are you sure you want to quit? │ + │ │ + │ │ + │ │ + │ │ + │ (y/n) │ + │ │ + └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ diff --git a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__move_up_and_enter_folder-6.snap b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__move_up_and_enter_folder-6.snap index 77cebb0..d57710c 100644 --- a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__move_up_and_enter_folder-6.snap +++ b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__move_up_and_enter_folder-6.snap @@ -22,17 +22,17 @@ expression: "&terminal_draw_events_mirror[5]" - - - - - - - - - - - + ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ + │ │ + │ │ + │ Are you sure you want to quit? │ + │ │ + │ │ + │ │ + │ │ + │ (y/n) │ + │ │ + └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ diff --git a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__noop_when_entering_file-4.snap b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__noop_when_entering_file-4.snap index 5488196..a46f81f 100644 --- a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__noop_when_entering_file-4.snap +++ b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__noop_when_entering_file-4.snap @@ -22,17 +22,17 @@ expression: "&terminal_draw_events_mirror[3]" - - - - - - - - - - - + ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ + │ │ + │ │ + │ Are you sure you want to quit? │ + │ │ + │ │ + │ │ + │ │ + │ (y/n) │ + │ │ + └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ diff --git a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__noop_when_pressing_esc_at_base_folder-9.snap b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__noop_when_pressing_esc_at_base_folder-9.snap index d8e1fff..7f7dcdd 100644 --- a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__noop_when_pressing_esc_at_base_folder-9.snap +++ b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__noop_when_pressing_esc_at_base_folder-9.snap @@ -22,17 +22,17 @@ expression: "&terminal_draw_events_mirror[8]" - - - - - - - - - - - + ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ + │ │ + │ │ + │ Are you sure you want to quit? │ + │ │ + │ │ + │ │ + │ │ + │ (y/n) │ + │ │ + └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ diff --git a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__permission_denied_when_deleting-9.snap b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__permission_denied_when_deleting-9.snap index 091b27a..7f7dcdd 100644 --- a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__permission_denied_when_deleting-9.snap +++ b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__permission_denied_when_deleting-9.snap @@ -22,17 +22,17 @@ expression: "&terminal_draw_events_mirror[8]" - - - - Permission denied (os error 13) - - - - (Press to dismiss) - - - + ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ + │ │ + │ │ + │ Are you sure you want to quit? │ + │ │ + │ │ + │ │ + │ │ + │ (y/n) │ + │ │ + └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ diff --git a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__pressing_delete_with_no_selected_tile-2.snap b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__pressing_delete_with_no_selected_tile-2.snap index 9365740..26b262d 100644 --- a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__pressing_delete_with_no_selected_tile-2.snap +++ b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__pressing_delete_with_no_selected_tile-2.snap @@ -22,17 +22,17 @@ expression: "&terminal_draw_events_mirror[1]" - - - - - - - - - - - + ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ + │ │ + │ │ + │ Are you sure you want to quit? │ + │ │ + │ │ + │ │ + │ │ + │ (y/n) │ + │ │ + └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ diff --git a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__small_files-2.snap b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__small_files-2.snap new file mode 100644 index 0000000..26b262d --- /dev/null +++ b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__small_files-2.snap @@ -0,0 +1,55 @@ +--- +source: src/tests/cases/ui.rs +expression: "&terminal_draw_events_mirror[1]" +--- + + + + + + + + + + + + + + + + + + + + + ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ + │ │ + │ │ + │ Are you sure you want to quit? │ + │ │ + │ │ + │ │ + │ │ + │ (y/n) │ + │ │ + └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ + + + + + + + + + + + + + + + + + + + + diff --git a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__small_files_with_x_as_zero-2.snap b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__small_files_with_x_as_zero-2.snap new file mode 100644 index 0000000..edf9cd1 --- /dev/null +++ b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__small_files_with_x_as_zero-2.snap @@ -0,0 +1,55 @@ +--- +source: src/tests/cases/ui.rs +expression: "&terminal_draw_events_mirror[1]" +--- + + + + + + + + + + + + + + + + + + + + + ┌────────────────────────┐ + │ │ + │ │ + │ Really quit? │ + │ │ + │ │ + │ │ + │ │ + │ (y/n) │ + │ │ + └────────────────────────┘ + + + + + + + + + + + + + + + + + + + + diff --git a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__small_files_with_y_as_zero-2.snap b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__small_files_with_y_as_zero-2.snap new file mode 100644 index 0000000..26b262d --- /dev/null +++ b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__small_files_with_y_as_zero-2.snap @@ -0,0 +1,55 @@ +--- +source: src/tests/cases/ui.rs +expression: "&terminal_draw_events_mirror[1]" +--- + + + + + + + + + + + + + + + + + + + + + ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ + │ │ + │ │ + │ Are you sure you want to quit? │ + │ │ + │ │ + │ │ + │ │ + │ (y/n) │ + │ │ + └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ + + + + + + + + + + + + + + + + + + + + diff --git a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__small_width-2.snap b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__small_width-2.snap new file mode 100644 index 0000000..edf9cd1 --- /dev/null +++ b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__small_width-2.snap @@ -0,0 +1,55 @@ +--- +source: src/tests/cases/ui.rs +expression: "&terminal_draw_events_mirror[1]" +--- + + + + + + + + + + + + + + + + + + + + + ┌────────────────────────┐ + │ │ + │ │ + │ Really quit? │ + │ │ + │ │ + │ │ + │ │ + │ (y/n) │ + │ │ + └────────────────────────┘ + + + + + + + + + + + + + + + + + + + + diff --git a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__small_width_long_folder_name-2.snap b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__small_width_long_folder_name-2.snap new file mode 100644 index 0000000..edf9cd1 --- /dev/null +++ b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__small_width_long_folder_name-2.snap @@ -0,0 +1,55 @@ +--- +source: src/tests/cases/ui.rs +expression: "&terminal_draw_events_mirror[1]" +--- + + + + + + + + + + + + + + + + + + + + + ┌────────────────────────┐ + │ │ + │ │ + │ Really quit? │ + │ │ + │ │ + │ │ + │ │ + │ (y/n) │ + │ │ + └────────────────────────┘ + + + + + + + + + + + + + + + + + + + + diff --git a/src/tests/cases/snapshots/diskonaut__tests__cases__ui__two_large_files_one_small_file-2.snap b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__two_large_files_one_small_file-2.snap new file mode 100644 index 0000000..26b262d --- /dev/null +++ b/src/tests/cases/snapshots/diskonaut__tests__cases__ui__two_large_files_one_small_file-2.snap @@ -0,0 +1,55 @@ +--- +source: src/tests/cases/ui.rs +expression: "&terminal_draw_events_mirror[1]" +--- + + + + + + + + + + + + + + + + + + + + + ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ + │ │ + │ │ + │ Are you sure you want to quit? │ + │ │ + │ │ + │ │ + │ │ + │ (y/n) │ + │ │ + └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ + + + + + + + + + + + + + + + + + + + + diff --git a/src/tests/cases/test_utils.rs b/src/tests/cases/test_utils.rs index b88978a..d4decf3 100644 --- a/src/tests/cases/test_utils.rs +++ b/src/tests/cases/test_utils.rs @@ -4,9 +4,13 @@ use ::termion::event::{Event, Key}; use crate::tests::fakes::{KeyboardEvents, TerminalEvent, TestBackend}; -pub fn sleep_and_quit_events(sleep_num: usize) -> Box { +pub fn sleep_and_quit_events(sleep_num: usize, quit_after_confirm: bool) -> Box { let mut events: Vec> = iter::repeat(None).take(sleep_num).collect(); events.push(Some(Event::Key(Key::Ctrl('c')))); + if quit_after_confirm { + events.push(None); + events.push(Some(Event::Key(Key::Char('y')))); + } Box::new(KeyboardEvents::new(events)) } diff --git a/src/tests/cases/ui.rs b/src/tests/cases/ui.rs index 2b4ba1e..a9998d6 100644 --- a/src/tests/cases/ui.rs +++ b/src/tests/cases/ui.rs @@ -38,7 +38,7 @@ fn create_temp_file>(path: P, size: usize) -> Result<(), failure: #[test] fn two_large_files_one_small_file() { let (terminal_events, terminal_draw_events, backend) = test_backend_factory(190, 50); - let keyboard_events = sleep_and_quit_events(1); + let keyboard_events = sleep_and_quit_events(1, true); let temp_dir_path = create_root_temp_dir("two_large_files_one_small_file").expect("failed to create temp dir"); @@ -62,21 +62,24 @@ fn two_large_files_one_small_file() { terminal_draw_events_mirror[0] ); - let expected_terminal_events = vec![Clear, HideCursor, Draw, Flush, Clear, ShowCursor]; + let expected_terminal_events = vec![ + Clear, HideCursor, Draw, Flush, Draw, Flush, Clear, ShowCursor, + ]; assert_eq!( &terminal_events.lock().unwrap()[..], &expected_terminal_events[..] ); - assert_eq!(terminal_draw_events_mirror.len(), 1); + assert_eq!(terminal_draw_events_mirror.len(), 2); assert_snapshot!(&terminal_draw_events_mirror[0]); + assert_snapshot!(&terminal_draw_events_mirror[1]); } #[test] fn medium_width() { let (terminal_events, terminal_draw_events, backend) = test_backend_factory(60, 50); - let keyboard_events = sleep_and_quit_events(1); + let keyboard_events = sleep_and_quit_events(1, true); let temp_dir_path = create_root_temp_dir("medium_width").expect("failed to create temp dir"); let mut file_1_path = PathBuf::from(&temp_dir_path); @@ -99,21 +102,24 @@ fn medium_width() { terminal_draw_events_mirror[0] ); - let expected_terminal_events = vec![Clear, HideCursor, Draw, Flush, Clear, ShowCursor]; + let expected_terminal_events = vec![ + Clear, HideCursor, Draw, Flush, Draw, Flush, Clear, ShowCursor, + ]; assert_eq!( &terminal_events.lock().unwrap()[..], &expected_terminal_events[..] ); - assert_eq!(terminal_draw_events_mirror.len(), 1); + assert_eq!(terminal_draw_events_mirror.len(), 2); assert_snapshot!(&terminal_draw_events_mirror[0]); + assert_snapshot!(&terminal_draw_events_mirror[1]); } #[test] fn small_width() { let (terminal_events, terminal_draw_events, backend) = test_backend_factory(50, 50); - let keyboard_events = sleep_and_quit_events(1); + let keyboard_events = sleep_and_quit_events(1, true); let temp_dir_path = create_root_temp_dir("small_width").expect("failed to create temp dir"); let mut file_1_path = PathBuf::from(&temp_dir_path); @@ -136,21 +142,24 @@ fn small_width() { terminal_draw_events_mirror[0] ); - let expected_terminal_events = vec![Clear, HideCursor, Draw, Flush, Clear, ShowCursor]; + let expected_terminal_events = vec![ + Clear, HideCursor, Draw, Flush, Draw, Flush, Clear, ShowCursor, + ]; assert_eq!( &terminal_events.lock().unwrap()[..], &expected_terminal_events[..] ); - assert_eq!(terminal_draw_events_mirror.len(), 1); + assert_eq!(terminal_draw_events_mirror.len(), 2); assert_snapshot!(&terminal_draw_events_mirror[0]); + assert_snapshot!(&terminal_draw_events_mirror[1]); } #[test] fn small_width_long_folder_name() { let (terminal_events, terminal_draw_events, backend) = test_backend_factory(50, 50); - let keyboard_events = sleep_and_quit_events(1); + let keyboard_events = sleep_and_quit_events(1, true); let temp_dir_path = create_root_temp_dir("small_width_long_folder_name").expect("failed to create temp dir"); @@ -174,21 +183,24 @@ fn small_width_long_folder_name() { terminal_draw_events_mirror[0] ); - let expected_terminal_events = vec![Clear, HideCursor, Draw, Flush, Clear, ShowCursor]; + let expected_terminal_events = vec![ + Clear, HideCursor, Draw, Flush, Draw, Flush, Clear, ShowCursor, + ]; assert_eq!( &terminal_events.lock().unwrap()[..], &expected_terminal_events[..] ); - assert_eq!(terminal_draw_events_mirror.len(), 1); + assert_eq!(terminal_draw_events_mirror.len(), 2); assert_snapshot!(&terminal_draw_events_mirror[0]); + assert_snapshot!(&terminal_draw_events_mirror[1]); } #[test] fn too_small_width_one() { let (terminal_events, terminal_draw_events, backend) = test_backend_factory(49, 50); - let keyboard_events = sleep_and_quit_events(1); + let keyboard_events = sleep_and_quit_events(1, false); let temp_dir_path = create_root_temp_dir("too_small_width_one").expect("failed to create temp dir"); @@ -226,7 +238,7 @@ fn too_small_width_one() { #[test] fn too_small_width_two() { let (terminal_events, terminal_draw_events, backend) = test_backend_factory(26, 50); - let keyboard_events = sleep_and_quit_events(1); + let keyboard_events = sleep_and_quit_events(1, false); let temp_dir_path = create_root_temp_dir("too_small_width_two").expect("failed to create temp dir"); @@ -264,7 +276,7 @@ fn too_small_width_two() { #[test] fn too_small_width_three() { let (terminal_events, terminal_draw_events, backend) = test_backend_factory(20, 50); - let keyboard_events = sleep_and_quit_events(1); + let keyboard_events = sleep_and_quit_events(1, false); let temp_dir_path = create_root_temp_dir("too_small_width_three").expect("failed to create temp dir"); @@ -290,7 +302,7 @@ fn too_small_width_three() { #[test] fn too_small_width_four() { let (terminal_events, terminal_draw_events, backend) = test_backend_factory(15, 50); - let keyboard_events = sleep_and_quit_events(1); + let keyboard_events = sleep_and_quit_events(1, false); let temp_dir_path = create_root_temp_dir("too_small_width_four").expect("failed to create temp dir"); @@ -316,7 +328,7 @@ fn too_small_width_four() { #[test] fn too_small_width_five() { let (terminal_events, terminal_draw_events, backend) = test_backend_factory(5, 50); - let keyboard_events = sleep_and_quit_events(1); + let keyboard_events = sleep_and_quit_events(1, false); let temp_dir_path = create_root_temp_dir("too_small_width_five").expect("failed to create temp dir"); @@ -342,7 +354,7 @@ fn too_small_width_five() { #[test] fn too_small_height() { let (terminal_events, terminal_draw_events, backend) = test_backend_factory(190, 14); - let keyboard_events = sleep_and_quit_events(1); + let keyboard_events = sleep_and_quit_events(1, false); let temp_dir_path = create_root_temp_dir("too_small_height").expect("failed to create temp dir"); @@ -368,7 +380,7 @@ fn too_small_height() { #[test] fn eleven_files() { let (terminal_events, terminal_draw_events, backend) = test_backend_factory(190, 50); - let keyboard_events = sleep_and_quit_events(1); + let keyboard_events = sleep_and_quit_events(1, true); let temp_dir_path = create_root_temp_dir("eleven_files").expect("failed to create temp dir"); let mut file_1_path = PathBuf::from(&temp_dir_path); @@ -419,14 +431,17 @@ fn eleven_files() { std::fs::remove_dir_all(temp_dir_path).expect("failed to remove temporary folder"); let terminal_draw_events_mirror = terminal_draw_events.lock().unwrap(); - let expected_terminal_events = vec![Clear, HideCursor, Draw, Flush, Clear, ShowCursor]; + let expected_terminal_events = vec![ + Clear, HideCursor, Draw, Flush, Draw, Flush, Clear, ShowCursor, + ]; assert_eq!( &terminal_events.lock().unwrap()[..], &expected_terminal_events[..] ); - assert_eq!(terminal_draw_events_mirror.len(), 1); + assert_eq!(terminal_draw_events_mirror.len(), 2); assert_snapshot!(&terminal_draw_events_mirror[0]); + assert_snapshot!(&terminal_draw_events_mirror[1]); } #[test] @@ -444,6 +459,8 @@ fn enter_folder() { events.push(None); events.push(None); events.push(Some(Event::Key(Key::Ctrl('c')))); + events.push(None); + events.push(Some(Event::Key(Key::Char('y')))); let keyboard_events = Box::new(KeyboardEvents::new(events)); let temp_dir_path = create_root_temp_dir("enter_folder").expect("failed to create temp dir"); @@ -472,7 +489,7 @@ fn enter_folder() { .expect("could not acquire lock on terminal events"); let expected_terminal_events = vec![ - Clear, HideCursor, Draw, Flush, Draw, Flush, Draw, Flush, Clear, ShowCursor, + Clear, HideCursor, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Clear, ShowCursor, ]; assert_eq!( @@ -482,10 +499,11 @@ fn enter_folder() { &expected_terminal_events[..] ); - assert_eq!(terminal_draw_events_mirror.len(), 3); + assert_eq!(terminal_draw_events_mirror.len(), 4); assert_snapshot!(&terminal_draw_events_mirror[0]); assert_snapshot!(&terminal_draw_events_mirror[1]); assert_snapshot!(&terminal_draw_events_mirror[2]); + assert_snapshot!(&terminal_draw_events_mirror[3]); } #[test] @@ -503,6 +521,8 @@ fn enter_folder_medium_width() { events.push(None); events.push(None); events.push(Some(Event::Key(Key::Ctrl('c')))); + events.push(None); + events.push(Some(Event::Key(Key::Char('y')))); let keyboard_events = Box::new(KeyboardEvents::new(events)); let temp_dir_path = @@ -532,7 +552,7 @@ fn enter_folder_medium_width() { .expect("could not acquire lock on terminal events"); let expected_terminal_events = vec![ - Clear, HideCursor, Draw, Flush, Draw, Flush, Draw, Flush, Clear, ShowCursor, + Clear, HideCursor, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Clear, ShowCursor, ]; assert_eq!( @@ -542,10 +562,11 @@ fn enter_folder_medium_width() { &expected_terminal_events[..] ); - assert_eq!(terminal_draw_events_mirror.len(), 3); + assert_eq!(terminal_draw_events_mirror.len(), 4); assert_snapshot!(&terminal_draw_events_mirror[0]); assert_snapshot!(&terminal_draw_events_mirror[1]); assert_snapshot!(&terminal_draw_events_mirror[2]); + assert_snapshot!(&terminal_draw_events_mirror[3]); } #[test] @@ -563,6 +584,8 @@ fn enter_folder_small_width() { events.push(None); events.push(None); events.push(Some(Event::Key(Key::Ctrl('c')))); + events.push(None); + events.push(Some(Event::Key(Key::Char('y')))); let keyboard_events = Box::new(KeyboardEvents::new(events)); let temp_dir_path = @@ -592,7 +615,7 @@ fn enter_folder_small_width() { .expect("could not acquire lock on terminal events"); let expected_terminal_events = vec![ - Clear, HideCursor, Draw, Flush, Draw, Flush, Draw, Flush, Clear, ShowCursor, + Clear, HideCursor, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Clear, ShowCursor, ]; assert_eq!( @@ -602,16 +625,17 @@ fn enter_folder_small_width() { &expected_terminal_events[..] ); - assert_eq!(terminal_draw_events_mirror.len(), 3); + assert_eq!(terminal_draw_events_mirror.len(), 4); assert_snapshot!(&terminal_draw_events_mirror[0]); assert_snapshot!(&terminal_draw_events_mirror[1]); assert_snapshot!(&terminal_draw_events_mirror[2]); + assert_snapshot!(&terminal_draw_events_mirror[3]); } #[test] fn small_files() { let (terminal_events, terminal_draw_events, backend) = test_backend_factory(190, 50); - let keyboard_events = sleep_and_quit_events(1); + let keyboard_events = sleep_and_quit_events(1, true); let temp_dir_path = create_root_temp_dir("small_files").expect("failed to create temp dir"); let mut file_1_path = PathBuf::from(&temp_dir_path); @@ -638,14 +662,17 @@ fn small_files() { std::fs::remove_dir_all(temp_dir_path).expect("failed to remove temporary folder"); let terminal_draw_events_mirror = terminal_draw_events.lock().unwrap(); - let expected_terminal_events = vec![Clear, HideCursor, Draw, Flush, Clear, ShowCursor]; + let expected_terminal_events = vec![ + Clear, HideCursor, Draw, Flush, Draw, Flush, Clear, ShowCursor, + ]; assert_eq!( &terminal_events.lock().unwrap()[..], &expected_terminal_events[..] ); - assert_eq!(terminal_draw_events_mirror.len(), 1); + assert_eq!(terminal_draw_events_mirror.len(), 2); assert_snapshot!(&terminal_draw_events_mirror[0]); + assert_snapshot!(&terminal_draw_events_mirror[1]); } #[test] @@ -660,6 +687,8 @@ fn cannot_move_into_small_files() { events.push(Some(Event::Key(Key::Char('j')))); events.push(None); events.push(Some(Event::Key(Key::Ctrl('c')))); + events.push(None); + events.push(Some(Event::Key(Key::Char('y')))); let keyboard_events = Box::new(KeyboardEvents::new(events)); let temp_dir_path = @@ -718,18 +747,20 @@ fn cannot_move_into_small_files() { let terminal_draw_events_mirror = terminal_draw_events.lock().unwrap(); let expected_terminal_events = vec![ - Clear, HideCursor, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Clear, ShowCursor, + Clear, HideCursor, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Clear, + ShowCursor, ]; assert_eq!( &terminal_events.lock().unwrap()[..], &expected_terminal_events[..] ); - assert_eq!(terminal_draw_events_mirror.len(), 4); + assert_eq!(terminal_draw_events_mirror.len(), 5); assert_snapshot!(&terminal_draw_events_mirror[0]); assert_snapshot!(&terminal_draw_events_mirror[1]); assert_snapshot!(&terminal_draw_events_mirror[2]); assert_snapshot!(&terminal_draw_events_mirror[3]); + assert_snapshot!(&terminal_draw_events_mirror[4]); } #[test] @@ -742,7 +773,7 @@ fn minimum_tile_sides() { // to the minimum with some sort of asterisk to explain let (terminal_events, terminal_draw_events, backend) = test_backend_factory(190, 50); - let keyboard_events = sleep_and_quit_events(1); + let keyboard_events = sleep_and_quit_events(1, true); let temp_dir_path = create_root_temp_dir("minimum_tile_sides").expect("failed to create temp dir"); @@ -768,15 +799,18 @@ fn minimum_tile_sides() { std::fs::remove_dir_all(temp_dir_path).expect("failed to remove temporary folder"); let terminal_draw_events_mirror = terminal_draw_events.lock().unwrap(); - let expected_terminal_events = vec![Clear, HideCursor, Draw, Flush, Clear, ShowCursor]; + let expected_terminal_events = vec![ + Clear, HideCursor, Draw, Flush, Draw, Flush, Clear, ShowCursor, + ]; // let expected_terminal_events = vec![Clear, HideCursor, Draw, Flush, Draw, Flush, Clear, ShowCursor]; assert_eq!( &terminal_events.lock().unwrap()[..], &expected_terminal_events[..] ); - assert_eq!(terminal_draw_events_mirror.len(), 1); + assert_eq!(terminal_draw_events_mirror.len(), 2); assert_snapshot!(&terminal_draw_events_mirror[0]); + assert_snapshot!(&terminal_draw_events_mirror[1]); } #[test] @@ -795,6 +829,8 @@ fn move_down_and_enter_folder() { events.push(None); events.push(None); events.push(Some(Event::Key(Key::Ctrl('c')))); + events.push(None); + events.push(Some(Event::Key(Key::Char('y')))); let keyboard_events = Box::new(KeyboardEvents::new(events)); let temp_dir_path = @@ -824,7 +860,8 @@ fn move_down_and_enter_folder() { .expect("could not acquire lock on terminal events"); let expected_terminal_events = vec![ - Clear, HideCursor, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Clear, ShowCursor, + Clear, HideCursor, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Clear, + ShowCursor, ]; assert_eq!( @@ -834,11 +871,12 @@ fn move_down_and_enter_folder() { &expected_terminal_events[..] ); - assert_eq!(terminal_draw_events_mirror.len(), 4); + assert_eq!(terminal_draw_events_mirror.len(), 5); assert_snapshot!(&terminal_draw_events_mirror[0]); assert_snapshot!(&terminal_draw_events_mirror[1]); assert_snapshot!(&terminal_draw_events_mirror[2]); assert_snapshot!(&terminal_draw_events_mirror[3]); + assert_snapshot!(&terminal_draw_events_mirror[4]); } #[test] @@ -857,6 +895,8 @@ fn noop_when_entering_file() { events.push(None); events.push(None); events.push(Some(Event::Key(Key::Ctrl('c')))); + events.push(None); + events.push(Some(Event::Key(Key::Char('y')))); let keyboard_events = Box::new(KeyboardEvents::new(events)); let temp_dir_path = @@ -881,7 +921,7 @@ fn noop_when_entering_file() { .expect("could not acquire lock on terminal events"); let expected_terminal_events = vec![ - Clear, HideCursor, Draw, Flush, Draw, Flush, Draw, Flush, Clear, ShowCursor, + Clear, HideCursor, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Clear, ShowCursor, ]; assert_eq!( @@ -891,10 +931,11 @@ fn noop_when_entering_file() { &expected_terminal_events[..] ); - assert_eq!(terminal_draw_events_mirror.len(), 3); + assert_eq!(terminal_draw_events_mirror.len(), 4); assert_snapshot!(&terminal_draw_events_mirror[0]); assert_snapshot!(&terminal_draw_events_mirror[1]); assert_snapshot!(&terminal_draw_events_mirror[2]); + assert_snapshot!(&terminal_draw_events_mirror[3]); } #[test] @@ -915,6 +956,8 @@ fn move_up_and_enter_folder() { events.push(None); events.push(None); events.push(Some(Event::Key(Key::Ctrl('c')))); + events.push(None); + events.push(Some(Event::Key(Key::Char('y')))); let keyboard_events = Box::new(KeyboardEvents::new(events)); let temp_dir_path = @@ -944,8 +987,8 @@ fn move_up_and_enter_folder() { .expect("could not acquire lock on terminal events"); let expected_terminal_events = vec![ - Clear, HideCursor, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Clear, - ShowCursor, + Clear, HideCursor, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Draw, + Flush, Clear, ShowCursor, ]; assert_eq!( @@ -955,12 +998,13 @@ fn move_up_and_enter_folder() { &expected_terminal_events[..] ); - assert_eq!(terminal_draw_events_mirror.len(), 5); + assert_eq!(terminal_draw_events_mirror.len(), 6); assert_snapshot!(&terminal_draw_events_mirror[0]); assert_snapshot!(&terminal_draw_events_mirror[1]); assert_snapshot!(&terminal_draw_events_mirror[2]); assert_snapshot!(&terminal_draw_events_mirror[3]); assert_snapshot!(&terminal_draw_events_mirror[4]); + assert_snapshot!(&terminal_draw_events_mirror[5]); } #[test] @@ -979,6 +1023,8 @@ fn move_right_and_enter_folder() { events.push(None); events.push(None); events.push(Some(Event::Key(Key::Ctrl('c')))); + events.push(None); + events.push(Some(Event::Key(Key::Char('y')))); let keyboard_events = Box::new(KeyboardEvents::new(events)); let temp_dir_path = @@ -1008,7 +1054,8 @@ fn move_right_and_enter_folder() { .expect("could not acquire lock on terminal events"); let expected_terminal_events = vec![ - Clear, HideCursor, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Clear, ShowCursor, + Clear, HideCursor, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Clear, + ShowCursor, ]; assert_eq!( @@ -1018,11 +1065,12 @@ fn move_right_and_enter_folder() { &expected_terminal_events[..] ); - assert_eq!(terminal_draw_events_mirror.len(), 4); + assert_eq!(terminal_draw_events_mirror.len(), 5); assert_snapshot!(&terminal_draw_events_mirror[0]); assert_snapshot!(&terminal_draw_events_mirror[1]); assert_snapshot!(&terminal_draw_events_mirror[2]); assert_snapshot!(&terminal_draw_events_mirror[3]); + assert_snapshot!(&terminal_draw_events_mirror[4]); } #[test] @@ -1043,6 +1091,8 @@ fn move_left_and_enter_folder() { events.push(None); events.push(None); events.push(Some(Event::Key(Key::Ctrl('c')))); + events.push(None); + events.push(Some(Event::Key(Key::Char('y')))); let keyboard_events = Box::new(KeyboardEvents::new(events)); let temp_dir_path = @@ -1072,8 +1122,8 @@ fn move_left_and_enter_folder() { .expect("could not acquire lock on terminal events"); let expected_terminal_events = vec![ - Clear, HideCursor, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Clear, - ShowCursor, + Clear, HideCursor, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Draw, + Flush, Clear, ShowCursor, ]; assert_eq!( @@ -1083,12 +1133,13 @@ fn move_left_and_enter_folder() { &expected_terminal_events[..] ); - assert_eq!(terminal_draw_events_mirror.len(), 5); + assert_eq!(terminal_draw_events_mirror.len(), 6); assert_snapshot!(&terminal_draw_events_mirror[0]); assert_snapshot!(&terminal_draw_events_mirror[1]); assert_snapshot!(&terminal_draw_events_mirror[2]); assert_snapshot!(&terminal_draw_events_mirror[3]); assert_snapshot!(&terminal_draw_events_mirror[4]); + assert_snapshot!(&terminal_draw_events_mirror[5]); } #[test] @@ -1103,6 +1154,8 @@ fn enter_largest_folder_with_no_selected_tile() { events.push(None); events.push(None); events.push(Some(Event::Key(Key::Ctrl('c')))); + events.push(None); + events.push(Some(Event::Key(Key::Char('y')))); let keyboard_events = Box::new(KeyboardEvents::new(events)); let temp_dir_path = create_root_temp_dir("enter_largest_folder_with_no_selected_tile") @@ -1132,7 +1185,7 @@ fn enter_largest_folder_with_no_selected_tile() { .expect("could not acquire lock on terminal events"); let expected_terminal_events = vec![ - Clear, HideCursor, Draw, Flush, Draw, Flush, Clear, ShowCursor, + Clear, HideCursor, Draw, Flush, Draw, Flush, Draw, Flush, Clear, ShowCursor, ]; assert_eq!( @@ -1142,9 +1195,10 @@ fn enter_largest_folder_with_no_selected_tile() { &expected_terminal_events[..] ); - assert_eq!(terminal_draw_events_mirror.len(), 2); + assert_eq!(terminal_draw_events_mirror.len(), 3); assert_snapshot!(&terminal_draw_events_mirror[0]); assert_snapshot!(&terminal_draw_events_mirror[1]); + assert_snapshot!(&terminal_draw_events_mirror[2]); } #[test] @@ -1159,6 +1213,8 @@ fn clear_selection_when_moving_off_screen_edges() { events.push(Some(Event::Key(Key::Char('l')))); events.push(None); events.push(Some(Event::Key(Key::Ctrl('c')))); + events.push(None); + events.push(Some(Event::Key(Key::Char('y')))); let keyboard_events = Box::new(KeyboardEvents::new(events)); let temp_dir_path = create_root_temp_dir("noop_when_moving_off_screen_edges") @@ -1183,7 +1239,8 @@ fn clear_selection_when_moving_off_screen_edges() { .expect("could not acquire lock on terminal events"); let expected_terminal_events = vec![ - Clear, HideCursor, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Clear, ShowCursor, + Clear, HideCursor, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Clear, + ShowCursor, ]; assert_eq!( &terminal_events @@ -1192,11 +1249,12 @@ fn clear_selection_when_moving_off_screen_edges() { &expected_terminal_events[..] ); - assert_eq!(terminal_draw_events_mirror.len(), 4); + assert_eq!(terminal_draw_events_mirror.len(), 5); assert_snapshot!(&terminal_draw_events_mirror[0]); assert_snapshot!(&terminal_draw_events_mirror[1]); assert_snapshot!(&terminal_draw_events_mirror[2]); assert_snapshot!(&terminal_draw_events_mirror[3]); + assert_snapshot!(&terminal_draw_events_mirror[4]); } #[test] @@ -1219,6 +1277,8 @@ fn esc_to_go_up() { events.push(None); events.push(None); events.push(Some(Event::Key(Key::Ctrl('c')))); + events.push(None); + events.push(Some(Event::Key(Key::Char('y')))); let keyboard_events = Box::new(KeyboardEvents::new(events)); let temp_dir_path = create_root_temp_dir("esc_to_go_up").expect("failed to create temp dir"); @@ -1247,8 +1307,8 @@ fn esc_to_go_up() { .expect("could not acquire lock on terminal events"); let expected_terminal_events = vec![ - Clear, HideCursor, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Clear, - ShowCursor, + Clear, HideCursor, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Draw, + Flush, Clear, ShowCursor, ]; assert_eq!( @@ -1258,12 +1318,13 @@ fn esc_to_go_up() { &expected_terminal_events[..] ); - assert_eq!(terminal_draw_events_mirror.len(), 5); + assert_eq!(terminal_draw_events_mirror.len(), 6); assert_snapshot!(&terminal_draw_events_mirror[0]); assert_snapshot!(&terminal_draw_events_mirror[1]); assert_snapshot!(&terminal_draw_events_mirror[2]); assert_snapshot!(&terminal_draw_events_mirror[3]); assert_snapshot!(&terminal_draw_events_mirror[4]); + assert_snapshot!(&terminal_draw_events_mirror[5]); } #[test] @@ -1290,6 +1351,8 @@ fn noop_when_pressing_esc_at_base_folder() { events.push(None); events.push(None); events.push(Some(Event::Key(Key::Ctrl('c')))); + events.push(None); + events.push(Some(Event::Key(Key::Char('y')))); let keyboard_events = Box::new(KeyboardEvents::new(events)); let temp_dir_path = create_root_temp_dir("noop_when_pressing_esc_at_base_folder") @@ -1320,7 +1383,7 @@ fn noop_when_pressing_esc_at_base_folder() { let expected_terminal_events = vec![ Clear, HideCursor, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Draw, - Flush, Draw, Flush, Draw, Flush, Clear, ShowCursor, + Flush, Draw, Flush, Draw, Flush, Draw, Flush, Clear, ShowCursor, ]; assert_eq!( @@ -1330,7 +1393,7 @@ fn noop_when_pressing_esc_at_base_folder() { &expected_terminal_events[..] ); - assert_eq!(terminal_draw_events_mirror.len(), 8); + assert_eq!(terminal_draw_events_mirror.len(), 9); assert_snapshot!(&terminal_draw_events_mirror[0]); assert_snapshot!(&terminal_draw_events_mirror[1]); assert_snapshot!(&terminal_draw_events_mirror[2]); @@ -1339,6 +1402,7 @@ fn noop_when_pressing_esc_at_base_folder() { assert_snapshot!(&terminal_draw_events_mirror[5]); assert_snapshot!(&terminal_draw_events_mirror[6]); assert_snapshot!(&terminal_draw_events_mirror[7]); + assert_snapshot!(&terminal_draw_events_mirror[8]); } #[test] @@ -1356,6 +1420,8 @@ fn delete_file() { events.push(None); events.push(None); events.push(Some(Event::Key(Key::Ctrl('c')))); + events.push(None); + events.push(Some(Event::Key(Key::Char('y')))); let keyboard_events = Box::new(KeyboardEvents::new(events)); let temp_dir_path = create_root_temp_dir("delete_file").expect("failed to create temp dir"); @@ -1384,7 +1450,7 @@ fn delete_file() { let expected_terminal_events = vec![ Clear, HideCursor, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Draw, - Flush, Draw, Flush, Clear, ShowCursor, + Flush, Draw, Flush, Draw, Flush, Clear, ShowCursor, ]; assert_eq!( &terminal_events @@ -1414,7 +1480,7 @@ fn delete_file() { ); std::fs::remove_dir_all(temp_dir_path).expect("failed to remove temporary folder"); - assert_eq!(terminal_draw_events_mirror.len(), 7); + assert_eq!(terminal_draw_events_mirror.len(), 8); assert_snapshot!(&terminal_draw_events_mirror[0]); assert_snapshot!(&terminal_draw_events_mirror[1]); assert_snapshot!(&terminal_draw_events_mirror[2]); @@ -1422,6 +1488,7 @@ fn delete_file() { assert_snapshot!(&terminal_draw_events_mirror[4]); assert_snapshot!(&terminal_draw_events_mirror[5]); assert_snapshot!(&terminal_draw_events_mirror[6]); + assert_snapshot!(&terminal_draw_events_mirror[7]); } #[test] @@ -1439,6 +1506,8 @@ fn cant_delete_file_with_term_too_small() { events.push(None); events.push(None); events.push(Some(Event::Key(Key::Ctrl('c')))); + events.push(None); + events.push(Some(Event::Key(Key::Char('y')))); let keyboard_events = Box::new(KeyboardEvents::new(events)); let temp_dir_path = create_root_temp_dir("cant_delete_file_with_term_too_small") @@ -1518,6 +1587,8 @@ fn delete_folder() { events.push(None); events.push(None); events.push(Some(Event::Key(Key::Ctrl('c')))); + events.push(None); + events.push(Some(Event::Key(Key::Char('y')))); let keyboard_events = Box::new(KeyboardEvents::new(events)); let temp_dir_path = create_root_temp_dir("delete_folder").expect("failed to create temp dir"); @@ -1539,98 +1610,6 @@ fn delete_folder() { file_3_path.push("file3"); create_temp_file(&file_3_path, 4000).expect("failed to create temp file"); - start(backend, keyboard_events, temp_dir_path.clone()); - let terminal_draw_events_mirror = terminal_draw_events - .lock() - .expect("could not acquire lock on terminal events"); - - let expected_terminal_events = vec![ - Clear, HideCursor, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Draw, - Flush, Draw, Flush, Draw, Flush, Clear, ShowCursor, - ]; - assert_eq!( - &terminal_events - .lock() - .expect("could not acquire lock on terminal_events")[..], - &expected_terminal_events[..] - ); - assert_eq!( - std::fs::metadata(&subfolder_1_path).is_err(), - true, - "folder successfully deleted" - ); - assert_eq!( - std::fs::metadata(&file_1_path).is_err(), - true, - "internal file successfully deleted" - ); // can't really fail on its own, but left here for clarity - assert_eq!( - std::fs::metadata(&file_2_path).is_ok(), - true, - "different file was untouched" - ); - assert_eq!( - std::fs::metadata(&file_3_path).is_ok(), - true, - "second different file was untouched" - ); - std::fs::remove_dir_all(temp_dir_path).expect("failed to remove temporary folder"); - - assert_eq!(terminal_draw_events_mirror.len(), 8); - assert_snapshot!(&terminal_draw_events_mirror[0]); - assert_snapshot!(&terminal_draw_events_mirror[1]); - assert_snapshot!(&terminal_draw_events_mirror[2]); - assert_snapshot!(&terminal_draw_events_mirror[3]); - assert_snapshot!(&terminal_draw_events_mirror[4]); - assert_snapshot!(&terminal_draw_events_mirror[5]); - assert_snapshot!(&terminal_draw_events_mirror[6]); - assert_snapshot!(&terminal_draw_events_mirror[7]); -} - -#[test] -fn delete_folder_small_window() { - // terminal window with a width of 60 (shorter message window layout) - let (terminal_events, terminal_draw_events, backend) = test_backend_factory(60, 50); - - let mut events: Vec> = iter::repeat(None).take(1).collect(); - events.push(Some(Event::Key(Key::Char('j')))); // once to place selected marker on screen - events.push(None); - events.push(Some(Event::Key(Key::Char('j')))); - events.push(None); - events.push(Some(Event::Key(Key::Char('j')))); - events.push(None); - events.push(Some(Event::Key(Key::Ctrl('d')))); - events.push(None); - events.push(Some(Event::Key(Key::Char('y')))); - // here we sleep extra to allow the blink events to happen and be tested before the app exits - // with the following ctrl-c - events.push(None); - events.push(None); - events.push(None); - events.push(None); - events.push(Some(Event::Key(Key::Ctrl('c')))); - let keyboard_events = Box::new(KeyboardEvents::new(events)); - - let temp_dir_path = - create_root_temp_dir("delete_folder_small_wikndow").expect("failed to create temp dir"); - - let mut subfolder_1_path = PathBuf::from(&temp_dir_path); - subfolder_1_path.push("subfolder1"); - create_dir(&subfolder_1_path).expect("failed to create temporary directory"); - - let mut file_1_path = PathBuf::from(&temp_dir_path); - file_1_path.push("subfolder1"); - file_1_path.push("file1"); - create_temp_file(&file_1_path, 4000).expect("failed to create temp file"); - - let mut file_2_path = PathBuf::from(&temp_dir_path); - file_2_path.push("file2"); - create_temp_file(&file_2_path, 4000).expect("failed to create temp file"); - - let mut file_3_path = PathBuf::from(&temp_dir_path); - file_3_path.push("file3"); - create_temp_file(&file_3_path, 4000).expect("failed to create temp file"); - start(backend, keyboard_events, temp_dir_path.clone()); let terminal_draw_events_mirror = terminal_draw_events .lock() @@ -1646,20 +1625,20 @@ fn delete_folder_small_window() { .expect("could not acquire lock on terminal_events")[..], &expected_terminal_events[..] ); - assert_eq!( - std::fs::metadata(&file_2_path).is_ok(), - true, - "different file was untouched" - ); assert_eq!( std::fs::metadata(&subfolder_1_path).is_err(), true, - "file successfully deleted" + "folder successfully deleted" ); assert_eq!( std::fs::metadata(&file_1_path).is_err(), true, - "file in folder deleted" + "internal file successfully deleted" + ); // can't really fail on its own, but left here for clarity + assert_eq!( + std::fs::metadata(&file_2_path).is_ok(), + true, + "different file was untouched" ); assert_eq!( std::fs::metadata(&file_3_path).is_ok(), @@ -1680,6 +1659,102 @@ fn delete_folder_small_window() { assert_snapshot!(&terminal_draw_events_mirror[8]); } +#[test] +fn delete_folder_small_window() { + // terminal window with a width of 60 (shorter message window layout) + let (terminal_events, terminal_draw_events, backend) = test_backend_factory(60, 50); + + let mut events: Vec> = iter::repeat(None).take(1).collect(); + events.push(Some(Event::Key(Key::Char('j')))); // once to place selected marker on screen + events.push(None); + events.push(Some(Event::Key(Key::Char('j')))); + events.push(None); + events.push(Some(Event::Key(Key::Char('j')))); + events.push(None); + events.push(Some(Event::Key(Key::Ctrl('d')))); + events.push(None); + events.push(Some(Event::Key(Key::Char('y')))); + // here we sleep extra to allow the blink events to happen and be tested before the app exits + // with the following ctrl-c + events.push(None); + events.push(None); + events.push(None); + events.push(None); + events.push(Some(Event::Key(Key::Ctrl('c')))); + events.push(None); + events.push(Some(Event::Key(Key::Char('y')))); + let keyboard_events = Box::new(KeyboardEvents::new(events)); + + let temp_dir_path = + create_root_temp_dir("delete_folder_small_wikndow").expect("failed to create temp dir"); + + let mut subfolder_1_path = PathBuf::from(&temp_dir_path); + subfolder_1_path.push("subfolder1"); + create_dir(&subfolder_1_path).expect("failed to create temporary directory"); + + let mut file_1_path = PathBuf::from(&temp_dir_path); + file_1_path.push("subfolder1"); + file_1_path.push("file1"); + create_temp_file(&file_1_path, 4000).expect("failed to create temp file"); + + let mut file_2_path = PathBuf::from(&temp_dir_path); + file_2_path.push("file2"); + create_temp_file(&file_2_path, 4000).expect("failed to create temp file"); + + let mut file_3_path = PathBuf::from(&temp_dir_path); + file_3_path.push("file3"); + create_temp_file(&file_3_path, 4000).expect("failed to create temp file"); + + start(backend, keyboard_events, temp_dir_path.clone()); + let terminal_draw_events_mirror = terminal_draw_events + .lock() + .expect("could not acquire lock on terminal events"); + + let expected_terminal_events = vec![ + Clear, HideCursor, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Draw, + Flush, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Clear, ShowCursor, + ]; + assert_eq!( + &terminal_events + .lock() + .expect("could not acquire lock on terminal_events")[..], + &expected_terminal_events[..] + ); + assert_eq!( + std::fs::metadata(&file_2_path).is_ok(), + true, + "different file was untouched" + ); + assert_eq!( + std::fs::metadata(&subfolder_1_path).is_err(), + true, + "file successfully deleted" + ); + assert_eq!( + std::fs::metadata(&file_1_path).is_err(), + true, + "file in folder deleted" + ); + assert_eq!( + std::fs::metadata(&file_3_path).is_ok(), + true, + "second different file was untouched" + ); + std::fs::remove_dir_all(temp_dir_path).expect("failed to remove temporary folder"); + + assert_eq!(terminal_draw_events_mirror.len(), 10); + assert_snapshot!(&terminal_draw_events_mirror[0]); + assert_snapshot!(&terminal_draw_events_mirror[1]); + assert_snapshot!(&terminal_draw_events_mirror[2]); + assert_snapshot!(&terminal_draw_events_mirror[3]); + assert_snapshot!(&terminal_draw_events_mirror[4]); + assert_snapshot!(&terminal_draw_events_mirror[5]); + assert_snapshot!(&terminal_draw_events_mirror[6]); + assert_snapshot!(&terminal_draw_events_mirror[7]); + assert_snapshot!(&terminal_draw_events_mirror[8]); + assert_snapshot!(&terminal_draw_events_mirror[9]); +} + #[test] fn delete_folder_with_multiple_children() { let (terminal_events, terminal_draw_events, backend) = test_backend_factory(190, 50); @@ -1699,6 +1774,8 @@ fn delete_folder_with_multiple_children() { events.push(None); events.push(None); events.push(Some(Event::Key(Key::Ctrl('c')))); + events.push(None); + events.push(Some(Event::Key(Key::Char('y')))); let keyboard_events = Box::new(KeyboardEvents::new(events)); let temp_dir_path = create_root_temp_dir("delete_folder_with_multiple_children") @@ -1745,7 +1822,7 @@ fn delete_folder_with_multiple_children() { let expected_terminal_events = vec![ Clear, HideCursor, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Draw, - Flush, Draw, Flush, Draw, Flush, Clear, ShowCursor, + Flush, Draw, Flush, Draw, Flush, Draw, Flush, Clear, ShowCursor, ]; assert_eq!( &terminal_events @@ -1790,7 +1867,7 @@ fn delete_folder_with_multiple_children() { ); std::fs::remove_dir_all(temp_dir_path).expect("failed to remove temporary folder"); - assert_eq!(terminal_draw_events_mirror.len(), 8); + assert_eq!(terminal_draw_events_mirror.len(), 9); assert_snapshot!(&terminal_draw_events_mirror[0]); assert_snapshot!(&terminal_draw_events_mirror[1]); assert_snapshot!(&terminal_draw_events_mirror[2]); @@ -1799,6 +1876,7 @@ fn delete_folder_with_multiple_children() { assert_snapshot!(&terminal_draw_events_mirror[5]); assert_snapshot!(&terminal_draw_events_mirror[6]); assert_snapshot!(&terminal_draw_events_mirror[7]); + assert_snapshot!(&terminal_draw_events_mirror[8]); } #[test] @@ -1809,6 +1887,8 @@ fn pressing_delete_with_no_selected_tile() { events.push(Some(Event::Key(Key::Ctrl('d')))); events.push(None); events.push(Some(Event::Key(Key::Ctrl('c')))); + events.push(None); + events.push(Some(Event::Key(Key::Char('y')))); let keyboard_events = Box::new(KeyboardEvents::new(events)); let temp_dir_path = create_root_temp_dir("pressing_delete_with_no_selected_tile") @@ -1831,85 +1911,13 @@ fn pressing_delete_with_no_selected_tile() { file_3_path.push("file3"); create_temp_file(&file_3_path, 4000).expect("failed to create temp file"); - start(backend, keyboard_events, temp_dir_path.clone()); - let terminal_draw_events_mirror = terminal_draw_events - .lock() - .expect("could not acquire lock on terminal events"); - - let expected_terminal_events = vec![Clear, HideCursor, Draw, Flush, Clear, ShowCursor]; - assert_eq!( - &terminal_events - .lock() - .expect("could not acquire lock on terminal_events")[..], - &expected_terminal_events[..] - ); - assert_eq!( - std::fs::metadata(&file_2_path).is_ok(), - true, - "file not deleted" - ); - assert_eq!( - std::fs::metadata(&subfolder_1_path).is_ok(), - true, - "different folder stayed the same" - ); - assert_eq!( - std::fs::metadata(&file_1_path).is_ok(), - true, - "different file was untoucehd" - ); - assert_eq!( - std::fs::metadata(&file_3_path).is_ok(), - true, - "second different file was untouched" - ); - std::fs::remove_dir_all(temp_dir_path).expect("failed to remove temporary folder"); - - assert_eq!(terminal_draw_events_mirror.len(), 1); - assert_snapshot!(&terminal_draw_events_mirror[0]); -} - -#[test] -fn delete_file_press_n() { - let (terminal_events, terminal_draw_events, backend) = test_backend_factory(190, 50); - - let mut events: Vec> = iter::repeat(None).take(1).collect(); - events.push(Some(Event::Key(Key::Char('l')))); // once to place selected marker on screen - events.push(None); - events.push(Some(Event::Key(Key::Ctrl('d')))); - events.push(None); - events.push(Some(Event::Key(Key::Char('n')))); - events.push(None); - events.push(Some(Event::Key(Key::Ctrl('c')))); - let keyboard_events = Box::new(KeyboardEvents::new(events)); - - let temp_dir_path = - create_root_temp_dir("delete_file_press_n").expect("failed to create temp dir"); - - let mut subfolder_1_path = PathBuf::from(&temp_dir_path); - subfolder_1_path.push("subfolder1"); - create_dir(&subfolder_1_path).expect("failed to create temporary directory"); - - let mut file_1_path = PathBuf::from(&temp_dir_path); - file_1_path.push("subfolder1"); - file_1_path.push("file1"); - create_temp_file(&file_1_path, 4000).expect("failed to create temp file"); - - let mut file_2_path = PathBuf::from(&temp_dir_path); - file_2_path.push("file2"); - create_temp_file(&file_2_path, 4000).expect("failed to create temp file"); - - let mut file_3_path = PathBuf::from(&temp_dir_path); - file_3_path.push("file3"); - create_temp_file(&file_3_path, 4000).expect("failed to create temp file"); - start(backend, keyboard_events, temp_dir_path.clone()); let terminal_draw_events_mirror = terminal_draw_events .lock() .expect("could not acquire lock on terminal events"); let expected_terminal_events = vec![ - Clear, HideCursor, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Clear, ShowCursor, + Clear, HideCursor, Draw, Flush, Draw, Flush, Clear, ShowCursor, ]; assert_eq!( &terminal_events @@ -1939,17 +1947,96 @@ fn delete_file_press_n() { ); std::fs::remove_dir_all(temp_dir_path).expect("failed to remove temporary folder"); - assert_eq!(terminal_draw_events_mirror.len(), 4); + assert_eq!(terminal_draw_events_mirror.len(), 2); + assert_snapshot!(&terminal_draw_events_mirror[0]); + assert_snapshot!(&terminal_draw_events_mirror[1]); +} + +#[test] +fn delete_file_press_n() { + let (terminal_events, terminal_draw_events, backend) = test_backend_factory(190, 50); + + let mut events: Vec> = iter::repeat(None).take(1).collect(); + events.push(Some(Event::Key(Key::Char('l')))); // once to place selected marker on screen + events.push(None); + events.push(Some(Event::Key(Key::Ctrl('d')))); + events.push(None); + events.push(Some(Event::Key(Key::Char('n')))); + events.push(None); + events.push(Some(Event::Key(Key::Ctrl('c')))); + events.push(None); + events.push(Some(Event::Key(Key::Char('y')))); + let keyboard_events = Box::new(KeyboardEvents::new(events)); + + let temp_dir_path = + create_root_temp_dir("delete_file_press_n").expect("failed to create temp dir"); + + let mut subfolder_1_path = PathBuf::from(&temp_dir_path); + subfolder_1_path.push("subfolder1"); + create_dir(&subfolder_1_path).expect("failed to create temporary directory"); + + let mut file_1_path = PathBuf::from(&temp_dir_path); + file_1_path.push("subfolder1"); + file_1_path.push("file1"); + create_temp_file(&file_1_path, 4000).expect("failed to create temp file"); + + let mut file_2_path = PathBuf::from(&temp_dir_path); + file_2_path.push("file2"); + create_temp_file(&file_2_path, 4000).expect("failed to create temp file"); + + let mut file_3_path = PathBuf::from(&temp_dir_path); + file_3_path.push("file3"); + create_temp_file(&file_3_path, 4000).expect("failed to create temp file"); + + start(backend, keyboard_events, temp_dir_path.clone()); + let terminal_draw_events_mirror = terminal_draw_events + .lock() + .expect("could not acquire lock on terminal events"); + + let expected_terminal_events = vec![ + Clear, HideCursor, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Clear, + ShowCursor, + ]; + assert_eq!( + &terminal_events + .lock() + .expect("could not acquire lock on terminal_events")[..], + &expected_terminal_events[..] + ); + assert_eq!( + std::fs::metadata(&file_2_path).is_ok(), + true, + "file not deleted" + ); + assert_eq!( + std::fs::metadata(&subfolder_1_path).is_ok(), + true, + "different folder stayed the same" + ); + assert_eq!( + std::fs::metadata(&file_1_path).is_ok(), + true, + "different file was untoucehd" + ); + assert_eq!( + std::fs::metadata(&file_3_path).is_ok(), + true, + "second different file was untouched" + ); + std::fs::remove_dir_all(temp_dir_path).expect("failed to remove temporary folder"); + + assert_eq!(terminal_draw_events_mirror.len(), 5); assert_snapshot!(&terminal_draw_events_mirror[0]); assert_snapshot!(&terminal_draw_events_mirror[1]); assert_snapshot!(&terminal_draw_events_mirror[2]); assert_snapshot!(&terminal_draw_events_mirror[3]); + assert_snapshot!(&terminal_draw_events_mirror[4]); } #[test] fn files_with_size_zero() { let (terminal_events, terminal_draw_events, backend) = test_backend_factory(190, 50); - let keyboard_events = sleep_and_quit_events(1); + let keyboard_events = sleep_and_quit_events(1, true); let temp_dir_path = create_root_temp_dir("files_with_size_zero").expect("failed to create temp dir"); @@ -1973,21 +2060,24 @@ fn files_with_size_zero() { terminal_draw_events_mirror[0] ); - let expected_terminal_events = vec![Clear, HideCursor, Draw, Flush, Clear, ShowCursor]; + let expected_terminal_events = vec![ + Clear, HideCursor, Draw, Flush, Draw, Flush, Clear, ShowCursor, + ]; assert_eq!( &terminal_events.lock().unwrap()[..], &expected_terminal_events[..] ); - assert_eq!(terminal_draw_events_mirror.len(), 1); + assert_eq!(terminal_draw_events_mirror.len(), 2); assert_snapshot!(&terminal_draw_events_mirror[0]); + assert_snapshot!(&terminal_draw_events_mirror[1]); } #[test] fn empty_folder() { let (terminal_events, terminal_draw_events, backend) = test_backend_factory(190, 50); - let keyboard_events = sleep_and_quit_events(1); + let keyboard_events = sleep_and_quit_events(1, true); let temp_dir_path = create_root_temp_dir("empty_folder").expect("failed to create temp dir"); start(backend, keyboard_events, temp_dir_path.clone()); @@ -1998,15 +2088,18 @@ fn empty_folder() { terminal_draw_events_mirror[0] ); - let expected_terminal_events = vec![Clear, HideCursor, Draw, Flush, Clear, ShowCursor]; + let expected_terminal_events = vec![ + Clear, HideCursor, Draw, Flush, Draw, Flush, Clear, ShowCursor, + ]; assert_eq!( &terminal_events.lock().unwrap()[..], &expected_terminal_events[..] ); - assert_eq!(terminal_draw_events_mirror.len(), 1); + assert_eq!(terminal_draw_events_mirror.len(), 2); assert_snapshot!(&terminal_draw_events_mirror[0]); + assert_snapshot!(&terminal_draw_events_mirror[1]); } #[test] @@ -2027,6 +2120,8 @@ fn permission_denied_when_deleting() { events.push(Some(Event::Key(Key::Esc))); events.push(None); events.push(Some(Event::Key(Key::Ctrl('c')))); + events.push(None); + events.push(Some(Event::Key(Key::Char('y')))); let keyboard_events = Box::new(KeyboardEvents::new(events)); let temp_dir_path = @@ -2067,7 +2162,7 @@ fn permission_denied_when_deleting() { let expected_terminal_events = vec![ Clear, HideCursor, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Draw, - Flush, Draw, Flush, Draw, Flush, Clear, ShowCursor, + Flush, Draw, Flush, Draw, Flush, Draw, Flush, Clear, ShowCursor, ]; assert_eq!( @@ -2077,7 +2172,7 @@ fn permission_denied_when_deleting() { &expected_terminal_events[..] ); - assert_eq!(terminal_draw_events_mirror.len(), 8); + assert_eq!(terminal_draw_events_mirror.len(), 9); assert_snapshot!(&terminal_draw_events_mirror[0]); assert_snapshot!(&terminal_draw_events_mirror[1]); assert_snapshot!(&terminal_draw_events_mirror[2]); @@ -2086,12 +2181,13 @@ fn permission_denied_when_deleting() { assert_snapshot!(&terminal_draw_events_mirror[5]); assert_snapshot!(&terminal_draw_events_mirror[6]); assert_snapshot!(&terminal_draw_events_mirror[7]); + assert_snapshot!(&terminal_draw_events_mirror[8]); } #[test] fn small_files_with_y_as_zero() { let (terminal_events, terminal_draw_events, backend) = test_backend_factory(190, 50); - let keyboard_events = sleep_and_quit_events(1); + let keyboard_events = sleep_and_quit_events(1, true); let temp_dir_path = create_root_temp_dir("small_files_with_y_as_zero").expect("failed to create temp dir"); @@ -2113,21 +2209,24 @@ fn small_files_with_y_as_zero() { terminal_draw_events_mirror[0] ); - let expected_terminal_events = vec![Clear, HideCursor, Draw, Flush, Clear, ShowCursor]; + let expected_terminal_events = vec![ + Clear, HideCursor, Draw, Flush, Draw, Flush, Clear, ShowCursor, + ]; assert_eq!( &terminal_events.lock().unwrap()[..], &expected_terminal_events[..] ); - assert_eq!(terminal_draw_events_mirror.len(), 1); + assert_eq!(terminal_draw_events_mirror.len(), 2); assert_snapshot!(&terminal_draw_events_mirror[0]); + assert_snapshot!(&terminal_draw_events_mirror[1]); } #[test] fn small_files_with_x_as_zero() { let (terminal_events, terminal_draw_events, backend) = test_backend_factory(50, 50); - let keyboard_events = sleep_and_quit_events(1); + let keyboard_events = sleep_and_quit_events(1, true); let temp_dir_path = create_root_temp_dir("small_files_with_x_as_zero").expect("failed to create temp dir"); @@ -2153,13 +2252,16 @@ fn small_files_with_x_as_zero() { terminal_draw_events_mirror[0] ); - let expected_terminal_events = vec![Clear, HideCursor, Draw, Flush, Clear, ShowCursor]; + let expected_terminal_events = vec![ + Clear, HideCursor, Draw, Flush, Draw, Flush, Clear, ShowCursor, + ]; assert_eq!( &terminal_events.lock().unwrap()[..], &expected_terminal_events[..] ); - assert_eq!(terminal_draw_events_mirror.len(), 1); + assert_eq!(terminal_draw_events_mirror.len(), 2); assert_snapshot!(&terminal_draw_events_mirror[0]); + assert_snapshot!(&terminal_draw_events_mirror[1]); } diff --git a/src/ui/display.rs b/src/ui/display.rs index b369c78..3660fab 100644 --- a/src/ui/display.rs +++ b/src/ui/display.rs @@ -7,7 +7,7 @@ use crate::state::files::FileTree; use crate::state::tiles::Board; use crate::state::UiEffects; use crate::ui::grid::RectangleGrid; -use crate::ui::modals::{ErrorBox, MessageBox}; +use crate::ui::modals::{ConfirmBox, ErrorBox, MessageBox}; use crate::ui::title::TitleLine; use crate::ui::{BottomLine, TermTooSmall}; use crate::UiMode; @@ -195,6 +195,57 @@ where ); f.render_widget(ErrorBox::new(message), full_screen); } + UiMode::Exiting { app_loaded } => { + if *app_loaded { + // render normal ui mode + f.render_widget( + TitleLine::new( + base_path_info, + current_path_info, + file_tree.space_freed, + ) + .path_error(ui_effects.current_path_is_red) + .flash_space(ui_effects.flash_space_freed) + .read_errors(file_tree.failed_to_read), + chunks[0], + ); + f.render_widget( + BottomLine::new().currently_selected(board.currently_selected()), + chunks[2], + ); + } else { + // render loading ui mode + f.render_widget( + TitleLine::new( + base_path_info, + current_path_info, + file_tree.space_freed, + ) + .progress_indicator(ui_effects.loading_progress_indicator) + .path_error(ui_effects.current_path_is_red) + .read_errors(file_tree.failed_to_read) + .show_loading(), + chunks[0], + ); + f.render_widget( + BottomLine::new() + .currently_selected(board.currently_selected()) + .last_read_path(ui_effects.last_read_path.as_ref()) + .hide_delete(), + chunks[2], + ); + } + // render common widgets + f.render_widget( + RectangleGrid::new( + &board.tiles, + board.unrenderable_tile_coordinates, + board.selected_index, + ), + chunks[1], + ); + f.render_widget(ConfirmBox::new(), full_screen); + } }; }) .expect("failed to draw"); diff --git a/src/ui/modals/confirm_box.rs b/src/ui/modals/confirm_box.rs new file mode 100644 index 0000000..15c3f82 --- /dev/null +++ b/src/ui/modals/confirm_box.rs @@ -0,0 +1,92 @@ +use ::tui::buffer::Buffer; +use ::tui::layout::Rect; +use ::tui::style::{Color, Modifier, Style}; +use ::tui::widgets::Widget; + +use crate::ui::format::truncate_middle; +use crate::ui::grid::draw_filled_rect; + +fn render_confirm_prompt(buf: &mut Buffer, confirm_rect: &Rect) { + let text_style = Style::default() + .bg(Color::Black) + .fg(Color::White) + .modifier(Modifier::BOLD); + + let possible_confirm_texts = [ + "Are you sure you want to quit?", + "Sure you want to quit?", + "Really quit?", + "Quit?", + ]; + // set default value of the confirm_text + // to the longest one from possible_confirm_text array + let mut confirm_text = String::from(possible_confirm_texts[0]); + let mut confirm_text_start_position: u16 = 0; + let text_max_length = confirm_rect.width - 4; + for line in possible_confirm_texts.iter() { + // "+10" here is to make sure confirm message has always some padding + if confirm_rect.width >= (line.chars().count() as u16) + 10 { + confirm_text = truncate_middle(line, text_max_length); + confirm_text_start_position = + ((confirm_rect.width - confirm_text.len() as u16) as f64 / 2.0).ceil() as u16 + + confirm_rect.x; + break; + } + } + + let y_n_line = "(y/n)"; + let y_n_line_start_position = + ((confirm_rect.width - y_n_line.len() as u16) as f64 / 2.0).ceil() as u16 + confirm_rect.x; + + buf.set_string( + confirm_text_start_position, + confirm_rect.y + confirm_rect.height / 2 - 2, + confirm_text, + text_style, + ); + buf.set_string( + y_n_line_start_position, + confirm_rect.y + confirm_rect.height / 2 + 3, + y_n_line, + text_style, + ); +} + +pub struct ConfirmBox {} + +impl ConfirmBox { + pub fn new() -> Self { + Self {} + } +} + +impl<'a> Widget for ConfirmBox { + fn render(self, area: Rect, buf: &mut Buffer) { + let (width, height) = if area.width > 150 { + (150, 10) + } else if area.width >= 50 { + (area.width / 2, 10) + } else { + unreachable!("app should not be rendered if window is so small") + }; + + // position self in the middle of the self + let x = ((area.x + area.width) / 2) - width / 2; + let y = ((area.y + area.height) / 2) - height / 2; + + let confirm_rect = Rect { + x, + y, + width, + height, + }; + let fill_style = Style::default() + .bg(Color::Black) + .fg(Color::White) + .modifier(Modifier::BOLD); + + draw_filled_rect(buf, fill_style, &confirm_rect); + + render_confirm_prompt(buf, &confirm_rect); + } +} diff --git a/src/ui/modals/error_box.rs b/src/ui/modals/error_box.rs index 35e307f..c5bb791 100644 --- a/src/ui/modals/error_box.rs +++ b/src/ui/modals/error_box.rs @@ -20,7 +20,7 @@ impl<'a> Widget for ErrorBox<'a> { fn render(self, area: Rect, buf: &mut Buffer) { let (width, height) = if area.width > 150 { (150, 10) - } else if area.width > 50 { + } else if area.width >= 50 { (area.width / 2, 10) } else { unreachable!("app should not be rendered if window is so small") diff --git a/src/ui/modals/message_box.rs b/src/ui/modals/message_box.rs index e92467b..8cee3bb 100644 --- a/src/ui/modals/message_box.rs +++ b/src/ui/modals/message_box.rs @@ -137,7 +137,7 @@ impl<'a> Widget for MessageBox<'a> { fn render(self, area: Rect, buf: &mut Buffer) { let (width, height) = if area.width > 150 { (150, 10) - } else if area.width > 50 { + } else if area.width >= 50 { (area.width / 2, 10) } else { unreachable!("app should not be rendered if window is so small") diff --git a/src/ui/modals/mod.rs b/src/ui/modals/mod.rs index 7473e52..72c613c 100644 --- a/src/ui/modals/mod.rs +++ b/src/ui/modals/mod.rs @@ -1,5 +1,7 @@ +mod confirm_box; mod error_box; mod message_box; +pub use confirm_box::*; pub use error_box::*; pub use message_box::*;