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::{
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) {
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 {
}
fn handle_keypress(&mut self, key: OurKey) -> LogicalAction {
- dbg!(&self.actions, &key);
match self.actions.get(&key) {
Some(action) => action.clone(),
None => LogicalAction::Nothing,
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> {
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> {
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())
}