use crossterm::event::{KeyEvent, MouseEvent};
use ratatui::{layout::Rect, Frame};
use crate::app::Action;
use crate::menus::{
confirmation::Confirmation, help::HelpMenu, job_actions::JobActionsMenu,
job_overview::JobOverview, message::Message, user_options_menu::UserOptionsMenu,
};
use crate::mouse_input::MouseInput;
use crate::{joblist::JobList, user_options::UserOptions};
use self::salloc::salloc_menu::SallocMenu;
pub mod confirmation;
pub mod help;
pub mod job_actions;
pub mod job_overview;
pub mod message;
pub mod salloc;
pub mod user_options_menu;
#[derive(Debug, Clone)]
pub enum OpenMenu {
JobOverview,
UserOptions,
Help(usize),
Salloc,
JobActions,
Message(message::Message),
}
pub struct MenuContainer {
pub job_overview: JobOverview,
pub job_actions_menu: JobActionsMenu,
pub salloc_menu: SallocMenu,
pub user_options_menu: UserOptionsMenu,
pub help_menu: HelpMenu,
pub message: Message,
pub confirmation: Confirmation,
}
impl MenuContainer {
pub fn new(user_options: &UserOptions, joblist: &JobList) -> Self {
Self {
job_overview: JobOverview::new(user_options.refresh_rate, &joblist.squeue_command),
job_actions_menu: JobActionsMenu::new(),
salloc_menu: SallocMenu::new(),
help_menu: HelpMenu::new(),
message: Message::new_disabled(),
confirmation: Confirmation::new_disabled(),
user_options_menu: UserOptionsMenu::load(),
}
}
}
impl MenuContainer {
pub fn activate_menu(&mut self, open_menu: OpenMenu, joblist: &JobList) {
match open_menu {
OpenMenu::JobOverview => {
self.open_job_overview();
}
OpenMenu::JobActions => {
self.open_job_action(joblist);
}
OpenMenu::Salloc => {
self.open_salloc_menu();
}
OpenMenu::UserOptions => {
self.user_options_menu.activate();
}
OpenMenu::Message(message) => {
self.open_message(message.clone());
}
OpenMenu::Help(selected_category) => {
self.open_help_menu(selected_category);
}
}
}
fn open_job_overview(&mut self) {
self.message = Message::new("Opening job overview not implemented");
}
fn open_job_action(&mut self, joblist: &JobList) {
match joblist.get_job() {
Some(job) => {
self.job_actions_menu.activate(&job);
}
None => {
self.message = Message::new("No job selected");
self.message.kind = message::MessageKind::Error;
}
}
}
fn open_salloc_menu(&mut self) {
self.salloc_menu.activate();
}
fn open_help_menu(&mut self, selected_category: usize) {
self.help_menu.open(selected_category);
}
fn open_message(&mut self, message: Message) {
self.message = message;
}
}
impl MenuContainer {
pub fn render(&mut self, f: &mut Frame, area: &Rect, joblist: &JobList) {
self.job_overview.render(f, area, joblist);
self.job_actions_menu.render(f, area);
self.salloc_menu.render(f, area);
self.user_options_menu.render(f, area);
self.help_menu.render(f, area);
self.message.render(f, area);
self.confirmation.render(f, area);
}
}
impl MenuContainer {
pub fn input(&mut self, action: &mut Action, key_event: KeyEvent) {
let mut input_handled = false;
if !input_handled {
input_handled = self.confirmation.input(action, key_event);
}
if !input_handled {
input_handled = self.message.input(action, key_event);
}
if !input_handled {
input_handled = self.help_menu.input(action, key_event);
}
if !input_handled {
input_handled = self.user_options_menu.input(action, key_event);
}
if !input_handled {
input_handled = self.salloc_menu.input(action, key_event);
}
if !input_handled {
input_handled = self.job_actions_menu.input(action, key_event);
}
if !input_handled {
self.job_overview.input(action, key_event);
}
}
pub fn mouse_input(
&mut self,
action: &mut Action,
mouse_input: &mut MouseInput,
mouse_event: MouseEvent,
) {
mouse_input.handled = false;
mouse_input.event = Some(mouse_event);
self.message.mouse_input(action, mouse_input);
self.confirmation.mouse_input(action, mouse_input);
self.help_menu.mouse_input(action, mouse_input);
self.user_options_menu.mouse_input(action, mouse_input);
self.salloc_menu.mouse_input(action, mouse_input);
self.job_actions_menu.mouse_input(action, mouse_input);
self.job_overview.mouse_input(action, mouse_input);
}
}