From 24e92d09e5c806980df5c2b3b358057d5e4df33a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=92=B2=E9=9B=85=20=C2=B7=20Misaki=20Masa?= Date: Wed, 15 Nov 2023 08:52:56 +0800 Subject: [PATCH] perf: clear only limited cells when hiding images (#369) --- yazi-config/src/manager/layout.rs | 32 +++++++++++++++++++++---------- yazi-core/src/preview/preview.rs | 2 +- yazi-core/src/preview/provider.rs | 2 +- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/yazi-config/src/manager/layout.rs b/yazi-config/src/manager/layout.rs index 14616505..3123f2c7 100644 --- a/yazi-config/src/manager/layout.rs +++ b/yazi-config/src/manager/layout.rs @@ -4,7 +4,7 @@ use ratatui::{prelude::Rect, widgets::{Block, Padding}}; use serde::{Deserialize, Serialize}; use yazi_shared::Term; -use crate::THEME; +use crate::{PREVIEW, THEME}; #[derive(Clone, Copy, Debug, Default, Deserialize, Serialize, PartialEq, Eq)] #[serde(try_from = "Vec")] @@ -38,22 +38,34 @@ impl TryFrom> for ManagerLayout { impl ManagerLayout { pub fn preview_rect(&self) -> Rect { let WindowSize { columns, rows, .. } = Term::size(); + let (top, right, bottom, left) = THEME.manager.preview_offset; - let width = (columns * self.preview) as f64 / self.all as f64; - let width = if width.fract() > 0.5 { width.ceil() as u16 } else { width.floor() as u16 }; + let w = (columns * self.preview) as f64 / self.all as f64; + let w = if w.fract() > 0.5 { w.ceil() as u16 } else { w.floor() as u16 }; - let offset = THEME.manager.preview_offset; - Block::default().padding(Padding::new(offset.3, offset.1, offset.0, offset.2)).inner(Rect { - x: columns.saturating_sub(width), - y: 0, - width, - height: rows, - }) + Rect { + x: left.saturating_add(columns - w), + y: top, + width: w.saturating_sub(left + right), + height: rows.saturating_sub(top + bottom), + } } #[inline] pub fn preview_height(&self) -> usize { self.preview_rect().height as usize } + pub fn image_rect(&self) -> Rect { + let mut rect = self.preview_rect(); + if PREVIEW.max_width == 0 || PREVIEW.max_height == 0 { + return rect; + } + if let Some((w, h)) = Term::ratio() { + rect.width = rect.width.min((PREVIEW.max_width as f64 / w).ceil() as u16); + rect.height = rect.height.min((PREVIEW.max_height as f64 / h).ceil() as u16); + } + rect + } + pub fn folder_rect(&self) -> Rect { let WindowSize { columns, rows, .. } = Term::size(); diff --git a/yazi-core/src/preview/preview.rs b/yazi-core/src/preview/preview.rs index c6c1ad0b..9b78fdeb 100644 --- a/yazi-core/src/preview/preview.rs +++ b/yazi-core/src/preview/preview.rs @@ -153,7 +153,7 @@ impl Preview { pub fn reset bool>(&mut self, f: F) -> bool { self.handle.take().map(|h| h.abort()); Highlighter::abort(); - ADAPTOR.image_hide(MANAGER.layout.preview_rect()).ok(); + ADAPTOR.image_hide(MANAGER.layout.image_rect()).ok(); let Some(ref lock) = self.lock else { return false; diff --git a/yazi-core/src/preview/provider.rs b/yazi-core/src/preview/provider.rs index d3bc6a42..191dc76d 100644 --- a/yazi-core/src/preview/provider.rs +++ b/yazi-core/src/preview/provider.rs @@ -42,7 +42,7 @@ impl Provider { } pub(super) async fn image(path: &Path) -> Result { - ADAPTOR.image_show(path, MANAGER.layout.preview_rect()).await?; + ADAPTOR.image_show(path, MANAGER.layout.image_rect()).await?; Ok(PreviewData::Image) }