Navigated back handing ready

This commit is contained in:
2026-08-07 00:00:57 +03:00
parent 0d9aaaea24
commit 0197b06122
+54 -10
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};
@@ -9,15 +10,15 @@ 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,6 +120,30 @@ impl ScreenState {
return Task::none(); return Task::none();
} }
let task: (Task<RootMessage>, bool) = self.navigate_or_update(message);
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!( state_update!(
message, message,
self.stack, self.stack,
@@ -134,10 +159,9 @@ impl ScreenState {
Sync, Sync,
History, History,
RepetitionSettings RepetitionSettings
); )
Task::none()
} }
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);
}
$stack.push(new_page);
} else { } else {
return $state.update($msg); $stack.push(new_page);
}
return (Task::<RootMessage>::none(), false);
} else {
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);