From 4a62feb5240b603b0531aa937429b2eb432b6460 Mon Sep 17 00:00:00 2001 From: alexpasmantier Date: Sun, 12 Jan 2025 22:08:03 +0100 Subject: [PATCH] perf: trying things with the preview --- .../television-previewers/src/previewers.rs | 64 ++++++++++--------- .../src/previewers/files.rs | 10 +-- crates/television/television.rs | 12 ++++ 3 files changed, 51 insertions(+), 35 deletions(-) diff --git a/crates/television-previewers/src/previewers.rs b/crates/television-previewers/src/previewers.rs index 132a703..e6fe199 100644 --- a/crates/television-previewers/src/previewers.rs +++ b/crates/television-previewers/src/previewers.rs @@ -156,39 +156,43 @@ impl Previewer { debug!("Preview already in cache"); return Some(preview); } - // if we've already acknowledged the request - if let Some(initial_request) = self.requests.get(entry) { - debug!("Request already acknowledged"); - // and we're past the debounce duration - if initial_request.elapsed() > DEBOUNCE_DURATION { - debug!("Past debounce duration"); - // forward the request to the appropriate previewer - let preview = match &entry.preview_type { - PreviewType::Basic => Some(self.basic.preview(entry)), - PreviewType::EnvVar => Some(self.env_var.preview(entry)), - PreviewType::Files => self.file.preview(entry), - PreviewType::Command(cmd) => { - self.command.preview(entry, cmd) - } - PreviewType::None => Some(Arc::new(Preview::default())), - }; - // if we got a preview, cache it - if let Some(preview) = preview { - self.cache.lock().insert(entry.name.clone(), &preview); - Some(preview) - } else { - None - } + // if we haven't acknowledged the request yet, acknowledge it + if !self.requests.contains_key(entry) { + self.requests.insert(entry.clone(), Instant::now()); + } + + let initial_request = self.requests.get(entry).unwrap(); + // if we're past the debounce duration + if initial_request.elapsed() > DEBOUNCE_DURATION { + debug!("Past debounce duration"); + // forward the request to the appropriate previewer + let preview = match &entry.preview_type { + PreviewType::Basic => Some(self.basic.preview(entry)), + PreviewType::EnvVar => Some(self.env_var.preview(entry)), + PreviewType::Files => self.file.preview(entry), + PreviewType::Command(cmd) => self.command.preview(entry, cmd), + PreviewType::None => Some(Arc::new(Preview::default())), + }; + // if we got a preview, cache it + if let Some(preview) = preview { + self.cache.lock().insert(entry.name.clone(), &preview); + Some(preview) } else { - debug!("Not past debounce duration"); None } - } - // if we haven't acknowledged the request yet - else { - debug!("Request not acknowledged, acknowledging"); - self.requests.insert(entry.clone(), Instant::now()); - None + } else { + debug!("Not past debounce duration"); + // partial preview + let preview = match &entry.preview_type { + PreviewType::Basic => Some(self.basic.preview(entry)), + PreviewType::EnvVar => Some(self.env_var.preview(entry)), + PreviewType::Files => self.file.preview(entry), + PreviewType::Command(cmd) => { + self.command.partial_preview(entry, cmd) + } + PreviewType::None => Some(Arc::new(Preview::default())), + }; + Some(preview) } } diff --git a/crates/television-previewers/src/previewers/files.rs b/crates/television-previewers/src/previewers/files.rs index a7f14bc..63749b7 100644 --- a/crates/television-previewers/src/previewers/files.rs +++ b/crates/television-previewers/src/previewers/files.rs @@ -150,10 +150,11 @@ pub fn try_preview( Ok(file) => { // compute the highlighted version in the background let mut reader = BufReader::new(file); + reader.seek(std::io::SeekFrom::Start(0)).unwrap(); let preview = compute_highlighted_text_preview( entry, - reader, + reader.lines().map_while(Result::ok).collect(), syntax_set, syntax_theme, ); @@ -176,7 +177,7 @@ pub fn try_preview( fn compute_highlighted_text_preview( entry: &entry::Entry, - reader: BufReader, + lines: Vec<&str>, syntax_set: &SyntaxSet, syntax_theme: &Theme, ) -> Arc { @@ -184,9 +185,8 @@ fn compute_highlighted_text_preview( "Computing highlights in the background for {:?}", entry.name ); - let lines: Vec = reader - .lines() - .map_while(Result::ok) + let lines: Vec = lines + .iter() // we need to add a newline here because sublime syntaxes expect one // to be present at the end of each line .map(|line| preprocess_line(&line).0 + "\n") diff --git a/crates/television/television.rs b/crates/television/television.rs index 69bec66..eb489be 100644 --- a/crates/television/television.rs +++ b/crates/television/television.rs @@ -561,6 +561,18 @@ impl Television { { // preview content let maybe_preview = self.previewer.preview(&selected_entry); + //// preload the next 3 previews + //if let Some(i) = self.results_picker.selected() { + // for j in 1..=5 { + // if let Some(entry) = + // self.channel.get_result((i + j).try_into().unwrap()) + // { + // let _ = self.previewer.preview(&entry); + // } + // } + //} + + let _ = self.previewer.preview(&selected_entry); if let Some(preview) = &maybe_preview { self.current_preview_total_lines = preview.total_lines();