Fixing some bugs
This commit is contained in:
1 parent
d59776d713
commit
5d305affd3
2 files changed
+78
-55
No files matched your search
+32
-5
@@ -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
@@ -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),
|
||||||
|
|||||||
Reference in new issue
Block a user