Navigated back handing ready

This commit is contained in:
2026-08-07 00:00:57 +03:00
parent 0d9aaaea24
commit 0197b06122
+68 -24
View File
@@ -1,3 +1,4 @@
use crate::state_navigate_handle;
use crate::data_provider::history::{get_history_of_set, history_dir}; use crate::data_provider::history::{get_history_of_set, history_dir};
use crate::data_provider::sqlite::create_db; use crate::data_provider::sqlite::create_db;
use crate::dictionary::{DictionaryMessage, DictionaryState}; use crate::dictionary::{DictionaryMessage, DictionaryState};
@@ -5,19 +6,19 @@ use crate::dictionary_test::{DictionaryQuizMessage, DictionaryQuizState};
use crate::history::{HistoryMessage, HistoryState}; use crate::history::{HistoryMessage, HistoryState};
use crate::message_navigation; use crate::message_navigation;
use crate::navigation::Page::*; use crate::navigation::Page::*;
use crate::navigation::RootMessage::{DataLoaded, Keyboard }; use crate::navigation::RootMessage::{DataLoaded, Keyboard};
use crate::quiz::{QuizMessage, QuizState}; use crate::quiz::{QuizMessage, QuizState};
use crate::randomizer::{RandomizerMessage, RandomizerState}; use crate::randomizer::{RandomizerMessage, RandomizerState};
use crate::repetition::{RepetitionMessage, RepetitionState}; use crate::repetition::{RepetitionMessage, RepetitionState};
use crate::repetition_settings::{RepetitionSettingsMessage, RepetitionSettingsState};
use crate::repetitions::{RepetitionsMessage, RepetitionsState}; use crate::repetitions::{RepetitionsMessage, RepetitionsState};
use crate::selector::{SelectorMessage, SelectorState}; use crate::selector::{SelectorMessage, SelectorState};
use crate::repetition_settings::{RepetitionSettingsMessage, RepetitionSettingsState};
use crate::state_update; use crate::state_update;
use crate::sync::{SyncMessage, SyncState}; use crate::sync::{SyncMessage, SyncState};
use crate::view_navigation; use crate::view_navigation;
use crate::word::{WordMessage, WordState}; use crate::word::{WordMessage, WordState};
use crate::writing::{WritingMessage, WritingState}; use crate::writing::{WritingMessage, WritingState};
use crate::{AppState, fill_state}; use crate::{fill_state, AppState};
use chrono::NaiveDate; use chrono::NaiveDate;
use iced::keyboard::Event; use iced::keyboard::Event;
use iced::{Element, Task}; use iced::{Element, Task};
@@ -119,25 +120,48 @@ impl ScreenState {
return Task::none(); return Task::none();
} }
state_update!( let task: (Task<RootMessage>, bool) = self.navigate_or_update(message);
message,
self.stack,
Selector,
Quiz,
Writing,
Dictionary,
DictionaryQuiz,
Randomizer,
Repetitions,
Repetition,
Word,
Sync,
History,
RepetitionSettings
);
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<RootMessage>, bool) {
state_update!(
message,
self.stack,
Selector,
Quiz,
Writing,
Dictionary,
DictionaryQuiz,
Randomizer,
Repetitions,
Repetition,
Word,
Sync,
History,
RepetitionSettings
)
}
pub fn view(&self) -> Element<'_, RootMessage> { pub fn view(&self) -> Element<'_, RootMessage> {
view_navigation!( view_navigation!(
self.stack, self.stack,
@@ -190,9 +214,12 @@ macro_rules! state_update {
if let $e(s) = $stack.last_mut().unwrap() { if let $e(s) = $stack.last_mut().unwrap() {
message_navigation!(msg, $stack, s) message_navigation!(msg, $stack, s)
} }
else {
return (Task::<RootMessage>::none(), false);
}
} }
)* )*
_ => {} _ => return (Task::<RootMessage>::none(), false),
} }
} }
} }
@@ -203,15 +230,32 @@ macro_rules! message_navigation {
if let Some(new_page) = $state.navigate(&$msg) { if let Some(new_page) = $state.navigate(&$msg) {
if let Page::PreviousPage = new_page { if let Page::PreviousPage = new_page {
$stack.pop(); $stack.pop();
return Task::none(); return (Task::<RootMessage>::none(), true);
} else {
$stack.push(new_page);
} }
$stack.push(new_page);
return (Task::<RootMessage>::none(), false);
} else { } 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<T> { pub trait NavigatedPage<T> {
fn navigate(&self, message: &T) -> Option<Page>; fn navigate(&self, message: &T) -> Option<Page>;
fn navigated(&mut self); fn navigated(&mut self);