From b6c70aa012713ab2e3aa06849a71b0997f915ad6 Mon Sep 17 00:00:00 2001 From: Diogo Duarte Date: Wed, 14 Feb 2024 20:15:38 +0000 Subject: [PATCH] feat: add `scrolloff` in `[manager]` --- yazi-config/preset/yazi.toml | 1 + yazi-config/src/manager/manager.rs | 1 + yazi-core/src/folder/folder.rs | 23 +++++++++++++++++++---- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/yazi-config/preset/yazi.toml b/yazi-config/preset/yazi.toml index cd7d6787..d4eaf662 100644 --- a/yazi-config/preset/yazi.toml +++ b/yazi-config/preset/yazi.toml @@ -11,6 +11,7 @@ sort_dir_first = false linemode = "none" show_hidden = false show_symlink = true +scrolloff = 5 [preview] tab_size = 2 diff --git a/yazi-config/src/manager/manager.rs b/yazi-config/src/manager/manager.rs index 74b4c552..27f4acaa 100644 --- a/yazi-config/src/manager/manager.rs +++ b/yazi-config/src/manager/manager.rs @@ -19,6 +19,7 @@ pub struct Manager { pub linemode: String, pub show_hidden: bool, pub show_symlink: bool, + pub scrolloff: u8, } impl Default for Manager { diff --git a/yazi-core/src/folder/folder.rs b/yazi-core/src/folder/folder.rs index 49fd1c34..836d0f7b 100644 --- a/yazi-core/src/folder/folder.rs +++ b/yazi-core/src/folder/folder.rs @@ -1,7 +1,7 @@ use std::{mem, time::SystemTime}; use ratatui::layout::Rect; -use yazi_config::LAYOUT; +use yazi_config::{LAYOUT, MANAGER}; use yazi_shared::fs::{File, FilesOp, Url}; use super::FolderStage; @@ -108,8 +108,15 @@ impl Folder { let len = self.files.len(); let limit = LAYOUT.load().current.height as usize; + let half_screen = limit / 2; + let scrolloff = if MANAGER.scrolloff as usize > half_screen { + half_screen + } else { + MANAGER.scrolloff as usize + }; + self.cursor = step.add(self.cursor, limit).min(len.saturating_sub(1)); - self.offset = if self.cursor >= (self.offset + limit).min(len).saturating_sub(5) { + self.offset = if self.cursor >= (self.offset + limit).min(len).saturating_sub(scrolloff) { len.saturating_sub(limit).min(self.offset + self.cursor - old.0) } else { self.offset.min(len.saturating_sub(1)) @@ -122,8 +129,16 @@ impl Folder { let old = (self.cursor, self.offset); let max = self.files.len().saturating_sub(1); - self.cursor = step.add(self.cursor, LAYOUT.load().current.height as usize).min(max); - self.offset = if self.cursor < self.offset + 5 { + let limit = LAYOUT.load().current.height as usize; + let half_screen = limit / 2; + let scrolloff = if MANAGER.scrolloff as usize > half_screen { + half_screen + } else { + MANAGER.scrolloff as usize + }; + + self.cursor = step.add(self.cursor, limit).min(max); + self.offset = if self.cursor < self.offset + scrolloff { self.offset.saturating_sub(old.0 - self.cursor) } else { self.offset.min(max)