diff --git a/src/modules/source/mod.rs b/src/modules/source/mod.rs index e72118c..54e182a 100644 --- a/src/modules/source/mod.rs +++ b/src/modules/source/mod.rs @@ -53,7 +53,7 @@ pub trait WordSource { fn find_by_word_and_lang(&self, word: &str, lang: &str) -> Vec; fn insert_word(&self, word: Word) -> Result<(), ()>; fn remove_word(&self, word_key: &str) -> Result<(), ()>; - fn edit_word(&self, word: Word) -> Result; + fn edit_word(&self, word: Word, key: &str) -> Result; fn normalize_word_key(word_key: &str) -> String; fn normalize_lang_key(word_key: &str) -> String; } @@ -70,7 +70,7 @@ impl WordSource for FileDatabase { fn get_all_words(&self) -> Vec { let statement = self .connection - .prepare("select key, description, lang from word"); + .prepare("select key, description, lang from word ORDER BY key ASC"); let mut word_list: Vec = vec![]; // TODO: make this pretty with functional programming @@ -94,7 +94,7 @@ impl WordSource for FileDatabase { fn find_by_word(&self, word: &str) -> Vec { let statement = self .connection - .prepare("SELECT key, description, lang FROM word"); + .prepare("SELECT key, description, lang FROM word ORDER BY key ASC"); let mut word_list: Vec = vec![]; if let Ok(mut query) = statement { @@ -118,7 +118,7 @@ impl WordSource for FileDatabase { fn find_by_lang(&self, lang: &str) -> Vec { let statement = self .connection - .prepare("select key, description, lang from word where lang = ?1"); + .prepare("select key, description, lang from word where lang = ?1 ORDER BY key ASC"); let mut word_list: Vec = vec![]; // TODO: make this pretty with functional programming @@ -142,7 +142,7 @@ impl WordSource for FileDatabase { fn find_by_word_and_lang(&self, word: &str, lang: &str) -> Vec { let statement = self .connection - .prepare("SELECT key, description, lang FROM word where lang = ?1"); + .prepare("SELECT key, description, lang FROM word where lang = ?1 ORDER BY key ASC"); let mut word_list: Vec = vec![]; if let Ok(mut query) = statement { @@ -180,13 +180,14 @@ impl WordSource for FileDatabase { Err(()) } - fn edit_word(&self, word: Word) -> Result { + fn edit_word(&self, word: Word, key: &str) -> Result { let result = self.connection.execute( - "UPDATE word SET key = ?1, description = ?2, lang = ?3 WHERE key = ?1", + "UPDATE word SET key = ?1, description = ?2, lang = ?3 WHERE key = ?4", ( &Self::normalize_word_key(&word.key), &word.description, &Self::normalize_lang_key(&word.lang), + key, ), ); match result { diff --git a/src/modules/ui/app.rs b/src/modules/ui/app.rs index 55b9beb..c6153d5 100644 --- a/src/modules/ui/app.rs +++ b/src/modules/ui/app.rs @@ -292,7 +292,6 @@ impl App { self.file_database.get_all_words() } }; - self.list_state.select(Some(0)); self.description_scroll = 0; self.word_list = word_list; } diff --git a/src/modules/ui/handler.rs b/src/modules/ui/handler.rs index b386a99..b591704 100644 --- a/src/modules/ui/handler.rs +++ b/src/modules/ui/handler.rs @@ -110,7 +110,7 @@ pub fn handle_user_input(app: &mut App) -> io::Result<()> { prev_word.description.push(c); app.word_to_edit = Some(prev_word); } else { - app.word_to_add = Some(Word { + app.word_to_edit = Some(Word { key: c.to_string(), description: "".to_string(), lang: "".to_string(), @@ -215,9 +215,10 @@ 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 Some(w_k) = app.get_selected_word() { - let res = app.file_database.edit_word(w.clone()); + // FIXME: dirty trick to make it work, but should need to use get_selected_word + let res = app.file_database.edit_word(w.clone(), &w_k.key); match res { Ok(_) => { app.update_word_list();