diff options
-rw-r--r-- | src/commands/set_mode.rs | 66 | ||||
-rw-r--r-- | src/context.rs | 2 | ||||
-rw-r--r-- | src/ui/widgets/tui_view.rs | 4 |
3 files changed, 42 insertions, 30 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(()) } } diff --git a/src/context.rs b/src/context.rs index 4cd83f9..0135674 100644 --- a/src/context.rs +++ b/src/context.rs @@ -11,7 +11,6 @@ pub struct JoshutoContext { pub curr_tab_index: usize, pub tabs: Vec<JoshutoTab>, pub worker_queue: VecDeque<IOWorkerThread>, - pub trx: (mpsc::SyncSender<u64>, mpsc::Receiver<u64>), pub worker_msg: Option<String>, pub message_queue: VecDeque<String>, @@ -27,7 +26,6 @@ impl JoshutoContext { curr_tab_index: 0, tabs: Vec::new(), worker_queue: VecDeque::with_capacity(10), - trx: mpsc::sync_channel::<u64>(1), worker_msg: None, message_queue: VecDeque::with_capacity(4), events: Events::new(), diff --git a/src/ui/widgets/tui_view.rs b/src/ui/widgets/tui_view.rs index 46af0b3..7cfe223 100644 --- a/src/ui/widgets/tui_view.rs +++ b/src/ui/widgets/tui_view.rs @@ -26,14 +26,14 @@ impl<'a> TuiView<'a> { impl<'a> Widget for TuiView<'a> { fn draw(&mut self, area: Rect, buf: &mut Buffer) { + let f_size = area; + let curr_tab = self.context.curr_tab_ref(); let curr_list = curr_tab.curr_list_ref(); let parent_list = curr_tab.parent_list_ref(); let child_list = curr_tab.child_list_ref(); - let f_size = area; - let constraints = match child_list { Some(_) => DEFAULT_LAYOUT, None => NO_PREVIEW_LAYOUT, |