#[derive(PartialEq, Eq, Debug)]
pub struct ActivityStack {
- nonutil: Vec<NonUtilityActivity>, // not counting MainMenu at the top
+ nonutil: Vec<NonUtilityActivity>,
util: Option<UtilityActivity>,
initial_util: Option<UtilityActivity>,
overlay: Option<OverlayActivity>,
}
impl ActivityStack {
- pub fn new() -> Self {
+ pub fn new(top: NonUtilityActivity) -> Self {
ActivityStack {
- nonutil: Vec::new(),
+ nonutil: vec![top],
util: None,
initial_util: None,
overlay: None,
pub fn pop(&mut self) {
if self.util.is_some() {
self.util = None;
- } else {
- // deliberately ignore failed pop at root
- let _ = self.nonutil.pop();
+ } else if self.nonutil.len() > 1 {
+ // never pop the topmost activity
+ self.nonutil.pop();
}
}
Activity::NonUtil(x) => {
self.util = None;
self.overlay = None;
- match x {
- NonUtilityActivity::MainMenu => self.nonutil.clear(),
- y => {
- let trunc =
- match self.nonutil.iter().position(|z| *z == y) {
- Some(pos) => pos,
- None => self.nonutil.len(),
- };
- self.nonutil.truncate(trunc);
- self.nonutil.push(y);
- }
- }
+ let trunc = match self.nonutil.iter().position(|z| *z == x) {
+ Some(pos) => pos,
+ None => self.nonutil.len(),
+ };
+ self.nonutil.truncate(trunc);
+ self.nonutil.push(x);
}
Activity::Overlay(x) => {
self.util = self.initial_util.clone();
#[test]
fn test() {
- let mut stk = ActivityStack::new();
+ let mut stk = ActivityStack::new(NonUtilityActivity::MainMenu);
assert_eq!(
stk,
ActivityStack {
- nonutil: vec! {},
+ nonutil: vec! {NonUtilityActivity::MainMenu},
util: None,
initial_util: None,
overlay: None,
stk,
ActivityStack {
nonutil: vec! {
+ NonUtilityActivity::MainMenu,
NonUtilityActivity::HomeTimelineFile,
},
util: None,
stk,
ActivityStack {
nonutil: vec! {
+ NonUtilityActivity::MainMenu,
NonUtilityActivity::HomeTimelineFile,
},
util: None,
assert_eq!(
stk,
ActivityStack {
- nonutil: vec! {},
+ nonutil: vec! {NonUtilityActivity::MainMenu},
util: None,
initial_util: None,
overlay: None,
stk,
ActivityStack {
nonutil: vec! {
+ NonUtilityActivity::MainMenu,
NonUtilityActivity::HomeTimelineFile,
},
util: None,
stk,
ActivityStack {
nonutil: vec! {
+ NonUtilityActivity::MainMenu,
NonUtilityActivity::HomeTimelineFile,
},
util: Some(UtilityActivity::UtilsMenu),
stk,
ActivityStack {
nonutil: vec! {
+ NonUtilityActivity::MainMenu,
NonUtilityActivity::HomeTimelineFile,
},
util: Some(UtilityActivity::ReadMentions),
stk,
ActivityStack {
nonutil: vec! {
+ NonUtilityActivity::MainMenu,
NonUtilityActivity::HomeTimelineFile,
},
util: None,
stk,
ActivityStack {
nonutil: vec! {
+ NonUtilityActivity::MainMenu,
NonUtilityActivity::HomeTimelineFile,
},
util: Some(UtilityActivity::ReadMentions),
stk,
ActivityStack {
nonutil: vec! {
+ NonUtilityActivity::MainMenu,
NonUtilityActivity::HomeTimelineFile,
},
util: None,
assert_eq!(
stk,
ActivityStack {
- nonutil: vec! {},
+ nonutil: vec! {NonUtilityActivity::MainMenu},
util: None,
initial_util: None,
overlay: None,
assert_eq!(
stk,
ActivityStack {
- nonutil: vec! {},
+ nonutil: vec! {NonUtilityActivity::MainMenu},
util: None,
initial_util: None,
overlay: None,