Remove Option for vecs in repetitions
This commit is contained in:
1 parent
d261a08932
commit
3cbdf0803b
1 file changed
+40
-57
+40
-57
@@ -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,23 +74,24 @@ 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 {
|
||||||
|
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);
|
drop(state);
|
||||||
self.decks.remove(index);
|
self.decks.remove(index);
|
||||||
self.clear_selection();
|
self.clear_selection()
|
||||||
} else {
|
|
||||||
self.decks[self.selected_deck_index.unwrap()].general_settings =
|
|
||||||
state.decks[index].clone();
|
|
||||||
drop(state);
|
|
||||||
self.fill_deck_word_indices();
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
drop(state);
|
|
||||||
self.decks.remove(index);
|
|
||||||
self.clear_selection()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fn update(&mut self, message: RepetitionsMessage) -> Task<RootMessage> {
|
fn update(&mut self, message: RepetitionsMessage) -> Task<RootMessage> {
|
||||||
@@ -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>,
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user