Repetition settings base
This commit is contained in:
+54
-7
@@ -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(),
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user