From ed8522344e348d94ab9e3732dfa749c3d0e2fe45 Mon Sep 17 00:00:00 2001 From: Francesco Pio Gaglione Date: Fri, 4 Oct 2024 11:52:34 +0200 Subject: [PATCH 1/4] hide files in .hidden file --- src/tab.rs | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 61 insertions(+), 2 deletions(-) diff --git a/src/tab.rs b/src/tab.rs index 9aa3ae0..4f8d81f 100644 --- a/src/tab.rs +++ b/src/tab.rs @@ -46,7 +46,8 @@ use std::{ cmp::Ordering, collections::HashMap, fmt::{self, Display}, - fs::{self, Metadata}, + fs::{self, File, Metadata}, + io::{BufRead, BufReader}, os::unix::fs::MetadataExt, path::{Path, PathBuf}, sync::{Arc, Mutex}, @@ -1358,6 +1359,35 @@ fn folder_name>(path: P) -> (String, bool) { (name, found_home) } +// parse .hidden file and return files path +fn parse_hidden_file(path: &PathBuf) -> Vec { + let parent_dir = match path.parent() { + Some(dir) => dir, + None => return Vec::new(), + }; + + let file = match File::open(path) { + Ok(f) => f, + Err(_) => return Vec::new(), + }; + + let reader = BufReader::new(file); + let mut paths: Vec = Vec::new(); + + for line in reader.lines() { + if let Ok(line) = line { + if !line.is_empty() { + let file_path = parent_dir.join(&line.trim()); + if file_path.exists() { + paths.push(file_path); + } + } + } + } + + paths +} + impl Tab { pub fn new(location: Location, config: TabConfig) -> Self { let history = vec![location.clone()]; @@ -3435,12 +3465,41 @@ impl Tab { let mut y = 0; let items = self.column_sort(); + let cloned_items = items.clone(); + let hidden_files = if let Some(items) = cloned_items { + let hidden_file = items + .iter() + .find(|(size, item)| item.name == ".hidden") + .map(|(size, item)| item); + match hidden_file { + Some(hidden_file) => match hidden_file.path_opt() { + Some(path) => parse_hidden_file(path), + None => Vec::new(), + }, + None => Vec::new(), + } + } else { + Vec::new() + }; let mut drag_items = Vec::new(); if let Some(items) = items { let mut count = 0; let mut hidden = 0; for (i, item) in items { - if !show_hidden && item.hidden { + let is_from_hidden = item.path_opt().and_then(|path| { + hidden_files + .iter() + .find(|hidden_item| hidden_item.eq(&path)) + }); + + if !show_hidden && is_from_hidden.is_some() { + item.pos_opt.set(None); + item.rect_opt.set(None); + hidden += 1; + continue; + } + + if item.hidden && !show_hidden { item.pos_opt.set(None); item.rect_opt.set(None); hidden += 1; From 022ea08196f996f6e025654d4edfa289324bc25e Mon Sep 17 00:00:00 2001 From: Francesco Pio Gaglione Date: Fri, 4 Oct 2024 14:04:10 +0200 Subject: [PATCH 2/4] hide file from hidden file in grid list --- src/tab.rs | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/tab.rs b/src/tab.rs index 4f8d81f..c0cf4a7 100644 --- a/src/tab.rs +++ b/src/tab.rs @@ -3208,6 +3208,20 @@ impl Tab { let mut children = Vec::new(); if let Some(items) = self.column_sort() { + let cloned_items = items.clone(); + let hidden_file = items + .iter() + .find(|(size, item)| item.name == ".hidden") + .map(|(size, item)| item); + + let hidden_files = match hidden_file { + Some(hidden_file) => match hidden_file.path_opt() { + Some(path) => parse_hidden_file(path), + None => Vec::new(), + }, + None => Vec::new(), + }; + let mut count = 0; let mut col = 0; let mut row = 0; @@ -3215,6 +3229,18 @@ impl Tab { let mut hidden = 0; let mut grid_elements = Vec::new(); for &(i, item) in items.iter() { + let is_from_hidden = item.path_opt().and_then(|path| { + hidden_files + .iter() + .find(|hidden_item| hidden_item.eq(&path)) + }); + + if !show_hidden && is_from_hidden.is_some() { + item.pos_opt.set(None); + item.rect_opt.set(None); + hidden += 1; + continue; + } if !show_hidden && item.hidden { item.pos_opt.set(None); item.rect_opt.set(None); From 613cbdaee9a49194e18200350d86d675ad6e3b74 Mon Sep 17 00:00:00 2001 From: Francesco Pio Gaglione Date: Fri, 4 Oct 2024 18:35:02 +0200 Subject: [PATCH 3/4] moved .hidden file logic to scan function --- src/tab.rs | 71 ++++++++++++------------------------------------------ 1 file changed, 16 insertions(+), 55 deletions(-) diff --git a/src/tab.rs b/src/tab.rs index c0cf4a7..ebe3ee9 100644 --- a/src/tab.rs +++ b/src/tab.rs @@ -447,6 +447,7 @@ pub fn item_from_path>(path: P, sizes: IconSizes) -> Result Vec { let mut items = Vec::new(); + let mut hidden_file = Vec::new(); match fs::read_dir(tab_path) { Ok(entries) => { for entry_res in entries { @@ -472,6 +473,10 @@ pub fn scan_path(tab_path: &PathBuf, sizes: IconSizes) -> Vec { } }; + if name == ".hidden" { + hidden_file = parse_hidden_file(&path); + } + let metadata = match fs::metadata(&path) { Ok(ok) => ok, Err(err) => { @@ -492,6 +497,17 @@ pub fn scan_path(tab_path: &PathBuf, sizes: IconSizes) -> Vec { (false, true) => Ordering::Greater, _ => LANGUAGE_SORTER.compare(&a.display_name, &b.display_name), }); + items.iter_mut().for_each(|mut item| { + if item.path_opt().is_some() { + if hidden_file + .iter() + .find(|hidden| hidden.eq(&item.path_opt().unwrap())) + .is_some() + { + item.hidden = true; + } + } + }); items } @@ -3208,20 +3224,6 @@ impl Tab { let mut children = Vec::new(); if let Some(items) = self.column_sort() { - let cloned_items = items.clone(); - let hidden_file = items - .iter() - .find(|(size, item)| item.name == ".hidden") - .map(|(size, item)| item); - - let hidden_files = match hidden_file { - Some(hidden_file) => match hidden_file.path_opt() { - Some(path) => parse_hidden_file(path), - None => Vec::new(), - }, - None => Vec::new(), - }; - let mut count = 0; let mut col = 0; let mut row = 0; @@ -3229,18 +3231,6 @@ impl Tab { let mut hidden = 0; let mut grid_elements = Vec::new(); for &(i, item) in items.iter() { - let is_from_hidden = item.path_opt().and_then(|path| { - hidden_files - .iter() - .find(|hidden_item| hidden_item.eq(&path)) - }); - - if !show_hidden && is_from_hidden.is_some() { - item.pos_opt.set(None); - item.rect_opt.set(None); - hidden += 1; - continue; - } if !show_hidden && item.hidden { item.pos_opt.set(None); item.rect_opt.set(None); @@ -3491,40 +3481,11 @@ impl Tab { let mut y = 0; let items = self.column_sort(); - let cloned_items = items.clone(); - let hidden_files = if let Some(items) = cloned_items { - let hidden_file = items - .iter() - .find(|(size, item)| item.name == ".hidden") - .map(|(size, item)| item); - match hidden_file { - Some(hidden_file) => match hidden_file.path_opt() { - Some(path) => parse_hidden_file(path), - None => Vec::new(), - }, - None => Vec::new(), - } - } else { - Vec::new() - }; let mut drag_items = Vec::new(); if let Some(items) = items { let mut count = 0; let mut hidden = 0; for (i, item) in items { - let is_from_hidden = item.path_opt().and_then(|path| { - hidden_files - .iter() - .find(|hidden_item| hidden_item.eq(&path)) - }); - - if !show_hidden && is_from_hidden.is_some() { - item.pos_opt.set(None); - item.rect_opt.set(None); - hidden += 1; - continue; - } - if item.hidden && !show_hidden { item.pos_opt.set(None); item.rect_opt.set(None); From f93ce730234bee61725ff887f738f441875eb1a5 Mon Sep 17 00:00:00 2001 From: Francesco Pio Gaglione Date: Fri, 4 Oct 2024 19:02:22 +0200 Subject: [PATCH 4/4] requested changes --- src/tab.rs | 32 +++++++++++--------------------- 1 file changed, 11 insertions(+), 21 deletions(-) diff --git a/src/tab.rs b/src/tab.rs index ebe3ee9..9933061 100644 --- a/src/tab.rs +++ b/src/tab.rs @@ -447,7 +447,7 @@ pub fn item_from_path>(path: P, sizes: IconSizes) -> Result Vec { let mut items = Vec::new(); - let mut hidden_file = Vec::new(); + let mut hidden_files = Vec::new(); match fs::read_dir(tab_path) { Ok(entries) => { for entry_res in entries { @@ -474,7 +474,7 @@ pub fn scan_path(tab_path: &PathBuf, sizes: IconSizes) -> Vec { }; if name == ".hidden" { - hidden_file = parse_hidden_file(&path); + hidden_files = parse_hidden_file(&path); } let metadata = match fs::metadata(&path) { @@ -498,14 +498,12 @@ pub fn scan_path(tab_path: &PathBuf, sizes: IconSizes) -> Vec { _ => LANGUAGE_SORTER.compare(&a.display_name, &b.display_name), }); items.iter_mut().for_each(|mut item| { - if item.path_opt().is_some() { - if hidden_file - .iter() - .find(|hidden| hidden.eq(&item.path_opt().unwrap())) - .is_some() - { - item.hidden = true; - } + if hidden_files + .iter() + .find(|hidden| &&item.name == hidden) + .is_some() + { + item.hidden = true; } }); items @@ -1376,27 +1374,19 @@ fn folder_name>(path: P) -> (String, bool) { } // parse .hidden file and return files path -fn parse_hidden_file(path: &PathBuf) -> Vec { - let parent_dir = match path.parent() { - Some(dir) => dir, - None => return Vec::new(), - }; - +fn parse_hidden_file(path: &PathBuf) -> Vec { let file = match File::open(path) { Ok(f) => f, Err(_) => return Vec::new(), }; let reader = BufReader::new(file); - let mut paths: Vec = Vec::new(); + let mut paths: Vec = Vec::new(); for line in reader.lines() { if let Ok(line) = line { if !line.is_empty() { - let file_path = parent_dir.join(&line.trim()); - if file_path.exists() { - paths.push(file_path); - } + paths.push(line.trim().to_string()); } } }