From 74a8ff01ae201f01d33269b08407db7b3484db3c Mon Sep 17 00:00:00 2001 From: Simon Tatham Date: Thu, 18 Jan 2024 08:55:54 +0000 Subject: [PATCH] Make MainMenu explicit at the top of the activity stack. This will allow me to replace it with a different top-level activity when we're in TUI login mode. --- src/activity_stack.rs | 48 ++++++++++++++++++++++--------------------- src/tui.rs | 2 +- 2 files changed, 26 insertions(+), 24 deletions(-) diff --git a/src/activity_stack.rs b/src/activity_stack.rs index 34c5fbf..f25e655 100644 --- a/src/activity_stack.rs +++ b/src/activity_stack.rs @@ -66,7 +66,7 @@ impl From for Activity { #[derive(PartialEq, Eq, Debug)] pub struct ActivityStack { - nonutil: Vec, // not counting MainMenu at the top + nonutil: Vec, util: Option, initial_util: Option, overlay: Option, @@ -91,9 +91,9 @@ impl Activity { } 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, @@ -103,9 +103,9 @@ impl ActivityStack { 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(); } } @@ -132,18 +132,12 @@ impl ActivityStack { 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(); @@ -178,12 +172,12 @@ impl ActivityStack { #[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, @@ -196,6 +190,7 @@ fn test() { stk, ActivityStack { nonutil: vec! { + NonUtilityActivity::MainMenu, NonUtilityActivity::HomeTimelineFile, }, util: None, @@ -210,6 +205,7 @@ fn test() { stk, ActivityStack { nonutil: vec! { + NonUtilityActivity::MainMenu, NonUtilityActivity::HomeTimelineFile, }, util: None, @@ -223,7 +219,7 @@ fn test() { assert_eq!( stk, ActivityStack { - nonutil: vec! {}, + nonutil: vec! {NonUtilityActivity::MainMenu}, util: None, initial_util: None, overlay: None, @@ -236,6 +232,7 @@ fn test() { stk, ActivityStack { nonutil: vec! { + NonUtilityActivity::MainMenu, NonUtilityActivity::HomeTimelineFile, }, util: None, @@ -250,6 +247,7 @@ fn test() { stk, ActivityStack { nonutil: vec! { + NonUtilityActivity::MainMenu, NonUtilityActivity::HomeTimelineFile, }, util: Some(UtilityActivity::UtilsMenu), @@ -264,6 +262,7 @@ fn test() { stk, ActivityStack { nonutil: vec! { + NonUtilityActivity::MainMenu, NonUtilityActivity::HomeTimelineFile, }, util: Some(UtilityActivity::ReadMentions), @@ -278,6 +277,7 @@ fn test() { stk, ActivityStack { nonutil: vec! { + NonUtilityActivity::MainMenu, NonUtilityActivity::HomeTimelineFile, }, util: None, @@ -292,6 +292,7 @@ fn test() { stk, ActivityStack { nonutil: vec! { + NonUtilityActivity::MainMenu, NonUtilityActivity::HomeTimelineFile, }, util: Some(UtilityActivity::ReadMentions), @@ -306,6 +307,7 @@ fn test() { stk, ActivityStack { nonutil: vec! { + NonUtilityActivity::MainMenu, NonUtilityActivity::HomeTimelineFile, }, util: None, @@ -319,7 +321,7 @@ fn test() { assert_eq!( stk, ActivityStack { - nonutil: vec! {}, + nonutil: vec! {NonUtilityActivity::MainMenu}, util: None, initial_util: None, overlay: None, @@ -331,7 +333,7 @@ fn test() { assert_eq!( stk, ActivityStack { - nonutil: vec! {}, + nonutil: vec! {NonUtilityActivity::MainMenu}, util: None, initial_util: None, overlay: None, diff --git a/src/tui.rs b/src/tui.rs index 66e8cde..0524f71 100644 --- a/src/tui.rs +++ b/src/tui.rs @@ -597,7 +597,7 @@ struct TuiLogicalState { impl TuiLogicalState { fn new(client: &Client, cfgloc: ConfigLocation) -> Self { - let activity_stack = ActivityStack::new(); + let activity_stack = ActivityStack::new(NonUtilityActivity::MainMenu); let activity_state = main_menu(client); TuiLogicalState { -- 2.30.2