diff --git a/src/app/mod.rs b/src/app/mod.rs index 9de9dcf..6db5c92 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -104,14 +104,6 @@ impl AppState { } } - // pub fn print(&self) { - // let tempEntry = &self.entries[0]; - // let res = serde_json::to_string(tempEntry).unwrap(); - // println!("{res}"); - // let resString = tempEntry.to_string(); - // println!("{resString}"); - // } - pub fn saveConfigToScript(&self) { let mut outputString: String = String::new(); outputString.push_str("#! /bin/bash\n\n# DO NOT EDIT THIS FILE MANUALLY\n# ANY MODIFICATIONS WILL BE OVERWRITTEN BY STECKBRETT\n# USE THAT STECKBRETT (stb) TO CONFIGURE PORT MAPPINGS.\n\n"); @@ -122,19 +114,12 @@ impl AppState { )) } outputString.push_str("\nwait"); - // for o in 0..1 { - // println!("test {o}"); - // sleep(Duration::from_secs(1)); - // } println!("Writing config to system"); sleep(Duration::from_millis(100)); let _ = std::fs::write("./forward.sh", outputString); } pub fn saveConfigToSettingsFile(&mut self) { - // let mut settings = Settings::new(&self.confDir); - // settings.entries = self.entries.clone(); - // settings.save(&self.confDir); self.settings.entries = self.entries.clone(); self.settings.save(&self.confDir); self.savedHash = self.settings.entryHash(); diff --git a/src/ui/entryBox.rs b/src/ui/entryBox.rs new file mode 100644 index 0000000..581eae0 --- /dev/null +++ b/src/ui/entryBox.rs @@ -0,0 +1,11 @@ +use ratatui::{ + style::{Color, Style}, + widgets::{Block, Borders}, +}; + +pub fn entryBox(title: String) -> Block<'static> { + Block::default() + .title(title) + .borders(Borders::ALL) + .style(Style::default().fg(Color::White)) +} diff --git a/src/ui/header.rs b/src/ui/header.rs new file mode 100644 index 0000000..2007c36 --- /dev/null +++ b/src/ui/header.rs @@ -0,0 +1,66 @@ +use ratatui::{ + style::{Color, Style}, + text::Span, +}; + +use crate::app::status::{AppStatus, CurrentScreen, EditingField, EntryValError}; + +pub fn getHeaderScreen(scr: &CurrentScreen) -> (Color, Span<'static>) { + match scr { + CurrentScreen::Main => ( + Color::LightBlue, + Span::styled("Main Screen", Style::default().fg(Color::LightBlue)), + ), + CurrentScreen::Add => ( + Color::LightGreen, + Span::styled("Add Window", Style::default().fg(Color::Green)), + ), + CurrentScreen::Exit => ( + Color::LightRed, + Span::styled("Exit Screen", Style::default().fg(Color::Red)), + ), + CurrentScreen::Settings => ( + Color::LightBlue, + Span::styled("Settings", Style::default().fg(Color::Blue)), + ), + CurrentScreen::Delete => ( + Color::Magenta, + Span::styled("Delete", Style::default().fg(Color::Magenta)), + ), + } +} + +pub fn getHeaderStatus(status: &AppStatus, editingField: &Option) -> Span<'static> { + match status { + AppStatus::Welcome => Span::styled("Welcome", Style::default().fg(Color::White)), + AppStatus::Added => Span::styled("Added", Style::default().fg(Color::Green)), + AppStatus::Deleted => Span::styled("Deleted", Style::default().fg(Color::Magenta)), + AppStatus::Editing => { + if let Some(editing) = editingField { + let curEdit = match editing { + EditingField::FromIP => "From IP", + EditingField::ToIP => "To IP", + EditingField::FromPort => "From Port", + EditingField::ToPort => "To Port", + }; + Span::styled( + format!("Editing: {curEdit}"), + Style::default().fg(Color::Green), + ) + } else { + Span::styled("Not Editing", Style::default().fg(Color::White)) + } + } + AppStatus::Error(e) => { + let errString = match e { + EntryValError::ToPortValError => "To Port Invalid", + EntryValError::FromPortValError => "From Port Invalid", + EntryValError::ToIPValError => "To IP Invalid", + EntryValError::FromIPValError => "From IP Invalid", + EntryValError::None => "", + }; + Span::styled(errString, Style::default().fg(Color::Red)) + } + AppStatus::Saved => Span::styled("Saved", Style::default().fg(Color::Green)), + } +} diff --git a/src/ui/mod.rs b/src/ui/mod.rs index dd99b72..62d0bb8 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -1,7 +1,9 @@ #![allow(non_snake_case)] mod centeredRect; +mod entryBox; mod entryTable; mod exitPrompt; +mod header; mod textHints; use ratatui::{ @@ -9,15 +11,16 @@ use ratatui::{ layout::{Constraint, Direction, Layout}, style::{Color, Style}, text::{Line, Span, Text}, - widgets::{Block, Borders, Clear, Padding, Paragraph}, + widgets::{Block, Borders, Clear, Paragraph}, }; -use crate::app::status::{AppStatus, CurrentScreen, EntryValError}; +use crate::app::status::CurrentScreen; use crate::app::{AppState, status::EditingField}; use crate::ui::centeredRect::centered_rect; use crate::ui::textHints::hints; pub fn ui(frame: &mut Frame, app: &mut AppState) { + // ------------------------------------------- // Split entire body into left title+body and right screen+keybinds chunks let screenChunks = Layout::default() .direction(ratatui::layout::Direction::Horizontal) @@ -36,7 +39,7 @@ pub fn ui(frame: &mut Frame, app: &mut AppState) { .constraints([Constraint::Length(3), Constraint::Min(3)]) .split(screenChunks[1]); - // ------------------------ + // ------------------------------------------- // Create and add title block let titleBlock = Block::default() .borders(Borders::all()) @@ -50,6 +53,7 @@ pub fn ui(frame: &mut Frame, app: &mut AppState) { frame.render_widget(title, titleBodyChunks[0]); + // ------------------------------------------- // table drawing let table = entryTable::getTableElement( &app.entries, @@ -60,6 +64,7 @@ pub fn ui(frame: &mut Frame, app: &mut AppState) { frame.render_stateful_widget(table, titleBodyChunks[1], &mut app.tableState); + // ------------------------------------------- // Renter exit prompt if let CurrentScreen::Exit = app.screen { let area = centered_rect(60, 25, titleBodyChunks[1]); @@ -67,6 +72,7 @@ pub fn ui(frame: &mut Frame, app: &mut AppState) { frame.render_widget(exitPrompt::getExitPara(), area); } + // ------------------------------------------- // Editing screen popup if let Some(edit) = &app.currentlyEditing { let popup = Block::default() @@ -84,27 +90,14 @@ pub fn ui(frame: &mut Frame, app: &mut AppState) { Constraint::Percentage(30), Constraint::Percentage(20), Constraint::Percentage(30), - Constraint::Percentage(25), + Constraint::Percentage(20), ]) .split(area); - let mut fromIPBlock = Block::default() - .title("From IP") - .borders(Borders::ALL) - .style(Style::default().fg(Color::White)); - let mut toIPBlock = Block::default() - .title("To IP") - .borders(Borders::ALL) - .style(Style::default().fg(Color::White)); - let mut fromPortBlock = Block::default() - .title("From Port") - .borders(Borders::ALL) - .style(Style::default().fg(Color::White)); - let mut toPortBlock = Block::default() - .title("To Port") - .borders(Borders::ALL) - .style(Style::default().fg(Color::White)); - + let mut fromIPBlock = entryBox::entryBox("From IP".to_string()); + let mut toIPBlock = entryBox::entryBox("To IP".to_string()); + let mut fromPortBlock = entryBox::entryBox("From Port".to_string()); + let mut toPortBlock = entryBox::entryBox("To Port".to_string()); let activeStyle = Style::default().bg(Color::LightYellow).fg(Color::Black); match edit { @@ -130,64 +123,13 @@ pub fn ui(frame: &mut Frame, app: &mut AppState) { let mut borderColor = Color::White; let _ = borderColor; // to suppress warning, remove later let screenHeader = vec![ - match app.screen { - CurrentScreen::Main => { - borderColor = Color::LightBlue; - Span::styled("Main Screen", Style::default().fg(Color::LightBlue)) - } - CurrentScreen::Add => { - borderColor = Color::LightGreen; - Span::styled("Add Window", Style::default().fg(Color::Green)) - } - CurrentScreen::Exit => { - borderColor = Color::LightRed; - Span::styled("Exit Screen", Style::default().fg(Color::Red)) - } - CurrentScreen::Settings => { - borderColor = Color::LightBlue; - Span::styled("Settings", Style::default().fg(Color::Blue)) - } - CurrentScreen::Delete => { - borderColor = Color::Magenta; - Span::styled("Delete", Style::default().fg(Color::Magenta)) - } - } - .to_owned(), - Span::styled(" | ", Style::default().fg(Color::White)), { - match &app.appStatus { - AppStatus::Welcome => Span::styled("Welcome", Style::default().fg(Color::White)), - AppStatus::Added => Span::styled("Added", Style::default().fg(Color::Green)), - AppStatus::Deleted => Span::styled("Deleted", Style::default().fg(Color::Magenta)), - AppStatus::Editing => { - if let Some(editing) = &app.currentlyEditing { - let curEdit = match editing { - EditingField::FromIP => "From IP", - EditingField::ToIP => "To IP", - EditingField::FromPort => "From Port", - EditingField::ToPort => "To Port", - }; - Span::styled( - format!("Editing: {curEdit}"), - Style::default().fg(Color::Green), - ) - } else { - Span::styled("Not Editing", Style::default().fg(Color::White)) - } - } - AppStatus::Error(e) => { - let errString = match e { - EntryValError::ToPortValError => "To Port Invalid", - EntryValError::FromPortValError => "From Port Invalid", - EntryValError::ToIPValError => "To IP Invalid", - EntryValError::FromIPValError => "From IP Invalid", - EntryValError::None => "", - }; - Span::styled(errString, Style::default().fg(Color::Red)) - } - AppStatus::Saved => Span::styled("Saved", Style::default().fg(Color::Green)), - } + let (color, span) = header::getHeaderScreen(&app.screen); + borderColor = color; + span }, + Span::styled(" | ", Style::default().fg(Color::White)), + header::getHeaderStatus(&app.appStatus, &app.currentlyEditing), ]; let screenHeaderPara = Paragraph::new(Line::from(screenHeader)).block( @@ -195,7 +137,9 @@ pub fn ui(frame: &mut Frame, app: &mut AppState) { .borders(Borders::TOP | Borders::LEFT | Borders::RIGHT) .style(Style::default().fg(borderColor)), ); + frame.render_widget(screenHeaderPara, headerKeybindChunks[0]); + // ------------------------------------------- // Keybinds Entry let keybinds = { match app.screen { @@ -213,6 +157,5 @@ pub fn ui(frame: &mut Frame, app: &mut AppState) { .style(Style::default().fg(borderColor)), ); - frame.render_widget(screenHeaderPara, headerKeybindChunks[0]); frame.render_widget(keyBindFooter, headerKeybindChunks[1]); }