summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJiayi Zhao <jeff.no.zhao@gmail.com>2020-03-02 18:52:27 -0500
committerJiayi Zhao <jeff.no.zhao@gmail.com>2020-03-02 18:54:09 -0500
commit7bc1f9ea482ad0d3a4ac1f692eed2bf2d06cda45 (patch)
tree4f3996d115ee6fc881ff7c87f67b7158e53b24c7 /src
parente321dfc3c96f50f09c3953340a5a6fea72a5a245 (diff)
parent3682d2fca58e70c3779f3588bcc0925ddacbbbbd (diff)
Merge branch 'dev' of github.com:kamiyaa/joshuto into dev
Diffstat (limited to 'src')
-rw-r--r--src/commands/set_mode.rs66
-rw-r--r--src/context.rs2
-rw-r--r--src/ui/widgets/tui_view.rs4
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,