diff options
Diffstat (limited to 'src/commands')
-rw-r--r-- | src/commands/set_mode.rs | 66 |
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(()) } } |