Add edit and delete instructions
parent
0a8a831f95
commit
39bbd8192c
77
src/main.rs
77
src/main.rs
|
|
@ -70,18 +70,35 @@ enum Field {
|
||||||
Command,
|
Command,
|
||||||
}
|
}
|
||||||
|
|
||||||
struct AddForm {
|
#[derive(Clone, Copy)]
|
||||||
|
enum CommandFormTarget {
|
||||||
|
New,
|
||||||
|
Existing(usize),
|
||||||
|
}
|
||||||
|
|
||||||
|
struct CommandForm {
|
||||||
alias: Input,
|
alias: Input,
|
||||||
command: Input,
|
command: Input,
|
||||||
field: Field,
|
field: Field,
|
||||||
|
target: CommandFormTarget,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl AddForm {
|
impl CommandForm {
|
||||||
fn new() -> Self {
|
fn new() -> Self {
|
||||||
Self {
|
Self {
|
||||||
alias: Input::default(),
|
alias: Input::default(),
|
||||||
command: Input::new(String::from("ssh ")),
|
command: Input::new(String::from("ssh ")),
|
||||||
field: Field::Alias,
|
field: Field::Alias,
|
||||||
|
target: CommandFormTarget::New,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn edit(index: usize, command: &Command) -> Self {
|
||||||
|
Self {
|
||||||
|
alias: Input::new(command.alias.clone()),
|
||||||
|
command: Input::new(command.command.clone()),
|
||||||
|
field: Field::Alias,
|
||||||
|
target: CommandFormTarget::Existing(index),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -102,7 +119,7 @@ impl AddForm {
|
||||||
|
|
||||||
enum Mode {
|
enum Mode {
|
||||||
Normal,
|
Normal,
|
||||||
Adding(AddForm),
|
Editing(CommandForm),
|
||||||
}
|
}
|
||||||
|
|
||||||
struct App {
|
struct App {
|
||||||
|
|
@ -143,43 +160,70 @@ impl App {
|
||||||
fn on_key(&mut self, key: KeyEvent) {
|
fn on_key(&mut self, key: KeyEvent) {
|
||||||
match self.mode {
|
match self.mode {
|
||||||
Mode::Normal => self.on_key_normal(key.code),
|
Mode::Normal => self.on_key_normal(key.code),
|
||||||
Mode::Adding(_) => self.on_key_adding(key),
|
Mode::Editing(_) => self.on_key_editing(key),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn on_key_normal(&mut self, code: KeyCode) {
|
fn on_key_normal(&mut self, code: KeyCode) {
|
||||||
match code {
|
match code {
|
||||||
KeyCode::Char('q') | KeyCode::Esc => self.should_quit = true,
|
KeyCode::Char('q') | KeyCode::Esc => self.should_quit = true,
|
||||||
KeyCode::Char('a') => self.mode = Mode::Adding(AddForm::new()),
|
KeyCode::Char('a') => self.mode = Mode::Editing(CommandForm::new()),
|
||||||
|
KeyCode::Char('e') => self.start_editing(),
|
||||||
|
KeyCode::Char('d') => self.delete_selected(),
|
||||||
KeyCode::Up | KeyCode::Char('k') => self.select_previous(),
|
KeyCode::Up | KeyCode::Char('k') => self.select_previous(),
|
||||||
KeyCode::Down | KeyCode::Char('j') => self.select_next(),
|
KeyCode::Down | KeyCode::Char('j') => self.select_next(),
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn on_key_adding(&mut self, key: KeyEvent) {
|
fn start_editing(&mut self) {
|
||||||
|
if let Some(command) = self.config.commands.get(self.selected) {
|
||||||
|
self.mode = Mode::Editing(CommandForm::edit(self.selected, command));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn delete_selected(&mut self) {
|
||||||
|
if self.selected < self.config.commands.len() {
|
||||||
|
self.config.commands.remove(self.selected);
|
||||||
|
self.selected = self
|
||||||
|
.selected
|
||||||
|
.min(self.config.commands.len().saturating_sub(1));
|
||||||
|
let _ = self.config.save();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn on_key_editing(&mut self, key: KeyEvent) {
|
||||||
match key.code {
|
match key.code {
|
||||||
KeyCode::Esc => self.mode = Mode::Normal,
|
KeyCode::Esc => self.mode = Mode::Normal,
|
||||||
KeyCode::Enter => self.confirm_adding(),
|
KeyCode::Enter => self.confirm_editing(),
|
||||||
KeyCode::Tab | KeyCode::Up | KeyCode::Down => {
|
KeyCode::Tab | KeyCode::Up | KeyCode::Down => {
|
||||||
if let Mode::Adding(form) = &mut self.mode {
|
if let Mode::Editing(form) = &mut self.mode {
|
||||||
form.toggle_field();
|
form.toggle_field();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
if let Mode::Adding(form) = &mut self.mode {
|
if let Mode::Editing(form) = &mut self.mode {
|
||||||
form.current_mut().handle_event(&Event::Key(key));
|
form.current_mut().handle_event(&Event::Key(key));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn confirm_adding(&mut self) {
|
fn confirm_editing(&mut self) {
|
||||||
if let Mode::Adding(form) = &self.mode {
|
if let Mode::Editing(form) = &self.mode {
|
||||||
let alias = form.alias.value().trim().to_string();
|
let alias = form.alias.value().trim().to_string();
|
||||||
let command = form.command.value().trim().to_string();
|
let command = form.command.value().trim().to_string();
|
||||||
|
let target = form.target;
|
||||||
if !command.is_empty() {
|
if !command.is_empty() {
|
||||||
self.config.commands.push(Command { alias, command });
|
match target {
|
||||||
|
CommandFormTarget::New => self.config.commands.push(Command { alias, command }),
|
||||||
|
CommandFormTarget::Existing(index) => {
|
||||||
|
if let Some(existing) = self.config.commands.get_mut(index) {
|
||||||
|
existing.alias = alias;
|
||||||
|
existing.command = command;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
let _ = self.config.save();
|
let _ = self.config.save();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -216,13 +260,14 @@ fn run(mut terminal: DefaultTerminal) -> std::io::Result<()> {
|
||||||
fn draw(frame: &mut Frame, app: &App) {
|
fn draw(frame: &mut Frame, app: &App) {
|
||||||
draw_main(frame, app, frame.area());
|
draw_main(frame, app, frame.area());
|
||||||
|
|
||||||
if let Mode::Adding(form) = &app.mode {
|
match &app.mode {
|
||||||
draw_add_popup(frame, form);
|
Mode::Normal => {}
|
||||||
|
Mode::Editing(form) => draw_edit_popup(frame, form),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn draw_main(frame: &mut Frame, app: &App, area: Rect) {
|
fn draw_main(frame: &mut Frame, app: &App, area: Rect) {
|
||||||
let instructions = " [a] Add connection [q/Esc] Quit ";
|
let instructions = " [a] Add [e] Edit [d] Delete [q/Esc] Quit ";
|
||||||
|
|
||||||
let block = Block::default()
|
let block = Block::default()
|
||||||
.title(" sshmngrs ")
|
.title(" sshmngrs ")
|
||||||
|
|
@ -252,7 +297,7 @@ fn draw_main(frame: &mut Frame, app: &App, area: Rect) {
|
||||||
frame.render_stateful_widget(list, area, &mut state);
|
frame.render_stateful_widget(list, area, &mut state);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn draw_add_popup(frame: &mut Frame, form: &AddForm) {
|
fn draw_edit_popup(frame: &mut Frame, form: &CommandForm) {
|
||||||
let area = centered_rect(frame.area(), 60, 6);
|
let area = centered_rect(frame.area(), 60, 6);
|
||||||
frame.render_widget(Clear, area);
|
frame.render_widget(Clear, area);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue