Working repetitions

This commit is contained in:
micialware committed 2026-09-09 10:08:52 +03:00
1 parent 242b56fc21
commit 2e04450c76
7 files changed
+163 -260

No files matched your search

+6 -5
View File
@@ -2,11 +2,13 @@ use crate::app::AppState;
use crate::core::deck::DeckData;
use crate::core::srs::WordOpenMode;
use crate::data::Id;
use crate::data::entities::{CardState, DeckSettings, WordData};
use crate::data::entities::{CardState, WordData};
use crate::data::repositories::Repository;
use crate::data_provider::voice::get_voice;
use crate::navigation::Page::PreviousPage;
use crate::navigation::{KeyPressedPage, NavigatedPage, Page, RootMessage};
use crate::notification::{MaybeError, NotificationData};
use crate::pages::repetitions::DeckRunData;
use crate::styling::*;
use crate::{push_error, push_error_task};
use iced::alignment::Horizontal::Center;
@@ -18,11 +20,10 @@ 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,
pub settings: DeckSettings,
pub settings: DeckRunData,
pub set: DeckData,
current_word: WordData,
current_statistic: CardState,
@@ -102,10 +103,10 @@ impl NavigatedPage<RepetitionMessage> for RepetitionState {
impl RepetitionState {
pub(crate) fn new(
set: DeckSettings,
set: DeckRunData,
state: AppState,
) -> Result<RepetitionState, NotificationData> {
let mut card_set = DeckData::new(&set, state.clone())?;
let mut card_set = DeckData::new(&set, set.open_mode, 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();
+18 -18
View File
@@ -33,7 +33,7 @@ use std::sync::Arc;
#[derive(Clone)]
pub struct RepetitionsState {
selected_deck_handle: Option<EntityHandle<DeckSettings>>,
decks: BTreeMap<EntityHandle<DeckSettings>, DeckViewData>,
decks: BTreeMap<EntityHandle<DeckSettings>, DeckRunData>,
state: AppState,
}
@@ -63,7 +63,7 @@ impl NavigatedPage<RepetitionsMessage> for RepetitionsState {
}
if let Ok(repetition_state) =
RepetitionState::new(selected_set.general_settings.clone(), self.state.clone())
RepetitionState::new(selected_set.clone(), self.state.clone())
{
return Some(Repetition(repetition_state));
}
@@ -111,7 +111,7 @@ impl NavigatedPage<RepetitionsMessage> for RepetitionsState {
let handle = self.state.decks.write().create(general.clone());
self.decks.insert(
handle,
DeckViewData {
DeckRunData {
settings_handle: handle,
general_settings: general,
existing_words_indices: Default::default(),
@@ -258,7 +258,7 @@ impl RepetitionsState {
fn get_decks_from_state(
state: &AppState,
) -> BTreeMap<EntityHandle<DeckSettings>, DeckViewData> {
) -> BTreeMap<EntityHandle<DeckSettings>, DeckRunData> {
state
.decks
.read()
@@ -267,7 +267,7 @@ impl RepetitionsState {
.map(|(index, deck)| {
(
EntityHandle::new(deck.id, index, true),
DeckViewData {
DeckRunData {
settings_handle: EntityHandle::new(deck.id, index, true),
general_settings: deck.clone(),
existing_words_indices: Default::default(),
@@ -284,7 +284,7 @@ impl RepetitionsState {
}
impl RepetitionsState {
fn launch_delete_button(&self, deck: &DeckViewData) -> Element<'_, RepetitionsMessage> {
fn launch_delete_button(&self, deck: &DeckRunData) -> Element<'_, RepetitionsMessage> {
if deck.id.is_valid() {
if deck.append_mode == AppendMode::Manual && deck.existing_words_indices.is_empty() {
return text!("Добавьте карточки или измените фильтр").into();
@@ -468,7 +468,7 @@ impl RepetitionsState {
})
.into()
}
fn word_append_panel(&self, deck: &DeckViewData) -> Element<'_, RepetitionsMessage> {
fn word_append_panel(&self, deck: &DeckRunData) -> Element<'_, RepetitionsMessage> {
column![
text!("Режим добавления карточек"),
row![
@@ -491,7 +491,7 @@ impl RepetitionsState {
.spacing(HALF_SPACING)
.into()
}
fn adder_panel(&self, deck: &DeckViewData) -> Element<'_, RepetitionsMessage> {
fn adder_panel(&self, deck: &DeckRunData) -> Element<'_, RepetitionsMessage> {
match deck.append_mode {
AppendMode::Full => space().into(),
AppendMode::Manual => row![
@@ -511,7 +511,7 @@ impl RepetitionsState {
let available = selected_deck.available_words_indices.len();
text!("{} слова добавлено из {}", now, available).into()
}
fn count_view(&self, deck: &DeckViewData) -> Element<'_, RepetitionsMessage> {
fn count_view(&self, deck: &DeckRunData) -> Element<'_, RepetitionsMessage> {
if let Some(count) = deck.count {
return text!("Количество слов: {}", count).into();
}
@@ -547,7 +547,7 @@ impl RepetitionsState {
}
impl RepetitionsState {
fn append_all_words(state: &mut AppState, deck: &DeckViewData) -> MaybeError {
fn append_all_words(state: &mut AppState, deck: &DeckRunData) -> MaybeError {
let existing = &deck.existing_words_indices;
let mut created_set = HashSet::with_capacity(existing.len());
existing.iter().for_each(|c| {
@@ -593,10 +593,10 @@ impl RepetitionsState {
}
}
fn selected_deck(&self) -> Option<&DeckViewData> {
fn selected_deck(&self) -> Option<&DeckRunData> {
self.decks.get(&self.selected_deck_handle?)
}
fn selected_deck_mut(&mut self) -> Option<&mut DeckViewData> {
fn selected_deck_mut(&mut self) -> Option<&mut DeckRunData> {
self.decks.get_mut(&self.selected_deck_handle?)
}
@@ -641,18 +641,18 @@ pub enum RepetitionsMessage {
}
#[derive(Clone)]
struct DeckViewData {
settings_handle: EntityHandle<DeckSettings>,
general_settings: DeckSettings,
pub struct DeckRunData {
pub settings_handle: EntityHandle<DeckSettings>,
pub general_settings: DeckSettings,
existing_words_indices: Vec<EntityHandle<WordData>>,
available_words_indices: Vec<EntityHandle<WordData>>,
indices_ready: bool,
append_mode: AppendMode,
pub append_mode: AppendMode,
count: Option<usize>,
open_mode: OrderMode,
pub open_mode: OrderMode,
}
impl Deref for DeckViewData {
impl Deref for DeckRunData {
type Target = DeckSettings;
fn deref(&self) -> &Self::Target {