summaryrefslogtreecommitdiffstats
path: root/src/commands/set_mode.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/commands/set_mode.rs')
-rw-r--r--src/commands/set_mode.rs66
1 files changed, 40 insertions, 26 deletions
diff --git a/src/commands/set_mode.rs b/src/commands/set_mode.rs
index 4ff5343..7ce18a2 100644
--- a/src/commands/set_mode.rs
+++ b/src/commands/set_mode.rs
@@ -2,6 +2,7 @@ use crate::commands::{CursorMoveDown, JoshutoCommand, JoshutoRunnable};
use crate::context::JoshutoContext;
use crate::error::JoshutoResult;
use crate::fs::JoshutoDirEntry;
+use crate::ui::widgets::TuiTextField;
use crate::ui::TuiBackend;
use crate::util::unix;
@@ -28,27 +29,15 @@ impl SetMode {
"set_mode"
}
- pub fn set_mode(&self, entry: &mut JoshutoDirEntry, initial: String) -> bool {
- use std::os::unix::fs::PermissionsExt;
-
- const PROMPT: &str = ":set_mode ";
- let user_input: Option<String> = None;
-
- match user_input {
- Some(s) => {
- let mut mode: u32 = 0;
- for (i, ch) in s.chars().enumerate() {
- if ch == LIBC_PERMISSION_VALS[i].1 {
- let val: u32 = LIBC_PERMISSION_VALS[i].0 as u32;
- mode |= val;
- }
- }
- unix::set_mode(entry.file_path().as_path(), mode);
- entry.metadata.permissions.set_mode(mode + (1 << 15));
- true
+ pub fn str_to_mode(s: &str) -> u32 {
+ let mut mode: u32 = 0;
+ for (i, ch) in s.chars().enumerate() {
+ if ch == LIBC_PERMISSION_VALS[i].1 {
+ let val: u32 = LIBC_PERMISSION_VALS[i].0 as u32;
+ mode |= val;
}
- None => false,
}
+ mode
}
}
@@ -63,17 +52,42 @@ impl std::fmt::Display for SetMode {
impl JoshutoRunnable for SetMode {
fn execute(&self, context: &mut JoshutoContext, backend: &mut TuiBackend) -> JoshutoResult<()> {
use std::os::unix::fs::PermissionsExt;
- let curr_tab = &mut context.tabs[context.curr_tab_index];
- if let Some(curr_list) = curr_tab.curr_list_mut() {
- if let Some(file) = curr_list.get_curr_mut() {
- let mode = file.metadata.permissions.mode();
- let mut mode_string = unix::stringify_mode(mode);
- mode_string.remove(0);
- self.set_mode(file, mode_string);
+ const PREFIX: &'static str = "set_mode ";
+
+ let entry = context.tabs[context.curr_tab_index]
+ .curr_list_ref()
+ .and_then(|x| x.get_curr_ref());
+
+ let user_input = match entry {
+ Some(entry) => {
+ let mode = entry.metadata.permissions.mode();
+ let mode_string = unix::stringify_mode(mode);
+ let mut textfield = TuiTextField::default()
+ .prompt(":")
+ .prefix(PREFIX)
+ .suffix(&mode_string.as_str()[1..]);
+ textfield.get_input(backend, context)
+ }
+ None => None,
+ };
+
+ if let Some(s) = user_input {
+ if s.starts_with(PREFIX) {
+ let s = &s[PREFIX.len()..];
+ let mode = Self::str_to_mode(s);
+
+ let mut entry = context.tabs[context.curr_tab_index]
+ .curr_list_mut()
+ .and_then(|x| x.get_curr_mut())
+ .unwrap();
+
+ unix::set_mode(entry.file_path().as_path(), mode);
+ entry.metadata.permissions.set_mode(mode);
CursorMoveDown::new(1).execute(context, backend)?;
}
}
+
Ok(())
}
}