This commit is contained in:
veeso 2021-03-26 22:19:24 +01:00
parent de3983e53f
commit 423f84353d
8 changed files with 34 additions and 45 deletions

View File

@ -16,10 +16,11 @@
## 0.4.0
Released on FIXME: date
Released on 27/03/2021
- **New explorer features**:
- **Execute** a command pressing `X`. This feature is supported on both local and remote hosts (only SFTP/SCP protocols support this feature).
- **Find**: search for files pressing `F` using wild matches.
- Enhancements:
- Input fields will now support **"input keys"** (such as moving cursor, DEL, END, HOME, ...)
- Improved performance regarding configuration I/O (config client is now shared in the activity context)

View File

@ -6,7 +6,7 @@
~ Basically, WinSCP on a terminal ~
Developed by Christian Visintin
Current version: 0.4.0 FIXME: (28/02/2021)
Current version: 0.4.0 (27/03/2021)
---
@ -351,6 +351,7 @@ If left empty, the default formatter syntax will be used: `{NAME:24} {PEX} {USER
| `<C>` | Copy file/directory | Copy |
| `<D>` | Make directory | Directory |
| `<E>` | Delete file (Same as `DEL`) | Erase |
| `<F>` | Search for files (wild match is supported) | Find |
| `<G>` | Go to supplied path | Go to |
| `<H>` | Show help | Help |
| `<I>` | Show info about selected file or directory | Info |
@ -380,7 +381,16 @@ The developer documentation can be found on Rust Docs at <https://docs.rs/termsc
## Upcoming Features 🧪
FIXME: add new
- **Themes provider**: I'm still thinking about how I will implement this, but basically the idea is to have a configuration file where it will be possible
to define the color schema for the entire application. I haven't planned this release yet
No other new feature is planned at the moment. I actually think that termscp is getting mature and now I should focus upcoming updates more on bug fixing and
code/performance improvements than on new features.
Anyway there are some ideas which I'd like to implement. If you want to start working on them, feel free to open a PR:
- Amazon S3 support
- Samba support
- Themes provider
---

View File

@ -83,11 +83,8 @@ impl AuthActivity {
.view
.get_value(super::COMPONENT_RADIO_BOOKMARK_SAVE_PWD)
{
Some(Payload::Unsigned(choice)) => match choice {
0 => Some(password), // Yes
_ => None, // No
},
_ => None, // No such component
Some(Payload::Unsigned(0)) => Some(password), // Yes
_ => None, // No such component / No
},
false => None,
};

View File

@ -274,14 +274,10 @@ impl AuthActivity {
Some(Payload::Text(s)) => s,
_ => String::new(),
};
let save_pwd: bool =
match self.view.get_value(COMPONENT_RADIO_BOOKMARK_SAVE_PWD) {
Some(Payload::Unsigned(idx)) => match idx {
0 => true,
_ => false,
},
_ => false,
};
let save_pwd: bool = matches!(
self.view.get_value(COMPONENT_RADIO_BOOKMARK_SAVE_PWD),
Some(Payload::Unsigned(0))
);
// Save bookmark
self.save_bookmark(bookmark_name, save_pwd);
// Umount popup

View File

@ -732,16 +732,13 @@ impl FileTransferActivity {
{
Some(props) => {
// Get width
let width: usize = match self
let width: usize = self
.context
.as_ref()
.unwrap()
.store
.get_unsigned(super::STORAGE_EXPLORER_WIDTH)
{
Some(val) => val,
None => 256, // Default
};
.unwrap_or(256);
let hostname: String = match hostname::get() {
Ok(h) => {
let hostname: String = h.as_os_str().to_string_lossy().to_string();
@ -787,16 +784,13 @@ impl FileTransferActivity {
{
Some(props) => {
// Get width
let width: usize = match self
let width: usize = self
.context
.as_ref()
.unwrap()
.store
.get_unsigned(super::STORAGE_EXPLORER_WIDTH)
{
Some(val) => val,
None => 256, // Default
};
.unwrap_or(256);
let params = self.context.as_ref().unwrap().ft_params.as_ref().unwrap();
let hostname: String = format!(
"{}:{} ",
@ -830,16 +824,13 @@ impl FileTransferActivity {
match self.view.get_props(super::COMPONENT_LOG_BOX).as_mut() {
Some(props) => {
// Get width
let width: usize = match self
let width: usize = self
.context
.as_ref()
.unwrap()
.store
.get_unsigned(super::STORAGE_LOGBOX_WIDTH)
{
Some(val) => val,
None => 256, // Default
};
.unwrap_or(256);
// Make log entries
let mut table: TableBuilder = TableBuilder::default();
for (idx, record) in self.log_records.iter().enumerate() {
@ -952,8 +943,8 @@ impl FileTransferActivity {
None => None,
Some(props) => {
let props = props.build();
let title: String = props.texts.title.clone().unwrap_or(String::new());
let mut props = PropsBuilder::from(props.clone());
let title: String = props.texts.title.clone().unwrap_or_default();
let mut props = PropsBuilder::from(props);
// Prepare files
let file_texts: Vec<TextSpan> = self
.found

View File

@ -703,7 +703,7 @@ impl SetupActivity {
.get_props(super::COMPONENT_INPUT_FILE_FMT)
.as_mut()
{
let file_fmt: String = cli.get_file_fmt().unwrap_or(String::new());
let file_fmt: String = cli.get_file_fmt().unwrap_or_default();
let props = props.with_value(PropValue::Str(file_fmt)).build();
let _ = self.view.update(super::COMPONENT_INPUT_FILE_FMT, props);
}
@ -734,19 +734,13 @@ impl SetupActivity {
if let Some(Payload::Unsigned(opt)) =
self.view.get_value(super::COMPONENT_RADIO_HIDDEN_FILES)
{
let show: bool = match opt {
0 => true,
_ => false,
};
let show: bool = matches!(opt, 0);
cli.set_show_hidden_files(show);
}
if let Some(Payload::Unsigned(opt)) =
self.view.get_value(super::COMPONENT_RADIO_UPDATES)
{
let check: bool = match opt {
0 => true,
_ => false,
};
let check: bool = matches!(opt, 0);
cli.set_check_for_updates(check);
}
if let Some(Payload::Text(fmt)) = self.view.get_value(super::COMPONENT_INPUT_FILE_FMT) {

View File

@ -86,7 +86,7 @@ impl OwnStates {
///
/// Delete element at cursor -1; then decrement cursor by 1
pub fn backspace(&mut self) {
if self.cursor > 0 && self.input.len() > 0 {
if self.cursor > 0 && !self.input.is_empty() {
self.input.remove(self.cursor - 1);
// Decrement cursor
self.cursor -= 1;
@ -106,7 +106,7 @@ impl OwnStates {
///
/// Increment cursor value by one if possible
pub fn incr_cursor(&mut self) {
if self.cursor + 1 <= self.input.len() {
if self.cursor < self.input.len() {
self.cursor += 1;
}
}

View File

@ -79,7 +79,7 @@ impl OwnStates {
/// ### make_choices
///
/// Set OwnStates choices from a vector of text spans
pub fn make_choices(&mut self, spans: &Vec<TextSpan>) {
pub fn make_choices(&mut self, spans: &[TextSpan]) {
self.choices = spans.iter().map(|x| x.content.clone()).collect();
}
}