diff --git a/src/ui/activities/auth_activity/callbacks.rs b/src/ui/activities/auth_activity/callbacks.rs new file mode 100644 index 0000000..ca859e1 --- /dev/null +++ b/src/ui/activities/auth_activity/callbacks.rs @@ -0,0 +1,58 @@ +//! ## AuthActivity +//! +//! `auth_activity` is the module which implements the authentication activity + +/* +* +* Copyright (C) 2020 Christian Visintin - christian.visintin1997@gmail.com +* +* This file is part of "TermSCP" +* +* TermSCP is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* TermSCP is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with TermSCP. If not, see . +* +*/ + +use super::{AuthActivity, InputForm}; + +impl AuthActivity { + /// ### callback_nothing_to_do + /// + /// Self titled + pub(super) fn callback_nothing_to_do(&mut self) {} + + /// ### callback_quit + /// + /// Self titled + pub(super) fn callback_quit(&mut self) { + self.quit = true; + } + + /// ### callback_del_bookmark + /// + /// Callback which deletes recent or bookmark based on current form + pub(super) fn callback_del_bookmark(&mut self) { + match self.input_form { + InputForm::Bookmarks => self.del_bookmark(self.bookmarks_idx), + InputForm::Recents => self.del_recent(self.recents_idx), + _ => { /* Nothing to do */ } + } + } + + /// ### callback_save_bookmark + /// + /// Callback used to save bookmark with name + pub(super) fn callback_save_bookmark(&mut self, input: String) { + self.save_bookmark(input); + } +} diff --git a/src/ui/activities/auth_activity/input.rs b/src/ui/activities/auth_activity/input.rs index d878ce1..2dc291b 100644 --- a/src/ui/activities/auth_activity/input.rs +++ b/src/ui/activities/auth_activity/input.rs @@ -24,10 +24,11 @@ */ use super::{ - AuthActivity, DialogCallback, DialogYesNoOption, FileTransferProtocol, InputEvent, InputField, InputForm, InputMode, OnInputSubmitCallback, PopupType, + AuthActivity, DialogCallback, DialogYesNoOption, FileTransferProtocol, InputEvent, InputField, + InputForm, InputMode, OnInputSubmitCallback, PopupType, }; -use crossterm::event::KeyCode; +use crossterm::event::{KeyCode, KeyModifiers}; use tui::style::Color; impl AuthActivity { @@ -55,6 +56,8 @@ impl AuthActivity { pub(super) fn handle_input_event_mode_form(&mut self, ev: &InputEvent) { match self.input_form { InputForm::AuthCredentials => self.handle_input_event_mode_form_auth(ev), + InputForm::Bookmarks => self.handle_input_event_mode_form_bookmarks(ev), + InputForm::Recents => self.handle_input_event_mode_form_recents(ev), } } @@ -65,8 +68,14 @@ impl AuthActivity { if let InputEvent::Key(key) = ev { match key.code { KeyCode::Esc => { - self.quit = true; + // Show quit dialog + self.input_mode = InputMode::Popup(PopupType::YesNo( + String::from("Are you sure you want to quit termscp?"), + AuthActivity::callback_quit, + AuthActivity::callback_nothing_to_do, + )); } + KeyCode::Tab => self.input_form = InputForm::Bookmarks, // Move to bookmarks KeyCode::Enter => { // Handle submit // Check form @@ -131,7 +140,7 @@ impl AuthActivity { InputField::Password => InputField::Username, } } - KeyCode::Down | KeyCode::Tab => { + KeyCode::Down => { // Move item down self.selected_field = match self.selected_field { InputField::Address => InputField::Port, @@ -142,17 +151,29 @@ impl AuthActivity { } } KeyCode::Char(ch) => { - match self.selected_field { - InputField::Address => self.address.push(ch), - InputField::Password => self.password.push(ch), - InputField::Username => self.username.push(ch), - InputField::Port => { - // Value must be numeric - if ch.is_numeric() { - self.port.push(ch); - } + // Check if Ctrl is enabled + if key.modifiers.intersects(KeyModifiers::CONTROL) { + // If 'S', save bookmark as... + if matches!(ch, 'S' | 's') { + // Save bookmark as... + self.input_mode = InputMode::Popup(PopupType::Input( + String::from("Save bookmark as..."), + AuthActivity::callback_save_bookmark, + )); + } + } else { + match self.selected_field { + InputField::Address => self.address.push(ch), + InputField::Password => self.password.push(ch), + InputField::Username => self.username.push(ch), + InputField::Port => { + // Value must be numeric + if ch.is_numeric() { + self.port.push(ch); + } + } + _ => { /* Nothing to do */ } } - _ => { /* Nothing to do */ } } } KeyCode::Left => { @@ -186,6 +207,160 @@ impl AuthActivity { } } + /// ### handle_input_event_mode_form_bookmarks + /// + /// Handle input event when input mode is Form and Tab is Bookmarks + pub(super) fn handle_input_event_mode_form_bookmarks(&mut self, ev: &InputEvent) { + if let InputEvent::Key(key) = ev { + match key.code { + KeyCode::Esc => { + // Show quit dialog + self.input_mode = InputMode::Popup(PopupType::YesNo( + String::from("Are you sure you want to quit termscp?"), + AuthActivity::callback_quit, + AuthActivity::callback_nothing_to_do, + )); + } + KeyCode::Tab => self.input_form = InputForm::AuthCredentials, // Move to Auth credentials + KeyCode::Right => self.input_form = InputForm::Recents, // Move to recents + KeyCode::Up => { + // Move bookmarks index up + if self.bookmarks_idx > 0 { + self.bookmarks_idx -= 1; + } else { + if let Some(hosts) = &self.bookmarks { + // Put to last index (wrap) + self.bookmarks_idx = hosts.bookmarks.len() - 1; + } + } + } + KeyCode::Down => { + if let Some(hosts) = &self.bookmarks { + let size: usize = hosts.bookmarks.len(); + // Check if can move down + if self.bookmarks_idx + 1 >= size { + // Move bookmarks index down + self.bookmarks_idx = 0; + } else { + // Set index to first element (wrap) + self.bookmarks_idx += 1; + } + } + } + KeyCode::Delete => { + // Ask if user wants to delete bookmark + self.input_mode = InputMode::Popup(PopupType::YesNo( + String::from("Are you sure you want to delete the selected bookmark?"), + AuthActivity::callback_del_bookmark, + AuthActivity::callback_nothing_to_do, + )); + } + KeyCode::Enter => { + // Load bookmark + self.load_bookmark(self.bookmarks_idx); + // Set input form to Auth + self.input_form = InputForm::AuthCredentials; + } + KeyCode::Char(ch) => match ch { + 'E' | 'e' => { + // Ask if user wants to delete bookmark; NOTE: same as + self.input_mode = InputMode::Popup(PopupType::YesNo( + String::from("Are you sure you want to delete the selected bookmark?"), + AuthActivity::callback_del_bookmark, + AuthActivity::callback_nothing_to_do, + )); + } + 'S' | 's' => { + // Save bookmark as... + self.input_mode = InputMode::Popup(PopupType::Input( + String::from("Save bookmark as..."), + AuthActivity::callback_save_bookmark, + )); + } + _ => { /* Nothing to do */ } + }, + _ => { /* Nothing to do */ } + } + } + } + + /// ### handle_input_event_mode_form_recents + /// + /// Handle input event when input mode is Form and Tab is Recents + pub(super) fn handle_input_event_mode_form_recents(&mut self, ev: &InputEvent) { + if let InputEvent::Key(key) = ev { + match key.code { + KeyCode::Esc => { + // Show quit dialog + self.input_mode = InputMode::Popup(PopupType::YesNo( + String::from("Are you sure you want to quit termscp?"), + AuthActivity::callback_quit, + AuthActivity::callback_nothing_to_do, + )); + } + KeyCode::Tab => self.input_form = InputForm::AuthCredentials, // Move to Auth credentials + KeyCode::Left => self.input_form = InputForm::Bookmarks, // Move to bookmarks + KeyCode::Up => { + // Move bookmarks index up + if self.recents_idx > 0 { + self.recents_idx -= 1; + } else { + if let Some(hosts) = &self.bookmarks { + // Put to last index (wrap) + self.recents_idx = hosts.recents.len() - 1; + } + } + } + KeyCode::Down => { + if let Some(hosts) = &self.bookmarks { + let size: usize = hosts.recents.len(); + // Check if can move down + if self.recents_idx + 1 >= size { + // Move bookmarks index down + self.recents_idx = 0; + } else { + // Set index to first element (wrap) + self.recents_idx += 1; + } + } + } + KeyCode::Delete => { + // Ask if user wants to delete bookmark + self.input_mode = InputMode::Popup(PopupType::YesNo( + String::from("Are you sure you want to delete the selected host?"), + AuthActivity::callback_del_bookmark, + AuthActivity::callback_nothing_to_do, + )); + } + KeyCode::Enter => { + // Load bookmark + self.load_recent(self.recents_idx); + // Set input form to Auth + self.input_form = InputForm::AuthCredentials; + } + KeyCode::Char(ch) => match ch { + 'E' | 'e' => { + // Ask if user wants to delete bookmark; NOTE: same as + self.input_mode = InputMode::Popup(PopupType::YesNo( + String::from("Are you sure you want to delete the selected host?"), + AuthActivity::callback_del_bookmark, + AuthActivity::callback_nothing_to_do, + )); + } + 'S' | 's' => { + // Save bookmark as... + self.input_mode = InputMode::Popup(PopupType::Input( + String::from("Save bookmark as..."), + AuthActivity::callback_save_bookmark, + )); + } + _ => { /* Nothing to do */ } + }, + _ => { /* Nothing to do */ } + } + } + } + /// ### handle_input_event_mode_text /// /// Handler for input event when in popup mode