bacon/tui/menu/
action_menu.rs

1use crate::*;
2
3pub type ActionMenu = Menu<Action>;
4
5#[derive(Debug, Clone, PartialEq, Eq, Hash)]
6pub struct ActionMenuDefinition {
7    pub intro: Option<String>,
8    pub actions: Vec<Action>,
9}
10
11impl ActionMenu {
12    pub fn add_action(
13        &mut self,
14        action: Action,
15    ) {
16        self.add_item(action, None); // TODO look for key combination in settings
17    }
18    pub fn with_all_jobs(mission: &Mission) -> Self {
19        let mut menu = Self::new();
20        let mut job_names = mission.settings.jobs.keys().collect::<Vec<_>>();
21        job_names.sort();
22        let actions = job_names
23            .into_iter()
24            .map(|job_name| Action::Job(ConcreteJobRef::from_job_name(job_name).into()));
25        for action in actions {
26            let key = mission.settings.keybindings.shortest_key_for(&action);
27            menu.add_item(action, key);
28        }
29        menu
30    }
31    pub fn from_definition(
32        ActionMenuDefinition { intro, actions }: ActionMenuDefinition,
33        settings: &Settings,
34    ) -> Self {
35        let mut menu = Self::new();
36        if let Some(intro) = intro {
37            menu.set_intro(intro);
38        }
39        for action in actions {
40            let key = settings.keybindings.shortest_key_for(&action);
41            menu.add_item(action, key);
42        }
43        menu
44    }
45}