diff --git a/src/ui/activities/filetransfer_activity/actions.rs b/src/ui/activities/filetransfer_activity/actions.rs index c93e885..8dcf9db 100644 --- a/src/ui/activities/filetransfer_activity/actions.rs +++ b/src/ui/activities/filetransfer_activity/actions.rs @@ -32,36 +32,156 @@ use tuirealm::{Payload, Value}; use std::path::PathBuf; impl FileTransferActivity { + /// ### action_enter_local_dir + /// + /// Enter a directory on local host from entry + /// Return true whether the directory changed + pub(super) fn action_enter_local_dir(&mut self, entry: FsEntry) -> bool { + match entry { + FsEntry::Directory(dir) => { + self.remote_changedir(dir.abs_path.as_path(), true); + if self.browser.sync_browsing { + self.action_change_remote_dir(dir.name.clone()); + } + true + } + FsEntry::File(file) => { + match &file.symlink { + Some(symlink_entry) => { + // If symlink and is directory, point to symlink + match &**symlink_entry { + FsEntry::Directory(dir) => { + self.remote_changedir(dir.abs_path.as_path(), true); + // Check whether to sync + if self.browser.sync_browsing { + self.action_change_remote_dir(dir.name.clone()); + } + true + } + _ => false, + } + } + None => false, + } + } + } + } + + /// ### action_enter_remote_dir + /// + /// Enter a directory on local host from entry + /// Return true whether the directory changed + pub(super) fn action_enter_remote_dir(&mut self, entry: FsEntry) -> bool { + match entry { + FsEntry::Directory(dir) => { + self.local_changedir(dir.abs_path.as_path(), true); + if self.browser.sync_browsing { + self.action_change_local_dir(dir.name.clone()); + } + true + } + FsEntry::File(file) => { + match &file.symlink { + Some(symlink_entry) => { + // If symlink and is directory, point to symlink + match &**symlink_entry { + FsEntry::Directory(dir) => { + self.local_changedir(dir.abs_path.as_path(), true); + // Check whether to sync + if self.browser.sync_browsing { + self.action_change_local_dir(dir.name.clone()); + } + true + } + _ => false, + } + } + None => false, + } + } + } + } + /// ### action_change_local_dir /// /// Change local directory reading value from input pub(super) fn action_change_local_dir(&mut self, input: String) { - let dir_path: PathBuf = PathBuf::from(input.as_str()); - let abs_dir_path: PathBuf = match dir_path.is_relative() { - true => { - let mut d: PathBuf = self.local.wrkdir.clone(); - d.push(dir_path); - d - } - false => dir_path, - }; - self.local_changedir(abs_dir_path.as_path(), true); + let dir_path: PathBuf = self.local_to_abs_path(PathBuf::from(input.as_str()).as_path()); + self.local_changedir(dir_path.as_path(), true); + // Check whether to sync + if self.browser.sync_browsing { + self.action_change_remote_dir(input); + } } /// ### action_change_remote_dir /// /// Change remote directory reading value from input pub(super) fn action_change_remote_dir(&mut self, input: String) { - let dir_path: PathBuf = PathBuf::from(input.as_str()); - let abs_dir_path: PathBuf = match dir_path.is_relative() { - true => { - let mut wrkdir: PathBuf = self.remote.wrkdir.clone(); - wrkdir.push(dir_path); - wrkdir + let dir_path: PathBuf = self.remote_to_abs_path(PathBuf::from(input.as_str()).as_path()); + self.remote_changedir(dir_path.as_path(), true); + // Check whether to sync + if self.browser.sync_browsing { + self.action_change_local_dir(input); + } + } + + /// ### action_go_to_previous_local_dir + /// + /// Go to previous directory from localhost + pub(super) fn action_go_to_previous_local_dir(&mut self) { + if let Some(d) = self.local.popd() { + self.local_changedir(d.as_path(), false); + // Check whether to sync + if self.browser.sync_browsing { + self.action_go_to_previous_remote_dir(); } - false => dir_path, - }; - self.remote_changedir(abs_dir_path.as_path(), true); + } + } + + /// ### action_go_to_previous_remote_dir + /// + /// Go to previous directory from remote host + pub(super) fn action_go_to_previous_remote_dir(&mut self) { + if let Some(d) = self.local.popd() { + self.remote_changedir(d.as_path(), false); + // Check whether to sync + if self.browser.sync_browsing { + self.action_go_to_previous_local_dir(); + } + } + } + + /// ### action_go_to_local_upper_dir + /// + /// Go to upper directory on local host + pub(super) fn action_go_to_local_upper_dir(&mut self) { + // Get pwd + let path: PathBuf = self.local.wrkdir.clone(); + // Go to parent directory + if let Some(parent) = path.as_path().parent() { + self.local_changedir(parent, true); + // If sync is enabled update remote too + if self.browser.sync_browsing { + self.action_go_to_remote_upper_dir(); + } + } + } + + /// #### action_go_to_remote_upper_dir + /// + /// Go to upper directory on remote host + pub(super) fn action_go_to_remote_upper_dir(&mut self) { + // Get pwd + let path: PathBuf = self.remote.wrkdir.clone(); + // Go to parent directory + if let Some(parent) = path.as_path().parent() { + self.remote_changedir(parent, true); + // If sync is enabled update local too + if self.browser.sync_browsing { + self.action_go_to_local_upper_dir(); + } + } } /// ### action_local_copy diff --git a/src/ui/activities/filetransfer_activity/misc.rs b/src/ui/activities/filetransfer_activity/misc.rs index cb56463..d30cb4e 100644 --- a/src/ui/activities/filetransfer_activity/misc.rs +++ b/src/ui/activities/filetransfer_activity/misc.rs @@ -28,7 +28,7 @@ use crate::system::environment; use crate::system::sshkey_storage::SshKeyStorage; // Ext use std::env; -use std::path::PathBuf; +use std::path::{Path, PathBuf}; impl FileTransferActivity { /// ### log @@ -175,4 +175,32 @@ impl FileTransferActivity { false } } + + /// ### local_to_abs_path + /// + /// Convert a path to absolute according to local explorer + pub(super) fn local_to_abs_path(&self, path: &Path) -> PathBuf { + match path.is_relative() { + true => { + let mut d: PathBuf = self.local.wrkdir.clone(); + d.push(path); + d + } + false => path.to_path_buf(), + } + } + + /// ### remote_to_abs_path + /// + /// Convert a path to absolute according to remote explorer + pub(super) fn remote_to_abs_path(&self, path: &Path) -> PathBuf { + match path.is_relative() { + true => { + let mut wrkdir: PathBuf = self.remote.wrkdir.clone(); + wrkdir.push(path); + wrkdir + } + false => path.to_path_buf(), + } + } } diff --git a/src/ui/activities/filetransfer_activity/session.rs b/src/ui/activities/filetransfer_activity/session.rs index 97aeb21..a98f55b 100644 --- a/src/ui/activities/filetransfer_activity/session.rs +++ b/src/ui/activities/filetransfer_activity/session.rs @@ -749,12 +749,6 @@ impl FileTransferActivity { if push { self.local.pushd(prev_dir.as_path()) } - // @! if synchronized browsing is enabled, change directory on remote too ~ since 0.5.0 - if self.browser.sync_browsing { - if let Some(name) = path.file_name() { - self.remote_changedir(PathBuf::from(name).as_path(), push); - } - } } Err(err) => { // Report err @@ -784,13 +778,6 @@ impl FileTransferActivity { if push { self.remote.pushd(prev_dir.as_path()) } - // @! if synchronized browsing is enabled, change directory on local too ~ since 0.5.0 - if self.browser.sync_browsing { - if let Some(name) = path.file_name() { - self.local_changedir(PathBuf::from(name).as_path(), push); - // TODO: move this somewhere else, since it's calling recursively - } - } } Err(err) => { // Report err diff --git a/src/ui/activities/filetransfer_activity/update.rs b/src/ui/activities/filetransfer_activity/update.rs index 05a43b6..06a16f0 100644 --- a/src/ui/activities/filetransfer_activity/update.rs +++ b/src/ui/activities/filetransfer_activity/update.rs @@ -73,8 +73,9 @@ impl FileTransferActivity { } (COMPONENT_EXPLORER_LOCAL, &MSG_KEY_BACKSPACE) => { // Go to previous directory - if let Some(d) = self.local.popd() { - self.local_changedir(d.as_path(), false); + self.action_go_to_previous_local_dir(); + if self.browser.sync_browsing { + let _ = self.update_remote_filelist(); } // Reload file list component self.update_local_filelist() @@ -86,25 +87,14 @@ impl FileTransferActivity { entry = Some(e.clone()); } if let Some(entry) = entry { - // If directory, enter directory, otherwise check if symlink - match entry { - FsEntry::Directory(dir) => { - self.local_changedir(dir.abs_path.as_path(), true); - self.update_local_filelist() - } - FsEntry::File(file) => { - // Check if symlink - match &file.symlink { - Some(pointer) => match &**pointer { - FsEntry::Directory(dir) => { - self.local_changedir(dir.abs_path.as_path(), true); - self.update_local_filelist() - } - _ => None, - }, - None => None, - } + if self.action_enter_local_dir(entry) { + // Update file list if sync + if self.browser.sync_browsing { + let _ = self.update_remote_filelist(); } + self.update_local_filelist() + } else { + None } } else { None @@ -170,13 +160,11 @@ impl FileTransferActivity { self.update_local_filelist() } (COMPONENT_EXPLORER_LOCAL, &MSG_KEY_CHAR_U) => { - // Get pwd - let path: PathBuf = self.local.wrkdir.clone(); - // Go to parent directory - if let Some(parent) = path.as_path().parent() { - self.local_changedir(parent, true); - // Reload file list component + self.action_go_to_local_upper_dir(); + if self.browser.sync_browsing { + let _ = self.update_remote_filelist(); } + // Reload file list component self.update_local_filelist() } // -- remote tab @@ -193,27 +181,14 @@ impl FileTransferActivity { entry = Some(e.clone()); } if let Some(entry) = entry { - // If directory, enter directory; if file, check if is symlink - match entry { - FsEntry::Directory(dir) => { - self.remote_changedir(dir.abs_path.as_path(), true); - self.update_remote_filelist() - } - FsEntry::File(file) => { - match &file.symlink { - Some(symlink_entry) => { - // If symlink and is directory, point to symlink - match &**symlink_entry { - FsEntry::Directory(dir) => { - self.remote_changedir(dir.abs_path.as_path(), true); - self.update_remote_filelist() - } - _ => None, - } - } - None => None, - } + if self.action_enter_remote_dir(entry) { + // Update file list if sync + if self.browser.sync_browsing { + let _ = self.update_local_filelist(); } + self.update_remote_filelist() + } else { + None } } else { None @@ -234,8 +209,10 @@ impl FileTransferActivity { } (COMPONENT_EXPLORER_REMOTE, &MSG_KEY_BACKSPACE) => { // Go to previous directory - if let Some(d) = self.remote.popd() { - self.remote_changedir(d.as_path(), false); + self.action_go_to_previous_remote_dir(); + // If sync is enabled update local too + if self.browser.sync_browsing { + let _ = self.update_local_filelist(); } // Reload file list component self.update_remote_filelist() @@ -286,11 +263,9 @@ impl FileTransferActivity { self.update_remote_filelist() } (COMPONENT_EXPLORER_REMOTE, &MSG_KEY_CHAR_U) => { - // Get pwd - let path: PathBuf = self.remote.wrkdir.clone(); - // Go to parent directory - if let Some(parent) = path.as_path().parent() { - self.remote_changedir(parent, true); + self.action_go_to_remote_upper_dir(); + if self.browser.sync_browsing { + let _ = self.update_local_filelist(); } // Reload file list component self.update_remote_filelist() @@ -517,6 +492,14 @@ impl FileTransferActivity { } // Umount self.umount_goto(); + // Reload files if sync + if self.browser.sync_browsing { + match self.tab { + FileExplorerTab::Remote => self.update_local_filelist(), + FileExplorerTab::Local => self.update_remote_filelist(), + _ => None, + }; + } // Reload files match self.tab { FileExplorerTab::Local => self.update_local_filelist(),