diff --git a/src/repetitions.rs b/src/repetitions.rs index 7aa5a75..2d5e052 100644 --- a/src/repetitions.rs +++ b/src/repetitions.rs @@ -1,7 +1,7 @@ use crate::data_provider::card_sets::update_deck; use crate::data_provider::card_stats::{add_stat_list, load_stats_of_deck}; use crate::history::HistoryState; -use crate::lang::{AppendMode, CardStatistics, DeckSettings, Id, OrderMode, INVALID_ID}; +use crate::lang::{AppendMode, CardStatistics, DeckSettings, INVALID_ID, Id, OrderMode}; use crate::navigation::Page::{History, PreviousPage, Repetition, RepetitionSettings}; use crate::navigation::{NavigatedPage, Page}; use crate::repetition::RepetitionState; @@ -11,17 +11,17 @@ use crate::styling::*; use crate::{AppState, RootMessage}; use chrono::{Days, Local, Utc}; use hashbrown::{HashMap, HashSet}; -use iced::widget::button::{danger, Status}; pub use iced::widget::button::{Catalog, Style}; +use iced::widget::button::{Status, danger}; use iced::widget::tooltip::Position::Top; use iced::widget::{ - button, column, container, lazy, radio, row, scrollable, space, svg, text, text_input, tooltip, - Column, Row, + Column, Row, button, column, container, lazy, radio, row, scrollable, space, svg, text, + text_input, tooltip, }; use iced::{Background, Border, Center, Color, Element, Fill, Length, Shadow, Task, Theme}; +use iced_core::Padding; use iced_core::border::Radius; use iced_core::svg::Handle; -use iced_core::Padding; use std::ops::Deref; use std::sync::{Arc, Mutex}; @@ -47,7 +47,6 @@ impl NavigatedPage for RepetitionsState { let selected_set = self.selected_deck_mut().unwrap(); if selected_set.append_mode == AppendMode::Full { - Self::append_all_words(&clone.lock().unwrap(), selected_set); selected_set.existing_words_indices = selected_set.available_words_indices.clone(); } else { @@ -62,7 +61,6 @@ impl NavigatedPage for RepetitionsState { .unwrap() .is_empty() { - selected_set.append_warning = true; return None; } } @@ -110,8 +108,6 @@ impl NavigatedPage for RepetitionsState { existing_words_indices: None, available_words_indices: None, append_mode: Default::default(), - append_warning: false, - valid_filter: true, index: None, }); } @@ -122,6 +118,15 @@ impl NavigatedPage for RepetitionsState { if deck.id != INVALID_ID { let mut state = self.state.lock().unwrap(); state.decks.remove(index); + self.decks = self + .decks + .clone() + .into_iter() + .map(|mut deck| { + deck.index = state.decks.iter().position(|d| d.id == deck.id); + deck + }) + .collect(); } } SetName(value) => { @@ -154,7 +159,7 @@ impl NavigatedPage for RepetitionsState { } else { state.decks.push(deck.general_settings.clone()); deck.index = Some(state.decks.len() - 1); - self.decks[deck.index.unwrap()] = deck.clone(); + self.decks[self.selected_deck_index.unwrap()] = deck.clone(); } } } @@ -259,15 +264,7 @@ impl RepetitionsState { map.insert(word.id, index); }); - let decks = state_.decks.iter().enumerate().map(|(index, deck)| {DeckViewData{ - general_settings: deck.clone(), - existing_words_indices: None, - available_words_indices: None, - append_mode: Default::default(), - append_warning: false, - valid_filter: true, - index: Some(index), - }}).collect(); + let decks = Self::get_decks_from_state(&state_); drop(state_); RepetitionsState { word_id_index_map: map, @@ -276,12 +273,29 @@ impl RepetitionsState { state, } } + + fn get_decks_from_state(state: &AppState) -> Vec { + state + .decks + .iter() + .enumerate() + .map(|(index, deck)| DeckViewData { + general_settings: deck.clone(), + existing_words_indices: None, + available_words_indices: None, + append_mode: Default::default(), + index: Some(index), + }) + .collect() + } } impl RepetitionsState { fn launch_delete_button(&self, deck: &DeckViewData) -> Element<'_, RepetitionsMessage> { if deck.id != INVALID_ID { - 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.as_ref().unwrap().is_empty() + { return text!("Добавьте карточки или измените фильтр").into(); } return row![ @@ -376,7 +390,8 @@ impl RepetitionsState { button("Сохранить").style(jl_button).on_press(Save), self.launch_delete_button(deck) ] - .spacing(DEFAULT_SPACING).align_y(Center), + .spacing(DEFAULT_SPACING) + .align_y(Center), ] .spacing(DEFAULT_SPACING) .width(Length::FillPortion(2)) @@ -533,11 +548,8 @@ impl RepetitionsState { } else { None }, - text_color: if deck.valid_filter { - _x.palette().primary - } else { - _x.palette().warning - }, + text_color: + _x.palette().primary, border: Border { color: Default::default(), width: 0.0, @@ -590,7 +602,7 @@ impl RepetitionsState { } fn select_deck(&mut self, index: usize) { - if self.decks.get(index).is_some() { + if self.decks.get(index).is_some() { self.selected_deck_index = Some(index); } } @@ -633,8 +645,6 @@ struct DeckViewData { existing_words_indices: Option>, available_words_indices: Option>, append_mode: AppendMode, - append_warning: bool, - valid_filter: bool, index: Option, } impl Deref for DeckViewData {