From a68e56e8610b8ea55697504c0690fd19742e8d0b Mon Sep 17 00:00:00 2001 From: Mikhail Mitrofanov Date: Fri, 4 Sep 2026 17:26:59 +0300 Subject: [PATCH] Solve repetition --- src/core/deck.rs | 2 +- src/data.rs | 2 +- src/data/entities.rs | 4 +--- src/data/repositories.rs | 6 ++---- src/data_provider/mod.rs | 2 +- src/data_provider/word_groups.rs | 5 ++--- src/data_provider/words.rs | 8 +++----- src/pages/dictionary.rs | 3 ++- src/pages/import.rs | 5 +++-- src/pages/repetition.rs | 14 ++++++++------ 10 files changed, 24 insertions(+), 27 deletions(-) diff --git a/src/core/deck.rs b/src/core/deck.rs index 8de5c3a..0cee651 100644 --- a/src/core/deck.rs +++ b/src/core/deck.rs @@ -8,7 +8,7 @@ use crate::core::srs::{ WordOpenMode, WorstWordsSRSModule, }; use crate::data::entities::*; -use crate::data_provider::card_states::{update_stat_score, CardStateRepository, CardStateRepositoryInner}; +use crate::data_provider::card_states::{CardStateRepositoryInner}; use crate::notification::{MaybeError, NotificationData}; use log::info; use rhai::{Engine, Scope}; diff --git a/src/data.rs b/src/data.rs index f6e2374..99d4446 100644 --- a/src/data.rs +++ b/src/data.rs @@ -3,7 +3,7 @@ pub mod repositories; use rusqlite::ToSql; use rusqlite::types::{FromSql, FromSqlError, FromSqlResult, ToSqlOutput, ValueRef}; -use std::fmt::{Display, Formatter, write}; +use std::fmt::{Display, Formatter}; use std::num::ParseIntError; use std::str::FromStr; diff --git a/src/data/entities.rs b/src/data/entities.rs index 1d9b49a..3986462 100644 --- a/src/data/entities.rs +++ b/src/data/entities.rs @@ -1,6 +1,4 @@ -use crate::app::AppState; -use crate::core::srs::{FADE_PER_DAY, MAX_SCORE, OrderMode, WordOpenMode}; -use crate::data::repositories::Repository; +use crate::core::srs::{FADE_PER_DAY, MAX_SCORE, WordOpenMode}; use crate::data::{INVALID_ID, Id}; use chrono::{DateTime, NaiveDate, Utc}; use fsrs::MemoryState; diff --git a/src/data/repositories.rs b/src/data/repositories.rs index e54908c..8d28a30 100644 --- a/src/data/repositories.rs +++ b/src/data/repositories.rs @@ -1,5 +1,6 @@ use crate::data::Id; -use crate::data::entities::{EntityData, EntityHandle, WordData}; +use crate::data::entities::{EntityData, EntityHandle}; +use crate::data_provider::sqlite::SqliteConnection; use crate::helpers::into_result; use crate::notification::{MaybeError, NotificationData}; use parking_lot::{Mutex, RwLock}; @@ -9,10 +10,7 @@ use rayon::iter::ParallelIterator; use rusqlite::Connection; use std::marker::PhantomData; use std::ops::{Deref, Index, IndexMut}; -use std::rc::Rc; -use std::slice::Iter; use std::sync::Arc; -use crate::data_provider::sqlite::SqliteConnection; pub trait Repository where diff --git a/src/data_provider/mod.rs b/src/data_provider/mod.rs index 94dc435..9770201 100644 --- a/src/data_provider/mod.rs +++ b/src/data_provider/mod.rs @@ -1,5 +1,5 @@ use crate::data::Id; -use crate::data::entities::{CardState, EntityData}; +use crate::data::entities::{EntityData}; use crate::data::repositories::{BatchedDbLayer, DbLayer}; use crate::notification::MaybeError; use crate::notification::NotificationData::{DbLoadError, DbSaveError}; diff --git a/src/data_provider/word_groups.rs b/src/data_provider/word_groups.rs index c6e67fc..450f73c 100644 --- a/src/data_provider/word_groups.rs +++ b/src/data_provider/word_groups.rs @@ -1,8 +1,7 @@ -use crate::data::entities::{DeckSettings, WordGroup}; +use crate::data::entities::WordGroup; +use crate::data::repositories::{DataRepository, DataRepositoryInner}; use crate::data_provider::{SqliteDbLayer, TableAccessQuerySet}; use rusqlite::{Error, Params, Row}; -use crate::data::repositories::{DataRepository, DataRepositoryInner}; -use crate::data_provider::decks::DeckQuerySet; pub type WordGroupRepository = DataRepository; pub type WordGroupRepositoryInner = DataRepositoryInner; diff --git a/src/data_provider/words.rs b/src/data_provider/words.rs index 82253f8..8e9f696 100644 --- a/src/data_provider/words.rs +++ b/src/data_provider/words.rs @@ -1,14 +1,12 @@ use crate::data::entities::{WordData, WordGroup}; +use crate::data::repositories::{DataRepository, DataRepositoryInner}; use crate::data_provider::{SqliteDbLayer, TableAccessQuerySet}; use crate::notification::NotificationData::{DbLoadError, DbSaveError}; use crate::notification::{MaybeError, NotificationData}; -use litemap::LiteMap; use rusqlite::{Connection, Error, Params, Row, params}; -use std::collections::HashMap; -use crate::data::repositories::{BatchedDbLayer, DataRepository, DataRepositoryInner}; -pub type WordRepository = DataRepository>; -pub type WordRepositoryInner = DataRepositoryInner>; +pub type WordRepository = DataRepository; +pub type WordRepositoryInner = DataRepositoryInner; pub type WordDataLayer = SqliteDbLayer; #[derive(Clone)] pub struct WordQuerySet; diff --git a/src/pages/dictionary.rs b/src/pages/dictionary.rs index a172d84..8f1b275 100644 --- a/src/pages/dictionary.rs +++ b/src/pages/dictionary.rs @@ -2,7 +2,8 @@ use crate::app::AppState; use crate::data::Id; use crate::data::entities::{EntityHandle, WordData, WordGroup}; use crate::data::repositories::{Query, Repository}; -use crate::data_provider::words::{WordRepository, WordDataLayer, WordQuerySet, WordRepositoryInner}; +use crate::data_provider::words::WordDataLayer; +use crate::data_provider::words::WordRepositoryInner; use crate::navigation::Page::{Import, Word}; use crate::navigation::{NavigatedPage, Page, RootMessage}; use crate::pages::dictionary::DictionaryMessage::*; diff --git a/src/pages/import.rs b/src/pages/import.rs index 762c19e..f444e7f 100644 --- a/src/pages/import.rs +++ b/src/pages/import.rs @@ -1,7 +1,8 @@ use crate::app::AppState; -use crate::data::entities::{EntityData, WordData, WordGroup}; +use crate::data::entities::EntityData; +use crate::data::entities::WordData; +use crate::data::entities::WordGroup; use crate::data_provider::import::{ImportData, ImportGroup, get_words_of_group, load_groups}; -use crate::data_provider::words::{add_group, add_words}; use crate::fs::*; use crate::navigation::{NavigatedPage, Page, RootMessage}; use crate::notification::NotificationData::OpenFileError; diff --git a/src/pages/repetition.rs b/src/pages/repetition.rs index 4143742..dec7ee6 100644 --- a/src/pages/repetition.rs +++ b/src/pages/repetition.rs @@ -9,17 +9,16 @@ use crate::navigation::{KeyPressedPage, NavigatedPage, Page, RootMessage}; use crate::notification::{MaybeError, NotificationData}; use crate::styling::*; use crate::{push_error, push_error_task}; -use chrono::Local; use iced::alignment::Horizontal::Center; use iced::keyboard::key::Physical::Code; use iced::widget::text::Style; use iced::widget::{Column, button, column, container, row, rule, space, text, tooltip}; use iced::{Element, Fill, Task, Theme, alignment, keyboard}; -use parking_lot::Mutex; use rodio::MixerDeviceSink; use std::collections::HashSet; use std::sync::Arc; use tokio::task::spawn_blocking; +use crate::data::repositories::Repository; pub struct RepetitionState { state: AppState, @@ -108,7 +107,8 @@ impl RepetitionState { ) -> Result { let mut card_set = DeckData::new(&set, state.clone())?; let (word, stat) = card_set.next(); - + let word = state.dictionary.read().get_static(word).unwrap(); + let stat = state.card_states.read().get_static(stat).unwrap(); let sink_handle = if set.forward.contains("speech") || set.backward.contains("speech") { rodio::DeviceSinkBuilder::open_default_sink().ok() } else { @@ -150,9 +150,11 @@ impl RepetitionState { self.open = false; self.opened.insert(self.current_word.id); - let next = self.set.next(); - self.current_word = next.0; - self.current_statistic = next.1; + let (word, state) = self.set.next(); + let word = self.state.dictionary.read().get_static(word).unwrap(); + let stat = self.state.card_states.read().get_static(state).unwrap(); + self.current_word = word; + self.current_statistic = stat; if self.settings.require_speech() && self.sink.is_some() { let sink = self.sink.clone();