summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorqkzk <qu3nt1n@gmail.com>2023-11-12 18:36:44 +0100
committerqkzk <qu3nt1n@gmail.com>2023-11-12 18:36:44 +0100
commit0dcaaee0ea5a269f2a0e607d6294d73c82f6c604 (patch)
tree7d472bd854e1335c19847fd1576ceaad30dc4cb3
parent920479a6618e21eda36188197dce3e0b48630445 (diff)
improve winsecondary draw methods
-rw-r--r--src/constant_strings_paths.rs1
-rw-r--r--src/term_manager.rs114
2 files changed, 55 insertions, 60 deletions
diff --git a/src/constant_strings_paths.rs b/src/constant_strings_paths.rs
index 91909d3..d66b9c9 100644
--- a/src/constant_strings_paths.rs
+++ b/src/constant_strings_paths.rs
@@ -164,6 +164,7 @@ pub const RENAME_LINES: [&str; 3] = [
"",
"Nothing is done if the file already exists",
];
+pub const TRASH_CONFIRM_LINE: &str = "Enter: restore the selected file -- x: delete permanently";
/// Executable commands whose output is a text to be displayed in terminal
pub const CLI_INFO_COMMANDS: [&str; 4] = ["duf", "inxi -v 2 --color", "neofetch", "lsusb"];
/// Wallpaper executable
diff --git a/src/term_manager.rs b/src/term_manager.rs
index d1cbda7..25dbd63 100644
--- a/src/term_manager.rs
+++ b/src/term_manager.rs
@@ -12,7 +12,7 @@ use tuikit::term::Term;
use crate::completion::InputCompleted;
use crate::constant_strings_paths::{
ENCRYPTED_DEVICE_BINDS, HELP_FIRST_SENTENCE, HELP_SECOND_SENTENCE, LOG_FIRST_SENTENCE,
- LOG_SECOND_SENTENCE,
+ LOG_SECOND_SENTENCE, TRASH_CONFIRM_LINE,
};
use crate::content_window::ContentWindow;
use crate::fileinfo::{fileinfo_attr, shorten_path, FileInfo};
@@ -23,6 +23,7 @@ use crate::preview::{Preview, TextKind, Window};
use crate::selectable_content::SelectableContent;
use crate::status::Status;
use crate::tab::Tab;
+use crate::trash::Trash;
use crate::tree::calculate_top_bottom;
/// Iter over the content, returning a triplet of `(index, line, attr)`.
@@ -741,9 +742,9 @@ impl<'a> WinSecondary<'a> {
Navigate::EncryptedDrive => self.draw_encrypted_drive(canvas),
Navigate::History => self.draw_history(canvas),
Navigate::Jump => self.draw_destination(canvas, &self.status.flagged),
- Navigate::Marks(_) => self.draw_marks(self.status, canvas),
+ Navigate::Marks(_) => self.draw_marks(canvas),
Navigate::RemovableDevices => self.draw_removable(canvas),
- Navigate::ShellMenu => self.draw_shell_menu(self.status, canvas),
+ Navigate::ShellMenu => self.draw_shell_menu(canvas),
Navigate::Shortcut => self.draw_destination(canvas, &self.tab.shortcut),
Navigate::Trash => self.draw_trash(canvas),
}
@@ -756,7 +757,7 @@ impl<'a> WinSecondary<'a> {
selectable: &impl SelectableContent<PathBuf>,
) -> Result<()> {
canvas.print(0, 0, "Go to...")?;
- let content = &selectable.content();
+ let content = selectable.content();
for (row, path, attr) in enumerated_colored_iter!(content) {
let mut attr = *attr;
if row == selectable.index() {
@@ -775,7 +776,7 @@ impl<'a> WinSecondary<'a> {
fn draw_history(&self, canvas: &mut dyn Canvas) -> Result<()> {
let selectable = &self.tab.history;
canvas.print(0, 0, "Go to...")?;
- let content = &selectable.content();
+ let content = selectable.content();
for (row, pair, attr) in enumerated_colored_iter!(content) {
let mut attr = *attr;
if row == selectable.index() {
@@ -795,7 +796,7 @@ impl<'a> WinSecondary<'a> {
let selectable = &self.status.bulk;
if let Some(selectable) = selectable {
canvas.print(0, 0, "Action...")?;
- let content = &selectable.content();
+ let content = selectable.content();
for (row, text, attr) in enumerated_colored_iter!(content) {
let mut attr = *attr;
if row == selectable.index() {
@@ -809,35 +810,30 @@ impl<'a> WinSecondary<'a> {
}
fn draw_trash(&self, canvas: &mut dyn Canvas) -> Result<()> {
- let selectable = &self.status.trash;
- canvas.print(
- 1,
- 0,
- "Enter: restore the selected file -- x: delete permanently",
- )?;
- let content = &selectable.content();
- if content.is_empty() {
+ let trash = &self.status.trash;
+ if trash.content().is_empty() {
+ self.draw_already_empty_trash(canvas)
+ } else {
+ self.draw_trash_content(canvas, trash)
+ };
+ Ok(())
+ }
+
+ fn draw_trash_content(&self, canvas: &mut dyn Canvas, trash: &Trash) {
+ let _ = canvas.print(1, 2, TRASH_CONFIRM_LINE);
+ let content = trash.content();
+ for (row, trashinfo, attr) in enumerated_colored_iter!(content) {
+ let mut attr = *attr;
+ if row == trash.index() {
+ attr.effect |= Effect::REVERSE;
+ }
let _ = canvas.print_with_attr(
- ContentWindow::WINDOW_MARGIN_TOP + 2,
+ row + ContentWindow::WINDOW_MARGIN_TOP,
4,
- "Trash is empty",
- ATTR_YELLOW_BOLD,
+ &format!("{trashinfo}"),
+ attr,
);
- } else {
- for (row, trashinfo, attr) in enumerated_colored_iter!(content) {
- let mut attr = *attr;
- if row == selectable.index() {
- attr.effect |= Effect::REVERSE;
- }
- let _ = canvas.print_with_attr(
- row + ContentWindow::WINDOW_MARGIN_TOP,
- 4,
- &format!("{trashinfo}"),
- attr,
- );
- }
}
- Ok(())
}
fn draw_compress(&self, canvas: &mut dyn Canvas) -> Result<()> {
@@ -848,7 +844,7 @@ impl<'a> WinSecondary<'a> {
"Archive and compress the flagged files. Pick a compression algorithm.",
Self::ATTR_YELLOW,
)?;
- let content = &selectable.content();
+ let content = selectable.content();
for (row, compression_method, attr) in enumerated_colored_iter!(content) {
let mut attr = *attr;
if row == selectable.index() {
@@ -865,15 +861,15 @@ impl<'a> WinSecondary<'a> {
Ok(())
}
- fn draw_marks(&self, status: &Status, canvas: &mut dyn Canvas) -> Result<()> {
+ fn draw_marks(&self, canvas: &mut dyn Canvas) -> Result<()> {
canvas.print_with_attr(2, 1, "mark path", Self::ATTR_YELLOW)?;
for ((row, line), attr) in std::iter::zip(
- status.marks.as_strings().iter().enumerate(),
+ self.status.marks.as_strings().iter().enumerate(),
MENU_COLORS.iter().cycle(),
) {
let mut attr = *attr;
- if row == status.marks.index() {
+ if row == self.status.marks.index() {
attr.effect |= Effect::REVERSE;
}
@@ -882,16 +878,16 @@ impl<'a> WinSecondary<'a> {
Ok(())
}
- fn draw_shell_menu(&self, status: &Status, canvas: &mut dyn Canvas) -> Result<()> {
+ fn draw_shell_menu(&self, canvas: &mut dyn Canvas) -> Result<()> {
canvas.print_with_attr(2, 1, "pick a command", Self::ATTR_YELLOW)?;
- let tab = status.selected_non_mut();
+ let tab = self.status.selected_non_mut();
for ((row, (command, _)), attr) in std::iter::zip(
- status.shell_menu.content.iter().enumerate(),
+ self.status.shell_menu.content.iter().enumerate(),
MENU_COLORS.iter().cycle(),
) {
let mut attr = *attr;
- if row == status.shell_menu.index() {
+ if row == self.status.shell_menu.index() {
attr.effect |= Effect::REVERSE;
}
let row = calc_line_row(row, &tab.window) + 2;
@@ -968,27 +964,13 @@ impl<'a> WinSecondary<'a> {
info!("confirmed action: {:?}", confirmed_mode);
match confirmed_mode {
NeedConfirmation::EmptyTrash => self.draw_confirm_empty_trash(canvas)?,
- _ => {
- for (row, path) in self.status.flagged.content.iter().enumerate() {
- canvas.print_with_attr(
- row + ContentWindow::WINDOW_MARGIN_TOP + 2,
- 4,
- path.to_str().context("Unreadable filename")?,
- Attr::default(),
- )?;
- }
- }
+ _ => self.draw_confirm_default(canvas)?,
}
- let dest = match self.tab.previous_mode {
- Mode::Tree => self
- .tab
- .tree
- .directory_of_selected()
- .context("No directory_of_selected")?
- .display()
- .to_string(),
- _ => self.tab.path_content.path_to_str(),
- };
+ let dest = self
+ .tab
+ .directory_of_selected_previous_mode()?
+ .display()
+ .to_string();
canvas.print_with_attr(
2,
3,
@@ -999,6 +981,18 @@ impl<'a> WinSecondary<'a> {
Ok(())
}
+ fn draw_confirm_default(&self, canvas: &mut dyn Canvas) -> Result<()> {
+ for (row, path) in self.status.flagged.content.iter().enumerate() {
+ canvas.print_with_attr(
+ row + ContentWindow::WINDOW_MARGIN_TOP + 2,
+ 4,
+ path.to_str().context("Unreadable filename")?,
+ Attr::default(),
+ )?;
+ }
+ Ok(())
+ }
+
fn draw_confirm_empty_trash(&self, canvas: &mut dyn Canvas) -> Result<()> {
if self.status.trash.is_empty() {
self.draw_already_empty_trash(canvas)
@@ -1038,7 +1032,7 @@ struct WinSecondaryFirstLine {
impl Draw for WinSecondaryFirstLine {
fn draw(&self, canvas: &mut dyn Canvas) -> DrawResult<()> {
- draw_colored_strings(0, 0, &self.content, canvas, false)?;
+ draw_colored_strings(0, 1, &self.content, canvas, false)?;
Ok(())
}
}