diff --git a/src/pages/repetitions.rs b/src/pages/repetitions.rs index 6105d9a..6fbcf31 100644 --- a/src/pages/repetitions.rs +++ b/src/pages/repetitions.rs @@ -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 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 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 { @@ -113,8 +106,9 @@ impl NavigatedPage 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 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 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 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>, - available_words_indices: Option>, + existing_words_indices: Vec, + available_words_indices: Vec, + indices_ready: bool, append_mode: AppendMode, index: Option, }