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