diff options
author | Sebastian Thiel <sebastian.thiel@icloud.com> | 2024-01-22 08:31:23 +0100 |
---|---|---|
committer | Sebastian Thiel <sebastian.thiel@icloud.com> | 2024-01-22 08:37:51 +0100 |
commit | c70ca81f007f925c7891340d0d0e763bcfc4114d (patch) | |
tree | dcb249754453dab0657ee9d76c6fe03d740a3455 /src | |
parent | 346b944a45d4cec12f7689718893ebdef0f46546 (diff) |
fix: don't check entry metadata while a scan is in progress (#223)
Previously each time the UI refreshes, every 250ms, it display
entries but also check their metadata to assure they exist.
This could lead to performance loss when the displayed folder
has a lot of entries.
Diffstat (limited to 'src')
-rw-r--r-- | src/interactive/app/common.rs | 3 | ||||
-rw-r--r-- | src/interactive/app/eventloop.rs | 21 | ||||
-rw-r--r-- | src/interactive/app/handlers.rs | 30 | ||||
-rw-r--r-- | src/interactive/app/terminal.rs | 1 | ||||
-rw-r--r-- | src/interactive/app/tree_view.rs | 8 |
5 files changed, 50 insertions, 13 deletions
diff --git a/src/interactive/app/common.rs b/src/interactive/app/common.rs index 99d0d6b..7c89a2f 100644 --- a/src/interactive/app/common.rs +++ b/src/interactive/app/common.rs @@ -63,6 +63,7 @@ pub fn sorted_entries( node_idx: TreeIndex, sorting: SortMode, glob_root: Option<TreeIndex>, + is_scanning: bool, ) -> Vec<EntryDataBundle> { use SortMode::*; fn cmp_count(l: &EntryDataBundle, r: &EntryDataBundle) -> Ordering { @@ -76,7 +77,7 @@ pub fn sorted_entries( let use_glob_path = glob_root.map_or(false, |glob_root| glob_root == node_idx); let (path, exists, is_dir) = { let path = path_of(tree, idx, glob_root); - if glob_root == Some(node_idx) { + if is_scanning || glob_root == Some(node_idx) { (path, true, entry.is_dir) } else { let meta = path.symlink_metadata(); diff --git a/src/interactive/app/eventloop.rs b/src/interactive/app/eventloop.rs index f03c55b..4c83c9f 100644 --- a/src/interactive/app/eventloop.rs +++ b/src/interactive/app/eventloop.rs @@ -194,7 +194,11 @@ impl AppState { is_finished: bool, ) { let tree_view = self.tree_view(traversal); - self.entries = tree_view.sorted_entries(self.navigation().view_root, self.sorting); + self.entries = tree_view.sorted_entries( + self.navigation().view_root, + self.sorting, + self.scan.is_some(), + ); if !self.received_events { let previously_selected_entry = @@ -440,7 +444,11 @@ impl AppState { tree.remove_entries(index, remove_root_node); tree.recompute_sizes_recursively(parent_index); - self.entries = tree.sorted_entries(self.navigation().view_root, self.sorting); + self.entries = tree.sorted_entries( + self.navigation().view_root, + self.sorting, + self.scan.is_some(), + ); self.navigation_mut().selected = self.entries.first().map(|e| e.index); self.scan = Some(FilesystemScan { @@ -493,7 +501,8 @@ impl AppState { traversal: tree_view.traversal, glob_tree_root: Some(tree_root), }; - let new_entries = glob_tree_view.sorted_entries(tree_root, self.sorting); + let new_entries = + glob_tree_view.sorted_entries(tree_root, self.sorting, self.scan.is_some()); let new_entries = self .navigation_mut() @@ -545,7 +554,11 @@ impl AppState { window.glob_pane = None; tree_view.glob_tree_root.take(); - self.entries = tree_view.sorted_entries(self.navigation().view_root, self.sorting); + self.entries = tree_view.sorted_entries( + self.navigation().view_root, + self.sorting, + self.scan.is_some(), + ); } } diff --git a/src/interactive/app/handlers.rs b/src/interactive/app/handlers.rs index c320c59..9639264 100644 --- a/src/interactive/app/handlers.rs +++ b/src/interactive/app/handlers.rs @@ -67,7 +67,7 @@ impl AppState { .map(|parent_idx| { ( parent_idx, - tree_view.sorted_entries(parent_idx, self.sorting), + tree_view.sorted_entries(parent_idx, self.sorting, self.scan.is_some()), ) }) } @@ -89,7 +89,7 @@ impl AppState { self.navigation().selected.map(|previously_selected| { ( previously_selected, - tree_view.sorted_entries(previously_selected, self.sorting), + tree_view.sorted_entries(previously_selected, self.sorting, self.scan.is_some()), ) }) } @@ -122,17 +122,29 @@ impl AppState { pub fn cycle_sorting(&mut self, tree_view: &TreeView<'_>) { self.sorting.toggle_size(); - self.entries = tree_view.sorted_entries(self.navigation().view_root, self.sorting); + self.entries = tree_view.sorted_entries( + self.navigation().view_root, + self.sorting, + self.scan.is_some(), + ); } pub fn cycle_mtime_sorting(&mut self, tree_view: &TreeView<'_>) { self.sorting.toggle_mtime(); - self.entries = tree_view.sorted_entries(self.navigation().view_root, self.sorting); + self.entries = tree_view.sorted_entries( + self.navigation().view_root, + self.sorting, + self.scan.is_some(), + ); } pub fn cycle_count_sorting(&mut self, tree_view: &TreeView<'_>) { self.sorting.toggle_count(); - self.entries = tree_view.sorted_entries(self.navigation().view_root, self.sorting); + self.entries = tree_view.sorted_entries( + self.navigation().view_root, + self.sorting, + self.scan.is_some(), + ); } pub fn toggle_mtime_column(&mut self) { @@ -318,7 +330,11 @@ impl AppState { if !tree_view.exists(self.navigation().view_root) { self.go_to_root(tree_view); } else { - self.entries = tree_view.sorted_entries(self.navigation().view_root, self.sorting); + self.entries = tree_view.sorted_entries( + self.navigation().view_root, + self.sorting, + self.scan.is_some(), + ); } if self @@ -337,7 +353,7 @@ impl AppState { pub fn go_to_root(&mut self, tree_view: &TreeView<'_>) { let root = self.navigation().tree_root; - let entries = tree_view.sorted_entries(root, self.sorting); + let entries = tree_view.sorted_entries(root, self.sorting, self.scan.is_some()); self.navigation_mut().exit_node(root, &entries); self.entries = entries; } diff --git a/src/interactive/app/terminal.rs b/src/interactive/app/terminal.rs index 2a8deb5..a949bbd 100644 --- a/src/interactive/app/terminal.rs +++ b/src/interactive/app/terminal.rs @@ -49,6 +49,7 @@ impl TerminalApp { state.navigation().view_root, state.sorting, state.glob_root(), + state.scan.is_some(), ); state.navigation_mut().selected = state.entries.first().map(|b| b.index); diff --git a/src/interactive/app/tree_view.rs b/src/interactive/app/tree_view.rs index 8a80cf0..2afc366 100644 --- a/src/interactive/app/tree_view.rs +++ b/src/interactive/app/tree_view.rs @@ -46,12 +46,18 @@ impl TreeView<'_> { path_of(&self.traversal.tree, node_idx, self.glob_tree_root) } - pub fn sorted_entries(&self, view_root: TreeIndex, sorting: SortMode) -> Vec<EntryDataBundle> { + pub fn sorted_entries( + &self, + view_root: TreeIndex, + sorting: SortMode, + is_scanning: bool, + ) -> Vec<EntryDataBundle> { sorted_entries( &self.traversal.tree, view_root, sorting, self.glob_tree_root, + is_scanning, ) } |