Remove Option for vecs in repetitions

This commit is contained in:
micialware committed 2026-08-24 13:15:49 +03:00
1 parent d261a08932
commit 3cbdf0803b
1 file changed
+28 -45
+28 -45
View File
@@ -1,8 +1,12 @@
use crate::app::AppState;
use crate::core::srs::{AppendMode, OrderMode};
use crate::data::Id;
use crate::data::entities::{CardStatistics, DeckSettings};
use crate::data_provider::card_sets::update_deck; use crate::data_provider::card_sets::update_deck;
use crate::data_provider::card_stats::{add_stat_list, load_stats_of_deck}; use crate::data_provider::card_stats::{add_stat_list, load_stats_of_deck};
use crate::pages::history::HistoryState;
use crate::navigation::Page::{History, PreviousPage, Repetition, RepetitionSettings}; use crate::navigation::Page::{History, PreviousPage, Repetition, RepetitionSettings};
use crate::navigation::{NavigatedPage, Page, RootMessage}; use crate::navigation::{NavigatedPage, Page, RootMessage};
use crate::pages::history::HistoryState;
use crate::pages::repetition::RepetitionState; use crate::pages::repetition::RepetitionState;
use crate::pages::repetition_settings::RepetitionSettingsState; use crate::pages::repetition_settings::RepetitionSettingsState;
use crate::pages::repetitions::RepetitionsMessage::*; use crate::pages::repetitions::RepetitionsMessage::*;
@@ -23,10 +27,6 @@ use iced_core::svg::Handle;
use parking_lot::Mutex; use parking_lot::Mutex;
use std::ops::Deref; use std::ops::Deref;
use std::sync::Arc; use std::sync::Arc;
use crate::app::AppState;
use crate::data::entities::{CardStatistics, DeckSettings};
use crate::core::srs::{AppendMode, OrderMode};
use crate::data::Id;
#[derive(Clone)] #[derive(Clone)]
pub struct RepetitionsState { pub struct RepetitionsState {
@@ -53,16 +53,8 @@ impl NavigatedPage<RepetitionsMessage> for RepetitionsState {
Self::append_all_words(&mut clone.lock(), selected_set); Self::append_all_words(&mut clone.lock(), selected_set);
selected_set.existing_words_indices = selected_set.available_words_indices.clone(); selected_set.existing_words_indices = selected_set.available_words_indices.clone();
} else { } else {
if selected_set if selected_set.available_words_indices.is_empty()
.available_words_indices || selected_set.existing_words_indices.is_empty()
.as_ref()
.unwrap()
.is_empty()
|| selected_set
.existing_words_indices
.as_ref()
.unwrap()
.is_empty()
{ {
return None; return None;
} }
@@ -82,7 +74,7 @@ impl NavigatedPage<RepetitionsMessage> for RepetitionsState {
} }
} }
fn navigated(&mut self) { fn navigated(&mut self) {
let index = self.selected_deck_index.unwrap(); if let Some(index) = self.selected_deck_index {
let state = self.state.lock(); let state = self.state.lock();
if let Some(global_deck) = state.decks.get(index) { if let Some(global_deck) = state.decks.get(index) {
if global_deck.id != self.selected_deck().unwrap().id { if global_deck.id != self.selected_deck().unwrap().id {
@@ -90,7 +82,7 @@ impl NavigatedPage<RepetitionsMessage> for RepetitionsState {
self.decks.remove(index); self.decks.remove(index);
self.clear_selection(); self.clear_selection();
} else { } else {
self.decks[self.selected_deck_index.unwrap()].general_settings = self.decks[index].general_settings =
state.decks[index].clone(); state.decks[index].clone();
drop(state); drop(state);
self.fill_deck_word_indices(); self.fill_deck_word_indices();
@@ -101,6 +93,7 @@ impl NavigatedPage<RepetitionsMessage> for RepetitionsState {
self.clear_selection() self.clear_selection()
} }
} }
}
fn update(&mut self, message: RepetitionsMessage) -> Task<RootMessage> { fn update(&mut self, message: RepetitionsMessage) -> Task<RootMessage> {
match message { match message {
Next => {} Next => {}
@@ -113,8 +106,9 @@ impl NavigatedPage<RepetitionsMessage> for RepetitionsState {
let index = self.decks.len() + 1; let index = self.decks.len() + 1;
self.decks.push(DeckViewData { self.decks.push(DeckViewData {
general_settings: DeckSettings::with_name(format!("Колода #{}", index)), general_settings: DeckSettings::with_name(format!("Колода #{}", index)),
existing_words_indices: None, existing_words_indices: Default::default(),
available_words_indices: None, available_words_indices: Default::default(),
indices_ready: false,
append_mode: Default::default(), append_mode: Default::default(),
index: None, index: None,
}); });
@@ -144,7 +138,7 @@ impl NavigatedPage<RepetitionsMessage> for RepetitionsState {
SelectSet(index) => { SelectSet(index) => {
self.select_deck(index); self.select_deck(index);
let deck = self.selected_deck().unwrap(); let deck = self.selected_deck().unwrap();
if deck.existing_words_indices.is_none() { if !deck.indices_ready {
self.fill_deck_word_indices(); self.fill_deck_word_indices();
} }
} }
@@ -195,15 +189,13 @@ impl NavigatedPage<RepetitionsMessage> for RepetitionsState {
{ {
{ {
let deck = self.selected_deck().unwrap(); let deck = self.selected_deck().unwrap();
let existing_words_indices = deck.existing_words_indices.as_ref().unwrap(); let existing_words_indices = &deck.existing_words_indices;
let mut created_set = HashSet::with_capacity(existing_words_indices.len()); let mut created_set = HashSet::with_capacity(existing_words_indices.len());
existing_words_indices.iter().for_each(|c| { existing_words_indices.iter().for_each(|c| {
created_set.insert(c); created_set.insert(c);
}); });
adding = deck adding = deck
.available_words_indices .available_words_indices
.as_ref()
.unwrap()
.iter() .iter()
.filter(|c| !created_set.contains(c)) .filter(|c| !created_set.contains(c))
.take(count) .take(count)
@@ -212,10 +204,7 @@ impl NavigatedPage<RepetitionsMessage> for RepetitionsState {
} }
let deck = self.selected_deck_mut().unwrap(); let deck = self.selected_deck_mut().unwrap();
deck.existing_words_indices deck.existing_words_indices.append(&mut adding.clone());
.as_mut()
.unwrap()
.append(&mut adding.clone());
} }
let deck = self.selected_deck().unwrap(); let deck = self.selected_deck().unwrap();
@@ -280,8 +269,9 @@ impl RepetitionsState {
.enumerate() .enumerate()
.map(|(index, deck)| DeckViewData { .map(|(index, deck)| DeckViewData {
general_settings: deck.clone(), general_settings: deck.clone(),
existing_words_indices: None, existing_words_indices: Default::default(),
available_words_indices: None, available_words_indices: Default::default(),
indices_ready: false,
append_mode: Default::default(), append_mode: Default::default(),
index: Some(index), index: Some(index),
}) })
@@ -292,9 +282,7 @@ impl RepetitionsState {
impl RepetitionsState { impl RepetitionsState {
fn launch_delete_button(&self, deck: &DeckViewData) -> Element<'_, RepetitionsMessage> { fn launch_delete_button(&self, deck: &DeckViewData) -> Element<'_, RepetitionsMessage> {
if deck.id.is_valid() { if deck.id.is_valid() {
if deck.append_mode == AppendMode::Manual if deck.append_mode == AppendMode::Manual && deck.existing_words_indices.is_empty() {
&& deck.existing_words_indices.as_ref().unwrap().is_empty()
{
return text!("Добавьте карточки или измените фильтр").into(); return text!("Добавьте карточки или измените фильтр").into();
} }
return row![ return row![
@@ -517,12 +505,8 @@ impl RepetitionsState {
fn count_comparator_view(&self) -> Element<'_, RepetitionsMessage> { fn count_comparator_view(&self) -> Element<'_, RepetitionsMessage> {
let selected_deck = self.selected_deck().unwrap(); let selected_deck = self.selected_deck().unwrap();
let now = selected_deck.existing_words_indices.as_ref().unwrap().len(); let now = selected_deck.existing_words_indices.len();
let available = selected_deck let available = selected_deck.available_words_indices.len();
.available_words_indices
.as_ref()
.unwrap()
.len();
text!("{} слова добавлено из {}", now, available).into() text!("{} слова добавлено из {}", now, available).into()
} }
fn count_view(&self, deck: &DeckSettings) -> Element<'_, RepetitionsMessage> { fn count_view(&self, deck: &DeckSettings) -> Element<'_, RepetitionsMessage> {
@@ -562,15 +546,13 @@ impl RepetitionsState {
impl RepetitionsState { impl RepetitionsState {
fn append_all_words(state: &mut AppState, deck: &DeckViewData) { fn append_all_words(state: &mut AppState, deck: &DeckViewData) {
let existing = deck.existing_words_indices.as_ref().unwrap(); let existing = &deck.existing_words_indices;
let mut created_set = HashSet::with_capacity(existing.len()); let mut created_set = HashSet::with_capacity(existing.len());
existing.iter().for_each(|c| { existing.iter().for_each(|c| {
created_set.insert(c); created_set.insert(c);
}); });
let required = deck let required = deck
.available_words_indices .available_words_indices
.as_ref()
.unwrap()
.iter() .iter()
.filter(|i| !created_set.contains(i)) .filter(|i| !created_set.contains(i))
.cloned(); .cloned();
@@ -625,8 +607,8 @@ impl RepetitionsState {
.map(|c| self.word_id_index_map[&c.word_id]) .map(|c| self.word_id_index_map[&c.word_id])
.collect(); .collect();
let total = deck.get_word_list(state); let total = deck.get_word_list(state);
deck.existing_words_indices = Some(added); deck.existing_words_indices = added;
deck.available_words_indices = Some(total); deck.available_words_indices = total;
self.decks[self.selected_deck_index.unwrap()] = deck; self.decks[self.selected_deck_index.unwrap()] = deck;
} }
} }
@@ -654,8 +636,9 @@ pub enum RepetitionsMessage {
#[derive(Clone)] #[derive(Clone)]
struct DeckViewData { struct DeckViewData {
general_settings: DeckSettings, general_settings: DeckSettings,
existing_words_indices: Option<Vec<usize>>, existing_words_indices: Vec<usize>,
available_words_indices: Option<Vec<usize>>, available_words_indices: Vec<usize>,
indices_ready: bool,
append_mode: AppendMode, append_mode: AppendMode,
index: Option<usize>, index: Option<usize>,
} }