mirror of
https://github.com/sxyazi/yazi.git
synced 2026-07-21 23:01:05 +00:00
perf: use lazy sorting when loading large directories to reduce unnecessary CPU consumption (#607)
This commit is contained in:
parent
e6079438a0
commit
920afe29bd
6 changed files with 30 additions and 7 deletions
|
|
@ -4,13 +4,15 @@ use ratatui::layout::Rect;
|
|||
use yazi_config::LAYOUT;
|
||||
use yazi_shared::fs::{File, FilesOp, Url};
|
||||
|
||||
use super::FolderStage;
|
||||
use crate::{folder::Files, manager::Manager, Step};
|
||||
|
||||
#[derive(Default)]
|
||||
pub struct Folder {
|
||||
pub cwd: Url,
|
||||
pub mtime: Option<SystemTime>,
|
||||
pub files: Files,
|
||||
pub mtime: Option<SystemTime>,
|
||||
pub stage: FolderStage,
|
||||
|
||||
pub offset: usize,
|
||||
pub cursor: usize,
|
||||
|
|
@ -31,8 +33,15 @@ impl Folder {
|
|||
pub fn update(&mut self, op: FilesOp) -> bool {
|
||||
let revision = self.files.revision;
|
||||
match op {
|
||||
FilesOp::Full(_, _, mtime) => self.mtime = mtime,
|
||||
FilesOp::Done(_, mtime, ticket) if ticket == self.files.ticket() => self.mtime = mtime,
|
||||
FilesOp::Full(_, _, mtime) => {
|
||||
(self.mtime, self.stage) = (mtime, FolderStage::Loaded);
|
||||
}
|
||||
FilesOp::Part(_, _, ticket) if ticket == self.files.ticket() => {
|
||||
self.stage = FolderStage::Loading;
|
||||
}
|
||||
FilesOp::Done(_, mtime, ticket) if ticket == self.files.ticket() => {
|
||||
(self.mtime, self.stage) = (mtime, FolderStage::Loaded);
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2,8 +2,10 @@ mod files;
|
|||
mod filter;
|
||||
mod folder;
|
||||
mod sorter;
|
||||
mod stage;
|
||||
|
||||
pub use files::*;
|
||||
pub use filter::*;
|
||||
pub use folder::*;
|
||||
pub use sorter::*;
|
||||
pub use stage::*;
|
||||
|
|
|
|||
7
yazi-core/src/folder/stage.rs
Normal file
7
yazi-core/src/folder/stage.rs
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
|
||||
pub enum FolderStage {
|
||||
#[default]
|
||||
Loading,
|
||||
Loaded,
|
||||
Failed,
|
||||
}
|
||||
|
|
@ -4,7 +4,8 @@ use crate::manager::Manager;
|
|||
|
||||
impl Manager {
|
||||
pub fn unyank(&mut self, _: Cmd) {
|
||||
render!(!self.yanked.1.is_empty());
|
||||
|
||||
self.yanked = Default::default();
|
||||
render!();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -73,7 +73,7 @@ impl Preview {
|
|||
};
|
||||
|
||||
let stream =
|
||||
UnboundedReceiverStream::new(rx).chunks_timeout(10000, Duration::from_millis(350));
|
||||
UnboundedReceiverStream::new(rx).chunks_timeout(50000, Duration::from_millis(500));
|
||||
pin!(stream);
|
||||
|
||||
let ticket = FilesOp::prepare(&url);
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ use tokio::task::JoinHandle;
|
|||
use yazi_shared::{fs::{File, Url}, render};
|
||||
|
||||
use super::{Backstack, Config, Finder, Mode, Preview};
|
||||
use crate::folder::Folder;
|
||||
use crate::folder::{Folder, FolderStage};
|
||||
|
||||
pub struct Tab {
|
||||
pub mode: Mode,
|
||||
|
|
@ -74,10 +74,14 @@ impl Tab {
|
|||
|
||||
pub fn apply_files_attrs(&mut self) {
|
||||
let apply = |f: &mut Folder| {
|
||||
let hovered = f.hovered().filter(|_| f.tracing).map(|h| h.url());
|
||||
if f.stage == FolderStage::Loading {
|
||||
return render!();
|
||||
}
|
||||
|
||||
let hovered = f.hovered().filter(|_| f.tracing).map(|h| h.url());
|
||||
f.files.set_show_hidden(self.conf.show_hidden);
|
||||
f.files.set_sorter(self.conf.sorter());
|
||||
|
||||
render!(f.files.catchup_revision());
|
||||
render!(f.repos(hovered));
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue