From 5d305affd34340333dac7f6966dcb60d73e7930c Mon Sep 17 00:00:00 2001 From: Mikhail Mitrofanov Date: Fri, 11 Sep 2026 12:38:21 +0300 Subject: [PATCH] Fixing some bugs --- src/pages/dictionary.rs | 37 +++++++++++++--- src/pages/word.rs | 96 ++++++++++++++++++++--------------------- 2 files changed, 78 insertions(+), 55 deletions(-) diff --git a/src/pages/dictionary.rs b/src/pages/dictionary.rs index 55c09c2..3ad5d09 100644 --- a/src/pages/dictionary.rs +++ b/src/pages/dictionary.rs @@ -53,7 +53,7 @@ pub struct DictionaryState { displayed_words_query: Query, groups_query: Query, selected_cell: Option<(EntityHandle, BasicWordFields, usize)>, - word_editor: Option, + word_editor: Option>, } #[derive(Clone)] @@ -84,6 +84,7 @@ pub enum DictionaryMessage { EditField(String), ChangeSelectedField(SelectionChangeDirection), EditorAction(WordMessage), + ExtendedWordEdited } #[derive(Clone, PartialEq, Eq, Hash, Copy)] @@ -186,7 +187,7 @@ impl NavigatedPage for DictionaryState { } ExtendedEdit(i) => { - self.word_editor = Some(WordEditor::new(i, self.state.clone())); + self.word_editor = Some(self.editor_for_word(i)); } Include(i, b) => { if b { @@ -271,6 +272,7 @@ impl NavigatedPage for DictionaryState { self.reverse_list = !self.reverse_list; } TrySave(mut handle) => { + let original = handle; let now = Utc::now(); if !self.auto_save_queue.contains_key(&handle) { return Task::none(); @@ -284,6 +286,10 @@ impl NavigatedPage for DictionaryState { let _ = dictionary.save(&mut handle); if reload_query { self.displayed_words_query.load(&dictionary); + if let Some(selected) = self.selected_cell && selected.0 == original { + self.selected_cell = Some((handle, selected.1, selected.2)); + self.word_editor = Some(self.editor_for_word(selected.0)); + } } info!("Saved word"); return Task::none(); @@ -293,7 +299,7 @@ impl NavigatedPage for DictionaryState { SelectField(e, f, index) => { info!("Editing word {}", e.id); if self.word_editor.is_some() && let Some(selected) = &self.selected_cell && selected.0 != e { - self.word_editor = Some(WordEditor::new(e, self.state.clone())); + self.word_editor = Some(self.editor_for_word(e)); } self.selected_cell = Some((e, f, index)); @@ -374,9 +380,26 @@ impl NavigatedPage for DictionaryState { } self.displayed_words_query.load(&dictionary); + if let Some(selected) = self.selected_cell && selected.0 != i { + self.selected_cell = None; + self.word_editor = None; + } } EditorAction(action) => { - self.word_editor.as_mut().unwrap().update(action); + let result = self.word_editor.as_mut().unwrap().update(action); + if let Some(result) = result { + match result { + DeleteWord(_) | + ExtendedWordEdited => { + return Task::done(RootMessage::Dictionary(result)); + }, + + _ => {} + } + } + } + ExtendedWordEdited => { + return self.launch_auto_save_offset(self.selected_cell.unwrap().0); } } @@ -433,6 +456,10 @@ impl DictionaryState { result } + fn editor_for_word(&self, handle: EntityHandle) -> WordEditor { + WordEditor::new(handle, self.state.clone()).on_delete(DeleteWord(handle)).on_edit(ExtendedWordEdited) + } + fn init(&mut self) { self.displayed_words_query = self .state @@ -564,7 +591,7 @@ impl DictionaryState { let line_button = || { if !data.handle.real() { return button("-") - .on_press(ExtendedEdit(data.handle)) + .on_press(DeleteWord(data.handle)) .style(|_x: &Theme, _status: button::Status| Style { background: None, text_color: Color::BLACK, diff --git a/src/pages/word.rs b/src/pages/word.rs index 0e4920e..0f7c699 100644 --- a/src/pages/word.rs +++ b/src/pages/word.rs @@ -1,58 +1,46 @@ use crate::app::AppState; use crate::data::entities::{EntityHandle, WordData}; -use crate::navigation::Page::PreviousPage; -use crate::navigation::{NavigatedPage, Page, RootMessage}; +use crate::data::repositories::Repository; use crate::pages::word::WordMessage::*; use crate::styling::*; use iced::widget::button::danger; -use iced::widget::{button, column, row, rule, scrollable, space, text, text_input}; -use iced::{Element, Fill, Task}; -use crate::data::repositories::Repository; -use crate::jl_button; +use iced::widget::space::horizontal; +use iced::widget::{button, column, row, rule, scrollable, text, text_input}; +use iced::{Element, Fill}; -pub struct WordEditor { +pub struct WordEditor { state: AppState, handle: EntityHandle, + on_delete: Option, + on_edit: Option, } -impl WordEditor { - pub(crate) fn update(&mut self, message: WordMessage) { - // match message { - // Back => {} - // Save => { - // let mut state = self.state.lock(); - // state.dictionary[self.index] = self.word.clone(); - // - // if let Err(err) = update_word(&mut self.word, &state.connection) { - // return push_error_task!(err); - // } - // return Task::done(RootMessage::Word(Back)); - // } - // Delete => { - // let mut state = self.state.lock(); - // state.dictionary.remove(self.index); - // if let Err(err) = delete_word(&self.word, &state.connection) { - // return push_error_task!(err); - // } - // return Task::done(RootMessage::Word(Back)); - // } - // SetTags(n) => self.word.tags = n, - // SetKey(n) => { - // self.word.key = n; - // } - // SetValue(n) => { - // self.word.value = n; - // } - // SetAdditional(key, value) => { - // self.word.additional.insert(key, value.clone()); - // } - // AddAdditional(key) => { - // self.word.additional.insert(key, "".to_string()); - // } - // RemoveAdditional(key) => { - // self.word.additional.remove(key.as_str()); - // } - // } +impl WordEditor { + pub(crate) fn update(&mut self, message: WordMessage) -> Option { + let dictionary = &mut self.state.dictionary.write(); + let word = dictionary.get_mut(&mut self.handle).unwrap(); + match message { + Delete => { + return self.on_delete.take(); + } + SetTags(n) => word.tags = n, + SetKey(n) => { + word.key = n; + } + SetValue(n) => { + word.value = n; + } + SetAdditional(key, value) => { + word.additional.insert(key, value.clone()); + } + AddAdditional(key) => { + word.additional.insert(key, "".to_string()); + } + RemoveAdditional(key) => { + word.additional.remove(key.as_str()); + } + } + self.on_edit.take() } pub(crate) fn view(&self) -> Element<'_, WordMessage> { @@ -108,7 +96,7 @@ impl WordEditor { column![ col.spacing(DEFAULT_SPACING / 2.0).width(Fill).height(Fill), row![ - jl_button!("Сохранить").on_press(Save), + horizontal().width(Fill), button("Удалить").style(danger).on_press(Delete), ] .spacing(DEFAULT_SPACING) @@ -120,13 +108,22 @@ impl WordEditor { } } -impl WordEditor { +impl WordEditor { pub fn new(handle: EntityHandle, state: AppState) -> Self { - Self { state, handle } + Self { state, handle, on_delete: None, on_edit: None } + } + + pub fn on_delete(mut self, message: Message) -> Self { + self.on_delete = Some(message); + self + } + pub fn on_edit(mut self, message: Message) -> Self { + self.on_edit = Some(message); + self } } -impl WordEditor { +impl WordEditor { fn get_view_for_more(&self, value: (&String, &String)) -> Element<'_, WordMessage> { match value.0.as_str() { "reading" => self.reading_field(value.1), @@ -170,7 +167,6 @@ impl WordEditor { #[derive(Debug, Clone)] pub enum WordMessage { - Save, Delete, SetTags(String), SetKey(String),