Fixing some bugs

This commit is contained in:
micialware committed 2026-09-11 12:38:21 +03:00
1 parent d59776d713
commit 5d305affd3
2 files changed
+78 -55

No files matched your search

+32 -5
View File
@@ -53,7 +53,7 @@ pub struct DictionaryState {
displayed_words_query: Query<WordData, WordRepositoryInner, WordDataLayer>, displayed_words_query: Query<WordData, WordRepositoryInner, WordDataLayer>,
groups_query: Query<WordGroup, WordGroupRepositoryInner, WordGroupDataLayer>, groups_query: Query<WordGroup, WordGroupRepositoryInner, WordGroupDataLayer>,
selected_cell: Option<(EntityHandle<WordData>, BasicWordFields, usize)>, selected_cell: Option<(EntityHandle<WordData>, BasicWordFields, usize)>,
word_editor: Option<WordEditor>, word_editor: Option<WordEditor<DictionaryMessage>>,
} }
#[derive(Clone)] #[derive(Clone)]
@@ -84,6 +84,7 @@ pub enum DictionaryMessage {
EditField(String), EditField(String),
ChangeSelectedField(SelectionChangeDirection), ChangeSelectedField(SelectionChangeDirection),
EditorAction(WordMessage), EditorAction(WordMessage),
ExtendedWordEdited
} }
#[derive(Clone, PartialEq, Eq, Hash, Copy)] #[derive(Clone, PartialEq, Eq, Hash, Copy)]
@@ -186,7 +187,7 @@ impl NavigatedPage<DictionaryMessage> for DictionaryState {
} }
ExtendedEdit(i) => { ExtendedEdit(i) => {
self.word_editor = Some(WordEditor::new(i, self.state.clone())); self.word_editor = Some(self.editor_for_word(i));
} }
Include(i, b) => { Include(i, b) => {
if b { if b {
@@ -271,6 +272,7 @@ impl NavigatedPage<DictionaryMessage> for DictionaryState {
self.reverse_list = !self.reverse_list; self.reverse_list = !self.reverse_list;
} }
TrySave(mut handle) => { TrySave(mut handle) => {
let original = handle;
let now = Utc::now(); let now = Utc::now();
if !self.auto_save_queue.contains_key(&handle) { if !self.auto_save_queue.contains_key(&handle) {
return Task::none(); return Task::none();
@@ -284,6 +286,10 @@ impl NavigatedPage<DictionaryMessage> for DictionaryState {
let _ = dictionary.save(&mut handle); let _ = dictionary.save(&mut handle);
if reload_query { if reload_query {
self.displayed_words_query.load(&dictionary); 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"); info!("Saved word");
return Task::none(); return Task::none();
@@ -293,7 +299,7 @@ impl NavigatedPage<DictionaryMessage> for DictionaryState {
SelectField(e, f, index) => { SelectField(e, f, index) => {
info!("Editing word {}", e.id); info!("Editing word {}", e.id);
if self.word_editor.is_some() && let Some(selected) = &self.selected_cell && selected.0 != e { 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)); self.selected_cell = Some((e, f, index));
@@ -374,9 +380,26 @@ impl NavigatedPage<DictionaryMessage> for DictionaryState {
} }
self.displayed_words_query.load(&dictionary); 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) => { 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 result
} }
fn editor_for_word(&self, handle: EntityHandle<WordData>) -> WordEditor<DictionaryMessage> {
WordEditor::new(handle, self.state.clone()).on_delete(DeleteWord(handle)).on_edit(ExtendedWordEdited)
}
fn init(&mut self) { fn init(&mut self) {
self.displayed_words_query = self self.displayed_words_query = self
.state .state
@@ -564,7 +591,7 @@ impl DictionaryState {
let line_button = || { let line_button = || {
if !data.handle.real() { if !data.handle.real() {
return button("-") return button("-")
.on_press(ExtendedEdit(data.handle)) .on_press(DeleteWord(data.handle))
.style(|_x: &Theme, _status: button::Status| Style { .style(|_x: &Theme, _status: button::Status| Style {
background: None, background: None,
text_color: Color::BLACK, text_color: Color::BLACK,
+46 -50
View File
@@ -1,58 +1,46 @@
use crate::app::AppState; use crate::app::AppState;
use crate::data::entities::{EntityHandle, WordData}; use crate::data::entities::{EntityHandle, WordData};
use crate::navigation::Page::PreviousPage; use crate::data::repositories::Repository;
use crate::navigation::{NavigatedPage, Page, RootMessage};
use crate::pages::word::WordMessage::*; use crate::pages::word::WordMessage::*;
use crate::styling::*; use crate::styling::*;
use iced::widget::button::danger; use iced::widget::button::danger;
use iced::widget::{button, column, row, rule, scrollable, space, text, text_input}; use iced::widget::space::horizontal;
use iced::{Element, Fill, Task}; use iced::widget::{button, column, row, rule, scrollable, text, text_input};
use crate::data::repositories::Repository; use iced::{Element, Fill};
use crate::jl_button;
pub struct WordEditor { pub struct WordEditor<Message> {
state: AppState, state: AppState,
handle: EntityHandle<WordData>, handle: EntityHandle<WordData>,
on_delete: Option<Message>,
on_edit: Option<Message>,
} }
impl WordEditor { impl<Message> WordEditor<Message> {
pub(crate) fn update(&mut self, message: WordMessage) { pub(crate) fn update(&mut self, message: WordMessage) -> Option<Message> {
// match message { let dictionary = &mut self.state.dictionary.write();
// Back => {} let word = dictionary.get_mut(&mut self.handle).unwrap();
// Save => { match message {
// let mut state = self.state.lock(); Delete => {
// state.dictionary[self.index] = self.word.clone(); return self.on_delete.take();
// }
// if let Err(err) = update_word(&mut self.word, &state.connection) { SetTags(n) => word.tags = n,
// return push_error_task!(err); SetKey(n) => {
// } word.key = n;
// return Task::done(RootMessage::Word(Back)); }
// } SetValue(n) => {
// Delete => { word.value = n;
// let mut state = self.state.lock(); }
// state.dictionary.remove(self.index); SetAdditional(key, value) => {
// if let Err(err) = delete_word(&self.word, &state.connection) { word.additional.insert(key, value.clone());
// return push_error_task!(err); }
// } AddAdditional(key) => {
// return Task::done(RootMessage::Word(Back)); word.additional.insert(key, "".to_string());
// } }
// SetTags(n) => self.word.tags = n, RemoveAdditional(key) => {
// SetKey(n) => { word.additional.remove(key.as_str());
// self.word.key = n; }
// } }
// SetValue(n) => { self.on_edit.take()
// 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());
// }
// }
} }
pub(crate) fn view(&self) -> Element<'_, WordMessage> { pub(crate) fn view(&self) -> Element<'_, WordMessage> {
@@ -108,7 +96,7 @@ impl WordEditor {
column![ column![
col.spacing(DEFAULT_SPACING / 2.0).width(Fill).height(Fill), col.spacing(DEFAULT_SPACING / 2.0).width(Fill).height(Fill),
row![ row![
jl_button!("Сохранить").on_press(Save), horizontal().width(Fill),
button("Удалить").style(danger).on_press(Delete), button("Удалить").style(danger).on_press(Delete),
] ]
.spacing(DEFAULT_SPACING) .spacing(DEFAULT_SPACING)
@@ -120,13 +108,22 @@ impl WordEditor {
} }
} }
impl WordEditor { impl<Message> WordEditor<Message> {
pub fn new(handle: EntityHandle<WordData>, state: AppState) -> Self { pub fn new(handle: EntityHandle<WordData>, 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<Message> WordEditor<Message> {
fn get_view_for_more(&self, value: (&String, &String)) -> Element<'_, WordMessage> { fn get_view_for_more(&self, value: (&String, &String)) -> Element<'_, WordMessage> {
match value.0.as_str() { match value.0.as_str() {
"reading" => self.reading_field(value.1), "reading" => self.reading_field(value.1),
@@ -170,7 +167,6 @@ impl WordEditor {
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub enum WordMessage { pub enum WordMessage {
Save,
Delete, Delete,
SetTags(String), SetTags(String),
SetKey(String), SetKey(String),