add overlay conception to Router

Signed-off-by: kernelkind <kernelkind@gmail.com>
This commit is contained in:
kernelkind
2025-06-16 17:43:09 -04:00
parent cdcca0ba35
commit e0dd09dd5f

View File

@@ -1,6 +1,9 @@
use enostr::{NoteId, Pubkey};
use notedeck::{NoteZapTargetOwned, WalletType};
use std::fmt::{self};
use std::{
fmt::{self},
ops::Range,
};
use crate::{
accounts::AccountsRoute,
@@ -250,6 +253,9 @@ pub struct Router<R: Clone> {
pub returning: bool,
pub navigating: bool,
replacing: bool,
// An overlay captures a range of routes where only one will persist when going back, the most recent added
overlay_ranges: Vec<Range<usize>>,
}
impl<R: Clone> Router<R> {
@@ -265,6 +271,7 @@ impl<R: Clone> Router<R> {
returning,
navigating,
replacing,
overlay_ranges: Vec::new(),
}
}
@@ -273,6 +280,16 @@ impl<R: Clone> Router<R> {
self.routes.push(route);
}
pub fn route_to_overlaid(&mut self, route: R) {
self.route_to(route);
self.set_overlaying();
}
pub fn route_to_overlaid_new(&mut self, route: R) {
self.route_to(route);
self.new_overlay();
}
// Route to R. Then when it is successfully placed, should call `remove_previous_routes` to remove all previous routes
pub fn route_to_replaced(&mut self, route: R) {
self.navigating = true;
@@ -286,6 +303,18 @@ impl<R: Clone> Router<R> {
return None;
}
self.returning = true;
if let Some(range) = self.overlay_ranges.pop() {
tracing::info!("Going back, found overlay: {:?}", range);
self.remove_overlay(range);
} else {
tracing::info!("Going back, no overlay");
}
if self.routes.len() == 1 {
return None;
}
self.prev().cloned()
}
@@ -294,6 +323,24 @@ impl<R: Clone> Router<R> {
if self.routes.len() == 1 {
return None;
}
's: {
let Some(last_range) = self.overlay_ranges.last_mut() else {
break 's;
};
if last_range.end != self.routes.len() {
break 's;
}
if last_range.end - 1 <= last_range.start {
self.overlay_ranges.pop();
break 's;
}
last_range.end -= 1;
}
self.returning = false;
self.routes.pop()
}
@@ -309,10 +356,47 @@ impl<R: Clone> Router<R> {
self.routes.drain(..num_routes - 1);
}
/// Removes all routes in the overlay besides the last
fn remove_overlay(&mut self, overlay_range: Range<usize>) {
let num_routes = self.routes.len();
if num_routes <= 1 {
return;
}
if overlay_range.len() <= 1 {
return;
}
self.routes
.drain(overlay_range.start..overlay_range.end - 1);
}
pub fn is_replacing(&self) -> bool {
self.replacing
}
fn set_overlaying(&mut self) {
let mut overlaying_active = None;
let mut binding = self.overlay_ranges.last_mut();
if let Some(range) = &mut binding {
if range.end == self.routes.len() - 1 {
overlaying_active = Some(range);
}
};
if let Some(range) = overlaying_active {
range.end = self.routes.len();
} else {
let new_range = self.routes.len() - 1..self.routes.len();
self.overlay_ranges.push(new_range);
}
}
fn new_overlay(&mut self) {
let new_range = self.routes.len() - 1..self.routes.len();
self.overlay_ranges.push(new_range);
}
pub fn top(&self) -> &R {
self.routes.last().expect("routes can't be empty")
}