chiark / gitweb /
Make MainMenu explicit at the top of the activity stack.
authorSimon Tatham <anakin@pobox.com>
Thu, 18 Jan 2024 08:55:54 +0000 (08:55 +0000)
committerSimon Tatham <anakin@pobox.com>
Fri, 19 Jan 2024 08:20:16 +0000 (08:20 +0000)
This will allow me to replace it with a different top-level activity
when we're in TUI login mode.

src/activity_stack.rs
src/tui.rs

index 34c5fbfefc931d1bfb105c5944d0e59e4bb91d99..f25e655fcc9f878e7c563b8b221900330674a492 100644 (file)
@@ -66,7 +66,7 @@ impl From<OverlayActivity> for Activity {
 
 #[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>,
@@ -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,
index 66e8cde9ca17e1bf6a820f17f474ce66d440629b..0524f71ec25a73eecf161cd16e430a3e29937449 100644 (file)
@@ -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 {