From 878d7bdbfb8f277d7bcfc556599c995f72d7f319 Mon Sep 17 00:00:00 2001 From: rabite Date: Fri, 25 Jan 2019 20:48:42 +0100 Subject: [PATCH] more sorting, directory first toggle --- src/files.rs | 54 ++++++++++++++++++++++++++++--------------------- src/listview.rs | 11 ++++++++++ 2 files changed, 42 insertions(+), 23 deletions(-) diff --git a/src/files.rs b/src/files.rs index ba37e04..1d652e1 100644 --- a/src/files.rs +++ b/src/files.rs @@ -3,6 +3,7 @@ use std::error::Error; use std::path::PathBuf; use std::ffi::OsStr; use std::cmp::{Ord, Ordering}; +use std::time::SystemTime; use lscolors::{LsColors, Style}; @@ -14,6 +15,7 @@ lazy_static! { pub struct Files { pub files: Vec, pub sort: SortBy, + pub dirs_first: bool, } impl Index for Files { @@ -45,17 +47,20 @@ impl Files { let path = file.path(); let meta = file.metadata()?; let size = meta.len() / 1024; + let mtime = meta.modified()?; + let style = match COLORS.style_for_path_with_metadata(file.path(), Some(&meta)) { Some(style) => Some(style.clone()), None => None }; - let file = File::new(&name, path, kind, size as usize, style); + let file = File::new(&name, path, kind, size as usize, mtime, style); files.push(file) } let mut files = Files { files: files, - sort: SortBy::Name }; + sort: SortBy::Name, + dirs_first: true }; files.sort(); Ok(files) @@ -76,25 +81,31 @@ impl Files { a.size.cmp(&b.size).reverse() }); }, - _ => {} + SortBy::MTime => { + self.files.sort_by(|a,b| { + if a.mtime == b.mtime { + return alphanumeric_sort::compare_str(&a.name, &b.name) + } + a.mtime.cmp(&b.mtime) + }); + } }; - // Direcories first - self.files.sort_by(|a,b| { - if a.is_dir() && !b.is_dir() { - Ordering::Less - } else { Ordering::Equal } - }); + if self.dirs_first { + self.files.sort_by(|a,b| { + if a.is_dir() && !b.is_dir() { + Ordering::Less + } else { Ordering::Equal } + }); + } } - pub fn cycle_sort(&mut self) -> SortBy { + pub fn cycle_sort(&mut self) { self.sort = match self.sort { SortBy::Name => SortBy::Size, - SortBy::Size => SortBy::Name, - _ => { SortBy::Name } + SortBy::Size => SortBy::MTime, + SortBy::MTime => SortBy::Name }; - self.sort(); - self.sort } pub fn iter(&self) -> std::slice::Iter { @@ -120,8 +131,7 @@ impl std::fmt::Display for SortBy { let text = match self { SortBy::Name => "name", SortBy::Size => "size", - SortBy::MDate => "mdate", - SortBy::CDate => "cdate" + SortBy::MTime => "mtime" }; write!(formatter, "{}", text) } @@ -131,8 +141,7 @@ impl std::fmt::Display for SortBy { pub enum SortBy { Name, Size, - MDate, - CDate + MTime, } #[derive(Debug, PartialEq, Clone)] @@ -141,12 +150,11 @@ pub struct File { pub path: PathBuf, pub size: Option, pub kind: Kind, - pub style: Option