mirror of
https://github.com/sxyazi/yazi.git
synced 2026-07-21 23:01:05 +00:00
67 lines
1.8 KiB
Rust
67 lines
1.8 KiB
Rust
use std::path::PathBuf;
|
|
|
|
use anyhow::{Context, Result, bail};
|
|
use serde::{Deserialize, Serialize};
|
|
use yazi_codegen::DeserializeOver2;
|
|
use yazi_fs::Xdg;
|
|
use yazi_shared::{SStr, timestamp_us};
|
|
|
|
use super::PreviewWrap;
|
|
use crate::normalize_path;
|
|
|
|
#[derive(Debug, Deserialize, DeserializeOver2, Serialize)]
|
|
pub struct Preview {
|
|
pub wrap: PreviewWrap,
|
|
pub tab_size: u8,
|
|
pub max_width: u16,
|
|
pub max_height: u16,
|
|
|
|
pub cache_dir: PathBuf,
|
|
|
|
pub image_delay: u8,
|
|
pub image_filter: String,
|
|
pub image_quality: u8,
|
|
|
|
pub ueberzug_scale: f32,
|
|
pub ueberzug_offset: (f32, f32, f32, f32),
|
|
}
|
|
|
|
impl Preview {
|
|
pub fn tmpfile(&self, prefix: &str) -> PathBuf {
|
|
self.cache_dir.join(format!("{prefix}-{}", timestamp_us()))
|
|
}
|
|
|
|
pub fn indent(&self) -> SStr {
|
|
#[rustfmt::skip]
|
|
const TABS: &[&str] = &["", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "];
|
|
|
|
if let Some(&s) = TABS.get(self.tab_size as usize) {
|
|
s.into()
|
|
} else {
|
|
" ".repeat(self.tab_size as usize).into()
|
|
}
|
|
}
|
|
}
|
|
|
|
impl Preview {
|
|
pub(crate) fn reshape(mut self) -> Result<Self> {
|
|
if self.image_delay > 100 {
|
|
bail!("[preview].image_delay must be between 0 and 100.");
|
|
} else if self.image_quality < 50 || self.image_quality > 90 {
|
|
bail!("[preview].image_quality must be between 50 and 90.");
|
|
}
|
|
|
|
self.cache_dir = if self.cache_dir.as_os_str().is_empty() {
|
|
Xdg::cache_dir().to_owned()
|
|
} else if let Some(p) = normalize_path(self.cache_dir) {
|
|
p
|
|
} else {
|
|
bail!("[preview].cache_dir must be either empty or an absolute path.");
|
|
};
|
|
|
|
std::fs::create_dir_all(&self.cache_dir)
|
|
.context(format!("Failed to create cache directory: {}", self.cache_dir.display()))?;
|
|
|
|
Ok(self)
|
|
}
|
|
}
|