fix: little fix from the previous merge with origin

This commit is contained in:
azy 2025-02-17 19:20:31 +08:00
parent 2aea007007
commit ad21cbd7b1
5 changed files with 58 additions and 11 deletions

View File

@ -241,7 +241,7 @@ impl Previewer {
// lookup request stack and return the most recent preview available // lookup request stack and return the most recent preview available
for request in self.requests.back_to_front() { for request in self.requests.back_to_front() {
if let Some(preview) = self.dispatch_request(&request) { if let Some(preview) = self.dispatch_request(&request, preview_window) {
return Some(preview); return Some(preview);
} }
} }

View File

@ -162,6 +162,7 @@ pub fn try_preview(
syntax_theme: &Arc<Theme>, syntax_theme: &Arc<Theme>,
concurrent_tasks: &Arc<AtomicU8>, concurrent_tasks: &Arc<AtomicU8>,
in_flight_previews: &Arc<Mutex<FxHashSet<String>>>, in_flight_previews: &Arc<Mutex<FxHashSet<String>>>,
preview_window: Option<Rect>,
) { ) {
debug!("Computing preview for {:?}", entry.name); debug!("Computing preview for {:?}", entry.name);
let path = PathBuf::from(&entry.name); let path = PathBuf::from(&entry.name);
@ -249,6 +250,53 @@ pub fn try_preview(
cache.lock().insert(entry.name.clone(), &p); cache.lock().insert(entry.name.clone(), &p);
} }
} }
} else if matches!(FileType::from(&path), FileType::Image) {
debug!("File is an image: {:?}", entry.name);
let (window_height, window_width) = if let Some(preview_window) =
preview_window
{
// it should be a better way to know the size of the border to remove than this magic number
let padding_width = 5;
let padding_height = 3;
(
(preview_window.height - padding_height) * 2,
preview_window.width - padding_width * 2,
)
} else {
warn!("Error opening image, impossible to display without information about the size of the preview window");
let p = meta::not_supported(&entry.name);
cache.lock().insert(entry.name.clone(), &p);
return;
};
match ImageReader::open(path).unwrap().decode() {
Ok(image) => {
cache.lock().insert(
entry.name.clone(),
&meta::loading(&format!("Loading {}", entry.name)),
);
let image = Image::from_dynamic_image(
image,
u32::from(window_height),
u32::from(window_width),
);
let total_lines =
image.pixel_grid.len().try_into().unwrap_or(u16::MAX);
let content = PreviewContent::Image(image);
let preview = Arc::new(Preview::new(
entry.name.clone(),
content,
entry.icon,
None,
total_lines,
));
cache.lock().insert(entry.name.clone(), &preview);
}
Err(e) => {
warn!("Error opening file: {:?}", e);
let p = meta::not_supported(&entry.name);
cache.lock().insert(entry.name.clone(), &p);
}
}
} else { } else {
debug!("File isn't text-based: {:?}", entry.name); debug!("File isn't text-based: {:?}", entry.name);
let preview = meta::not_supported(&entry.name); let preview = meta::not_supported(&entry.name);

View File

@ -4,7 +4,6 @@ use crate::preview::{
PREVIEW_NOT_SUPPORTED_MSG, TIMEOUT_MSG, PREVIEW_NOT_SUPPORTED_MSG, TIMEOUT_MSG,
}; };
use crate::screen::{ use crate::screen::{
cache::RenderedPreviewCache,
colors::{Colorscheme, PreviewColorscheme}, colors::{Colorscheme, PreviewColorscheme},
}; };
use crate::utils::strings::{ use crate::utils::strings::{
@ -20,7 +19,6 @@ use ratatui::{
prelude::{Color, Line, Modifier, Span, Style, Stylize, Text}, prelude::{Color, Line, Modifier, Span, Style, Stylize, Text},
}; };
use std::str::FromStr; use std::str::FromStr;
use std::sync::{Arc, Mutex};
use crate::utils::image::{Image, ImageColor, PIXEL}; use crate::utils::image::{Image, ImageColor, PIXEL};
#[allow(dead_code)] #[allow(dead_code)]
@ -250,11 +248,11 @@ fn build_syntect_highlighted_paragraph<'a>(
//.scroll((preview_scroll, 0)) //.scroll((preview_scroll, 0))
} }
fn build_image_paragraph( fn build_image_paragraph<'a>(
image: &Image, image: &'a Image,
preview_block: Block<'_>, preview_block: Block<'a>,
colorscheme: PreviewColorscheme, colorscheme: PreviewColorscheme,
) -> Paragraph<'_> { ) -> Paragraph<'a> {
let lines = image let lines = image
.pixel_grid .pixel_grid
.iter() .iter()

View File

@ -20,6 +20,7 @@ use copypasta::{ClipboardContext, ClipboardProvider};
use rustc_hash::{FxBuildHasher, FxHashSet}; use rustc_hash::{FxBuildHasher, FxHashSet};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::collections::HashSet; use std::collections::HashSet;
use ratatui::layout::Rect;
use tokio::sync::mpsc::{Receiver, Sender, UnboundedSender}; use tokio::sync::mpsc::{Receiver, Sender, UnboundedSender};
use tracing::error; use tracing::error;
@ -315,7 +316,7 @@ impl Television {
&& !matches!(selected_entry.preview_type, PreviewType::None) && !matches!(selected_entry.preview_type, PreviewType::None)
{ {
// preview content // preview content
if let Some(preview) = self.previewer.preview(selected_entry, ) { if let Some(preview) = self.previewer.preview(selected_entry, Some(Rect::new(0,0,50,50))) {
if self.preview_state.preview.title != preview.title { if self.preview_state.preview.title != preview.title {
self.preview_state.update( self.preview_state.update(
preview, preview,
@ -583,7 +584,7 @@ impl Television {
let selected_entry = self let selected_entry = self
.get_selected_entry(Some(Mode::Channel)) .get_selected_entry(Some(Mode::Channel))
.unwrap_or(ENTRY_PLACEHOLDER); .unwrap_or(ENTRY_PLACEHOLDER);
;
self.update_preview_state(&selected_entry)?; self.update_preview_state(&selected_entry)?;
self.ticks += 1; self.ticks += 1;

View File

@ -3,7 +3,7 @@ use image::DynamicImage;
pub const PIXEL: char = '▀'; pub const PIXEL: char = '▀';
const FILTER: FilterType = FilterType::Triangle; const FILTER: FilterType = FilterType::Triangle;
#[derive(Clone, Debug)] #[derive(Clone, Debug, Hash, PartialEq)]
pub struct Image { pub struct Image {
pub pixel_grid: Vec<Vec<(ImageColor, ImageColor)>>, pub pixel_grid: Vec<Vec<(ImageColor, ImageColor)>>,
} }
@ -63,7 +63,7 @@ impl Image {
} }
} }
#[derive(Clone, Copy, Debug)] #[derive(Clone, Copy, Debug, Hash, PartialEq)]
pub struct ImageColor { pub struct ImageColor {
pub r: u8, pub r: u8,
pub g: u8, pub g: u8,