summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Zhao <jeff.no.zhao@gmail.com>2021-08-18 15:44:26 -0400
committerJeff Zhao <jeff.no.zhao@gmail.com>2021-08-18 15:44:26 -0400
commitf8851c7f9ac22289e473a2911611958e361befdc (patch)
tree5f1ea05eb677aede45eb12a877882a7c2ff23a3d
parent45e7a9f8cc3937ed21006fb4a5d5145426f70558 (diff)
add quit_to_cwd command
- this command lets users exit to the current directory more easily and more ergonomically
-rw-r--r--src/commands/delete_files.rs2
-rw-r--r--src/commands/key_command.rs5
-rw-r--r--src/commands/quit.rs11
-rw-r--r--src/context/app_context.rs12
-rw-r--r--src/context/mod.rs2
-rw-r--r--src/fs/dirlist.rs2
-rw-r--r--src/main.rs34
-rw-r--r--src/run.rs4
-rw-r--r--src/tab.rs4
-rw-r--r--src/ui/views/tui_folder_view.rs3
-rw-r--r--src/ui/widgets/tui_dirlist_detailed.rs6
-rw-r--r--src/util/input.rs14
12 files changed, 66 insertions, 33 deletions
diff --git a/src/commands/delete_files.rs b/src/commands/delete_files.rs
index 4c698dc..2ab2763 100644
--- a/src/commands/delete_files.rs
+++ b/src/commands/delete_files.rs
@@ -119,7 +119,7 @@ pub fn delete_selected_files(
context: &mut AppContext,
backend: &mut TuiBackend,
) -> std::io::Result<()> {
- let res = delete_files(context, backend)?;
+ let _ = delete_files(context, backend)?;
let options = context.config_ref().display_options_ref().clone();
let curr_path = context.tab_context_ref().curr_tab_ref().cwd().to_path_buf();
diff --git a/src/commands/key_command.rs b/src/commands/key_command.rs
index 5a28592..1fd7307 100644
--- a/src/commands/key_command.rs
+++ b/src/commands/key_command.rs
@@ -46,6 +46,7 @@ pub enum KeyCommand {
ParentDirectory,
Quit,
+ QuitToCurrentDirectory,
ForceQuit,
ReloadDirList,
RenameFile(path::PathBuf),
@@ -108,6 +109,7 @@ impl KeyCommand {
Self::ParentDirectory => "cd ..",
Self::Quit => "quit",
+ Self::QuitToCurrentDirectory => "quit_to_cwd",
Self::ForceQuit => "force_quit",
Self::ReloadDirList => "reload_dirlist",
Self::RenameFile(_) => "rename",
@@ -260,6 +262,7 @@ impl std::str::FromStr for KeyCommand {
Ok(Self::PasteFiles(options))
}
"quit" => Ok(Self::Quit),
+ "quit_to_cwd" => Ok(Self::QuitToCurrentDirectory),
"reload_dirlist" => Ok(Self::ReloadDirList),
"rename" => match arg {
"" => Err(JoshutoError::new(
@@ -398,7 +401,9 @@ impl AppExecute for KeyCommand {
Self::ParentDirectory => parent_directory::parent_directory(context),
Self::Quit => quit::quit(context),
+ Self::QuitToCurrentDirectory => quit::quit_to_current_directory(context),
Self::ForceQuit => quit::force_quit(context),
+
Self::ReloadDirList => reload::reload_dirlist(context),
Self::RenameFile(p) => rename_file::rename_file(context, p.as_path()),
Self::RenameFileAppend => rename_file::rename_file_append(context, backend),
diff --git a/src/commands/quit.rs b/src/commands/quit.rs
index c85e65f..74e3422 100644
--- a/src/commands/quit.rs
+++ b/src/commands/quit.rs
@@ -1,6 +1,6 @@
use std::io;
-use crate::context::AppContext;
+use crate::context::{AppContext, QuitType};
use crate::error::{JoshutoError, JoshutoErrorKind, JoshutoResult};
pub fn quit(context: &mut AppContext) -> JoshutoResult<()> {
@@ -11,12 +11,17 @@ pub fn quit(context: &mut AppContext) -> JoshutoResult<()> {
String::from("operations running in background, use force_quit to quit"),
))
} else {
- context.exit = true;
+ context.quit = QuitType::Normal;
Ok(())
}
}
pub fn force_quit(context: &mut AppContext) -> JoshutoResult<()> {
- context.exit = true;
+ context.quit = QuitType::Force;
+ Ok(())
+}
+
+pub fn quit_to_current_directory(context: &mut AppContext) -> JoshutoResult<()> {
+ context.quit = QuitType::ToCurrentDirectory;
Ok(())
}
diff --git a/src/context/app_context.rs b/src/context/app_context.rs
index 5c206e5..112b63b 100644
--- a/src/context/app_context.rs
+++ b/src/context/app_context.rs
@@ -6,8 +6,16 @@ use crate::context::{LocalStateContext, PreviewContext, TabContext, WorkerContex
use crate::event::{AppEvent, Events};
use crate::util::search::SearchPattern;
+#[derive(Clone, Copy, Debug, PartialEq)]
+pub enum QuitType {
+ DoNot,
+ Normal,
+ Force,
+ ToCurrentDirectory,
+}
+
pub struct AppContext {
- pub exit: bool,
+ pub quit: QuitType,
// event loop querying
pub events: Events,
// app config
@@ -31,7 +39,7 @@ impl AppContext {
let events = Events::new();
let event_tx = events.event_tx.clone();
Self {
- exit: false,
+ quit: QuitType::DoNot,
events,
tab_context: TabContext::new(),
local_state: None,
diff --git a/src/context/mod.rs b/src/context/mod.rs
index 0a5f6c2..3ba9a56 100644
--- a/src/context/mod.rs
+++ b/src/context/mod.rs
@@ -4,7 +4,7 @@ mod preview_context;
mod tab_context;
mod worker_context;
-pub use self::app_context::AppContext;
+pub use self::app_context::{AppContext, QuitType};
pub use self::local_state::LocalStateContext;
pub use self::preview_context::PreviewContext;
pub use self::tab_context::TabContext;
diff --git a/src/fs/dirlist.rs b/src/fs/dirlist.rs
index 80f9089..94dd142 100644
--- a/src/fs/dirlist.rs
+++ b/src/fs/dirlist.rs
@@ -1,7 +1,7 @@
use std::slice::{Iter, IterMut};
use std::{fs, path};
-use crate::fs::{FileType, JoshutoDirEntry, JoshutoMetadata};
+use crate::fs::{JoshutoDirEntry, JoshutoMetadata};
use crate::util::display::DisplayOption;
#[derive(Clone, Debug)]
diff --git a/src/main.rs b/src/main.rs
index 446e00e..209b364 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -22,7 +22,7 @@ use structopt::StructOpt;
use crate::config::{
AppConfig, AppKeyMapping, AppMimetypeRegistry, AppTheme, ConfigStructure, JoshutoPreview,
};
-use crate::context::AppContext;
+use crate::context::{AppContext, QuitType};
use crate::error::JoshutoError;
use crate::run::run;
@@ -98,24 +98,32 @@ fn run_joshuto(args: Args) -> Result<(), JoshutoError> {
let config = AppConfig::get_config(CONFIG_FILE);
let keymap = AppKeyMapping::get_config(KEYMAP_FILE);
+ let mut context = AppContext::new(config);
{
- let mut context = AppContext::new(config);
let mut backend: ui::TuiBackend = ui::TuiBackend::new()?;
run(&mut backend, &mut context, keymap)?;
}
- if let Some(p) = args.last_dir {
- let curr_path = std::env::current_dir()?;
- let mut file = File::create(p)?;
- file.write_all(
- curr_path
- .into_os_string()
- .as_os_str()
- .to_string_lossy()
- .as_bytes(),
- )?;
- file.write_all("\n".as_bytes())?;
+ match context.quit {
+ QuitType::ToCurrentDirectory => {
+ if let Some(p) = args.last_dir {
+ let curr_path = std::env::current_dir()?;
+ let mut file = File::create(p)?;
+ file.write_all(
+ curr_path
+ .into_os_string()
+ .as_os_str()
+ .to_string_lossy()
+ .as_bytes(),
+ )?;
+ file.write_all("\n".as_bytes())?;
+ }
+ },
+ QuitType::Force => {},
+ _ => {},
+
}
+
Ok(())
}
diff --git a/src/run.rs b/src/run.rs
index fd1a3af..3e46d2a 100644
--- a/src/run.rs
+++ b/src/run.rs
@@ -2,7 +2,7 @@ use termion::event::Event;
use crate::commands::{AppExecute, CommandKeybind, KeyCommand};
use crate::config::AppKeyMapping;
-use crate::context::AppContext;
+use crate::context::{AppContext, QuitType};
use crate::event::AppEvent;
use crate::preview::preview_default;
use crate::tab::JoshutoTab;
@@ -26,7 +26,7 @@ pub fn run(
preview_default::load_preview(context, backend);
}
- while !context.exit {
+ while context.quit == QuitType::DoNot {
backend.render(TuiView::new(&context));
if !context.worker_context_ref().is_busy() && !context.worker_context_ref().is_empty() {
diff --git a/src/tab.rs b/src/tab.rs
index 9756058..bcd97bb 100644
--- a/src/tab.rs
+++ b/src/tab.rs
@@ -32,6 +32,10 @@ impl JoshutoTab {
self._cwd = cwd.to_path_buf();
}
+ pub fn history_ref(&self) -> &JoshutoHistory {
+ &self.history
+ }
+
pub fn history_mut(&mut self) -> &mut JoshutoHistory {
&mut self.history
}
diff --git a/src/ui/views/tui_folder_view.rs b/src/ui/views/tui_folder_view.rs
index d1e420e..1e23aa6 100644
--- a/src/ui/views/tui_folder_view.rs
+++ b/src/ui/views/tui_folder_view.rs
@@ -30,6 +30,7 @@ impl<'a> Widget for TuiFolderView<'a> {
fn render(self, area: Rect, buf: &mut Buffer) {
let preview_context = self.context.preview_context_ref();
let curr_tab = self.context.tab_context_ref().curr_tab_ref();
+ let history = curr_tab.history_ref();
let curr_list = curr_tab.curr_list_ref();
let parent_list = curr_tab.parent_list_ref();
@@ -127,7 +128,7 @@ impl<'a> Widget for TuiFolderView<'a> {
// render current view
if let Some(list) = curr_list.as_ref() {
- TuiDirListDetailed::new(&list).render(layout_rect[1], buf);
+ TuiDirListDetailed::new(&list, history).render(layout_rect[1], buf);
let rect = Rect {
x: 0,
y: area.height - 1,
diff --git a/src/ui/widgets/tui_dirlist_detailed.rs b/src/ui/widgets/tui_dirlist_detailed.rs
index a43d4f6..2ecec93 100644
--- a/src/ui/widgets/tui_dirlist_detailed.rs
+++ b/src/ui/widgets/tui_dirlist_detailed.rs
@@ -4,6 +4,7 @@ use tui::style::{Color, Modifier, Style};
use tui::widgets::Widget;
use crate::fs::{FileType, JoshutoDirEntry, JoshutoDirList, LinkType};
+use crate::history::JoshutoHistory;
use crate::util::format;
use crate::util::string::UnicodeTruncate;
use crate::util::style;
@@ -15,11 +16,12 @@ const ELLIPSIS: &str = "…";
pub struct TuiDirListDetailed<'a> {
dirlist: &'a JoshutoDirList,
+ history: &'a JoshutoHistory,
}
impl<'a> TuiDirListDetailed<'a> {
- pub fn new(dirlist: &'a JoshutoDirList) -> Self {
- Self { dirlist }
+ pub fn new(dirlist: &'a JoshutoDirList, history: &'a JoshutoHistory) -> Self {
+ Self { dirlist, history }
}
}
diff --git a/src/util/input.rs b/src/util/input.rs
index 2aa1c76..139c4ad 100644
--- a/src/util/input.rs
+++ b/src/util/input.rs
@@ -96,15 +96,15 @@ pub fn process_mouse(event: MouseEvent, context: &mut AppContext, backend: &mut
let f_size = backend.terminal.as_ref().unwrap().size().unwrap();
let constraints: &[Constraint; 3] = &context.config_ref().display_options_ref().default_layout;
+ let vertical_margin = if context.config_ref().display_options_ref().show_borders() {
+ 2
+ } else {
+ 1
+ };
+
let layout_rect = Layout::default()
.direction(Direction::Horizontal)
- .vertical_margin(
- if context.config_ref().display_options_ref().show_borders() {
- 2
- } else {
- 1
- },
- )
+ .vertical_margin(vertical_margin)
.constraints(constraints.as_ref())
.split(f_size);