nav: fix accounts nav animations

also make nav go backward when clicking the account switch button if we
already are navigating to accounts

Signed-off-by: William Casarin <jb55@jb55.com>
This commit is contained in:
William Casarin 2024-09-16 16:53:37 -07:00
parent 79a447239a
commit fce82b2b6d
3 changed files with 24 additions and 4 deletions

View File

@ -11,6 +11,7 @@ use crate::{
use egui_nav::{Nav, NavAction}; use egui_nav::{Nav, NavAction};
pub fn render_nav(show_postbox: bool, col: usize, app: &mut Damus, ui: &mut egui::Ui) { pub fn render_nav(show_postbox: bool, col: usize, app: &mut Damus, ui: &mut egui::Ui) {
// TODO(jb55): clean up this router_mut mess by using Router<R> in egui-nav directly
let nav_response = Nav::new(app.columns().column(col).router().routes().clone()) let nav_response = Nav::new(app.columns().column(col).router().routes().clone())
.navigating(app.columns_mut().column_mut(col).router_mut().navigating) .navigating(app.columns_mut().column_mut(col).router_mut().navigating)
.returning(app.columns_mut().column_mut(col).router_mut().returning) .returning(app.columns_mut().column_mut(col).router_mut().returning)
@ -67,7 +68,7 @@ pub fn render_nav(show_postbox: bool, col: usize, app: &mut Damus, ui: &mut egui
} }
if let Some(NavAction::Returned) = nav_response.action { if let Some(NavAction::Returned) = nav_response.action {
let r = app.columns_mut().column_mut(col).router_mut().go_back(); let r = app.columns_mut().column_mut(col).router_mut().pop();
if let Some(Route::Timeline(TimelineRoute::Thread(id))) = r { if let Some(Route::Timeline(TimelineRoute::Thread(id))) = r {
thread_unsubscribe( thread_unsubscribe(
&app.ndb, &app.ndb,
@ -77,7 +78,6 @@ pub fn render_nav(show_postbox: bool, col: usize, app: &mut Damus, ui: &mut egui
id.bytes(), id.bytes(),
); );
} }
app.columns_mut().column_mut(col).router_mut().returning = false;
} else if let Some(NavAction::Navigated) = nav_response.action { } else if let Some(NavAction::Navigated) = nav_response.action {
app.columns_mut().column_mut(col).router_mut().navigating = false; app.columns_mut().column_mut(col).router_mut().navigating = false;
} }

View File

@ -72,10 +72,21 @@ impl<R: Clone> Router<R> {
self.routes.push(route); self.routes.push(route);
} }
/// Go back, start the returning process
pub fn go_back(&mut self) -> Option<R> { pub fn go_back(&mut self) -> Option<R> {
if self.returning || self.routes.len() == 1 {
return None;
}
self.returning = true;
self.routes.get(self.routes.len() - 2).cloned()
}
/// Pop a route, should only be called on a NavRespose::Returned reseponse
pub fn pop(&mut self) -> Option<R> {
if self.routes.len() == 1 { if self.routes.len() == 1 {
return None; return None;
} }
self.returning = false;
self.routes.pop() self.routes.pop()
} }

View File

@ -1,6 +1,7 @@
use egui::{Button, Layout, SidePanel, Vec2, Widget}; use egui::{Button, Layout, SidePanel, Vec2, Widget};
use crate::{ use crate::{
account_manager::AccountsRoute,
column::Column, column::Column,
route::{Route, Router}, route::{Route, Router},
ui::profile_preview_controller, ui::profile_preview_controller,
@ -89,8 +90,16 @@ impl<'a> DesktopSidePanel<'a> {
match action { match action {
SidePanelAction::Panel => {} // TODO SidePanelAction::Panel => {} // TODO
SidePanelAction::Account => { SidePanelAction::Account => {
router.route_to(Route::accounts()); if router
//app.show_account_switcher = !app.show_account_switcher, .routes()
.iter()
.any(|&r| r == Route::Accounts(AccountsRoute::Accounts))
{
// return if we are already routing to accounts
router.go_back();
} else {
router.route_to(Route::accounts());
}
} }
SidePanelAction::Settings => {} // TODO SidePanelAction::Settings => {} // TODO
SidePanelAction::Columns => (), // TODO SidePanelAction::Columns => (), // TODO