From 0d11c52e4df1891743ad96fe5b8743672375d5fe Mon Sep 17 00:00:00 2001 From: sxyazi Date: Mon, 28 Aug 2023 17:31:56 +0800 Subject: [PATCH] .. --- app/src/executor.rs | 2 +- core/src/files/files.rs | 16 ++++++++++++---- core/src/manager/folder.rs | 10 ++++++---- core/src/manager/tab.rs | 21 +++++++++++++++------ 4 files changed, 34 insertions(+), 15 deletions(-) diff --git a/app/src/executor.rs b/app/src/executor.rs index 5c27d2a0..6028691a 100644 --- a/app/src/executor.rs +++ b/app/src/executor.rs @@ -137,7 +137,7 @@ impl Executor { // Sorting "sort" => { - let b = cx.manager.current_mut().files.set_sorter(FilesSorter { + let b = cx.manager.active_mut().set_sorter(FilesSorter { by: SortBy::try_from(exec.args.get(0).cloned().unwrap_or_default()) .unwrap_or_default(), reverse: exec.named.contains_key("reverse"), diff --git a/core/src/files/files.rs b/core/src/files/files.rs index de377c9a..c89b9399 100644 --- a/core/src/files/files.rs +++ b/core/src/files/files.rs @@ -1,6 +1,7 @@ use std::{collections::{BTreeMap, BTreeSet}, mem, ops::Deref, path::{Path, PathBuf}}; use anyhow::Result; +use config::manager::SortBy; use tokio::fs; use super::{File, FilesSorter}; @@ -124,15 +125,22 @@ impl Files { pub fn update_size(&mut self, items: BTreeMap) -> bool { self.sizes.extend(items); - self.sorter.sort(&mut self.items); + if self.sorter.by == SortBy::Size { + self.sorter.sort(&mut self.items); + } true } pub fn update_search(&mut self, items: Vec) -> bool { if !items.is_empty() { - let (hidden, items): (Vec<_>, Vec<_>) = items.into_iter().partition(|f| f.is_hidden); - self.items.extend(items); - self.hidden.extend(hidden); + if self.show_hidden { + self.items.extend(items); + } else { + let (hidden, items): (Vec<_>, Vec<_>) = items.into_iter().partition(|f| f.is_hidden); + self.items.extend(items); + self.hidden.extend(hidden); + } + self.sorter.sort(&mut self.items); return true; } diff --git a/core/src/manager/folder.rs b/core/src/manager/folder.rs index e813231b..9cb3ff1e 100644 --- a/core/src/manager/folder.rs +++ b/core/src/manager/folder.rs @@ -40,11 +40,8 @@ impl Folder { self.cursor = self.cursor.min(len.saturating_sub(1)); self.set_page(true); - if let Some(h) = self.hovered.as_ref().map(|h| h.path_owned()) { - self.hover(&h); - } + self.hover_repos(); self.hovered = self.files.duplicate(self.cursor); - true } @@ -110,6 +107,11 @@ impl Folder { if new > self.cursor { self.next(new - self.cursor) } else { self.prev(self.cursor - new) } } + #[inline] + pub fn hover_repos(&mut self) -> bool { + self.hover(&self.hovered.as_ref().map(|h| h.path_owned()).unwrap_or_default()) + } + pub fn hover_force(&mut self, file: File) -> bool { if self.hover(file.path()) { return true; diff --git a/core/src/manager/tab.rs b/core/src/manager/tab.rs index ddb49a3d..06e50b7c 100644 --- a/core/src/manager/tab.rs +++ b/core/src/manager/tab.rs @@ -7,7 +7,7 @@ use shared::{Defer, MIME_DIR}; use tokio::task::JoinHandle; use super::{Folder, Mode, Preview, PreviewLock}; -use crate::{emit, external::{self, FzfOpt, ZoxideOpt}, files::{File, Files, FilesOp}, input::InputOpt, Event, BLOCKER}; +use crate::{emit, external::{self, FzfOpt, ZoxideOpt}, files::{File, Files, FilesOp, FilesSorter}, input::InputOpt, Event, BLOCKER}; pub struct Tab { pub(super) mode: Mode, @@ -401,6 +401,16 @@ impl Tab { #[inline] pub fn preview_reset_image(&mut self) -> bool { self.preview.reset_image() } + // --- Sorter + pub fn set_sorter(&mut self, sorter: FilesSorter) -> bool { + if !self.current.files.set_sorter(sorter) { + return false; + } + + self.current.hover_repos(); + true + } + // --- Show hidden pub fn set_show_hidden(&mut self, state: Option) -> bool { let state = state.unwrap_or(!self.show_hidden); @@ -424,14 +434,13 @@ impl Tab { } applied |= match self.current.hovered { - Some(ref hovered) if hovered.is_dir() => self - .history - .get_mut(hovered.path()) - .map(|f| f.files.set_show_hidden(state)) - .unwrap_or(false), + Some(ref h) if h.is_dir() => { + self.history.get_mut(h.path()).map(|f| f.files.set_show_hidden(state)).unwrap_or(false) + } _ => false, }; + self.current.hover_repos(); applied } }