refactor(ui): make bottom_line clearer

This commit is contained in:
Aram Drevekenin
2020-06-16 12:35:28 +02:00
parent cc26a0e26a
commit 67efe19744

View File

@@ -9,6 +9,68 @@ use tui::buffer::Buffer;
use crate::state::{Tile, FileType}; use crate::state::{Tile, FileType};
use crate::ui::format::{DisplaySize, truncate_middle}; use crate::ui::format::{DisplaySize, truncate_middle};
fn render_currently_selected (buf: &mut Buffer, currently_selected: &Tile, max_len: u16, y: u16) {
let file_name = currently_selected.name.to_string_lossy();
let size = DisplaySize(currently_selected.size as f64);
let descendants = currently_selected.descendants;
let (style, lines) = match currently_selected.file_type {
FileType::File => (
Style::default().modifier(Modifier::BOLD),
vec![
format!("SELECTED: {} ({})", file_name, size),
format!("SELECTED: {}", file_name),
format!("{}", file_name)
]
),
FileType::Folder => (
Style::default().fg(Color::Blue).modifier(Modifier::BOLD),
vec![
format!("SELECTED: {} ({}, {} files)", file_name, size, descendants.expect("a folder should have descendants")),
format!("SELECTED: {} ({})", file_name, size),
format!("SELECTED: {}", file_name),
format!("{}", file_name),
]
)
};
for line in lines {
if (line.chars().count() as u16) < max_len {
buf.set_string(1, y, line, style);
break;
}
}
}
fn render_last_read_path (buf: &mut Buffer, last_read_path: &PathBuf, max_len: u16, y: u16) {
let last_read_path = last_read_path.to_string_lossy();
if (last_read_path.chars().count() as u16) < max_len {
buf.set_string(1, y, last_read_path, Style::default());
} else {
buf.set_string(1, y, truncate_middle(&last_read_path, max_len), Style::default());
}
}
fn render_controls_legend (buf: &mut Buffer, hide_delete: bool, max_len: u16, y: u16) {
let (long_controls_line, short_controls_line) = if hide_delete {
(
String::from("<hjkl> or <arrow keys> - move around, <ENTER> - enter folder, <ESC> - parent folder"),
String::from("←↓↑→/<ENTER>/<ESC>: navigate")
)
} else {
(
String::from("<hjkl> or <arrow keys> - move around, <ENTER> - enter folder, <ESC> - parent folder, <Ctrl-D> - delete"),
String::from("←↓↑→/<ENTER>/<ESC>: navigate, <Ctrl-D>: del")
)
};
let too_small_line = "(...)";
if max_len >= long_controls_line.chars().count() as u16 {
buf.set_string(1, y, long_controls_line, Style::default().modifier(Modifier::BOLD));
} else if max_len >= short_controls_line.chars().count() as u16 {
buf.set_string(1, y, short_controls_line, Style::default().modifier(Modifier::BOLD));
} else {
buf.set_string(1, y, too_small_line, Style::default().modifier(Modifier::BOLD));
}
}
pub struct BottomLine <'a>{ pub struct BottomLine <'a>{
hide_delete: bool, hide_delete: bool,
currently_selected: Option<&'a Tile>, currently_selected: Option<&'a Tile>,
@@ -35,70 +97,22 @@ impl <'a>BottomLine <'a>{
impl<'a> Widget for BottomLine <'a>{ impl<'a> Widget for BottomLine <'a>{
fn draw(&mut self, area: Rect, buf: &mut Buffer) { fn draw(&mut self, area: Rect, buf: &mut Buffer) {
// status line TODO: make own component
let small_files_legend = "(x = Small files)"; let small_files_legend = "(x = Small files)";
if let Some(currently_selected) = self.currently_selected {
let file_name = currently_selected.name.to_string_lossy();
let size = DisplaySize(currently_selected.size as f64);
let descendants = currently_selected.descendants;
let (style, lines) = match currently_selected.file_type {
FileType::File => (
Style::default().modifier(Modifier::BOLD),
vec![
format!("SELECTED: {} ({})", file_name, size),
format!("SELECTED: {}", file_name),
format!("{}", file_name)
]
),
FileType::Folder => (
Style::default().fg(Color::Blue).modifier(Modifier::BOLD),
vec![
format!("SELECTED: {} ({}, {} files)", file_name, size, descendants.expect("a folder should have descendants")),
format!("SELECTED: {} ({})", file_name, size),
format!("SELECTED: {}", file_name),
format!("{}", file_name),
]
)
};
for line in lines {
if (line.chars().count() as u16) < area.width - small_files_legend.chars().count() as u16 {
buf.set_string(1, area.y + area.height - 2, line, style);
break;
}
}
} else if let Some(last_read_path) = self.last_read_path {
let max_len = area.width - small_files_legend.chars().count() as u16 - 5;
let last_read_path = last_read_path.to_string_lossy();
if (last_read_path.chars().count() as u16) < max_len {
buf.set_string(1, area.y + area.height - 2, last_read_path, Style::default());
} else {
buf.set_string(1, area.y + area.height - 2, truncate_middle(&last_read_path, max_len), Style::default());
}
}
let small_files_len = small_files_legend.chars().count() as u16; let small_files_len = small_files_legend.chars().count() as u16;
buf.set_string(area.width - small_files_len - 1, area.y + area.height - 2, small_files_legend, Style::default()); let max_status_len = area.width - small_files_len;
let bottom_left_character = buf.get_mut(area.width - small_files_len, area.y + area.height - 2); let max_controls_len = area.width;
bottom_left_character.set_style(Style::default().bg(Color::White).fg(Color::Black)); let status_line_y = area.y + area.height - 2;
let controls_line_y = status_line_y + 1;
let (long_controls_line, short_controls_line) = if self.hide_delete { if let Some(currently_selected) = self.currently_selected {
( render_currently_selected(buf, currently_selected, max_status_len, status_line_y);
String::from("<hjkl> or <arrow keys> - move around, <ENTER> - enter folder, <ESC> - parent folder"), } else if let Some(last_read_path) = self.last_read_path {
String::from("←↓↑→/<ENTER>/<ESC>: navigate") render_last_read_path(buf, last_read_path, max_status_len, status_line_y);
)
} else {
(
String::from("<hjkl> or <arrow keys> - move around, <ENTER> - enter folder, <ESC> - parent folder, <Ctrl-D> - delete"),
String::from("←↓↑→/<ENTER>/<ESC>: navigate, <Ctrl-D>: del")
)
};
let too_small_line = "(...)";
if area.width >= long_controls_line.chars().count() as u16 {
buf.set_string(1, area.y + area.height - 1, long_controls_line, Style::default().modifier(Modifier::BOLD));
} else if area.width >= short_controls_line.chars().count() as u16 {
buf.set_string(1, area.y + area.height - 1, short_controls_line, Style::default().modifier(Modifier::BOLD));
} else {
buf.set_string(1, area.y + area.height - 1, too_small_line, Style::default().modifier(Modifier::BOLD));
} }
buf.set_string(area.width - small_files_len - 1, status_line_y, small_files_legend, Style::default());
let small_files_legend_character = buf.get_mut(area.width - small_files_len, status_line_y);
small_files_legend_character.set_style(Style::default().bg(Color::White).fg(Color::Black));
render_controls_legend(buf, self.hide_delete, max_controls_len, controls_line_y);
} }
} }