Implement a basic back queue/stack
This commit is contained in:
parent
e5e4d40d89
commit
dca386e67a
34
src/main.rs
34
src/main.rs
|
@ -30,7 +30,7 @@ enum AppState {
|
|||
struct App {
|
||||
state: AppState,
|
||||
message: Option<String>,
|
||||
latest_action: Option<AppMsg>,
|
||||
back_queue: Vec<AppMsg>,
|
||||
posts: FactoryVecDeque<PostRow>,
|
||||
communities: FactoryVecDeque<CommunityRow>,
|
||||
profile_page: Controller<ProfilePage>,
|
||||
|
@ -52,7 +52,6 @@ pub enum AppMsg {
|
|||
Login(String, String),
|
||||
LoggedIn,
|
||||
Logout,
|
||||
Retry,
|
||||
ShowMessage(String),
|
||||
DoneChoosingInstance(String),
|
||||
StartFetchPosts(Option<ListingType>, bool),
|
||||
|
@ -65,7 +64,8 @@ pub enum AppMsg {
|
|||
DoneFetchPerson(GetPersonDetailsResponse),
|
||||
OpenPost(PostId),
|
||||
DoneFetchPost(GetPostResponse),
|
||||
OpenInbox
|
||||
OpenInbox,
|
||||
PopBackStack
|
||||
}
|
||||
|
||||
#[relm4::component]
|
||||
|
@ -86,6 +86,12 @@ impl SimpleComponent for App {
|
|||
set_icon_name: "view-more",
|
||||
set_menu_model: Some(&menu_model),
|
||||
},
|
||||
pack_start = >k::Button {
|
||||
set_icon_name: "go-previous",
|
||||
connect_clicked => AppMsg::PopBackStack,
|
||||
#[watch]
|
||||
set_visible: model.back_queue.len() > 1,
|
||||
},
|
||||
pack_start = >k::Button {
|
||||
set_label: "Home",
|
||||
connect_clicked => AppMsg::StartFetchPosts(None, true),
|
||||
|
@ -279,7 +285,7 @@ impl SimpleComponent for App {
|
|||
},
|
||||
gtk::Button {
|
||||
set_label: "Go Home",
|
||||
connect_clicked => AppMsg::Retry,
|
||||
connect_clicked => AppMsg::StartFetchPosts(None, true),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -321,7 +327,7 @@ impl SimpleComponent for App {
|
|||
let inbox_page = InboxPage::builder().launch(()).forward(sender.input_sender(), |msg| msg);
|
||||
let community_search_buffer = gtk::EntryBuffer::builder().build();
|
||||
|
||||
let model = App { state, logged_in, posts, communities, profile_page, community_page, post_page, inbox_page, message: None, latest_action: None, current_communities_type: None, current_posts_type: None, current_communities_page: 1, current_posts_page: 1, community_search_buffer };
|
||||
let model = App { state, back_queue: vec![], logged_in, posts, communities, profile_page, community_page, post_page, inbox_page, message: None, current_communities_type: None, current_posts_type: None, current_communities_page: 1, current_posts_page: 1, community_search_buffer };
|
||||
|
||||
// fetch posts if that's the initial page
|
||||
if !current_account.instance_url.is_empty() { sender.input(AppMsg::StartFetchPosts(None, true)) };
|
||||
|
@ -365,6 +371,14 @@ impl SimpleComponent for App {
|
|||
}
|
||||
|
||||
fn update(&mut self, msg: Self::Input, sender: ComponentSender<Self>) {
|
||||
// save the back queue
|
||||
match msg {
|
||||
AppMsg::DoneFetchCommunities(_) | AppMsg::DoneFetchCommunity(_) | AppMsg::DoneFetchPerson(_) | AppMsg::DoneFetchPost(_) | AppMsg::DoneFetchPosts(_) | AppMsg::ShowMessage(_) => {
|
||||
self.back_queue.push(msg.clone())
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
|
||||
match msg {
|
||||
AppMsg::DoneChoosingInstance(instance_url) => {
|
||||
if instance_url.trim().is_empty() { return; }
|
||||
|
@ -499,9 +513,6 @@ impl SimpleComponent for App {
|
|||
self.message = Some(message);
|
||||
self.state = AppState::Message;
|
||||
}
|
||||
AppMsg::Retry => {
|
||||
sender.input(self.latest_action.clone().unwrap_or(AppMsg::StartFetchPosts(None, true)));
|
||||
}
|
||||
AppMsg::OpenInbox => {
|
||||
self.state = AppState::Inbox;
|
||||
self.inbox_page.sender().emit(InboxInput::FetchInbox);
|
||||
|
@ -510,6 +521,13 @@ impl SimpleComponent for App {
|
|||
self.logged_in = true;
|
||||
sender.input(AppMsg::StartFetchPosts(None, true));
|
||||
}
|
||||
AppMsg::PopBackStack => {
|
||||
let action = self.back_queue.get(self.back_queue.len() - 2);
|
||||
if let Some(action) = action { sender.input(action.clone()); }
|
||||
for _ in 0..2 {
|
||||
self.back_queue.remove(self.back_queue.len() - 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue