chiark / gitweb /
Filled in all the rest of the menus.
authorSimon Tatham <anakin@pobox.com>
Thu, 28 Dec 2023 14:16:53 +0000 (14:16 +0000)
committerSimon Tatham <anakin@pobox.com>
Thu, 28 Dec 2023 14:18:11 +0000 (14:18 +0000)
Also, the actions that aren't implemented yet are clearly marked with
'NYI', and been if you try to select them.

src/menu.rs
src/tui.rs

index 37a9f22b7e4ca7325e36bc2cc66d2cb5349be74a..999f4c472ba6619d72554412c586ab51446563ff 100644 (file)
@@ -1,7 +1,8 @@
 use std::collections::HashMap;
+use std::cmp::max;
 use itertools::Itertools;
 
-use super::activity_stack::{NonUtilityActivity, UtilityActivity};
+use super::activity_stack::UtilityActivity;
 use super::coloured_string::ColouredString;
 use super::text::*;
 use super::tui::{
@@ -69,20 +70,28 @@ impl Menu {
 
     fn add_action_coloured(&mut self, key: OurKey, desc: ColouredString,
                            action: LogicalAction) {
+        let desc = if action == LogicalAction::NYI {
+            desc + &ColouredString::plain(" ") +
+                &ColouredString::uniform("NYI", '!')
+        } else {
+            desc
+        };
         self.lines.push(MenuLine::Key(MenuKeypressLine::new(key, desc)));
 
-        if let Pr(c) = key {
-            if let Ok(c) = c.to_lowercase().
-                to_string().chars().exactly_one() {
-                    self.actions.insert(Pr(c), action.clone());
-                }
-            if let Ok(c) = c.to_uppercase().
-                to_string().chars().exactly_one() {
-                    self.actions.insert(Pr(c), action.clone());
-                }
+        if action != LogicalAction::Nothing {
+            if let Pr(c) = key {
+                if let Ok(c) = c.to_lowercase().
+                    to_string().chars().exactly_one() {
+                        self.actions.insert(Pr(c), action.clone());
+                    }
+                if let Ok(c) = c.to_uppercase().
+                    to_string().chars().exactly_one() {
+                        self.actions.insert(Pr(c), action.clone());
+                    }
+            }
+
+            self.actions.insert(key, action);
         }
-
-        self.actions.insert(key, action);
     }
 
     fn add_action(&mut self, key: OurKey, desc: &str, action: LogicalAction) {
@@ -114,6 +123,24 @@ impl Menu {
     fn add_blank_line(&mut self) {
         self.lines.push(MenuLine::Blank);
     }
+
+    fn finalise(mut self) -> Self {
+        let mut lmaxwid = 0;
+        let mut rmaxwid = 0;
+        for line in &self.lines {
+            if let MenuLine::Key(mk) = line {
+                let (lwid, rwid) = mk.get_widths();
+                lmaxwid = max(lmaxwid, lwid);
+                rmaxwid = max(rmaxwid, rwid);
+            }
+        }
+        for line in &mut self.lines {
+            if let MenuLine::Key(mk) = line {
+                mk.ensure_widths(lmaxwid, rmaxwid);
+            }
+        }
+        self
+    }
 }
 
 impl ActivityState for Menu {
@@ -143,7 +170,6 @@ impl ActivityState for Menu {
     }
 
     fn handle_keypress(&mut self, key: OurKey) -> LogicalAction {
-        dbg!(&self.actions, &key);
         match self.actions.get(&key) {
             Some(action) => action.clone(),
             None => LogicalAction::Nothing,
@@ -155,10 +181,29 @@ pub fn main_menu() -> Box<dyn ActivityState> {
     let mut menu = Menu::new(
         ColouredString::uniform("Mastodonochrome Main Menu", 'H'), true);
 
-    menu.add_action(Pr('H'), "Home timeline", LogicalAction::Goto(
-        NonUtilityActivity::HomeTimelineFile.into()));
+    menu.add_action(Pr('H'), "Home timeline", LogicalAction::NYI);
+    menu.add_blank_line();
+    menu.add_action(Pr('P'), "Public timeline (all servers)",
+                    LogicalAction::NYI);
+    menu.add_action(Pr('L'), "Local public timeline (this server)",
+                    LogicalAction::NYI);
+    menu.add_action(Pr('#'), "Timeline for a #hashtag",
+                    LogicalAction::NYI);
+    menu.add_blank_line();
+    menu.add_action(Pr('I'), "View a post by its ID",
+                    LogicalAction::NYI);
+    menu.add_blank_line();
+    menu.add_action(Pr('C'), "Compose a post",
+                    LogicalAction::NYI);
+    menu.add_blank_line();
+
+    // We don't need to provide a LogicalAction for this keystroke,
+    // because it's only here as documentation. The actual handler is
+    // centralised into TuiLogicalState, so that you can press [ESC]
+    // anywhere.
+    menu.add_action(Escape, "Utilities and Exit", LogicalAction::Nothing);
 
-    Box::new(menu)
+    Box::new(menu.finalise())
 }
 
 pub fn utils_menu() -> Box<dyn ActivityState> {
@@ -176,7 +221,7 @@ pub fn utils_menu() -> Box<dyn ActivityState> {
     menu.add_action(Pr('X'), "Exit Mastodonochrome", LogicalAction::Goto(
         UtilityActivity::ExitMenu.into()));
 
-    Box::new(menu)
+    Box::new(menu.finalise())
 }
 
 pub fn exit_menu() -> Box<dyn ActivityState> {
@@ -187,5 +232,29 @@ pub fn exit_menu() -> Box<dyn ActivityState> {
 
     menu.add_action(Pr('X'), "Confirm exit", LogicalAction::Exit);
 
-    Box::new(menu)
+    Box::new(menu.finalise())
+}
+
+pub fn logs_menu_1() -> Box<dyn ActivityState> {
+    let mut menu = Menu::new(
+        ColouredString::general(
+            "Client Logs [ESC][L]",
+            "HHHHHHHHHHHHHKKKHHKH"), false);
+
+    menu.add_action(Pr('L'), "Server Logs", LogicalAction::Goto(
+        UtilityActivity::LogsMenu2.into()));
+
+    Box::new(menu.finalise())
+}
+
+pub fn logs_menu_2() -> Box<dyn ActivityState> {
+    let mut menu = Menu::new(
+        ColouredString::general(
+            "Server Logs [ESC][L][L]",
+            "HHHHHHHHHHHHHKKKHHKHHKH"), false);
+
+    menu.add_action(Pr('E'), "Ego Log (Boosts, Follows and Faves)",
+                    LogicalAction::NYI);
+
+    Box::new(menu.finalise())
 }
index 7467738e009a5860010107bd3a459fd93839b639..d1ef5124cb26dff8207771aa66dc4f92266dc57c 100644 (file)
@@ -280,7 +280,7 @@ pub enum CursorPosition {
     At(usize, usize), // (x,y)
 }
 
-#[derive(Debug, Clone)]
+#[derive(PartialEq, Eq, Debug, Clone)]
 pub enum LogicalAction {
     Beep,
     Pop,
@@ -305,6 +305,8 @@ fn new_activity_state(activity: Activity) -> Box<dyn ActivityState> {
         Activity::NonUtil(NonUtilityActivity::MainMenu) => main_menu(),
         Activity::Util(UtilityActivity::UtilsMenu) => utils_menu(),
         Activity::Util(UtilityActivity::ExitMenu) => exit_menu(),
+        Activity::Util(UtilityActivity::LogsMenu1) => logs_menu_1(),
+        Activity::Util(UtilityActivity::LogsMenu2) => logs_menu_2(),
         _ => panic!("FIXME"),
     }
 }