diff --git a/src/modules/ui/app.rs b/src/modules/ui/app.rs index dbc3499..55b9beb 100644 --- a/src/modules/ui/app.rs +++ b/src/modules/ui/app.rs @@ -143,18 +143,26 @@ impl App { }; // PERF: do not clone let selected_word = self.word_list.clone().into_iter().nth(scroll_position); - if self.state == UiState::ADD { + if self.state == UiState::ADD || self.state == UiState::EDIT { let add_words_heading_layout = Layout::horizontal(vec![Constraint::Fill(1), Constraint::Length(8)]) .spacing(1) .split(main_layout[0]); // PERF: maybe not clone - let word_to_add = self.word_to_add.clone().unwrap_or(Word { - key: "".to_string(), - description: "".to_string(), - lang: "".to_string(), - }); + let word_to_add = { + if self.state == UiState::EDIT + && let Some(w) = self.word_to_edit.clone() + { + w + } else { + self.word_to_add.clone().unwrap_or(Word { + key: "".to_string(), + description: "".to_string(), + lang: "".to_string(), + }) + } + }; frame.render_widget( Paragraph::new(word_to_add.key).block( Block::new() @@ -309,6 +317,17 @@ impl App { } } + pub fn get_selected_word(&self) -> Option { + let scroll_position: usize = { + if let Some(i) = self.list_state.selected() { + i + } else { + 0 + } + }; + self.word_list.clone().into_iter().nth(scroll_position) + } + fn handle_events(&mut self) -> io::Result<()> { return handle_user_input(self); } diff --git a/src/modules/ui/handler.rs b/src/modules/ui/handler.rs index 3db5029..b386a99 100644 --- a/src/modules/ui/handler.rs +++ b/src/modules/ui/handler.rs @@ -6,7 +6,6 @@ use crate::modules::{ source::{Word, WordSource}, ui::app::{AddState, App, UiState}, }; - pub fn handle_user_input(app: &mut App) -> io::Result<()> { if let Event::Key(key) = event::read()? { match key.code { @@ -93,6 +92,44 @@ pub fn handle_user_input(app: &mut App) -> io::Result<()> { } } }, + UiState::EDIT => match app.add_state { + AddState::KEY => { + if let Some(mut prev_word) = app.word_to_edit.clone() { + prev_word.key.push(c); + app.word_to_edit = Some(prev_word); + } else { + app.word_to_edit = Some(Word { + key: c.to_string(), + description: "".to_string(), + lang: "".to_string(), + }); + } + } + AddState::DESCRIPTION => { + if let Some(mut prev_word) = app.word_to_edit.clone() { + prev_word.description.push(c); + app.word_to_edit = Some(prev_word); + } else { + app.word_to_add = Some(Word { + key: c.to_string(), + description: "".to_string(), + lang: "".to_string(), + }); + } + } + AddState::LANG => { + if let Some(mut prev_word) = app.word_to_edit.clone() { + prev_word.lang.push(c); + app.word_to_edit = Some(prev_word); + } else { + app.word_to_edit = Some(Word { + key: c.to_string(), + description: "".to_string(), + lang: "".to_string(), + }); + } + } + }, _ => { // Quit if c == 'q' || c == 'x' { @@ -110,6 +147,8 @@ pub fn handle_user_input(app: &mut App) -> io::Result<()> { } if c == 'e' { app.state = UiState::EDIT; + let selected_word = app.get_selected_word(); + app.word_to_edit = selected_word; } if c == 'a' { app.state = UiState::ADD; @@ -128,6 +167,18 @@ pub fn handle_user_input(app: &mut App) -> io::Result<()> { app.description_scroll = 0; } } + if c == 'g' { + if let Some(g) = app.last_key { + match g.code { + event::KeyCode::Char(g_c) => { + if g_c == 'g' { + app.list_state.select_first(); + } + } + _ => {} + } + } + } if c == 'G' { app.list_state.select_last(); } @@ -162,12 +213,30 @@ pub fn handle_user_input(app: &mut App) -> io::Result<()> { } } } + UiState::EDIT => { + if let Some(w) = app.word_to_edit.clone() + && w.key.len() > 0 + { + let res = app.file_database.edit_word(w.clone()); + match res { + Ok(_) => { + app.update_word_list(); + app.word_to_edit = None; + app.state = get_next_ui_state(app.state); + } + Err(_) => app.state = get_next_ui_state(app.state), + } + } + } _ => {} }, event::KeyCode::Tab => match app.state { UiState::ADD => { app.add_state = get_next_add_state(app.add_state); } + UiState::EDIT => { + app.add_state = get_next_add_state(app.add_state); + } _ => { app.state = get_next_ui_state(app.state); } @@ -201,6 +270,26 @@ pub fn handle_user_input(app: &mut App) -> io::Result<()> { } } }, + UiState::EDIT => match app.add_state { + AddState::KEY => { + if let Some(mut prev_word) = app.word_to_edit.clone() { + prev_word.key.pop(); + app.word_to_edit = Some(prev_word); + } + } + AddState::DESCRIPTION => { + if let Some(mut prev_word) = app.word_to_edit.clone() { + prev_word.description.pop(); + app.word_to_edit = Some(prev_word); + } + } + AddState::LANG => { + if let Some(mut prev_word) = app.word_to_edit.clone() { + prev_word.lang.pop(); + app.word_to_edit = Some(prev_word); + } + } + }, _ => {} }, event::KeyCode::Esc => {