Fixing bugs

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