Repetition settings base

This commit is contained in:
2026-08-04 16:53:09 +03:00
parent a222233290
commit da9dc8d781
10 changed files with 456 additions and 52 deletions
+54 -7
View File
@@ -1,23 +1,28 @@
use crate::data_provider::history::{get_history_of_set, history_dir};
use crate::data_provider::sqlite::create_db;
use crate::dictionary::{DictionaryMessage, DictionaryState};
use crate::dictionary_test::{DictionaryQuizMessage, DictionaryQuizState};
use crate::history::{HistoryMessage, HistoryState};
use crate::message_navigation;
use crate::navigation::Page::*;
use crate::navigation::RootMessage::Keyboard;
use crate::navigation::RootMessage::{DataLoaded, Keyboard };
use crate::quiz::{QuizMessage, QuizState};
use crate::randomizer::{RandomizerMessage, RandomizerState};
use crate::repetition::{RepetitionMessage, RepetitionState};
use crate::repetitions::{RepetitionsMessage, RepetitionsState};
use crate::selector::{SelectorMessage, SelectorState};
use crate::repetition_settings::{RepetitionSettingsMessage, RepetitionSettingsState};
use crate::state_update;
use crate::sync::{SyncMessage, SyncState};
use crate::view_navigation;
use crate::word::{WordMessage, WordState};
use crate::writing::{WritingMessage, WritingState};
use crate::{fill_state, AppState};
use crate::{AppState, fill_state};
use chrono::NaiveDate;
use iced::keyboard::Event;
use iced::{Element, Task};
use rusqlite::fallible_iterator::FallibleIterator;
use std::collections::HashMap;
use std::sync::{Arc, Mutex};
impl Default for ScreenState {
@@ -26,7 +31,8 @@ impl Default for ScreenState {
fill_state(&mut state);
let state = Arc::new(Mutex::new(state));
ScreenState {
stack: vec![Page::Selector(SelectorState::new(state.clone()))],
stack: vec![Selector(SelectorState::new(state.clone()))],
app_state: state.clone(),
}
}
}
@@ -44,7 +50,9 @@ pub enum RootMessage {
Word(WordMessage),
Sync(SyncMessage),
History(HistoryMessage),
RepetitionSettings(RepetitionSettingsMessage),
Keyboard(Event),
DataLoaded(HashMap<u32, Vec<(NaiveDate, u32)>>),
}
pub enum Page {
@@ -59,23 +67,59 @@ pub enum Page {
Word(WordState),
Sync(SyncState),
History(HistoryState),
RepetitionSettings(RepetitionSettingsState),
PreviousPage,
}
pub struct ScreenState {
stack: Vec<Page>,
app_state: Arc<Mutex<AppState>>,
}
impl ScreenState {
pub fn boot() -> (ScreenState, Task<RootMessage>) {
create_db();
(ScreenState::default(), Task::none())
(
ScreenState::default(),
Task::perform(Self::load_additional_data(), |data| data),
)
}
async fn load_additional_data() -> RootMessage {
let directory = history_dir();
let mut map = HashMap::new();
for file in directory.read_dir().unwrap() {
if let Ok(file) = file {
let mut vec = vec![];
let history_file_name = file.file_name().into_string().unwrap();
let id = history_file_name[4..history_file_name.len() - 12]
.parse::<u32>()
.unwrap();
let history = get_history_of_set(id);
let by_date = history.chunk_by(|x, x1| {
x.timestamp.naive_local().date() == x1.timestamp.naive_local().date()
});
for group in by_date {
vec.push((group[0].timestamp.naive_local().date(), group.len() as u32));
}
map.insert(id, vec);
}
}
DataLoaded(map)
}
pub fn update(&mut self, message: RootMessage) -> Task<RootMessage> {
if let Keyboard(e) = message {
return self.handle_keyboard(e);
}
if let DataLoaded(data) = message {
self.app_state.lock().unwrap().activity = data;
return Task::none();
}
state_update!(
message,
self.stack,
@@ -89,8 +133,10 @@ impl ScreenState {
Repetition,
Word,
Sync,
History
History,
RepetitionSettings
);
Task::none()
}
pub fn view(&self) -> Element<'_, RootMessage> {
@@ -106,14 +152,15 @@ impl ScreenState {
Repetition,
Word,
Sync,
History
History,
RepetitionSettings
)
}
fn handle_keyboard(&mut self, message: Event) -> Task<RootMessage> {
let page = self.stack.last_mut().unwrap();
match page {
Page::Repetition(page) => page.press(&message),
Repetition(page) => page.press(&message),
_ => Task::none(),
}
}