From d37dab60885e96aa959747adf4abc7eaf63e8971 Mon Sep 17 00:00:00 2001 From: Simon Tatham Date: Thu, 28 Dec 2023 14:16:53 +0000 Subject: [PATCH] Filled in all the rest of the menus. Also, the actions that aren't implemented yet are clearly marked with 'NYI', and been if you try to select them. --- src/menu.rs | 105 +++++++++++++++++++++++++++++++++++++++++++--------- src/tui.rs | 4 +- 2 files changed, 90 insertions(+), 19 deletions(-) diff --git a/src/menu.rs b/src/menu.rs index 37a9f22..999f4c4 100644 --- a/src/menu.rs +++ b/src/menu.rs @@ -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 { 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 { @@ -176,7 +221,7 @@ pub fn utils_menu() -> Box { menu.add_action(Pr('X'), "Exit Mastodonochrome", LogicalAction::Goto( UtilityActivity::ExitMenu.into())); - Box::new(menu) + Box::new(menu.finalise()) } pub fn exit_menu() -> Box { @@ -187,5 +232,29 @@ pub fn exit_menu() -> Box { menu.add_action(Pr('X'), "Confirm exit", LogicalAction::Exit); - Box::new(menu) + Box::new(menu.finalise()) +} + +pub fn logs_menu_1() -> Box { + 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 { + 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()) } diff --git a/src/tui.rs b/src/tui.rs index 7467738..d1ef512 100644 --- a/src/tui.rs +++ b/src/tui.rs @@ -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 { 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"), } } -- 2.30.2