Fix deck data

This commit is contained in:
micialware committed 2026-09-04 13:00:41 +03:00
1 parent 9a7578727b
commit 08ab55f283
7 files changed
+145 -96

No files matched your search

-20
View File
@@ -162,29 +162,9 @@ impl RepetitionState {
Err(err) => push_error!(err),
});
}
self.increment_counter();
Task::none()
}
fn increment_counter(&mut self) {
let mut state = self.state;
let id = self.settings.id;
let activity = state.activity.get_mut(&id);
let now = Local::now().date_naive();
if let Some(activity) = activity {
let (last_day, counter) = activity.last_mut().unwrap();
if *last_day == now {
*counter += 1;
} else {
activity.push((now, 1));
}
} else {
state.activity.insert(id, vec![(now, 1)]);
}
}
fn draw_forward(&self) -> Element<'_, RepetitionMessage> {
self.draw_card_view(self.settings.forward.as_str())
}
+30 -34
View File
@@ -1,5 +1,5 @@
use crate::app::AppState;
use crate::data::entities::DeckSettings;
use crate::data::entities::{DeckSettings, EntityHandle};
use crate::data_provider::card_states::{delete_stats, load_stats_of_deck};
use crate::navigation::Page::PreviousPage;
use crate::navigation::{NavigatedPage, Page, RootMessage};
@@ -16,31 +16,25 @@ use iced_core::{Padding, Theme, color};
use parking_lot::Mutex;
use std::sync::Arc;
use std::time::Duration;
use crate::core::deck::DeckData;
use crate::data::repositories::BatchedRepository;
pub struct RepetitionSettingsState {
set: DeckSettings,
index: usize,
settings: EntityHandle<DeckSettings>,
state: AppState,
real_delete: bool,
correct_filter: bool,
filter_changed: bool,
filtered_words: Option<u32>
}
impl RepetitionSettingsState {
pub(crate) fn new(index: usize, state: AppState) -> RepetitionSettingsState {
let set;
{
let local_state = state.lock();
set = local_state.decks[index].clone();
}
let filter_state = set.check_filter();
pub(crate) fn new(settings: EntityHandle<DeckSettings>, state: AppState) -> RepetitionSettingsState {
RepetitionSettingsState {
index,
set,
settings,
state,
real_delete: false,
correct_filter: filter_state,
correct_filter: false,
filter_changed: false,
}
}
@@ -61,34 +55,34 @@ impl NavigatedPage<RepetitionSettingsMessage> for RepetitionSettingsState {
Back => {}
Save => {
let mut state = self.state.lock();
if let Err(e) = update_deck(&mut self.set, &state.connection) {
if let Err(e) = update_deck(&mut self.settings, &state.connection) {
return push_error_task!(e);
}
if self.filter_changed
&& let Err(e) = update_deck_stats(&self.set, &state)
&& let Err(e) = update_deck_stats(&self.settings, &state)
{
return push_error_task!(e);
}
state.decks[self.index] = self.set.clone();
state.decks[self.index] = self.settings.clone();
}
SetName(new) => {
self.set.name = new;
self.settings.name = new;
}
SetForward(new) => {
self.set.forward = new;
self.settings.forward = new;
}
SetBackward(backward) => {
self.set.backward = backward;
self.settings.backward = backward;
}
SetFilter(new) => {
self.set.filter = new;
self.correct_filter = self.set.check_filter();
self.settings.filter = new;
self.correct_filter = self.settings.check_filter();
self.filter_changed = true;
}
TryFilter => {
let state = self.state.lock();
let count = self.set.get_word_list(&state).len();
self.set.count = Some(count);
let count = self.settings.get_word_list(&state).len();
self.settings.count = Some(count);
}
DeleteSet => {
if !self.real_delete {
@@ -99,7 +93,7 @@ impl NavigatedPage<RepetitionSettingsMessage> for RepetitionSettingsState {
});
}
let mut state = self.state.lock();
if let Err(e) = delete_set(&self.set, &state.connection) {
if let Err(e) = delete_set(&self.settings, &state.connection) {
return push_error_task!(e);
}
@@ -118,22 +112,22 @@ impl NavigatedPage<RepetitionSettingsMessage> for RepetitionSettingsState {
column![
column![
text!("Название набора"),
text_input("", &self.set.name).on_input(SetName),
text_input("", &self.settings.name).on_input(SetName),
]
.spacing(QUARTER_SPACING),
column![
text!("Передняя сторона"),
text_input("", &self.set.forward).on_input(SetForward),
text_input("", &self.settings.forward).on_input(SetForward),
]
.spacing(QUARTER_SPACING),
column![
text!("Задняя сторона"),
text_input("", &self.set.backward).on_input(SetBackward),
text_input("", &self.settings.backward).on_input(SetBackward),
]
.spacing(QUARTER_SPACING),
column![
text!("Фильтр"),
text_input("", &self.set.filter)
text_input("", &self.settings.filter)
.style(|x, status| {
let mut primary = Theme::default()(x, status);
if !self.correct_filter {
@@ -145,7 +139,7 @@ impl NavigatedPage<RepetitionSettingsMessage> for RepetitionSettingsState {
button("Проверить фильтр")
.style(jl_button)
.on_press(TryFilter),
self.count_view(&self.set),
self.count_view(&self.settings),
]
.spacing(QUARTER_SPACING),
]
@@ -179,8 +173,8 @@ impl NavigatedPage<RepetitionSettingsMessage> for RepetitionSettingsState {
}
fn update_deck_stats(deck: &DeckSettings, state: &AppState) -> MaybeError {
let mut db_stats = load_stats_of_deck(deck, &state.connection).expect("Wrong db operation");
let filtered_words = deck.get_word_list(state);
let mut db_stats = state.card_states.read().query_par(Arc::new(|s| s.set_id == deck.id));
let filtered_words = DeckData::list(deck, state)?;
filtered_words.iter().for_each(|word| {
let word_id = state.dictionary[*word].id;
if let Some(index) = db_stats.iter().position(|stat| stat.word_id == word_id) {
@@ -188,13 +182,15 @@ fn update_deck_stats(deck: &DeckSettings, state: &AppState) -> MaybeError {
}
});
delete_stats(db_stats.as_slice(), &state.connection)?;
let repo = state.card_states.write();
// repo.delete_many();
// delete_stats(db_stats.as_slice(), &state.connection)?;
Ok(())
}
impl RepetitionSettingsState {
fn count_view(&self, set: &DeckSettings) -> Element<'_, RepetitionSettingsMessage> {
if let Some(count) = set.count {
if let Some(count) = self.filtered_words {
return text!("Количество слов: {}", count).into();
}
space().into()