diff --git a/src/navigation.rs b/src/navigation.rs index d98e3cf..9374b99 100644 --- a/src/navigation.rs +++ b/src/navigation.rs @@ -1,3 +1,4 @@ +use crate::state_navigate_handle; use crate::data_provider::history::{get_history_of_set, history_dir}; use crate::data_provider::sqlite::create_db; use crate::dictionary::{DictionaryMessage, DictionaryState}; @@ -5,19 +6,19 @@ use crate::dictionary_test::{DictionaryQuizMessage, DictionaryQuizState}; use crate::history::{HistoryMessage, HistoryState}; use crate::message_navigation; use crate::navigation::Page::*; -use crate::navigation::RootMessage::{DataLoaded, Keyboard }; +use crate::navigation::RootMessage::{DataLoaded, Keyboard}; use crate::quiz::{QuizMessage, QuizState}; use crate::randomizer::{RandomizerMessage, RandomizerState}; use crate::repetition::{RepetitionMessage, RepetitionState}; +use crate::repetition_settings::{RepetitionSettingsMessage, RepetitionSettingsState}; 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::{AppState, fill_state}; +use crate::{fill_state, AppState}; use chrono::NaiveDate; use iced::keyboard::Event; use iced::{Element, Task}; @@ -119,25 +120,48 @@ impl ScreenState { return Task::none(); } - state_update!( - message, - self.stack, - Selector, - Quiz, - Writing, - Dictionary, - DictionaryQuiz, - Randomizer, - Repetitions, - Repetition, - Word, - Sync, - History, - RepetitionSettings - ); + let task: (Task, bool) = self.navigate_or_update(message); - Task::none() + if task.1 { + state_navigate_handle!( + self.stack, + Selector, + Quiz, + Writing, + Dictionary, + DictionaryQuiz, + Randomizer, + Repetitions, + Repetition, + Word, + Sync, + History, + RepetitionSettings + ); + } + + task.0 } + + fn navigate_or_update(&mut self, message: RootMessage) -> (Task, bool) { + state_update!( + message, + self.stack, + Selector, + Quiz, + Writing, + Dictionary, + DictionaryQuiz, + Randomizer, + Repetitions, + Repetition, + Word, + Sync, + History, + RepetitionSettings + ) + } + pub fn view(&self) -> Element<'_, RootMessage> { view_navigation!( self.stack, @@ -190,9 +214,12 @@ macro_rules! state_update { if let $e(s) = $stack.last_mut().unwrap() { message_navigation!(msg, $stack, s) } + else { + return (Task::::none(), false); + } } )* - _ => {} + _ => return (Task::::none(), false), } } } @@ -203,15 +230,32 @@ macro_rules! message_navigation { if let Some(new_page) = $state.navigate(&$msg) { if let Page::PreviousPage = new_page { $stack.pop(); - return Task::none(); + return (Task::::none(), true); + } else { + $stack.push(new_page); } - $stack.push(new_page); + + return (Task::::none(), false); } else { - return $state.update($msg); + return ($state.update($msg), false); } }; } +#[macro_export] +macro_rules! state_navigate_handle { + ($stack:expr, $($e:ident), *) => { + match $stack.last_mut().unwrap() { + $( + Page::$e(page) => { + page.navigated(); + } + )* + _ => {}, + } + } +} + pub trait NavigatedPage { fn navigate(&self, message: &T) -> Option; fn navigated(&mut self);