mirror of https://github.com/bobwen-dev/hunter
shorten HOME and show indicator for links
This commit is contained in:
parent
a7abc0d645
commit
cc8020ee8c
|
@ -8,7 +8,7 @@ use std::time::Duration;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
use crate::files::{File, Files};
|
use crate::files::{File, Files, ShortPaths};
|
||||||
use crate::listview::ListView;
|
use crate::listview::ListView;
|
||||||
use crate::miller_columns::MillerColumns;
|
use crate::miller_columns::MillerColumns;
|
||||||
use crate::widget::Widget;
|
use crate::widget::Widget;
|
||||||
|
@ -347,12 +347,8 @@ impl FileBrowser {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_title(&self) -> HResult<()> {
|
pub fn set_title(&self) -> HResult<()> {
|
||||||
let path = match self.cwd.short_path() {
|
let path = self.cwd.short_string();
|
||||||
Ok(path) => path,
|
|
||||||
Err(_) => self.cwd.path.clone()
|
|
||||||
};
|
|
||||||
|
|
||||||
let path = path.to_string_lossy().to_string();
|
|
||||||
self.screen()?.set_title(&path)?;
|
self.screen()?.set_title(&path)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -658,6 +654,9 @@ impl FileBrowser {
|
||||||
let user = file.pretty_user().unwrap_or("NOUSER".into());
|
let user = file.pretty_user().unwrap_or("NOUSER".into());
|
||||||
let group = file.pretty_group().unwrap_or("NOGROUP".into());
|
let group = file.pretty_group().unwrap_or("NOGROUP".into());
|
||||||
let mtime = file.pretty_mtime().unwrap_or("NOMTIME".into());
|
let mtime = file.pretty_mtime().unwrap_or("NOMTIME".into());
|
||||||
|
let target = if let Some(target) = file.target {
|
||||||
|
"--> ".to_string() + &target.short_string()
|
||||||
|
} else { "".to_string() };
|
||||||
|
|
||||||
let main_widget = self.main_widget()?.widget()?;
|
let main_widget = self.main_widget()?.widget()?;
|
||||||
let selection = main_widget.lock()?.as_ref().unwrap().get_selection();
|
let selection = main_widget.lock()?.as_ref().unwrap().get_selection();
|
||||||
|
@ -671,8 +670,17 @@ impl FileBrowser {
|
||||||
let count_xpos = xsize - file_count.len() as u16;
|
let count_xpos = xsize - file_count.len() as u16;
|
||||||
let count_ypos = ypos + self.get_coordinates()?.ysize();
|
let count_ypos = ypos + self.get_coordinates()?.ysize();
|
||||||
|
|
||||||
let status = format!("{} {}:{} {} {} {}", permissions, user, group, mtime,
|
let status = format!("{} {}:{} {}{} {}{}{} {}{}",
|
||||||
crate::term::goto_xy(count_xpos, count_ypos), file_count);
|
permissions,
|
||||||
|
user,
|
||||||
|
group,
|
||||||
|
crate::term::header_color(),
|
||||||
|
mtime,
|
||||||
|
crate::term::color_yellow(),
|
||||||
|
target,
|
||||||
|
crate::term::header_color(),
|
||||||
|
crate::term::goto_xy(count_xpos, count_ypos),
|
||||||
|
file_count);
|
||||||
Ok(status)
|
Ok(status)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -693,12 +701,9 @@ impl Widget for FileBrowser {
|
||||||
crate::term::highlight_color() } else {
|
crate::term::highlight_color() } else {
|
||||||
crate::term::from_lscolor(file.color.as_ref().unwrap()) };
|
crate::term::from_lscolor(file.color.as_ref().unwrap()) };
|
||||||
|
|
||||||
let path = match self.cwd.short_path() {
|
let path = self.cwd.short_string();
|
||||||
Ok(path) => path,
|
|
||||||
Err(_) => file.path
|
|
||||||
};
|
|
||||||
|
|
||||||
let mut path = path.to_string_lossy().to_string();
|
let mut path = path;
|
||||||
if &path == "" { path.clear(); }
|
if &path == "" { path.clear(); }
|
||||||
if &path == "~/" { path.pop(); }
|
if &path == "~/" { path.pop(); }
|
||||||
if &path == "/" { path.pop(); }
|
if &path == "/" { path.pop(); }
|
||||||
|
|
35
src/files.rs
35
src/files.rs
|
@ -350,6 +350,7 @@ pub struct File {
|
||||||
pub name: String,
|
pub name: String,
|
||||||
pub path: PathBuf,
|
pub path: PathBuf,
|
||||||
pub kind: Kind,
|
pub kind: Kind,
|
||||||
|
pub target: Option<PathBuf>,
|
||||||
pub color: Option<lscolors::Color>,
|
pub color: Option<lscolors::Color>,
|
||||||
pub meta: Option<std::fs::Metadata>,
|
pub meta: Option<std::fs::Metadata>,
|
||||||
pub selected: bool,
|
pub selected: bool,
|
||||||
|
@ -368,6 +369,7 @@ impl File {
|
||||||
name: name.to_string(),
|
name: name.to_string(),
|
||||||
kind: if path.is_dir() { Kind::Directory } else { Kind::File },
|
kind: if path.is_dir() { Kind::Directory } else { Kind::File },
|
||||||
path: path,
|
path: path,
|
||||||
|
target: None,
|
||||||
meta: None,
|
meta: None,
|
||||||
color: None,
|
color: None,
|
||||||
selected: false,
|
selected: false,
|
||||||
|
@ -404,9 +406,13 @@ impl File {
|
||||||
|
|
||||||
let meta = std::fs::symlink_metadata(&self.path)?;
|
let meta = std::fs::symlink_metadata(&self.path)?;
|
||||||
let color = self.get_color(&meta);
|
let color = self.get_color(&meta);
|
||||||
|
let target = if meta.file_type().is_symlink() {
|
||||||
|
self.path.read_link().ok()
|
||||||
|
} else { None };
|
||||||
|
|
||||||
self.meta = Some(meta);
|
self.meta = Some(meta);
|
||||||
self.color = color;
|
self.color = color;
|
||||||
|
self.target = target;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -603,14 +609,25 @@ impl File {
|
||||||
Some(time.format("%F %R").to_string())
|
Some(time.format("%F %R").to_string())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn short_path(&self) -> HResult<PathBuf> {
|
pub fn short_string(&self) -> String {
|
||||||
if let Ok(home) = crate::paths::home_path() {
|
self.path.short_string()
|
||||||
if let Ok(short) = self.path.strip_prefix(home) {
|
}
|
||||||
let mut path = PathBuf::from("~");
|
}
|
||||||
path.push(short);
|
|
||||||
return Ok(path);
|
|
||||||
}
|
pub trait ShortPaths {
|
||||||
}
|
fn short_string(&self) -> String;
|
||||||
return Ok(self.path.clone())
|
}
|
||||||
|
|
||||||
|
impl ShortPaths for PathBuf {
|
||||||
|
fn short_string(&self) -> String {
|
||||||
|
if let Ok(home) = crate::paths::home_path() {
|
||||||
|
if let Ok(short) = self.strip_prefix(home) {
|
||||||
|
let mut path = PathBuf::from("~");
|
||||||
|
path.push(short);
|
||||||
|
return path.to_string_lossy().to_string();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return self.to_string_lossy().to_string();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -335,17 +335,25 @@ impl ListView<Files>
|
||||||
(selection_gap + name, crate::term::color_yellow())
|
(selection_gap + name, crate::term::color_yellow())
|
||||||
} else { (name.clone(), "".to_string()) };
|
} else { (name.clone(), "".to_string()) };
|
||||||
|
|
||||||
|
let (link_indicator, link_indicator_len) = if file.target.is_some() {
|
||||||
|
(format!("{}{}{}",
|
||||||
|
term::color_yellow(),
|
||||||
|
"--> ".to_string(),
|
||||||
|
term::highlight_color()),
|
||||||
|
4)
|
||||||
|
} else { ("".to_string(), 0) };
|
||||||
|
|
||||||
let xsize = self.get_coordinates().unwrap().xsize();
|
let xsize = self.get_coordinates().unwrap().xsize();
|
||||||
let sized_string = term::sized_string(&name, xsize);
|
let sized_string = term::sized_string(&name, xsize);
|
||||||
let size_pos = xsize - (size.to_string().len() as u16
|
let size_pos = xsize - (size.to_string().len() as u16
|
||||||
+ unit.to_string().len() as u16);
|
+ unit.to_string().len() as u16
|
||||||
|
+ link_indicator_len);
|
||||||
let padding = sized_string.len() - sized_string.width_cjk();
|
let padding = sized_string.len() - sized_string.width_cjk();
|
||||||
let padding = xsize - padding as u16;
|
let padding = xsize - padding as u16;
|
||||||
let padding = padding - tag_len;
|
let padding = padding - tag_len;
|
||||||
|
|
||||||
format!(
|
format!(
|
||||||
"{}{}{}{}{}{}{}",
|
"{}{}{}{}{}{}{}{}",
|
||||||
termion::cursor::Save,
|
termion::cursor::Save,
|
||||||
match &file.color {
|
match &file.color {
|
||||||
Some(color) => format!("{}{}{}{:padding$}{}",
|
Some(color) => format!("{}{}{}{:padding$}{}",
|
||||||
|
@ -365,6 +373,7 @@ impl ListView<Files>
|
||||||
} ,
|
} ,
|
||||||
termion::cursor::Restore,
|
termion::cursor::Restore,
|
||||||
termion::cursor::Right(size_pos),
|
termion::cursor::Right(size_pos),
|
||||||
|
link_indicator,
|
||||||
term::highlight_color(),
|
term::highlight_color(),
|
||||||
size,
|
size,
|
||||||
unit
|
unit
|
||||||
|
|
Loading…
Reference in New Issue