summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorqkzk <qu3nt1n@gmail.com>2023-11-12 16:58:46 +0100
committerqkzk <qu3nt1n@gmail.com>2023-11-12 16:58:46 +0100
commit43f393c0806de4804660877f733240301e40ac11 (patch)
treea879e0211a437931906a6dfbad2f86aee9f23698
parentfd306d477daaee5a946667833a2efb29749a62ca (diff)
improve winsecondary draw
-rw-r--r--src/term_manager.rs226
1 files changed, 111 insertions, 115 deletions
diff --git a/src/term_manager.rs b/src/term_manager.rs
index 0d3fca1..977e318 100644
--- a/src/term_manager.rs
+++ b/src/term_manager.rs
@@ -10,7 +10,6 @@ use tuikit::prelude::*;
use tuikit::term::Term;
use crate::completion::InputCompleted;
-use crate::compress::CompressionMethod;
use crate::constant_strings_paths::{
ENCRYPTED_DEVICE_BINDS, HELP_FIRST_SENTENCE, HELP_SECOND_SENTENCE, LOG_FIRST_SENTENCE,
LOG_SECOND_SENTENCE,
@@ -24,7 +23,6 @@ use crate::preview::{Preview, TextKind, Window};
use crate::selectable_content::SelectableContent;
use crate::status::Status;
use crate::tab::Tab;
-use crate::trash::TrashInfo;
use crate::tree::calculate_top_bottom;
/// Iter over the content, returning a triplet of `(index, line, attr)`.
@@ -661,15 +659,14 @@ impl<'a> Draw for WinSecondary<'a> {
fn draw(&self, canvas: &mut dyn Canvas) -> DrawResult<()> {
canvas.clear()?;
match self.tab.mode {
- Mode::Navigate(mode) => self.navigate(mode, canvas),
- Mode::NeedConfirmation(mode) => self.confirm(self.status, self.tab, mode, canvas),
- Mode::InputCompleted(_) => self.completion(self.tab, canvas),
- Mode::InputSimple(mode) => Self::display_static_lines(mode.lines(), canvas),
+ Mode::Navigate(mode) => self.draw_navigate(mode, canvas),
+ Mode::NeedConfirmation(mode) => self.draw_confirm(mode, canvas),
+ Mode::InputCompleted(_) => self.draw_completion(canvas),
+ Mode::InputSimple(mode) => Self::draw_static_lines(mode.lines(), canvas),
_ => Ok(()),
}?;
- self.cursor(self.tab, canvas)?;
- self.first_line(self.tab, canvas)?;
- Ok(())
+ self.draw_cursor(canvas)?;
+ WinSecondaryFirstLine::new(self.tab)?.draw(canvas)
}
}
@@ -686,53 +683,13 @@ impl<'a> WinSecondary<'a> {
}
}
- fn first_line(&self, tab: &Tab, canvas: &mut dyn Canvas) -> Result<()> {
- draw_colored_strings(0, 0, &self.create_first_row(tab)?, canvas, false)
- }
-
- fn create_first_row(&self, tab: &Tab) -> Result<Vec<String>> {
- let first_row = match tab.mode {
- Mode::NeedConfirmation(confirmed_action) => {
- vec![format!("{confirmed_action}"), " (y/n)".to_owned()]
- }
- Mode::Navigate(Navigate::Marks(MarkAction::Jump)) => {
- vec!["Jump to...".to_owned()]
- }
- Mode::Navigate(Navigate::Marks(MarkAction::New)) => {
- vec!["Save mark...".to_owned()]
- }
- Mode::InputSimple(InputSimple::Password(password_kind, _encrypted_action, _)) => {
- info!("term: password");
- vec![format!("{password_kind}"), tab.input.password()]
- }
- Mode::InputCompleted(mode) => {
- let mut completion_strings = vec![tab.mode.to_string(), tab.input.string()];
- if let Some(completion) = tab.completion.complete_input_string(&tab.input.string())
- {
- completion_strings.push(completion.to_owned())
- }
- if let InputCompleted::Exec = mode {
- let selected_path = &tab.selected().context("can't parse path")?.path;
- let selected_path = format!(" {}", selected_path.display());
-
- completion_strings.push(selected_path);
- }
- completion_strings
- }
- _ => {
- vec![tab.mode.to_string(), tab.input.string()]
- }
- };
- Ok(first_row)
- }
-
/// Display the possible completion items. The currently selected one is
/// reversed.
- fn completion(&self, tab: &Tab, canvas: &mut dyn Canvas) -> Result<()> {
- canvas.set_cursor(0, tab.input.cursor_index + Self::EDIT_BOX_OFFSET)?;
- for (row, candidate) in tab.completion.proposals.iter().enumerate() {
+ fn draw_completion(&self, canvas: &mut dyn Canvas) -> Result<()> {
+ canvas.set_cursor(0, self.tab.input.cursor_index + Self::EDIT_BOX_OFFSET)?;
+ for (row, candidate) in self.tab.completion.proposals.iter().enumerate() {
let mut attr = Attr::default();
- if row == tab.completion.index {
+ if row == self.tab.completion.index {
attr.effect |= Effect::REVERSE;
}
canvas.print_with_attr(row + ContentWindow::WINDOW_MARGIN_TOP, 4, candidate, attr)?;
@@ -740,7 +697,7 @@ impl<'a> WinSecondary<'a> {
Ok(())
}
- fn display_static_lines(lines: &[&str], canvas: &mut dyn Canvas) -> Result<()> {
+ fn draw_static_lines(lines: &[&str], canvas: &mut dyn Canvas) -> Result<()> {
for (row, line, attr) in enumerated_colored_iter!(lines) {
canvas.print_with_attr(row + ContentWindow::WINDOW_MARGIN_TOP, 4, line, *attr)?;
}
@@ -748,8 +705,8 @@ impl<'a> WinSecondary<'a> {
}
/// Display a cursor in the top row, at a correct column.
- fn cursor(&self, tab: &Tab, canvas: &mut dyn Canvas) -> Result<()> {
- match tab.mode {
+ fn draw_cursor(&self, canvas: &mut dyn Canvas) -> Result<()> {
+ match self.tab.mode {
Mode::Normal | Mode::Tree | Mode::Navigate(_) | Mode::Preview => {
canvas.show_cursor(false)?;
}
@@ -759,11 +716,14 @@ impl<'a> WinSecondary<'a> {
}
Mode::InputSimple(InputSimple::Password(_, _, _)) => {
canvas.show_cursor(true)?;
- canvas.set_cursor(0, Self::PASSWORD_CURSOR_OFFSET + tab.input.cursor_index)?;
+ canvas.set_cursor(
+ 0,
+ Self::PASSWORD_CURSOR_OFFSET + self.tab.input.cursor_index,
+ )?;
}
Mode::InputSimple(_) | Mode::InputCompleted(_) => {
canvas.show_cursor(true)?;
- canvas.set_cursor(0, Self::EDIT_BOX_OFFSET + tab.input.cursor_index)?;
+ canvas.set_cursor(0, Self::EDIT_BOX_OFFSET + self.tab.input.cursor_index)?;
}
Mode::NeedConfirmation(confirmed_action) => {
canvas.show_cursor(true)?;
@@ -773,24 +733,24 @@ impl<'a> WinSecondary<'a> {
Ok(())
}
- fn navigate(&self, navigable_mode: Navigate, canvas: &mut dyn Canvas) -> Result<()> {
+ fn draw_navigate(&self, navigable_mode: Navigate, canvas: &mut dyn Canvas) -> Result<()> {
match navigable_mode {
- Navigate::Bulk => self.bulk(canvas, &self.status.bulk),
- Navigate::CliInfo => self.cli_info(self.status, canvas),
- Navigate::Compress => self.compress(canvas, &self.status.compression),
- Navigate::EncryptedDrive => self.encrypted_drive(self.status, self.tab, canvas),
- Navigate::RemovableDevices => self.removable_devices(self.status, self.tab, canvas),
- Navigate::History => self.history(canvas, &self.tab.history),
- Navigate::Jump => self.destination(canvas, &self.status.flagged),
- Navigate::Marks(_) => self.marks(self.status, canvas),
- Navigate::ShellMenu => self.shell_menu(self.status, canvas),
- Navigate::Shortcut => self.destination(canvas, &self.tab.shortcut),
- Navigate::Trash => self.trash(canvas, &self.status.trash),
+ Navigate::Bulk => self.draw_bulk(canvas),
+ Navigate::CliInfo => self.draw_cli_info(canvas),
+ Navigate::Compress => self.draw_compress(canvas),
+ 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::RemovableDevices => self.draw_removable(canvas),
+ Navigate::ShellMenu => self.draw_shell_menu(self.status, canvas),
+ Navigate::Shortcut => self.draw_destination(canvas, &self.tab.shortcut),
+ Navigate::Trash => self.draw_trash(canvas),
}
}
/// Display the possible destinations from a selectable content of PathBuf.
- fn destination(
+ fn draw_destination(
&self,
canvas: &mut dyn Canvas,
selectable: &impl SelectableContent<PathBuf>,
@@ -812,11 +772,8 @@ impl<'a> WinSecondary<'a> {
Ok(())
}
- fn history(
- &self,
- canvas: &mut dyn Canvas,
- selectable: &impl SelectableContent<(PathBuf, PathBuf)>,
- ) -> Result<()> {
+ fn draw_history(&self, canvas: &mut dyn Canvas) -> Result<()> {
+ let selectable = &self.tab.history;
canvas.print(0, 0, "Go to...")?;
let content = &selectable.content();
for (row, pair, attr) in enumerated_colored_iter!(content) {
@@ -834,11 +791,8 @@ impl<'a> WinSecondary<'a> {
Ok(())
}
- fn bulk(
- &self,
- canvas: &mut dyn Canvas,
- selectable: &Option<impl SelectableContent<String>>,
- ) -> Result<()> {
+ fn draw_bulk(&self, canvas: &mut dyn Canvas) -> Result<()> {
+ let selectable = &self.status.bulk;
if let Some(selectable) = selectable {
canvas.print(0, 0, "Action...")?;
let content = &selectable.content();
@@ -854,11 +808,8 @@ impl<'a> WinSecondary<'a> {
Ok(())
}
- fn trash(
- &self,
- canvas: &mut dyn Canvas,
- selectable: &impl SelectableContent<TrashInfo>,
- ) -> Result<()> {
+ fn draw_trash(&self, canvas: &mut dyn Canvas) -> Result<()> {
+ let selectable = &self.status.trash;
canvas.print(
1,
0,
@@ -889,11 +840,8 @@ impl<'a> WinSecondary<'a> {
Ok(())
}
- fn compress(
- &self,
- canvas: &mut dyn Canvas,
- selectable: &impl SelectableContent<CompressionMethod>,
- ) -> Result<()> {
+ fn draw_compress(&self, canvas: &mut dyn Canvas) -> Result<()> {
+ let selectable = &self.status.compression;
canvas.print_with_attr(
1,
0,
@@ -917,7 +865,7 @@ impl<'a> WinSecondary<'a> {
Ok(())
}
- fn marks(&self, status: &Status, canvas: &mut dyn Canvas) -> Result<()> {
+ fn draw_marks(&self, status: &Status, canvas: &mut dyn Canvas) -> Result<()> {
canvas.print_with_attr(2, 1, "mark path", Self::ATTR_YELLOW)?;
for ((row, line), attr) in std::iter::zip(
@@ -934,7 +882,7 @@ impl<'a> WinSecondary<'a> {
Ok(())
}
- fn shell_menu(&self, status: &Status, canvas: &mut dyn Canvas) -> Result<()> {
+ fn draw_shell_menu(&self, status: &Status, canvas: &mut dyn Canvas) -> Result<()> {
canvas.print_with_attr(2, 1, "pick a command", Self::ATTR_YELLOW)?;
let tab = status.selected_non_mut();
@@ -953,16 +901,16 @@ impl<'a> WinSecondary<'a> {
Ok(())
}
- fn cli_info(&self, status: &Status, canvas: &mut dyn Canvas) -> Result<()> {
+ fn draw_cli_info(&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.cli_info.content.iter().enumerate(),
+ self.status.cli_info.content.iter().enumerate(),
MENU_COLORS.iter().cycle(),
) {
let mut attr = *attr;
- if row == status.cli_info.index() {
+ if row == self.status.cli_info.index() {
attr.effect |= Effect::REVERSE;
}
let row = calc_line_row(row, &tab.window) + 2;
@@ -972,17 +920,17 @@ impl<'a> WinSecondary<'a> {
Ok(())
}
- fn encrypted_drive(&self, status: &Status, tab: &Tab, canvas: &mut dyn Canvas) -> Result<()> {
+ fn draw_encrypted_drive(&self, canvas: &mut dyn Canvas) -> Result<()> {
canvas.print_with_attr(2, 3, ENCRYPTED_DEVICE_BINDS, Self::ATTR_YELLOW)?;
- for (i, device) in status.encrypted_devices.content.iter().enumerate() {
- let row = calc_line_row(i, &tab.window) + 2;
+ for (i, device) in self.status.encrypted_devices.content.iter().enumerate() {
+ let row = calc_line_row(i, &self.tab.window) + 2;
let mut not_mounted_attr = Attr::default();
let mut mounted_attr = Attr::from(Color::BLUE);
- if i == status.encrypted_devices.index() {
+ if i == self.status.encrypted_devices.index() {
not_mounted_attr.effect |= Effect::REVERSE;
mounted_attr.effect |= Effect::REVERSE;
}
- if status.encrypted_devices.content[i].is_mounted() {
+ if self.status.encrypted_devices.content[i].is_mounted() {
canvas.print_with_attr(row, 3, &device.as_string()?, mounted_attr)?;
} else {
canvas.print_with_attr(row, 3, &device.as_string()?, not_mounted_attr)?;
@@ -991,14 +939,14 @@ impl<'a> WinSecondary<'a> {
Ok(())
}
- fn removable_devices(&self, status: &Status, tab: &Tab, canvas: &mut dyn Canvas) -> Result<()> {
+ fn draw_removable(&self, canvas: &mut dyn Canvas) -> Result<()> {
canvas.print_with_attr(2, 3, ENCRYPTED_DEVICE_BINDS, Self::ATTR_YELLOW)?;
- if let Some(removable) = &status.removable_devices {
+ if let Some(removable) = &self.status.removable_devices {
for (i, removable) in removable.content.iter().enumerate() {
- let row = calc_line_row(i, &tab.window) + 2;
+ let row = calc_line_row(i, &self.tab.window) + 2;
let mut not_mounted_attr = Attr::default();
let mut mounted_attr = Attr::from(Color::BLUE);
- if i == status.encrypted_devices.index() {
+ if i == self.status.encrypted_devices.index() {
not_mounted_attr.effect |= Effect::REVERSE;
mounted_attr.effect |= Effect::REVERSE;
}
@@ -1012,17 +960,15 @@ impl<'a> WinSecondary<'a> {
Ok(())
}
/// Display a list of edited (deleted, copied, moved, trashed) files for confirmation
- fn confirm(
+ fn draw_confirm(
&self,
- status: &Status,
- tab: &Tab,
confirmed_mode: NeedConfirmation,
canvas: &mut dyn Canvas,
) -> Result<()> {
info!("confirmed action: {:?}", confirmed_mode);
match confirmed_mode {
NeedConfirmation::EmptyTrash => {
- if status.trash.is_empty() {
+ if self.status.trash.is_empty() {
let _ = canvas.print_with_attr(
ContentWindow::WINDOW_MARGIN_TOP + 2,
4,
@@ -1030,7 +976,7 @@ impl<'a> WinSecondary<'a> {
ATTR_YELLOW_BOLD,
);
} else {
- for (row, trashinfo) in status.trash.content().iter().enumerate() {
+ for (row, trashinfo) in self.status.trash.content().iter().enumerate() {
canvas.print_with_attr(
row + ContentWindow::WINDOW_MARGIN_TOP + 2,
4,
@@ -1041,7 +987,7 @@ impl<'a> WinSecondary<'a> {
}
}
_ => {
- for (row, path) in status.flagged.content.iter().enumerate() {
+ for (row, path) in self.status.flagged.content.iter().enumerate() {
canvas.print_with_attr(
row + ContentWindow::WINDOW_MARGIN_TOP + 2,
4,
@@ -1051,14 +997,15 @@ impl<'a> WinSecondary<'a> {
}
}
}
- let dest = match tab.previous_mode {
- Mode::Tree => tab
+ let dest = match self.tab.previous_mode {
+ Mode::Tree => self
+ .tab
.tree
.directory_of_selected()
.context("No directory_of_selected")?
.display()
.to_string(),
- _ => tab.path_content.path_to_str(),
+ _ => self.tab.path_content.path_to_str(),
};
canvas.print_with_attr(
2,
@@ -1073,6 +1020,55 @@ impl<'a> WinSecondary<'a> {
impl<'a> Widget for WinSecondary<'a> {}
+struct WinSecondaryFirstLine {
+ content: Vec<String>,
+}
+
+impl Draw for WinSecondaryFirstLine {
+ fn draw(&self, canvas: &mut dyn Canvas) -> DrawResult<()> {
+ draw_colored_strings(0, 0, &self.content, canvas, false)?;
+ Ok(())
+ }
+}
+
+impl WinSecondaryFirstLine {
+ fn new(tab: &Tab) -> Result<Self> {
+ let content = match tab.mode {
+ Mode::NeedConfirmation(confirmed_action) => {
+ vec![format!("{confirmed_action}"), " (y/n)".to_owned()]
+ }
+ Mode::Navigate(Navigate::Marks(MarkAction::Jump)) => {
+ vec!["Jump to...".to_owned()]
+ }
+ Mode::Navigate(Navigate::Marks(MarkAction::New)) => {
+ vec!["Save mark...".to_owned()]
+ }
+ Mode::InputSimple(InputSimple::Password(password_kind, _encrypted_action, _)) => {
+ info!("term: password");
+ vec![format!("{password_kind}"), tab.input.password()]
+ }
+ Mode::InputCompleted(mode) => {
+ let mut completion_strings = vec![tab.mode.to_string(), tab.input.string()];
+ if let Some(completion) = tab.completion.complete_input_string(&tab.input.string())
+ {
+ completion_strings.push(completion.to_owned())
+ }
+ if let InputCompleted::Exec = mode {
+ let selected_path = &tab.selected().context("can't parse path")?.path;
+ let selected_path = format!(" {}", selected_path.display());
+
+ completion_strings.push(selected_path);
+ }
+ completion_strings
+ }
+ _ => {
+ vec![tab.mode.to_string(), tab.input.string()]
+ }
+ };
+ Ok(Self { content })
+ }
+}
+
/// Is responsible for displaying content in the terminal.
/// It uses an already created terminal.
pub struct Display {